Allow random selection for ProxyExercise
This commit is contained in:
@ -42,7 +42,7 @@ class ProxyExercisesController < ApplicationController
|
|||||||
|
|
||||||
def proxy_exercise_params
|
def proxy_exercise_params
|
||||||
if params[:proxy_exercise].present?
|
if params[:proxy_exercise].present?
|
||||||
params[:proxy_exercise].permit(:description, :title, :public, exercise_ids: []).merge(user_id: current_user.id,
|
params[:proxy_exercise].permit(:description, :title, :algorithm, :public, exercise_ids: []).merge(user_id: current_user.id,
|
||||||
user_type: current_user.class.name)
|
user_type: current_user.class.name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -4,6 +4,11 @@ class ProxyExercise < ApplicationRecord
|
|||||||
include Creation
|
include Creation
|
||||||
include DefaultValues
|
include DefaultValues
|
||||||
|
|
||||||
|
enum algorithm: {
|
||||||
|
best_match: 0,
|
||||||
|
random: 1,
|
||||||
|
}, _default: :write, _prefix: true
|
||||||
|
|
||||||
after_initialize :generate_token
|
after_initialize :generate_token
|
||||||
after_initialize :set_reason
|
after_initialize :set_reason
|
||||||
after_initialize :set_default_values
|
after_initialize :set_default_values
|
||||||
@ -47,8 +52,10 @@ class ProxyExercise < ApplicationRecord
|
|||||||
Rails.logger.debug { "retrieved assigned exercise for user #{user.id}: Exercise #{assigned_user_proxy_exercise.exercise}" }
|
Rails.logger.debug { "retrieved assigned exercise for user #{user.id}: Exercise #{assigned_user_proxy_exercise.exercise}" }
|
||||||
assigned_user_proxy_exercise.exercise
|
assigned_user_proxy_exercise.exercise
|
||||||
else
|
else
|
||||||
Rails.logger.debug { "find new matching exercise for user #{user.id}" }
|
|
||||||
matching_exercise =
|
matching_exercise =
|
||||||
|
case algorithm
|
||||||
|
when 'best_match'
|
||||||
|
Rails.logger.debug { "find new matching exercise for user #{user.id}" }
|
||||||
begin
|
begin
|
||||||
find_matching_exercise(user)
|
find_matching_exercise(user)
|
||||||
rescue StandardError => e # fallback
|
rescue StandardError => e # fallback
|
||||||
@ -57,6 +64,13 @@ class ProxyExercise < ApplicationRecord
|
|||||||
@reason[:error] = "#{$ERROR_INFO}:\n\t#{e.backtrace.join("\n\t")}"
|
@reason[:error] = "#{$ERROR_INFO}:\n\t#{e.backtrace.join("\n\t")}"
|
||||||
exercises.where('expected_difficulty > 1').sample # difficulty should be > 1 to prevent dummy exercise from being chosen.
|
exercises.where('expected_difficulty > 1').sample # difficulty should be > 1 to prevent dummy exercise from being chosen.
|
||||||
end
|
end
|
||||||
|
when 'random'
|
||||||
|
@reason[:reason] = 'random exercise requested'
|
||||||
|
exercises.sample
|
||||||
|
else
|
||||||
|
raise "Unknown algorithm #{algorithm}"
|
||||||
|
end
|
||||||
|
|
||||||
user.user_proxy_exercise_exercises << UserProxyExerciseExercise.create(user:,
|
user.user_proxy_exercise_exercises << UserProxyExerciseExercise.create(user:,
|
||||||
exercise: matching_exercise, proxy_exercise: self, reason: @reason.to_json)
|
exercise: matching_exercise, proxy_exercise: self, reason: @reason.to_json)
|
||||||
matching_exercise
|
matching_exercise
|
||||||
|
@ -6,6 +6,9 @@
|
|||||||
.mb-3
|
.mb-3
|
||||||
= f.label(:description, class: 'form-label')
|
= f.label(:description, class: 'form-label')
|
||||||
= f.pagedown :description, input_html: { preview: true, rows: 10 }
|
= f.pagedown :description, input_html: { preview: true, rows: 10 }
|
||||||
|
.mb-3
|
||||||
|
= f.label(:algorithm, class: 'form-label')
|
||||||
|
= f.collection_select(:algorithm, ProxyExercise.algorithms.map { |algorithm, _id| [t("activerecord.attributes.proxy_exercise.algorithm_type.#{algorithm}"), algorithm] }, :second, :first, {}, class: 'form-control form-control-sm')
|
||||||
.form-check.mb-3
|
.form-check.mb-3
|
||||||
label.form-check-label
|
label.form-check-label
|
||||||
= f.check_box(:public, class: 'form-check-input')
|
= f.check_box(:public, class: 'form-check-input')
|
||||||
|
@ -5,6 +5,7 @@ h1
|
|||||||
= row(label: 'exercise.title', value: @proxy_exercise.title)
|
= row(label: 'exercise.title', value: @proxy_exercise.title)
|
||||||
= row(label: 'exercise.user', value: link_to_if(policy(@proxy_exercise.author).show?, @proxy_exercise.author, @proxy_exercise.author))
|
= row(label: 'exercise.user', value: link_to_if(policy(@proxy_exercise.author).show?, @proxy_exercise.author, @proxy_exercise.author))
|
||||||
= row(label: 'proxy_exercise.files_count', value: @exercises.count)
|
= row(label: 'proxy_exercise.files_count', value: @exercises.count)
|
||||||
|
= row(label: 'proxy_exercise.algorithm', value: t("activerecord.attributes.proxy_exercise.algorithm_type.#{@proxy_exercise.algorithm}"))
|
||||||
= row(label: 'exercise.public', value: @proxy_exercise.public?)
|
= row(label: 'exercise.public', value: @proxy_exercise.public?)
|
||||||
= row(label: 'exercise.description', value: @proxy_exercise.description)
|
= row(label: 'exercise.description', value: @proxy_exercise.description)
|
||||||
= row(label: 'exercise.embedding_parameters', class: 'mb-4') do
|
= row(label: 'exercise.embedding_parameters', class: 'mb-4') do
|
||||||
|
@ -54,6 +54,10 @@ de:
|
|||||||
proxy_exercise:
|
proxy_exercise:
|
||||||
title: Title
|
title: Title
|
||||||
files_count: Anzahl der Aufgaben
|
files_count: Anzahl der Aufgaben
|
||||||
|
algorithm: Algorithmus
|
||||||
|
algorithm_type:
|
||||||
|
best_match: Beste Übereinstimmung
|
||||||
|
random: Zufällige Aufgabe
|
||||||
external_user:
|
external_user:
|
||||||
consumer: Konsument
|
consumer: Konsument
|
||||||
email: E-Mail
|
email: E-Mail
|
||||||
|
@ -54,6 +54,10 @@ en:
|
|||||||
proxy_exercise:
|
proxy_exercise:
|
||||||
title: Title
|
title: Title
|
||||||
files_count: Exercises Count
|
files_count: Exercises Count
|
||||||
|
algorithm: Algorithm
|
||||||
|
algorithm_type:
|
||||||
|
best_match: Best Match
|
||||||
|
random: Random Exercise
|
||||||
external_user:
|
external_user:
|
||||||
consumer: Consumer
|
consumer: Consumer
|
||||||
email: Email
|
email: Email
|
||||||
|
@ -0,0 +1,7 @@
|
|||||||
|
# frozen_string_literal: true
|
||||||
|
|
||||||
|
class AddAlgorithmToProxyExercise < ActiveRecord::Migration[7.0]
|
||||||
|
def change
|
||||||
|
add_column :proxy_exercises, :algorithm, :integer, limit: 1, null: false, default: 0, comment: 'Used as enum in Rails'
|
||||||
|
end
|
||||||
|
end
|
@ -10,7 +10,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended that you check this file into your version control system.
|
# It's strongly recommended that you check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema[7.0].define(version: 2022_12_06_221333) do
|
ActiveRecord::Schema[7.0].define(version: 2023_01_20_185807) do
|
||||||
# These are extensions that must be enabled in order to support this database
|
# These are extensions that must be enabled in order to support this database
|
||||||
enable_extension "pg_trgm"
|
enable_extension "pg_trgm"
|
||||||
enable_extension "pgcrypto"
|
enable_extension "pgcrypto"
|
||||||
@ -358,6 +358,7 @@ ActiveRecord::Schema[7.0].define(version: 2022_12_06_221333) do
|
|||||||
t.string "user_type"
|
t.string "user_type"
|
||||||
t.bigint "user_id"
|
t.bigint "user_id"
|
||||||
t.boolean "public", default: false, null: false
|
t.boolean "public", default: false, null: false
|
||||||
|
t.integer "algorithm", limit: 2, default: 0, null: false, comment: "Used as enum in Rails"
|
||||||
t.index ["user_type", "user_id"], name: "index_proxy_exercises_on_user_type_and_user_id"
|
t.index ["user_type", "user_id"], name: "index_proxy_exercises_on_user_type_and_user_id"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -5,5 +5,6 @@ FactoryBot.define do
|
|||||||
created_by_teacher
|
created_by_teacher
|
||||||
token { 'dummytoken' }
|
token { 'dummytoken' }
|
||||||
title { 'Dummy' }
|
title { 'Dummy' }
|
||||||
|
algorithm { 'best_match' }
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
Reference in New Issue
Block a user