@@ -412,6 +412,10 @@ def active_prerequisites
412412 def clear_cached_lookups
413413 @cached_tags = nil
414414 end
415+
416+ def cached_tags
417+ @cached_tags ||= self . content_tags . active
418+ end
415419
416420 def re_evaluate_for ( users , skip_confirm_valid_requirements = false )
417421 users = Array ( users )
@@ -494,114 +498,18 @@ def content_tags_hash
494498 self . content_tags . each { |t | @tags_hash [ t . id ] = t }
495499 @tags_hash
496500 end
497-
498- def evaluate_for ( user , recursive_check = false , deep_check = false )
499- progression = nil
500- if user . is_a? ( ContextModuleProgression )
501- progression = user
502- user = progression . user
503- end
504- return nil unless user
505- progression ||= self . find_or_create_progression_with_multiple_lookups ( user )
506- return unless progression
507- if self . unpublished?
508- progression . workflow_state = 'locked'
509- Shackles . activate ( :master ) do
510- progression . save if progression . workflow_state_changed?
511- end
512- return progression
513- end
514- requirements_met_changed = false
515- if User . module_progression_jobs_queued? ( user . id )
516- progression . workflow_state = 'locked'
517- end
518- if deep_check
519- confirm_valid_requirements ( true ) rescue nil
520- end
521- @cached_tags ||= self . content_tags . active
522- tags = @cached_tags
523- if recursive_check || progression . new_record? || progression . updated_at < self . updated_at || User . module_progression_jobs_queued? ( user . id )
524- if self . completion_requirements . blank? && active_prerequisites . empty?
525- progression . workflow_state = 'completed'
526- Shackles . activate ( :master ) do
527- progression . save
528- end
529- end
530- progression . workflow_state = 'locked'
531- if !self . to_be_unlocked
532- progression . requirements_met ||= [ ]
533- if progression . locked?
534- progression . workflow_state = 'unlocked' if self . prerequisites_satisfied? ( user )
535- end
536- if progression . unlocked? || progression . started?
537- orig_reqs = ( progression . requirements_met || [ ] ) . map { |r | "#{ r [ :id ] } _#{ r [ :type ] } " } . sort
538- completes = ( self . completion_requirements || [ ] ) . map do |req |
539- tag = tags . detect { |t | t . id == req [ :id ] . to_i }
540- if !tag
541- res = true
542- elsif [ 'min_score' , 'max_score' , 'must_submit' ] . include? ( req [ :type ] ) && !tag . scoreable?
543- res = true
544- else
545- progression . evaluate_requirements_met if deep_check
546- res = progression . requirements_met . any? { |r | r [ :id ] == req [ :id ] && r [ :type ] == req [ :type ] } #include?(req)
547- if req [ :type ] == 'min_score'
548- progression . requirements_met = progression . requirements_met . select { |r | r [ :id ] != req [ :id ] || r [ :type ] != req [ :type ] }
549- if tag . content_type_quiz?
550- submission = Quizzes ::QuizSubmission . find_by_quiz_id_and_user_id ( tag . content_id , user . id )
551- score = submission . try ( :kept_score )
552- elsif tag . content_type == "DiscussionTopic"
553- if tag . content
554- submission = Submission . find_by_assignment_id_and_user_id ( tag . content . assignment_id , user . id )
555- score = submission . try ( :score )
556- else
557- score = nil
558- end
559- else
560- submission = Submission . find_by_assignment_id_and_user_id ( tag . content_id , user . id )
561- score = submission . try ( :score )
562- end
563- if score && score >= req [ :min_score ] . to_f
564- progression . requirements_met << req
565- res = true
566- else
567- res = false
568- end
569- end
570- end
571- res
572- end
573- new_reqs = ( progression . requirements_met || [ ] ) . map { |r | "#{ r [ :id ] } _#{ r [ :type ] } " } . sort
574- requirements_met_changed = new_reqs != orig_reqs
575- progression . workflow_state = 'started' if completes . any?
576- progression . workflow_state = 'completed' if completes . all?
577- end
578- end
579- end
580- position = nil
581- found_failure = false
582- if self . require_sequential_progress
583- tags . each do |tag |
584- requirements_for_tag = ( self . completion_requirements || [ ] ) . select { |r | r [ :id ] == tag . id } . sort_by { |r | r [ :id ] }
585- next if found_failure
586- if requirements_for_tag . empty?
587- position = tag . position
588- else
589- all_met = requirements_for_tag . all? do |req |
590- ( progression . requirements_met || [ ] ) . any? { |r | r [ :id ] == req [ :id ] && r [ :type ] == req [ :type ] }
591- end
592- if all_met
593- position = tag . position if tag . position && all_met
594- else
595- position = tag . position
596- found_failure = true
597- end
598- end
599- end
600- end
601- progression . current_position = position
602- Shackles . activate ( :master ) do
603- progression . save if progression . workflow_state_changed? || requirements_met_changed
501+
502+ def evaluate_for ( user_or_progression , recursive_check = false , deep_check = false )
503+ if user_or_progression . is_a? ( ContextModuleProgression )
504+ progression , user = [ user_or_progression , user_or_progression . user ]
505+ else
506+ progression , user = [ self . find_or_create_progression_with_multiple_lookups ( user_or_progression ) , user_or_progression ] if user_or_progression
604507 end
508+ return nil unless progression && user
509+
510+ progression . context_module = self if progression . context_module_id == self . id
511+ progression . user = user if progression . user_id == user . id
512+ progression . evaluate ( recursive_check , deep_check )
605513 progression
606514 end
607515
0 commit comments