@@ -37,35 +37,43 @@ def eligible_students
37
37
38
38
course = Course . find_by! ( name : "#{ params [ :organization_slug ] } -#{ params [ :course_name ] } " )
39
39
40
- authorize! :read , course
40
+ authorize! :teach , course
41
41
42
- applied_students = UserAppDatum . where ( field_name : 'applies_for_study_right' , value : 't' , namespace : 'ohjelmoinnin-mooc-2019' ) . each { | datum | datum . user_id }
42
+ applied_students = UserAppDatum . where ( field_name : 'applies_for_study_right' , value : 't' , namespace : 'ohjelmoinnin-mooc-2019' ) . pluck ( : user_id)
43
43
44
- authorize! :read , applied_students
44
+ groups = course . exercise_groups [ 0 .. 6 ] + course . exercise_groups [ 8 .. 13 ]
45
45
46
- eligible_student_ids = [ ]
46
+ cbu = course . exercise_group_completion_by_user
47
47
48
- applied_students . map do |user |
49
- drop = false
50
- course . exercise_group_completion_counts_for_user ( user ) . map do |group , info |
51
- if info [ :progress ] < 0.9
52
- drop = true
53
- end
54
- end
55
- eligible_student_ids . push ( user ) unless drop
56
- end
48
+ user_ids = groups . flat_map { |group | ap = cbu [ group . name ] [ :available_points ] ; cbu [ group . name ] [ :points_by_user ] . map { |k , v | { k => ( v . to_f / ap ) } } } . group_by { |o | o . keys . first } . map { |k , v | { k => v . map { |o2 | o2 [ k ] } } } . inject ( :merge ) . select { |_k , v | v . length == groups . length } . select { |_k , v | v . all? { |o2 | o2 >= 0.8995 } } . map { |k , _v | k }
57
49
58
- eligible_students = [ ]
50
+ eligble_ids = ( user_ids & applied_students )
51
+ users = User . where ( id : eligble_ids )
59
52
60
- eligible_student_ids . map do |user_id |
61
- u = User . find ( user_id )
62
- info = {
53
+ if params [ :extra_fields ]
54
+ namespace = params [ :extra_fields ]
55
+ user_id_to_extra_fields = UserAppDatum . where ( namespace : namespace , user : users ) . group_by ( &:user_id )
56
+ end
57
+
58
+ eligible_students = users . map do |u |
59
+ d = {
63
60
id : u . id ,
64
61
username : u . login ,
65
62
email : u . email ,
66
63
administrator : u . administrator
67
64
}
68
- eligible_students . push ( info )
65
+ if user_id_to_extra_fields
66
+ extra_fields = user_id_to_extra_fields [ u . id ] || [ ]
67
+ d [ :extra_fields ] = extra_fields . map { |o | [ o . field_name , o . value ] } . to_h
68
+ end
69
+ if params [ :user_fields ]
70
+ user_fields = u . user_field_values . map { |o | [ o . field_name , o . value ] } . to_h
71
+ d [ :user_fields ] = user_fields
72
+ d [ :student_number ] = user_fields [ 'organizational_id' ]
73
+ d [ :first_name ] = user_fields [ 'first_name' ]
74
+ d [ :last_name ] = user_fields [ 'last_name' ]
75
+ end
76
+ d
69
77
end
70
78
71
79
render json : {
0 commit comments