Fixed some name versus pk issues lingering after the Document/DocAlias primary key refactoring. Fixes issue #2729.

- Legacy-Id: 16288
This commit is contained in:
Henrik Levkowetz 2019-06-19 12:57:52 +00:00
parent 7270d5f67a
commit db12f2b948
11 changed files with 81 additions and 59 deletions

View file

@ -110,7 +110,7 @@ class CommunityListTests(TestCase):
self.assertEqual(r.status_code, 200)
# add document
r = self.client.post(url, { "action": "add_documents", "documents": draft.name })
r = self.client.post(url, { "action": "add_documents", "documents": draft.pk })
self.assertEqual(r.status_code, 302)
clist = CommunityList.objects.get(user__username="plain")
self.assertTrue(clist.added_docs.filter(pk=draft.pk))

View file

@ -57,6 +57,7 @@ class SearchableDocumentsField(forms.CharField):
value = str(value)
if isinstance(value, basestring):
items = self.parse_select2_value(value)
# accept both names and pks here
names = [ i for i in items if not i.isdigit() ]
ids = [ i for i in items if i.isdigit() ]
value = self.model.objects.filter(Q(name__in=names)|Q(id__in=ids))
@ -82,14 +83,14 @@ class SearchableDocumentsField(forms.CharField):
def clean(self, value):
value = super(SearchableDocumentsField, self).clean(value)
names = self.parse_select2_value(value)
pks = self.parse_select2_value(value)
objs = self.model.objects.filter(name__in=names)
objs = self.model.objects.filter(pk__in=pks)
found_names = [str(o.name) for o in objs]
failed_names = [x for x in names if x not in found_names]
if failed_names:
raise forms.ValidationError(u"Could not recognize the following documents: {names}. You can only input documents already registered in the Datatracker.".format(names=", ".join(failed_names)))
found_pks = [ str(o.pk) for o in objs ]
failed_pks = [ x for x in pks if x not in found_pks ]
if failed_pks:
raise forms.ValidationError(u"Could not recognize the following documents: {names}. You can only input documents already registered in the Datatracker.".format(names=", ".join(failed_pks)))
if self.max_entries != None and len(objs) > self.max_entries:
raise forms.ValidationError(u"You can select at most %s entries." % self.max_entries)

View file

@ -9,7 +9,7 @@ from pyquery import PyQuery
import debug # pyflakes:ignore
from ietf.doc.factories import WgDraftFactory, WgRfcFactory
from ietf.doc.models import Document, DocAlias, RelatedDocument, State
from ietf.doc.models import RelatedDocument, State
from ietf.person.factories import PersonFactory
from ietf.utils.test_utils import TestCase
from ietf.utils.test_utils import login_testing_unauthorized, unicontent
@ -18,10 +18,13 @@ class Downref(TestCase):
def setUp(self):
PersonFactory(name='Plain Man',user__username='plain')
WgDraftFactory(name='draft-ietf-mars-test')
doc = WgDraftFactory(name='draft-ietf-mars-approved-document',states=[('draft-iesg','rfcqueue')])
rfc = WgRfcFactory(alias2__name='rfc9998')
RelatedDocument.objects.create(source=doc, target=rfc.docalias.get(name='rfc9998'),relationship_id='downref-approval')
self.draft = WgDraftFactory(name='draft-ietf-mars-test')
self.draftalias = self.draft.docalias.get(name='draft-ietf-mars-test')
self.doc = WgDraftFactory(name='draft-ietf-mars-approved-document',states=[('draft-iesg','rfcqueue')])
self.docalias = self.doc.docalias.get(name='draft-ietf-mars-approved-document')
self.rfc = WgRfcFactory(alias2__name='rfc9998')
self.rfcalias = self.rfc.docalias.get(name='rfc9998')
RelatedDocument.objects.create(source=self.doc, target=self.rfcalias, relationship_id='downref-approval')
def test_downref_registry(self):
url = urlreverse('ietf.doc.views_downref.downref_registry')
@ -71,7 +74,7 @@ class Downref(TestCase):
self.assertTrue('Save downref' in content)
# error - already in the downref registry
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-approved-document', )))
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.doc.pk, )))
self.assertEqual(r.status_code, 200)
content = unicontent(r)
self.assertTrue('Downref is already in the registry' in content)
@ -79,40 +82,38 @@ class Downref(TestCase):
# error - source is not in an approved state
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-test', )))
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draft.pk, )))
self.assertEqual(r.status_code, 200)
content = unicontent(r)
self.assertTrue('Draft is not yet approved' in content)
# error - the target is not a normative reference of the source
draft = Document.objects.get(name="draft-ietf-mars-test")
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub"))
self.draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-test', )))
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draft.pk, )))
self.assertEqual(r.status_code, 200)
content = unicontent(r)
self.assertTrue('There does not seem to be a normative reference to RFC' in content)
self.assertTrue('Save downref anyway' in content)
# normal - approve the document so the downref is now okay
rfc = DocAlias.objects.get(name="rfc9998")
RelatedDocument.objects.create(source=draft, target=rfc, relationship_id='refnorm')
draft_de_count_before = draft.docevent_set.count()
rfc_de_count_before = rfc.document.docevent_set.count()
RelatedDocument.objects.create(source=self.draft, target=self.rfcalias, relationship_id='refnorm')
draft_de_count_before = self.draft.docevent_set.count()
rfc_de_count_before = self.rfc.docevent_set.count()
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-test', )))
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draft.pk, )))
self.assertEqual(r.status_code, 302)
newurl = urlreverse('ietf.doc.views_downref.downref_registry')
r = self.client.get(newurl)
self.assertEqual(r.status_code, 200)
content = unicontent(r)
self.assertTrue('<a href="/doc/draft-ietf-mars-test' in content)
self.assertTrue(RelatedDocument.objects.filter(source=draft, target=rfc, relationship_id='downref-approval'))
self.assertEqual(draft.docevent_set.count(), draft_de_count_before + 1)
self.assertEqual(rfc.document.docevent_set.count(), rfc_de_count_before + 1)
self.assertTrue(RelatedDocument.objects.filter(source=self.draft, target=self.rfcalias, relationship_id='downref-approval'))
self.assertEqual(self.draft.docevent_set.count(), draft_de_count_before + 1)
self.assertEqual(self.rfc.docevent_set.count(), rfc_de_count_before + 1)
def test_downref_last_call(self):
draft = WgDraftFactory(name='draft-ietf-mars-ready-for-lc-document',intended_std_level_id='ps',states=[('draft-iesg','iesg-eva')])

View file

@ -1574,7 +1574,7 @@ class ChangeReplacesTests(TestCase):
RelatedDocument.objects.create(source=self.replacea, target=self.basea.docalias.first(),
relationship=DocRelationshipName.objects.get(slug="possibly-replaces"))
self.assertEqual(self.basea.get_state().slug,'active')
r = self.client.post(url, dict(replaces=self.basea.name))
r = self.client.post(url, dict(replaces=self.basea.pk))
self.assertEqual(r.status_code, 302)
self.assertEqual(RelatedDocument.objects.filter(relationship__slug='replaces',source=self.replacea).count(),1)
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
@ -1588,7 +1588,7 @@ class ChangeReplacesTests(TestCase):
# Post that says replaceboth replaces both base a and base b
url = urlreverse('ietf.doc.views_draft.replaces', kwargs=dict(name=self.replaceboth.name))
self.assertEqual(self.baseb.get_state().slug,'expired')
r = self.client.post(url, dict(replaces=self.basea.name + "," + self.baseb.name))
r = self.client.post(url, dict(replaces='%s,%s' % (self.basea.pk, self.baseb.pk)))
self.assertEqual(r.status_code, 302)
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
self.assertEqual(Document.objects.get(name='draft-test-base-b').get_state().slug,'repl')
@ -1647,7 +1647,7 @@ class MoreReplacesTests(TestCase):
new_doc = IndividualDraftFactory(stream_id=stream)
url = urlreverse('ietf.doc.views_draft.replaces', kwargs=dict(name=new_doc.name))
r = self.client.post(url, dict(replaces=old_doc.name))
r = self.client.post(url, dict(replaces=old_doc.pk))
self.assertEqual(r.status_code,302)
old_doc = Document.objects.get(name=old_doc.name)
self.assertEqual(old_doc.get_state_slug('draft'),'repl')

View file

@ -45,6 +45,9 @@ def group_urlreverse_list(group, viewname):
]
def pklist(docs):
return [ str(doc.pk) for doc in docs.all() ]
class GroupPagesTests(TestCase):
def setUp(self):
self.charter_dir = self.tempdir('charter')
@ -811,7 +814,7 @@ class MilestoneTests(TestCase):
milestones_before = GroupMilestone.objects.count()
events_before = group.groupevent_set.count()
docs = Document.objects.filter(type="draft").values_list("name", flat=True)
doc_pks = pklist(Document.objects.filter(type="draft"))
due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))
@ -821,7 +824,7 @@ class MilestoneTests(TestCase):
'm-1-desc': "", # no description
'm-1-due': due.strftime("%B %Y"),
'm-1-resolved': "",
'm-1-docs': ",".join(docs),
'm-1-docs': ",".join(doc_pks),
'action': "save",
})
self.assertEqual(r.status_code, 200)
@ -836,7 +839,7 @@ class MilestoneTests(TestCase):
'm-1-desc': "Test 3",
'm-1-due': due.strftime("%B %Y"),
'm-1-resolved': "",
'm-1-docs': ",".join(docs),
'm-1-docs': ",".join(doc_pks),
'action': "save",
})
self.assertEqual(r.status_code, 302)
@ -847,7 +850,7 @@ class MilestoneTests(TestCase):
self.assertEqual(m.state_id, "active")
self.assertEqual(m.due, due)
self.assertEqual(m.resolved, "")
self.assertEqual(set(m.docs.values_list("name", flat=True)), set(docs))
self.assertEqual(set(pklist(m.docs)), set(doc_pks))
self.assertTrue("Added milestone" in m.milestonegroupevent_set.all()[0].desc)
self.assertEqual(len(outbox),mailbox_before+2)
self.assertFalse(any('Review Required' in x['Subject'] for x in outbox[-2:]))
@ -913,7 +916,7 @@ class MilestoneTests(TestCase):
'm1-desc': m1.desc,
'm1-due': m1.due.strftime("%B %Y"),
'm1-resolved': m1.resolved,
'm1-docs': ",".join(m1.docs.values_list("name", flat=True)),
'm1-docs': ",".join(pklist(m1.docs)),
'm1-review': "accept",
'action': "save",
})
@ -939,7 +942,7 @@ class MilestoneTests(TestCase):
'm1-desc': m1.desc,
'm1-due': m1.due.strftime("%B %Y"),
'm1-resolved': "",
'm1-docs': ",".join(m1.docs.values_list("name", flat=True)),
'm1-docs': ",".join(pklist(m1.docs)),
'm1-delete': "checked",
'action': "save",
})
@ -959,7 +962,7 @@ class MilestoneTests(TestCase):
milestones_before = GroupMilestone.objects.count()
events_before = group.groupevent_set.count()
docs = Document.objects.filter(type="draft").values_list("name", flat=True)
doc_pks = pklist(Document.objects.filter(type="draft"))
due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))
@ -969,7 +972,7 @@ class MilestoneTests(TestCase):
'm1-desc': "", # no description
'm1-due': due.strftime("%B %Y"),
'm1-resolved': "",
'm1-docs': ",".join(docs),
'm1-docs': ",".join(doc_pks),
'action': "save",
})
self.assertEqual(r.status_code, 200)
@ -987,7 +990,7 @@ class MilestoneTests(TestCase):
'm1-due': due.strftime("%B %Y"),
'm1-resolved': "Done",
'm1-resolved_checkbox': "checked",
'm1-docs': ",".join(docs),
'm1-docs': ",".join(doc_pks),
'action': "save",
})
self.assertEqual(r.status_code, 302)
@ -998,7 +1001,7 @@ class MilestoneTests(TestCase):
self.assertEqual(m.state_id, "active")
self.assertEqual(m.due, due)
self.assertEqual(m.resolved, "Done")
self.assertEqual(set(m.docs.values_list("name", flat=True)), set(docs))
self.assertEqual(set(pklist(m.docs)), set(doc_pks))
self.assertTrue("Changed milestone" in m.milestonegroupevent_set.all()[0].desc)
self.assertEqual(len(outbox), mailbox_before + 2)
self.assertTrue("Milestones changed" in outbox[-2]["Subject"])

View file

@ -384,7 +384,7 @@ class IetfAuthTests(TestCase):
# wish to review
r = self.client.post(url, {
"action": "add_wish",
'doc': doc.name,
'doc': doc.pk,
"team": review_req.team_id,
})
self.assertEqual(r.status_code, 302)

View file

@ -1,3 +1,6 @@
# Copyright The IETF Trust 2014-2019, All Rights Reserved
# -*- coding: utf-8 -*-
import json
from django.utils.html import escape
@ -36,6 +39,12 @@ class SearchableIprDisclosuresField(forms.CharField):
def parse_select2_value(self, value):
return [x.strip() for x in value.split(",") if x.strip()]
def check_pks(self, pks):
for pk in pks:
if not pk.isdigit():
raise forms.ValidationError("Unexpected value: %s" % pk)
return pks
def prepare_value(self, value):
if not value:
value = ""
@ -59,7 +68,7 @@ class SearchableIprDisclosuresField(forms.CharField):
def clean(self, value):
value = super(SearchableIprDisclosuresField, self).clean(value)
pks = self.parse_select2_value(value)
pks = self.check_pks(self.parse_select2_value(value))
if not all([ key.isdigit() for key in pks ]):
raise forms.ValidationError(u'You must enter IPR ID(s) as integers')

View file

@ -263,9 +263,9 @@ class IprTests(TestCase):
"ietfer_contact_info": "555-555-0101",
"iprdocrel_set-TOTAL_FORMS": 2,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
"iprdocrel_set-0-revisions": '00',
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name,
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
"patent_number": "SE12345678901",
"patent_inventor": "A. Nonymous",
"patent_title": "A method of transfering bits",
@ -306,9 +306,9 @@ class IprTests(TestCase):
"ietfer_contact_info": "555-555-0101",
"iprdocrel_set-TOTAL_FORMS": 2,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
"iprdocrel_set-0-revisions": '00',
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name,
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
"patent_number": "SE12345678901",
"patent_inventor": "A. Nonymous",
"patent_title": "A method of transfering bits",
@ -354,7 +354,7 @@ class IprTests(TestCase):
"holder_legal_name": "Test Legal",
"ietfer_contact_info": "555-555-0101",
"ietfer_name": "Test Participant",
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
"iprdocrel_set-0-revisions": '00',
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-TOTAL_FORMS": 1,
@ -403,9 +403,9 @@ class IprTests(TestCase):
"ietfer_contact_info": "555-555-0101",
"iprdocrel_set-TOTAL_FORMS": 2,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
"iprdocrel_set-0-revisions": '00',
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name,
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
"patent_number": "SE12345678901",
"patent_inventor": "A. Nonymous",
"patent_title": "A method of transfering bits",
@ -441,7 +441,7 @@ class IprTests(TestCase):
"holder_contact_email": "test@holder.com",
"iprdocrel_set-TOTAL_FORMS": 1,
"iprdocrel_set-INITIAL_FORMS": 0,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
"iprdocrel_set-0-revisions": '00',
"patent_number": "SE12345678901",
"patent_inventor": "A. Nonymous",
@ -630,7 +630,7 @@ Subject: test
'iprdocrel_set-TOTAL_FORMS' : 1,
'iprdocrel_set-INITIAL_FORMS' : 1,
'iprdocrel_set-0-id': disclosure.pk,
"iprdocrel_set-0-document": disclosure.docs.first().name,
"iprdocrel_set-0-document": disclosure.docs.first().pk,
"iprdocrel_set-0-revisions": disclosure.docs.first().document.rev,
'holder_legal_name': disclosure.holder_legal_name,
'patent_number': patent_dict['Number'],

View file

@ -1,3 +1,6 @@
# Copyright The IETF Trust 2014-2019, All Rights Reserved
# -*- coding: utf-8 -*-
import json
from django.utils.html import escape
@ -35,6 +38,12 @@ class SearchableLiaisonStatementsField(forms.CharField):
def parse_select2_value(self, value):
return [x.strip() for x in value.split(",") if x.strip()]
def check_pks(self, pks):
for pk in pks:
if not pk.isdigit():
raise forms.ValidationError("Unexpected value: %s" % pk)
return pks
def prepare_value(self, value):
if not value:
value = ""
@ -56,7 +65,7 @@ class SearchableLiaisonStatementsField(forms.CharField):
def clean(self, value):
value = super(SearchableLiaisonStatementsField, self).clean(value)
pks = self.parse_select2_value(value)
pks = self.check_pks(self.parse_select2_value(value))
objs = self.model.objects.filter(pk__in=pks)

View file

@ -761,13 +761,13 @@ class SessionDetailsTests(TestCase):
self.assertEqual(r.status_code, 200)
self.assertTrue(old_draft.name in unicontent(r))
r = self.client.post(url,dict(drafts=[new_draft.name,old_draft.name]))
r = self.client.post(url,dict(drafts=[new_draft.pk, old_draft.pk]))
self.assertTrue(r.status_code, 200)
q = PyQuery(r.content)
self.assertTrue("Already linked:" in q('form .alert-danger').text())
self.assertEqual(1,session.sessionpresentation_set.count())
r = self.client.post(url,dict(drafts=[new_draft.name,]))
r = self.client.post(url,dict(drafts=[new_draft.pk,]))
self.assertTrue(r.status_code, 302)
self.assertEqual(2,session.sessionpresentation_set.count())

View file

@ -181,7 +181,7 @@ class SubmitTests(TestCase):
if r.status_code == 302:
submission = Submission.objects.get(name=name)
self.assertEqual(submission.submitter, email.utils.formataddr((submitter_name, submitter_email)))
self.assertEqual(submission.replaces, ",".join(d.name for d in DocAlias.objects.filter(name__in=replaces.split(",") if replaces else [])))
self.assertEqual(submission.replaces, ",".join(d.name for d in DocAlias.objects.filter(pk__in=replaces.split(",") if replaces else [])))
return r
@ -237,7 +237,7 @@ class SubmitTests(TestCase):
mailbox_before = len(outbox)
replaced_alias = draft.docalias.first()
r = self.supply_extra_metadata(name, status_url, author.ascii, author.email().address.lower(),
replaces=str(replaced_alias.name) + "," + str(sug_replaced_alias.name))
replaces=str(replaced_alias.pk) + "," + str(sug_replaced_alias.pk))
self.assertEqual(r.status_code, 302)
status_url = r["Location"]
@ -594,16 +594,16 @@ class SubmitTests(TestCase):
status_url, author = self.do_submission(name,rev)
mailbox_before = len(outbox)
replaced_alias = draft.docalias.first()
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.name))
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.pk))
self.assertEqual(r.status_code, 200)
self.assertTrue('cannot replace itself' in unicontent(r))
replaced_alias = DocAlias.objects.get(name='draft-ietf-random-thing')
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.name))
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.pk))
self.assertEqual(r.status_code, 200)
self.assertTrue('cannot replace an RFC' in unicontent(r))
replaced_alias.document.set_state(State.objects.get(type='draft-iesg',slug='approved'))
replaced_alias.document.set_state(State.objects.get(type='draft',slug='active'))
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.name))
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.pk))
self.assertEqual(r.status_code, 200)
self.assertTrue('approved by the IESG and cannot' in unicontent(r))
r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces='')
@ -737,7 +737,7 @@ class SubmitTests(TestCase):
"edit-pages": "123",
"submitter-name": "Some Random Test Person",
"submitter-email": "random@example.com",
"replaces": str(draft.docalias.first().name),
"replaces": str(draft.docalias.first().pk),
"edit-note": "no comments",
"authors-0-name": "Person 1",
"authors-0-email": "person1@example.com",
@ -745,7 +745,6 @@ class SubmitTests(TestCase):
"authors-1-email": "person2@example.com",
"authors-2-name": "Person 3",
"authors-2-email": "",
"authors-prefix": ["authors-", "authors-0", "authors-1", "authors-2"],
})
self.assertNoFormPostErrors(r, ".has-error,.alert-danger")