@@ -31,24 +31,38 @@ def course_data(organization, course, opts = {})
31
31
end
32
32
33
33
def course_data_core_api ( course )
34
- exercises = course . exercises . includes ( :course , :available_points ) . to_a . natsort_by ( &:name )
35
-
34
+ UncomputedUnlock . resolve ( course , @user )
36
35
@unlocked_exercises = course . unlocks
37
36
. where ( user_id : @user . id )
38
37
. where ( [ 'valid_after IS NULL OR valid_after < ?' , Time . now ] )
39
38
. pluck ( :exercise_name )
40
39
41
- submissions_by_exercise = { }
42
- Submission . where ( course_id : course . id , user_id : @user . id ) . each do |sub |
43
- submissions_by_exercise [ sub . exercise_name ] ||= [ ]
44
- submissions_by_exercise [ sub . exercise_name ] << sub
45
- end
46
- exercises . each do |ex |
47
- ex . set_submissions_by ( @user , submissions_by_exercise [ ex . name ] || [ ] )
40
+ exercises = course . exercises . includes ( :course , :available_points )
41
+
42
+ unless @user . administrator? || @user . teacher? ( course . organization ) || @user . assistant? ( course )
43
+ exercises = exercises . where ( hidden : false , disabled_status : 0 )
44
+ exercises = if @unlocked_exercises . empty?
45
+ exercises . where ( unlock_spec : nil )
46
+ else
47
+ exercises . where ( [ "unlock_spec IS NULL OR name IN (#{ @unlocked_exercises . map { |_ | '?' } . join ( ', ' ) } )" , *@unlocked_exercises ] )
48
+ end . select { |e | e . _fast_visible_to? ( @user ) }
48
49
end
49
50
50
- @course_list . course_data_core_api ( course ) . merge ( unlockables : course . unlockable_exercises_for ( @user ) . map ( &:name ) . natsort ,
51
- exercises : exercises . map { |ex | exercise_data_core_api ( ex ) } . reject ( &:nil? ) )
51
+ exercises = exercises . to_a . natsort_by ( &:name )
52
+
53
+ {
54
+ id : course . id ,
55
+ name : course . name ,
56
+ title : course . title ,
57
+ description : course . description ,
58
+ details_url : @helpers . api_v8_core_course_url ( course ) ,
59
+ unlock_url : @helpers . api_v8_core_course_unlock_url ( course ) ,
60
+ reviews_url : @helpers . api_v8_core_course_reviews_url ( course ) ,
61
+ comet_url : CometServer . get . client_url ,
62
+ spyware_urls : SiteSetting . value ( 'spyware_servers' ) ,
63
+ unlockables : [ ] ,
64
+ exercises : exercises . map { |ex | exercise_data_core_api ( ex ) }
65
+ }
52
66
end
53
67
54
68
private
@@ -94,8 +108,6 @@ def exercise_data(exercise)
94
108
end
95
109
96
110
def exercise_data_core_api ( exercise )
97
- return nil unless exercise . visible_to? ( @user )
98
-
99
111
# optimization: use @unlocked_exercises to avoid querying unlocks repeatedly
100
112
locked = exercise . requires_unlock? && !@unlocked_exercises . include? ( exercise . name )
101
113
@@ -122,10 +134,6 @@ def exercise_data_core_api(exercise)
122
134
}
123
135
124
136
data [ :solution_zip_url ] = @helpers . download_api_v8_core_exercise_solution_url ( exercise ) if @user . administrator?
125
- data [ :exercise_submissions_url ] = @helpers . api_v8_core_exercise_url ( exercise , format : 'json' )
126
- last_submission = get_latest_submission ( exercise )
127
- data [ :latest_submission_url ] = @helpers . download_api_v8_core_submission_url ( last_submission ) unless last_submission . nil?
128
- data [ :latest_submission_id ] = last_submission . id unless last_submission . nil?
129
137
130
138
data
131
139
end
0 commit comments