@@ -37,35 +37,43 @@ def eligible_students
3737
3838 course = Course . find_by! ( name : "#{ params [ :organization_slug ] } -#{ params [ :course_name ] } " )
3939
40- authorize! :read , course
40+ authorize! :teach , course
4141
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)
4343
44- authorize! :read , applied_students
44+ groups = course . exercise_groups [ 0 .. 6 ] + course . exercise_groups [ 8 .. 13 ]
4545
46- eligible_student_ids = [ ]
46+ cbu = course . exercise_group_completion_by_user
4747
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 }
5749
58- eligible_students = [ ]
50+ eligble_ids = ( user_ids & applied_students )
51+ users = User . where ( id : eligble_ids )
5952
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 = {
6360 id : u . id ,
6461 username : u . login ,
6562 email : u . email ,
6663 administrator : u . administrator
6764 }
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
6977 end
7078
7179 render json : {
0 commit comments