Skip to content

Commit 766270a

Browse files
committed
Improve the form validation for the submission replaces form. Commit ready for merge.
- Legacy-Id: 9875
1 parent 6ccd96f commit 766270a

3 files changed

Lines changed: 37 additions & 8 deletions

File tree

ietf/submit/forms.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,22 @@ def cleaned_line(self):
254254
class ReplacesForm(forms.Form):
255255
replaces = SearchableDocAliasesField(required=False, help_text="Any drafts that this document replaces (approval required for replacing a draft you are not the author of)")
256256

257+
def __init__(self, *args, **kwargs):
258+
self.name = kwargs.pop("name")
259+
super(ReplacesForm, self).__init__(*args, **kwargs)
260+
261+
def clean_replaces(self):
262+
for alias in self.cleaned_data['replaces']:
263+
if alias.document.name == self.name:
264+
raise forms.ValidationError("A draft cannot replace itself.")
265+
if alias.document.type_id != "draft":
266+
raise forms.ValidationError("A draft can only replace another draft")
267+
if alias.document.get_state_slug() == "rfc":
268+
raise forms.ValidationError("A draft cannot replace an RFC")
269+
if alias.document.get_state_slug('draft-iesg') in ('approved','ann','rfcqueue'):
270+
raise forms.ValidationError(alias.name+" is approved by the IESG and cannot be replaced")
271+
return self.cleaned_data['replaces']
272+
257273
class EditSubmissionForm(forms.ModelForm):
258274
title = forms.CharField(required=True, max_length=255)
259275
rev = forms.CharField(label=u'Revision', max_length=2, required=True)

ietf/submit/tests.py

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,10 @@ def supply_extra_metadata(self, name, status_url, submitter_name, submitter_emai
102102
"replaces": replaces,
103103
})
104104

105-
submission = Submission.objects.get(name=name)
106-
self.assertEqual(submission.submitter, u"%s <%s>" % (submitter_name, submitter_email))
107-
self.assertEqual(submission.replaces, ",".join(d.name for d in DocAlias.objects.filter(pk__in=replaces.split(",") if replaces else [])))
105+
if r.status_code == 302:
106+
submission = Submission.objects.get(name=name)
107+
self.assertEqual(submission.submitter, u"%s <%s>" % (submitter_name, submitter_email))
108+
self.assertEqual(submission.replaces, ",".join(d.name for d in DocAlias.objects.filter(pk__in=replaces.split(",") if replaces else [])))
108109

109110
return r
110111

@@ -355,14 +356,26 @@ def test_submit_new_individual(self):
355356
self.assertEqual(new_revision.type, "new_revision")
356357
self.assertEqual(new_revision.by.name, "Submitter Name")
357358

358-
def test_submit_update_replacing_self(self):
359+
def test_submit_update_individual(self):
359360
draft = make_test_data()
360361
name = draft.name
361362
rev = '%02d'%(int(draft.rev)+1)
362363
status_url = self.do_submission(name,rev)
363364
mailbox_before = len(outbox)
364365
replaced_alias = draft.docalias_set.first()
365366
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.pk))
367+
self.assertEqual(r.status_code, 200)
368+
self.assertTrue('cannot replace itself' in r.content)
369+
replaced_alias = DocAlias.objects.get(name='draft-ietf-random-thing')
370+
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.pk))
371+
self.assertEqual(r.status_code, 200)
372+
self.assertTrue('cannot replace an RFC' in r.content)
373+
replaced_alias.document.set_state(State.objects.get(type='draft-iesg',slug='approved'))
374+
replaced_alias.document.set_state(State.objects.get(type='draft',slug='active'))
375+
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.pk))
376+
self.assertEqual(r.status_code, 200)
377+
self.assertTrue('approved by the IESG and cannot' in r.content)
378+
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces='')
366379
self.assertEqual(r.status_code, 302)
367380
status_url = r["Location"]
368381
r = self.client.get(status_url)

ietf/submit/views.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ def submission_status(request, submission_id, access_token=None):
165165

166166

167167
submitter_form = NameEmailForm(initial=submission.submitter_parsed(), prefix="submitter")
168-
replaces_form = ReplacesForm(initial=DocAlias.objects.filter(name__in=submission.replaces.split(",")))
168+
replaces_form = ReplacesForm(name=submission.name,initial=DocAlias.objects.filter(name__in=submission.replaces.split(",")))
169169

170170
if request.method == 'POST':
171171
action = request.POST.get('action')
@@ -174,7 +174,7 @@ def submission_status(request, submission_id, access_token=None):
174174
return HttpResponseForbidden("You do not have permission to perfom this action")
175175

176176
submitter_form = NameEmailForm(request.POST, prefix="submitter")
177-
replaces_form = ReplacesForm(request.POST)
177+
replaces_form = ReplacesForm(request.POST, name=submission.name)
178178
validations = [submitter_form.is_valid(), replaces_form.is_valid()]
179179
if all(validations):
180180
submission.submitter = submitter_form.cleaned_line()
@@ -311,7 +311,7 @@ def edit_submission(request, submission_id, access_token=None):
311311

312312
edit_form = EditSubmissionForm(request.POST, instance=submission, prefix="edit")
313313
submitter_form = NameEmailForm(request.POST, prefix="submitter")
314-
replaces_form = ReplacesForm(request.POST)
314+
replaces_form = ReplacesForm(request.POST,name=submission.name)
315315
author_forms = [ NameEmailForm(request.POST, email_required=False, prefix=prefix)
316316
for prefix in request.POST.getlist("authors-prefix")
317317
if prefix != "authors-" ]
@@ -352,7 +352,7 @@ def edit_submission(request, submission_id, access_token=None):
352352
else:
353353
edit_form = EditSubmissionForm(instance=submission, prefix="edit")
354354
submitter_form = NameEmailForm(initial=submission.submitter_parsed(), prefix="submitter")
355-
replaces_form = ReplacesForm(initial=DocAlias.objects.filter(name__in=submission.replaces.split(",")))
355+
replaces_form = ReplacesForm(name=submission.name,initial=DocAlias.objects.filter(name__in=submission.replaces.split(",")))
356356
author_forms = [ NameEmailForm(initial=author, email_required=False, prefix="authors-%s" % i)
357357
for i, author in enumerate(submission.authors_parsed()) ]
358358

0 commit comments

Comments
 (0)