diff --git a/app/callbacks/activable_callbacks.rb b/app/callbacks/activable_callbacks.rb index 4b03bb6c..94c85ed5 100644 --- a/app/callbacks/activable_callbacks.rb +++ b/app/callbacks/activable_callbacks.rb @@ -6,4 +6,10 @@ def self.before_validation(model_object) end end + def self.before_save(model_object) + if model_object.active? && !model_object.publishable? + self.active = false + end + end + end diff --git a/app/controllers/concerns/controllers/activable.rb b/app/controllers/concerns/controllers/activable.rb index 3184d639..ab301ad4 100644 --- a/app/controllers/concerns/controllers/activable.rb +++ b/app/controllers/concerns/controllers/activable.rb @@ -7,7 +7,7 @@ module Controllers::Activable end def activate - if @model_instance.activate + if @model_instance.activate && @model_instance.active? flash[:alert] = "#{controller_name.classify} was successfully activated." else flash[:alert] = "#{controller_name.classify} cannot be activated." diff --git a/app/models/question.rb b/app/models/question.rb index 5c689923..319aa2d9 100644 --- a/app/models/question.rb +++ b/app/models/question.rb @@ -16,6 +16,8 @@ class Question < ApplicationRecord validate :only_one_correct_option before_validation ActivableCallbacks, on: :update + before_save ActivableCallbacks + after_commit :update_quiz, on: [:update, :destroy] scope :active, -> { where(active: true) } @@ -35,6 +37,10 @@ def self.ransackable_associations(auth_object = nil) [] end + def publishable? + question_options.length >= 4 + end + private def only_one_correct_option @@ -51,4 +57,13 @@ def options_count errors.add :base, 'enter exactly 4 options' unless count == 4 end + def update_quiz + quiz.inactivate unless quiz.publishable? + + if quiz_id_before_last_save && quiz_id_before_last_save != quiz_id + previous_quiz = Quiz.find_by_id(quiz_id_before_last_save) + previous_quiz.inactivate unless previous_quiz.publishable? + end + end + end diff --git a/app/models/question_option.rb b/app/models/question_option.rb index faf0b693..a223462c 100644 --- a/app/models/question_option.rb +++ b/app/models/question_option.rb @@ -8,13 +8,14 @@ class QuestionOption < ApplicationRecord validate :presence_of_either_data_or_image before_validation :set_type + after_commit :update_question, on: [:update, :destroy] scope :correct, -> { where(correct: true) } private def presence_of_either_data_or_image - unless option_image.present? && data.present? + if option_image.blank? && data.blank? errors.add :base, 'Both data and image can\'t be blank' end end @@ -28,4 +29,13 @@ def set_type end end + def update_question + question.inactivate unless question.publishable? + + if question_id_before_last_save && question_id_before_last_save != question_id + previous_question = Question.find_by_id(question_id_before_last_save) + previous_question.inactivate unless previous_question.publishable? + end + end + end diff --git a/app/models/quiz.rb b/app/models/quiz.rb index 6dd39f85..9b33c400 100644 --- a/app/models/quiz.rb +++ b/app/models/quiz.rb @@ -31,6 +31,7 @@ class Quiz < ApplicationRecord before_validation :set_time_limit_in_seconds, if: -> { time_limit_in_minutes.present? } before_validation ActivableCallbacks, on: :update + before_save ActivableCallbacks after_save_commit :schedule_mail_if_featured, if: :featured? scope :active, -> { where(active: true) } @@ -59,6 +60,10 @@ def self.ransackable_associations(auth_object = nil) [] end + def publishable? + questions.length >= 10 && questions.length == questions.map(&:publishable?).count(true) + end + private def set_time_limit_in_seconds