Skip to content

Commit eea739d

Browse files
authored
Don't validate submissions during deletion. (#1995)
* Don't validate submissions during deletion.
1 parent 803be79 commit eea739d

File tree

4 files changed

+48
-37
lines changed

4 files changed

+48
-37
lines changed

app/controllers/admin/submissions_controller.rb

Lines changed: 13 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -186,31 +186,29 @@ def unmark
186186
def delete
187187
ensure_form_manager(form: @form)
188188

189-
if @submission.update(deleted: true, deleted_at: Time.now)
190-
Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} deleted at #{DateTime.now}", current_user.id)
191-
else
192-
Rails.logger.warn("Failed to delete submission: #{@submission.errors.full_messages.join(', ')}")
193-
end
189+
Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} deleted at #{DateTime.now}", current_user.id)
190+
@submission.assign_attributes(deleted: true, deleted_at: Time.now)
191+
@submission.save(validate: false)
194192
end
195193

196194
def destroy
197195
ensure_form_manager(form: @form)
198196

199-
if @submission.update(deleted: true, deleted_at: Time.now)
200-
Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} deleted at #{DateTime.now}", current_user.id)
201-
respond_to do |format|
202-
format.js { render :destroy }
203-
end
204-
else
205-
Rails.logger.warn("Failed to delete submission: #{@submission.errors.full_messages.join(', ')}")
197+
Event.log_event(Event.names[:response_deleted], 'Submission', @submission.id, "Submission #{@submission.id} deleted at #{DateTime.now}", current_user.id)
198+
@submission.assign_attributes(deleted: true, deleted_at: Time.now)
199+
@submission.save(validate: false)
200+
201+
respond_to do |format|
202+
format.js { render :destroy }
206203
end
207204
end
208205

209206
def undelete
210207
ensure_form_manager(form: @form)
211208

212209
Event.log_event(Event.names[:response_undeleted], 'Submission', @submission.id, "Submission #{@submission.id} undeleted at #{DateTime.now}", current_user.id)
213-
@submission.update(deleted: false, deleted_at: nil)
210+
@submission.assign_attributes(deleted: false, deleted_at: nil)
211+
@submission.save(validate: false)
214212
end
215213

216214
def feed
@@ -302,7 +300,8 @@ def bulk_update
302300
when 'delete'
303301
submissions.each do |submission|
304302
Event.log_event(Event.names[:response_deleted], 'Submission', submission.id, "Submission #{submission.id} deleted at #{DateTime.now}", current_user.id)
305-
submission.update(deleted: true, deleted_at: Time.now)
303+
submission.assign_attributes(deleted: true, deleted_at: Time.now)
304+
submission.save(validate: false)
306305
end
307306
flash[:notice] = "#{view_context.pluralize(submissions.count, 'Submission')} deleted."
308307
else

app/models/submission.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ class Submission < ApplicationRecord
66
belongs_to :form, counter_cache: :response_count
77
attr_accessor :fba_directive # for SPAM capture
88

9-
validate :validate_custom_form
9+
validate :validate_answers, on: :create
1010
validates :uuid, uniqueness: true
1111

1212
before_create :set_uuid
@@ -47,7 +47,7 @@ class Submission < ApplicationRecord
4747
end
4848

4949
# Validate each submitted field against its question type
50-
def validate_custom_form
50+
def validate_answers
5151
# Isolate questions that were answered
5252
answered_questions = attributes.select { |_key, value| value.present? }
5353

spec/controllers/admin/submissions_controller_spec.rb

Lines changed: 31 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -9,28 +9,27 @@
99
let!(:user_role) { FactoryBot.create(:user_role, user: admin, form:, role: UserRole::Role::FormManager) }
1010
let!(:questions) {
1111
FactoryBot.create(:question,
12-
form:,
13-
question_type: 'text_field',
14-
form_section: form.form_sections.first,
15-
answer_field: 'answer_02',
16-
position: 2,
17-
text: 'Two'
12+
form:,
13+
question_type: 'text_field',
14+
form_section: form.form_sections.first,
15+
answer_field: 'answer_02',
16+
position: 2,
17+
text: 'Two',
1818
)
1919
FactoryBot.create(:question,
20-
form:,
21-
question_type: 'text_field',
22-
form_section: form.form_sections.first,
23-
answer_field: 'answer_03',
24-
position: 3,
25-
text: 'Three'
20+
form:,
21+
question_type: 'text_field',
22+
form_section: form.form_sections.first,
23+
answer_field: 'answer_03',
24+
position: 3,
25+
text: 'Three',
2626
)
2727
FactoryBot.create(:question,
28-
form:,
29-
question_type: 'text_field',
30-
form_section: form.form_sections.first,
31-
answer_field: 'answer_04',
32-
position: 4,
33-
text: 'Four'
28+
:email,
29+
form:,
30+
form_section: form.form_sections.first,
31+
answer_field: 'answer_04',
32+
position: 4,
3433
)
3534

3635
}
@@ -47,10 +46,11 @@
4746

4847
let(:invalid_attributes) do
4948
{
49+
form_id: form.id,
5050
answer_01: nil,
5151
answer_02: 'James',
5252
answer_03: 'Madison',
53-
answer_04: nil,
53+
answer_04: 'not_an_email',
5454
}
5555
end
5656

@@ -99,6 +99,18 @@
9999
end.to change { Submission.active.count }.by(-1)
100100
end
101101

102+
it 'deletes the requested submission even if it has invalid answers' do
103+
expect { Submission.create! invalid_attributes }.to raise_error(ActiveRecord::RecordInvalid)
104+
105+
submission = Submission.create! valid_attributes
106+
submission.assign_attributes(invalid_attributes)
107+
submission.save(validate: false)
108+
109+
expect do
110+
delete :delete, params: { id: submission.to_param, form_id: form.short_uuid }, session: valid_session, format: :js
111+
end.to change { Submission.active.count }.by(-1)
112+
end
113+
102114
it 'redirects to the submissions list' do
103115
submission = Submission.create! valid_attributes
104116
delete :destroy, params: { id: submission.to_param, form_id: form.short_uuid }, session: valid_session, format: :js

spec/features/admin/submissions_spec.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,9 +103,9 @@
103103
visit admin_form_submission_path(form, submission)
104104
end
105105

106-
it 'try to update a submission that has had its question validations changed' do
106+
it 'can update status of a submission that has had its question validations changed' do
107107
click_on("Acknowledge")
108-
expect(page).to have_content("Response could not be updated.")
108+
expect(page).to have_content("Response was successfully updated.")
109109
end
110110
end
111111
end

0 commit comments

Comments
 (0)