diff --git a/Changelog.md b/Changelog.md index e096873ab6..7120f92a3e 100644 --- a/Changelog.md +++ b/Changelog.md @@ -11,6 +11,7 @@ - Update autotest settings form UI (#7777) - Store start and end date for courses (#7783) - Update batch test runs table UI (#7790) +- Remove QR code name size limit (#7796) ### 🐛 Bug fixes - Fixed the editing form of marking schemes to include newly added assessments (#7788) diff --git a/app/controllers/exam_templates_controller.rb b/app/controllers/exam_templates_controller.rb index 3a90083db4..bd07dc41dc 100644 --- a/app/controllers/exam_templates_controller.rb +++ b/app/controllers/exam_templates_controller.rb @@ -35,7 +35,8 @@ def create redirect_to edit_course_exam_template_path(current_course, exam_template) return else - flash_message(:error, t('exam_templates.create.failure')) + errors = exam_template&.errors&.full_messages&.join(', ') + flash_message(:error, t('exam_templates.create.failure', errors: errors.present? ? ": #{errors}" : '')) end end redirect_to course_assignment_exam_templates_path(current_course, assignment) @@ -71,7 +72,8 @@ def update if old_exam_template.update(exam_template_params) flash_message(:success, t('exam_templates.update.success')) else - flash_message(:error, t('exam_templates.update.failure')) + errors = old_exam_template.errors.full_messages.join(', ') + flash_message(:error, t('exam_templates.update.failure', errors: errors.present? ? ": #{errors}" : '')) end else new_template_filename = new_uploaded_io.original_filename diff --git a/app/models/exam_template.rb b/app/models/exam_template.rb index b75932fc05..cdb86067c7 100644 --- a/app/models/exam_template.rb +++ b/app/models/exam_template.rb @@ -8,7 +8,8 @@ class ExamTemplate < ApplicationRecord has_one :course, through: :assignment validates :filename, :num_pages, :name, presence: true validates :name, - uniqueness: { scope: :assignment } + uniqueness: { scope: :assignment }, + length: { maximum: 20, message: 'must be at most 20 characters' } validates :num_pages, numericality: { greater_than_or_equal_to: 0, only_integer: true } diff --git a/config/locales/views/exam_templates/en.yml b/config/locales/views/exam_templates/en.yml index b00c3cd1ed..b4b887603e 100644 --- a/config/locales/views/exam_templates/en.yml +++ b/config/locales/views/exam_templates/en.yml @@ -29,7 +29,7 @@ en: create: add_division: Add Template Division add_new: Add Exam Template - failure: Exam Template not successfully created + failure: Exam Template not successfully created%{errors} success: Exam Template successfully created upload: Upload Template delete: @@ -94,7 +94,7 @@ en: scan_error: Some files have not been scanned properly. submission_in_progress: Scanning QR codes done, now preparing PDF pages for grading update: - failure: Exam Template has not been successfully updated + failure: Exam Template has not been successfully updated%{errors} instruction: Replace template file success: Exam Template has been successfully updated upload_scans: diff --git a/spec/controllers/exam_templates_controller_spec.rb b/spec/controllers/exam_templates_controller_spec.rb index 756713f4b4..833526a0ef 100644 --- a/spec/controllers/exam_templates_controller_spec.rb +++ b/spec/controllers/exam_templates_controller_spec.rb @@ -22,6 +22,24 @@ it('should respond with 302') { expect(response).to have_http_status :found } end + describe '#create with a name that is too long' do + let(:file_io) { fixture_file_upload('scanned_exams/midterm1-v2-test.pdf', 'application/pdf') } + let(:params) do + { create_template: { file_io: file_io, name: 'Test_Midterm_Exam_Template_V2' }, + assignment_id: exam_template.assignment.id, course_id: course.id } + end + + before { post_as user, :create, params: params } + + it 'does not create an ExamTemplate' do + expect(ExamTemplate.find_by(name: 'Test_Midterm_Exam_Template_V2')).to be_nil + end + + it 'displays a flash error about name length' do + expect(flash[:error].first).to include('Name must be at most 20 characters') + end + end + describe '#create with empty filename' do let(:file_io) { fixture_file_upload('scanned_exams/midterm1-v2-test.pdf', 'application/pdf') } let(:params) do @@ -84,6 +102,26 @@ end end + context 'when updating with a name that is too long' do + let(:params) do + { exam_template: { name: 'Test_Midterm_Exam_Template_V2' }, + id: exam_template.id, course_id: course.id } + end + + it 'does not update the exam template name' do + original_name = exam_template.name + expect(exam_template.reload.name).to eq original_name + end + + it 'displays a flash error about name length' do + expect(flash[:error].first).to include('Name must be at most 20 characters') + end + + it 'responds with 302' do + expect(response).to have_http_status :found + end + end + context 'when replacing the exam template file with a PDF file' do let(:file_io) { fixture_file_upload('scanned_exams/midterm1-v2-test.pdf') } let(:params) do