From 59257d17f2bca876781c60bd7c072a617e816a0d Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Thu, 22 Nov 2018 19:16:03 +0100 Subject: [PATCH 1/2] Add user (ID and type) to proxy exercise This is required for the existing policies to work --- app/controllers/proxy_exercises_controller.rb | 4 ++-- app/models/proxy_exercise.rb | 10 ++++++++++ app/views/proxy_exercises/_form.html.slim | 4 ++++ app/views/proxy_exercises/index.html.slim | 6 +++++- app/views/proxy_exercises/show.html.slim | 5 ++++- .../20181119161514_add_user_to_proxy_exercise.rb | 9 +++++++++ db/schema.rb | 4 ++++ spec/factories/proxy_exercise.rb | 1 + 8 files changed, 39 insertions(+), 4 deletions(-) create mode 100644 db/migrate/20181119161514_add_user_to_proxy_exercise.rb diff --git a/app/controllers/proxy_exercises_controller.rb b/app/controllers/proxy_exercises_controller.rb index 40bd20ca..2f3534d8 100644 --- a/app/controllers/proxy_exercises_controller.rb +++ b/app/controllers/proxy_exercises_controller.rb @@ -9,7 +9,7 @@ class ProxyExercisesController < ApplicationController private :authorize! def clone - proxy_exercise = @proxy_exercise.duplicate(token: nil, exercises: @proxy_exercise.exercises) + proxy_exercise = @proxy_exercise.duplicate(public: false, token: nil, exercises: @proxy_exercise.exercises, user: current_user) proxy_exercise.send(:generate_token) if proxy_exercise.save redirect_to(proxy_exercise, notice: t('shared.object_cloned', model: ProxyExercise.model_name.human)) @@ -39,7 +39,7 @@ class ProxyExercisesController < ApplicationController end def proxy_exercise_params - params[:proxy_exercise].permit(:description, :title, :exercise_ids => []) if params[:proxy_exercise].present? + params[:proxy_exercise].permit(:description, :title, :public, :exercise_ids => []).merge(user_id: current_user.id, user_type: current_user.class.name) if params[:proxy_exercise].present? end private :proxy_exercise_params diff --git a/app/models/proxy_exercise.rb b/app/models/proxy_exercise.rb index 328fffa6..bb17b30a 100644 --- a/app/models/proxy_exercise.rb +++ b/app/models/proxy_exercise.rb @@ -1,11 +1,16 @@ class ProxyExercise < ApplicationRecord + include Creation + include DefaultValues after_initialize :generate_token after_initialize :set_reason + after_initialize :set_default_values has_and_belongs_to_many :exercises has_many :user_proxy_exercise_exercises + validates :public, boolean_presence: true + def count_files exercises.count end @@ -19,6 +24,11 @@ class ProxyExercise < ApplicationRecord end private :generate_token + def set_default_values + set_default_values_if_present(public: false) + end + private :set_default_values + def duplicate(attributes = {}) proxy_exercise = dup proxy_exercise.attributes = attributes diff --git a/app/views/proxy_exercises/_form.html.slim b/app/views/proxy_exercises/_form.html.slim index 601ef950..831fb17e 100644 --- a/app/views/proxy_exercises/_form.html.slim +++ b/app/views/proxy_exercises/_form.html.slim @@ -6,6 +6,10 @@ .form-group = f.label(:description) = f.pagedown :description, input_html: { preview: true, rows: 10 } + .form-check.mb-3 + label.form-check-label + = f.check_box(:public, class: 'form-check-input') + = t('activerecord.attributes.exercise.public') h3 Exercises .table-responsive diff --git a/app/views/proxy_exercises/index.html.slim b/app/views/proxy_exercises/index.html.slim index a2e7e460..198ff991 100644 --- a/app/views/proxy_exercises/index.html.slim +++ b/app/views/proxy_exercises/index.html.slim @@ -11,13 +11,17 @@ h1 = ProxyExercise.model_name.human(count: 2) tr th.p-1 = sort_link(@search, :title, t('activerecord.attributes.proxy_exercise.title')) th.p-1 = t('activerecord.attributes.exercise.token') + th.p-1 = t('activerecord.attributes.exercise.public') th.p-1 = t('activerecord.attributes.proxy_exercise.files_count') th.p-1 colspan=6 = t('shared.actions') tbody - @proxy_exercises.each do |proxy_exercise| tr data-id=proxy_exercise.id td.p-1.pt-2 = link_to(proxy_exercise.title,proxy_exercise) - td.p-1.pt-2 = proxy_exercise.token + td.p-1.pt-2 + code + = proxy_exercise.token + td.p-1.pt-2.public data-value=proxy_exercise.public? = symbol_for(proxy_exercise.public?) td.p-1.pt-2 = proxy_exercise.count_files td.p-1.pt-2 = link_to(t('shared.edit'), edit_proxy_exercise_path(proxy_exercise)) if policy(proxy_exercise).edit? diff --git a/app/views/proxy_exercises/show.html.slim b/app/views/proxy_exercises/show.html.slim index 07f5061a..4868443c 100644 --- a/app/views/proxy_exercises/show.html.slim +++ b/app/views/proxy_exercises/show.html.slim @@ -11,9 +11,12 @@ h1 = render('shared/edit_button', object: @proxy_exercise) = 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: 'proxy_exercise.files_count', value: @exercises.count) += row(label: 'exercise.public', value: @proxy_exercise.public?) = row(label: 'exercise.description', value: @proxy_exercise.description) -= row(label: 'exercise.token', value: @proxy_exercise.token) += row(label: 'exercise.embedding_parameters', class: 'mb-4') do + = content_tag(:input, nil, class: 'form-control mb-4', readonly: true, value: embedding_parameters(@proxy_exercise)) h2.mt-4 Exercises .table-responsive diff --git a/db/migrate/20181119161514_add_user_to_proxy_exercise.rb b/db/migrate/20181119161514_add_user_to_proxy_exercise.rb new file mode 100644 index 00000000..d250117b --- /dev/null +++ b/db/migrate/20181119161514_add_user_to_proxy_exercise.rb @@ -0,0 +1,9 @@ +class AddUserToProxyExercise < ActiveRecord::Migration[5.2] + def change + add_reference :proxy_exercises, :user, polymorphic: true, index: true + add_column :proxy_exercises, :public, :boolean, null: false, default: false + + internal_user = InternalUser.find_by(id: 46) + ProxyExercise.update_all(user_id: internal_user.id, user_type: internal_user.class.name) + end +end diff --git a/db/schema.rb b/db/schema.rb index 82ec19bf..5ee3a783 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -263,6 +263,10 @@ ActiveRecord::Schema.define(version: 2018_11_29_093207) do t.string "token" t.datetime "created_at" t.datetime "updated_at" + t.string "user_type" + t.bigint "user_id" + t.boolean "public" + t.index ["user_type", "user_id"], name: "index_proxy_exercises_on_user_type_and_user_id" end create_table "remote_evaluation_mappings", force: :cascade do |t| diff --git a/spec/factories/proxy_exercise.rb b/spec/factories/proxy_exercise.rb index 3927541f..3118da81 100644 --- a/spec/factories/proxy_exercise.rb +++ b/spec/factories/proxy_exercise.rb @@ -1,5 +1,6 @@ FactoryBot.define do factory :proxy_exercise, class: ProxyExercise do + created_by_teacher token { 'dummytoken' } title { 'Dummy' } end From f0a462e3b8f3b58952720109f1d364e43e9aca5b Mon Sep 17 00:00:00 2001 From: Sebastian Serth Date: Thu, 13 Dec 2018 14:30:21 +0100 Subject: [PATCH 2/2] Ensure that migration will always succeed --- db/migrate/20181119161514_add_user_to_proxy_exercise.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/db/migrate/20181119161514_add_user_to_proxy_exercise.rb b/db/migrate/20181119161514_add_user_to_proxy_exercise.rb index d250117b..983ce778 100644 --- a/db/migrate/20181119161514_add_user_to_proxy_exercise.rb +++ b/db/migrate/20181119161514_add_user_to_proxy_exercise.rb @@ -3,7 +3,7 @@ class AddUserToProxyExercise < ActiveRecord::Migration[5.2] add_reference :proxy_exercises, :user, polymorphic: true, index: true add_column :proxy_exercises, :public, :boolean, null: false, default: false - internal_user = InternalUser.find_by(id: 46) + internal_user = InternalUser.find_by(id: 46) || InternalUser.first ProxyExercise.update_all(user_id: internal_user.id, user_type: internal_user.class.name) end end