@@ -310,8 +310,8 @@ def is_publicly_available?
310310 end
311311 end
312312
313- def self . progsnap2_attempt_csv ( exercise_id , course_offering_id = nil , workout_id = nil )
314- denormalized = Exercise . denormalized_attempt_data ( exercise_id , course_offering_id , workout_id )
313+ def self . progsnap2_attempt_csv ( exercise_id , course_id = nil , term_id = nil )
314+ denormalized = Exercise . denormalized_attempt_data ( exercise_id , course_id , term_id )
315315 main_events = Exercise . progsnap2_main_events_csv ( denormalized )
316316 code_states = Exercise . progsnap2_code_states_csv ( denormalized )
317317 return main_events , code_states
@@ -356,28 +356,49 @@ def self.denormalized_attempt_csv(exercise_id)
356356 # All relationship fields are in the same table, so null values
357357 # are possible for workout_id, workout_offering_id, course_id,
358358 # course_offering_id, etc.
359- def self . denormalized_attempt_data ( exercise_id , course_offering_id = nil , workout_id = nil )
360- course_offering_filter = course_offering_id ?
361- "AND course_offerings.id = #{ course_offering_id } " :
359+ def self . denormalized_attempt_data ( exercise_id = nil , course_id = nil , term_id = nil )
360+
361+ unless exercise_id || ( course_id && term_id )
362+ raise ArgumentError , 'Please specify one or more exercise ids, OR ' \
363+ 'a course id and term id.'
364+ end
365+
366+ course_filter = course_id ?
367+ "AND courses.id = #{ course_id } " :
362368 ""
363- workout_filter = workout_id ?
364- "AND workouts .id = #{ workout_id } " :
369+ term_filter = term_id ?
370+ "AND terms .id = #{ term_id } " :
365371 ""
366372
367- result = Exercise . where ( :id , exercise_id )
368- . joins ( exercise_versions : { attempts : :prompt_answers } )
373+ if exercise_id
374+ result = Exercise . where ( :id , exercise_id )
375+ . joins ( exercise_versions : { attempts : :prompt_answers } )
376+ else
377+ result = Exercise . joins ( exercise_versions : { attempts : :prompt_answers } )
378+ end
379+ result = result
369380 . joins ( 'LEFT JOIN workout_scores ON
370381 workout_scores.id = attempts.workout_score_id' )
371382 . joins ( 'LEFT JOIN workout_offerings ON
372383 workout_offerings.id = workout_scores.workout_offering_id' )
373- . joins ( " LEFT JOIN workouts ON workouts.id = workout_scores.workout_id #{ workout_filter } " )
374- . joins ( " LEFT JOIN course_offerings ON
375- course_offerings.id = workout_offerings.course_offering_id #{ course_offering_filter } " )
384+ . joins ( ' LEFT JOIN workouts ON workouts.id = workout_scores.workout_id' )
385+ . joins ( ' LEFT JOIN course_offerings ON
386+ course_offerings.id = workout_offerings.course_offering_id' )
376387 . joins ( 'LEFT JOIN terms ON terms.id = course_offerings.term_id' )
377388 . joins ( 'LEFT JOIN courses ON courses.id = course_offerings.course_id' )
378389 . joins ( 'LEFT JOIN coding_prompt_answers ON
379390 prompt_answers.actable_id = coding_prompt_answers.id' )
380- . select ( 'attempts.user_id,
391+
392+ if course_id
393+ result = result . where ( 'courses.id = ?' , course_id )
394+ end
395+
396+ if term_id
397+ result = result . where ( 'terms.id = ?' , term_id )
398+ end
399+
400+ result = result
401+ . select ( 'attempts.user_id,
381402 exercise_versions.id as exercise_version_id,
382403 exercise_versions.version as version_no,
383404 coding_prompt_answers.id as answer_id,
0 commit comments