Class: CompletionKit::MetricsController
- Inherits:
-
ApplicationController
- Object
- ActionController::Base
- ApplicationController
- CompletionKit::MetricsController
- Includes:
- TagFiltering
- Defined in:
- app/controllers/completion_kit/metrics_controller.rb
Constant Summary
Constants inherited from ApplicationController
ApplicationController::ONBOARDING_DISMISS_COOKIE
Instance Method Summary collapse
- #adopt_starter ⇒ Object
- #create ⇒ Object
- #destroy ⇒ Object
- #dismiss_starter ⇒ Object
- #dismiss_suggestion ⇒ Object
- #edit ⇒ Object
- #exclude_example ⇒ Object
- #index ⇒ Object
- #new ⇒ Object
- #publish_draft ⇒ Object
- #show ⇒ Object
- #starter_preview ⇒ Object
- #suggest_variants ⇒ Object
- #update ⇒ Object
Instance Method Details
#adopt_starter ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 18 def adopt_starter starter = StarterMetrics.find(params[:key]) return redirect_to(metrics_path, alert: "Unknown starter metric.") unless starter if Metric.exists?(name: starter.name) return redirect_to(metrics_path, alert: "A metric named \"#{starter.name}\" already exists.") end metric = Metric.create!( name: starter.name, instruction: starter.instruction, rubric_bands: starter.rubric_bands ) redirect_to metric_path(metric), notice: "Added the \"#{starter.name}\" starter. Tweak any band before you run a judge against it." end |
#create ⇒ Object
63 64 65 66 67 68 69 70 71 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 63 def create @metric = Metric.new(metric_params) if @metric.save redirect_to metric_path(@metric), notice: "Metric was successfully created." else render :new, status: :unprocessable_entity end end |
#destroy ⇒ Object
113 114 115 116 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 113 def destroy @metric.destroy redirect_to metrics_path, notice: "Metric was successfully destroyed." end |
#dismiss_starter ⇒ Object
32 33 34 35 36 37 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 32 def dismiss_starter starter = StarterMetrics.find(params[:key]) return redirect_to(metrics_path, alert: "Unknown starter metric.") unless starter StarterMetricDismissal.find_or_create_by(starter_key: starter.key) redirect_to metrics_path, notice: "Dismissed \"#{starter.name}\". It won't appear here again." end |
#dismiss_suggestion ⇒ Object
139 140 141 142 143 144 145 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 139 def dismiss_suggestion draft = MetricVersion.drafts.where(metric_id: @metric.id).find_by(id: params[:draft_id]) label = draft&.version_label draft&.destroy target = params[:back_to] == "edit" ? edit_metric_path(@metric) : metric_path(@metric) redirect_to target, notice: label ? "Discarded draft #{label}." : "Draft already gone." end |
#edit ⇒ Object
51 52 53 54 55 56 57 58 59 60 61 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 51 def edit @suggestion_draft = MetricVersion.drafts.where(metric_id: @metric.id, source: "suggestion").order(created_at: :desc).first @edit_draft = MetricVersion.drafts.where(metric_id: @metric.id, source: "edit").order(created_at: :desc).first @published_metric_version = MetricVersion.published.where(metric_id: @metric.id, current: true).first @improve_disagreement_count = Calibration.where(metric_id: @metric.id, verdict: "disagree").count if @edit_draft @metric.instruction = @edit_draft.instruction @metric.rubric_bands = @edit_draft.rubric_bands end end |
#exclude_example ⇒ Object
147 148 149 150 151 152 153 154 155 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 147 def exclude_example calibration = Calibration.where(metric_id: @metric.id).find(params[:calibration_id]) calibration.update!(excluded_from_examples: true) render turbo_stream: turbo_stream.replace( "ck-guiding-#{@metric.id}", partial: "completion_kit/metrics/guiding_examples", locals: { metric: @metric, examples: MetricCalibrationExamples.judge_examples_for(@metric) } ) end |
#index ⇒ Object
7 8 9 10 11 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 7 def index @metrics = apply_tag_filter(Metric.includes(:metric_groups, :tags).order(:name)) @available_starters = StarterMetrics.available @current_versions = MetricVersion.published.current.where(metric_id: @metrics.map(&:id)).index_by(&:metric_id) end |
#new ⇒ Object
47 48 49 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 47 def new @metric = Metric.new end |
#publish_draft ⇒ Object
157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 157 def publish_draft scope = MetricVersion.where(metric_id: @metric.id) version = if params[:draft_id].present? scope.find_by(id: params[:draft_id]) else MetricVersion.drafts.where(metric_id: @metric.id).order(created_at: :desc).first end if version.nil? redirect_to metric_path(@metric), alert: "No version to publish." return end was_published_already = version.published? reverting = was_published_already && !version.current? previously_current = MetricVersion.current.find_by(metric_id: @metric.id) if reverting audit = version.revert! prior_label = previously_current.version_label redirect_to metric_path(@metric), notice: "Reverted #{@metric.name} to #{version.version_label} (logged as #{audit.version_label}). Human reviews collected against #{prior_label} stay tied to it." else version.publish! redirect_to metric_path(@metric), notice: "#{@metric.name} #{version.version_label} is now the published version." end end |
#show ⇒ Object
39 40 41 42 43 44 45 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 39 def show @edit_draft = MetricVersion.drafts.where(metric_id: @metric.id, source: "edit").order(created_at: :desc).first @suggestion_draft = MetricVersion.drafts.where(metric_id: @metric.id, source: "suggestion").order(created_at: :desc).first @improve_disagreement_count = Calibration.where(metric_id: @metric.id, verdict: "disagree").count @versions = MetricVersion.where(metric_id: @metric.id).order(version_number: :desc).to_a @guiding_examples = CompletionKit.config.judge_examples_from_reviews ? MetricCalibrationExamples.judge_examples_for(@metric) : [] end |
#starter_preview ⇒ Object
13 14 15 16 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 13 def starter_preview @starter = StarterMetrics.find(params[:key]) return redirect_to(metrics_path, alert: "Unknown starter metric.") unless @starter end |
#suggest_variants ⇒ Object
118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 118 def suggest_variants target = params[:back_to] == "edit" ? edit_metric_path(@metric) : metric_path(@metric) counts = Calibration.where(metric_id: @metric.id, verdict: %w[agree disagree]).group(:verdict).count if counts["disagree"].to_i.zero? redirect_to target, alert: "Mark at least one case as Disagree before asking the model to suggest a change." return end MetricSuggestionJob.perform_later(@metric.id) if params[:back_to] == "edit" redirect_to metric_path(@metric), notice: "Drafting a change from your reviews. It will appear here once it's tested." else render turbo_stream: turbo_stream.replace( "ck-suggestion-status-#{@metric.id}", partial: "completion_kit/metrics/suggestion_pending", locals: { metric: @metric, count: counts.values.sum } ) end end |
#update ⇒ Object
73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 |
# File 'app/controllers/completion_kit/metrics_controller.rb', line 73 def update judge_keys = %i[instruction rubric_bands] = metric_params.except(*judge_keys) proposed_instruction = metric_params[:instruction] proposed_rubric = metric_params[:rubric_bands] unless @metric.update() return render(:edit, status: :unprocessable_entity) end current_instruction = @metric.instruction.to_s current_rubric = @metric.rubric_bands || [] normalized_proposed_rubric = normalize_rubric_bands_for_update(proposed_rubric) instruction_changed = !proposed_instruction.nil? && proposed_instruction.to_s != current_instruction rubric_changed = !normalized_proposed_rubric.nil? && normalized_proposed_rubric != current_rubric unless instruction_changed || rubric_changed return redirect_to(metric_path(@metric), notice: "Metric was successfully updated.") end new_instruction = instruction_changed ? proposed_instruction.to_s : current_instruction new_rubric = rubric_changed ? normalized_proposed_rubric : current_rubric if @metric.reviews.exists? MetricVersion.drafts.where(metric_id: @metric.id, source: "edit").destroy_all draft = MetricVersion.create!( metric: @metric, instruction: new_instruction, rubric_bands: new_rubric, state: "draft", source: "edit", current: false ) redirect_to edit_metric_path(@metric), notice: "Saved as draft #{draft.version_label}. Publish to make these changes the metric's live version." else @metric.update!(instruction: new_instruction, rubric_bands: new_rubric) current_pub = MetricVersion.published.where(metric_id: @metric.id, current: true).first current_pub&.update!(instruction: @metric.instruction, rubric_bands: @metric.rubric_bands) redirect_to metric_path(@metric), notice: "Metric was successfully updated." end end |