Skip to content

Commit db12f2b

Browse files
committed
Fixed some name versus pk issues lingering after the Document/DocAlias primary key refactoring. Fixes issue ietf-tools#2729.
- Legacy-Id: 16288
1 parent 7270d5f commit db12f2b

11 files changed

Lines changed: 81 additions & 59 deletions

File tree

ietf/community/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ def test_manage_personal_list(self):
110110
self.assertEqual(r.status_code, 200)
111111

112112
# add document
113-
r = self.client.post(url, { "action": "add_documents", "documents": draft.name })
113+
r = self.client.post(url, { "action": "add_documents", "documents": draft.pk })
114114
self.assertEqual(r.status_code, 302)
115115
clist = CommunityList.objects.get(user__username="plain")
116116
self.assertTrue(clist.added_docs.filter(pk=draft.pk))

ietf/doc/fields.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@ def prepare_value(self, value):
5757
value = str(value)
5858
if isinstance(value, basestring):
5959
items = self.parse_select2_value(value)
60+
# accept both names and pks here
6061
names = [ i for i in items if not i.isdigit() ]
6162
ids = [ i for i in items if i.isdigit() ]
6263
value = self.model.objects.filter(Q(name__in=names)|Q(id__in=ids))
@@ -82,14 +83,14 @@ def prepare_value(self, value):
8283

8384
def clean(self, value):
8485
value = super(SearchableDocumentsField, self).clean(value)
85-
names = self.parse_select2_value(value)
86+
pks = self.parse_select2_value(value)
8687

87-
objs = self.model.objects.filter(name__in=names)
88+
objs = self.model.objects.filter(pk__in=pks)
8889

89-
found_names = [str(o.name) for o in objs]
90-
failed_names = [x for x in names if x not in found_names]
91-
if failed_names:
92-
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)))
90+
found_pks = [ str(o.pk) for o in objs ]
91+
failed_pks = [ x for x in pks if x not in found_pks ]
92+
if failed_pks:
93+
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)))
9394

9495
if self.max_entries != None and len(objs) > self.max_entries:
9596
raise forms.ValidationError(u"You can select at most %s entries." % self.max_entries)

ietf/doc/tests_downref.py

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
import debug # pyflakes:ignore
1010

1111
from ietf.doc.factories import WgDraftFactory, WgRfcFactory
12-
from ietf.doc.models import Document, DocAlias, RelatedDocument, State
12+
from ietf.doc.models import RelatedDocument, State
1313
from ietf.person.factories import PersonFactory
1414
from ietf.utils.test_utils import TestCase
1515
from ietf.utils.test_utils import login_testing_unauthorized, unicontent
@@ -18,10 +18,13 @@ class Downref(TestCase):
1818

1919
def setUp(self):
2020
PersonFactory(name='Plain Man',user__username='plain')
21-
WgDraftFactory(name='draft-ietf-mars-test')
22-
doc = WgDraftFactory(name='draft-ietf-mars-approved-document',states=[('draft-iesg','rfcqueue')])
23-
rfc = WgRfcFactory(alias2__name='rfc9998')
24-
RelatedDocument.objects.create(source=doc, target=rfc.docalias.get(name='rfc9998'),relationship_id='downref-approval')
21+
self.draft = WgDraftFactory(name='draft-ietf-mars-test')
22+
self.draftalias = self.draft.docalias.get(name='draft-ietf-mars-test')
23+
self.doc = WgDraftFactory(name='draft-ietf-mars-approved-document',states=[('draft-iesg','rfcqueue')])
24+
self.docalias = self.doc.docalias.get(name='draft-ietf-mars-approved-document')
25+
self.rfc = WgRfcFactory(alias2__name='rfc9998')
26+
self.rfcalias = self.rfc.docalias.get(name='rfc9998')
27+
RelatedDocument.objects.create(source=self.doc, target=self.rfcalias, relationship_id='downref-approval')
2528

2629
def test_downref_registry(self):
2730
url = urlreverse('ietf.doc.views_downref.downref_registry')
@@ -71,48 +74,46 @@ def test_downref_registry_add(self):
7174
self.assertTrue('Save downref' in content)
7275

7376
# error - already in the downref registry
74-
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-approved-document', )))
77+
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.doc.pk, )))
7578
self.assertEqual(r.status_code, 200)
7679
content = unicontent(r)
7780
self.assertTrue('Downref is already in the registry' in content)
7881

7982
# error - source is not in an approved state
8083
r = self.client.get(url)
8184
self.assertEqual(r.status_code, 200)
82-
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-test', )))
85+
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draft.pk, )))
8386
self.assertEqual(r.status_code, 200)
8487
content = unicontent(r)
8588
self.assertTrue('Draft is not yet approved' in content)
8689

8790
# error - the target is not a normative reference of the source
88-
draft = Document.objects.get(name="draft-ietf-mars-test")
89-
draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub"))
91+
self.draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub"))
9092
r = self.client.get(url)
9193
self.assertEqual(r.status_code, 200)
92-
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-test', )))
94+
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draft.pk, )))
9395
self.assertEqual(r.status_code, 200)
9496
content = unicontent(r)
9597
self.assertTrue('There does not seem to be a normative reference to RFC' in content)
9698
self.assertTrue('Save downref anyway' in content)
9799

98100
# normal - approve the document so the downref is now okay
99-
rfc = DocAlias.objects.get(name="rfc9998")
100-
RelatedDocument.objects.create(source=draft, target=rfc, relationship_id='refnorm')
101-
draft_de_count_before = draft.docevent_set.count()
102-
rfc_de_count_before = rfc.document.docevent_set.count()
101+
RelatedDocument.objects.create(source=self.draft, target=self.rfcalias, relationship_id='refnorm')
102+
draft_de_count_before = self.draft.docevent_set.count()
103+
rfc_de_count_before = self.rfc.docevent_set.count()
103104

104105
r = self.client.get(url)
105106
self.assertEqual(r.status_code, 200)
106-
r = self.client.post(url, dict(rfc='rfc9998', drafts=('draft-ietf-mars-test', )))
107+
r = self.client.post(url, dict(rfc=self.rfcalias.pk, drafts=(self.draft.pk, )))
107108
self.assertEqual(r.status_code, 302)
108109
newurl = urlreverse('ietf.doc.views_downref.downref_registry')
109110
r = self.client.get(newurl)
110111
self.assertEqual(r.status_code, 200)
111112
content = unicontent(r)
112113
self.assertTrue('<a href="/doc/draft-ietf-mars-test' in content)
113-
self.assertTrue(RelatedDocument.objects.filter(source=draft, target=rfc, relationship_id='downref-approval'))
114-
self.assertEqual(draft.docevent_set.count(), draft_de_count_before + 1)
115-
self.assertEqual(rfc.document.docevent_set.count(), rfc_de_count_before + 1)
114+
self.assertTrue(RelatedDocument.objects.filter(source=self.draft, target=self.rfcalias, relationship_id='downref-approval'))
115+
self.assertEqual(self.draft.docevent_set.count(), draft_de_count_before + 1)
116+
self.assertEqual(self.rfc.docevent_set.count(), rfc_de_count_before + 1)
116117

117118
def test_downref_last_call(self):
118119
draft = WgDraftFactory(name='draft-ietf-mars-ready-for-lc-document',intended_std_level_id='ps',states=[('draft-iesg','iesg-eva')])

ietf/doc/tests_draft.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1574,7 +1574,7 @@ def test_change_replaces(self):
15741574
RelatedDocument.objects.create(source=self.replacea, target=self.basea.docalias.first(),
15751575
relationship=DocRelationshipName.objects.get(slug="possibly-replaces"))
15761576
self.assertEqual(self.basea.get_state().slug,'active')
1577-
r = self.client.post(url, dict(replaces=self.basea.name))
1577+
r = self.client.post(url, dict(replaces=self.basea.pk))
15781578
self.assertEqual(r.status_code, 302)
15791579
self.assertEqual(RelatedDocument.objects.filter(relationship__slug='replaces',source=self.replacea).count(),1)
15801580
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
@@ -1588,7 +1588,7 @@ def test_change_replaces(self):
15881588
# Post that says replaceboth replaces both base a and base b
15891589
url = urlreverse('ietf.doc.views_draft.replaces', kwargs=dict(name=self.replaceboth.name))
15901590
self.assertEqual(self.baseb.get_state().slug,'expired')
1591-
r = self.client.post(url, dict(replaces=self.basea.name + "," + self.baseb.name))
1591+
r = self.client.post(url, dict(replaces='%s,%s' % (self.basea.pk, self.baseb.pk)))
15921592
self.assertEqual(r.status_code, 302)
15931593
self.assertEqual(Document.objects.get(name='draft-test-base-a').get_state().slug,'repl')
15941594
self.assertEqual(Document.objects.get(name='draft-test-base-b').get_state().slug,'repl')
@@ -1647,7 +1647,7 @@ def test_stream_state_changes_when_replaced(self):
16471647
new_doc = IndividualDraftFactory(stream_id=stream)
16481648

16491649
url = urlreverse('ietf.doc.views_draft.replaces', kwargs=dict(name=new_doc.name))
1650-
r = self.client.post(url, dict(replaces=old_doc.name))
1650+
r = self.client.post(url, dict(replaces=old_doc.pk))
16511651
self.assertEqual(r.status_code,302)
16521652
old_doc = Document.objects.get(name=old_doc.name)
16531653
self.assertEqual(old_doc.get_state_slug('draft'),'repl')

ietf/group/tests_info.py

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,9 @@ def group_urlreverse_list(group, viewname):
4545
]
4646

4747

48+
def pklist(docs):
49+
return [ str(doc.pk) for doc in docs.all() ]
50+
4851
class GroupPagesTests(TestCase):
4952
def setUp(self):
5053
self.charter_dir = self.tempdir('charter')
@@ -811,7 +814,7 @@ def test_add_milestone(self):
811814

812815
milestones_before = GroupMilestone.objects.count()
813816
events_before = group.groupevent_set.count()
814-
docs = Document.objects.filter(type="draft").values_list("name", flat=True)
817+
doc_pks = pklist(Document.objects.filter(type="draft"))
815818

816819
due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))
817820

@@ -821,7 +824,7 @@ def test_add_milestone(self):
821824
'm-1-desc': "", # no description
822825
'm-1-due': due.strftime("%B %Y"),
823826
'm-1-resolved': "",
824-
'm-1-docs': ",".join(docs),
827+
'm-1-docs': ",".join(doc_pks),
825828
'action': "save",
826829
})
827830
self.assertEqual(r.status_code, 200)
@@ -836,7 +839,7 @@ def test_add_milestone(self):
836839
'm-1-desc': "Test 3",
837840
'm-1-due': due.strftime("%B %Y"),
838841
'm-1-resolved': "",
839-
'm-1-docs': ",".join(docs),
842+
'm-1-docs': ",".join(doc_pks),
840843
'action': "save",
841844
})
842845
self.assertEqual(r.status_code, 302)
@@ -847,7 +850,7 @@ def test_add_milestone(self):
847850
self.assertEqual(m.state_id, "active")
848851
self.assertEqual(m.due, due)
849852
self.assertEqual(m.resolved, "")
850-
self.assertEqual(set(m.docs.values_list("name", flat=True)), set(docs))
853+
self.assertEqual(set(pklist(m.docs)), set(doc_pks))
851854
self.assertTrue("Added milestone" in m.milestonegroupevent_set.all()[0].desc)
852855
self.assertEqual(len(outbox),mailbox_before+2)
853856
self.assertFalse(any('Review Required' in x['Subject'] for x in outbox[-2:]))
@@ -913,7 +916,7 @@ def test_accept_milestone(self):
913916
'm1-desc': m1.desc,
914917
'm1-due': m1.due.strftime("%B %Y"),
915918
'm1-resolved': m1.resolved,
916-
'm1-docs': ",".join(m1.docs.values_list("name", flat=True)),
919+
'm1-docs': ",".join(pklist(m1.docs)),
917920
'm1-review': "accept",
918921
'action': "save",
919922
})
@@ -939,7 +942,7 @@ def test_delete_milestone(self):
939942
'm1-desc': m1.desc,
940943
'm1-due': m1.due.strftime("%B %Y"),
941944
'm1-resolved': "",
942-
'm1-docs': ",".join(m1.docs.values_list("name", flat=True)),
945+
'm1-docs': ",".join(pklist(m1.docs)),
943946
'm1-delete': "checked",
944947
'action': "save",
945948
})
@@ -959,7 +962,7 @@ def test_edit_milestone(self):
959962

960963
milestones_before = GroupMilestone.objects.count()
961964
events_before = group.groupevent_set.count()
962-
docs = Document.objects.filter(type="draft").values_list("name", flat=True)
965+
doc_pks = pklist(Document.objects.filter(type="draft"))
963966

964967
due = self.last_day_of_month(datetime.date.today() + datetime.timedelta(days=365))
965968

@@ -969,7 +972,7 @@ def test_edit_milestone(self):
969972
'm1-desc': "", # no description
970973
'm1-due': due.strftime("%B %Y"),
971974
'm1-resolved': "",
972-
'm1-docs': ",".join(docs),
975+
'm1-docs': ",".join(doc_pks),
973976
'action': "save",
974977
})
975978
self.assertEqual(r.status_code, 200)
@@ -987,7 +990,7 @@ def test_edit_milestone(self):
987990
'm1-due': due.strftime("%B %Y"),
988991
'm1-resolved': "Done",
989992
'm1-resolved_checkbox': "checked",
990-
'm1-docs': ",".join(docs),
993+
'm1-docs': ",".join(doc_pks),
991994
'action': "save",
992995
})
993996
self.assertEqual(r.status_code, 302)
@@ -998,7 +1001,7 @@ def test_edit_milestone(self):
9981001
self.assertEqual(m.state_id, "active")
9991002
self.assertEqual(m.due, due)
10001003
self.assertEqual(m.resolved, "Done")
1001-
self.assertEqual(set(m.docs.values_list("name", flat=True)), set(docs))
1004+
self.assertEqual(set(pklist(m.docs)), set(doc_pks))
10021005
self.assertTrue("Changed milestone" in m.milestonegroupevent_set.all()[0].desc)
10031006
self.assertEqual(len(outbox), mailbox_before + 2)
10041007
self.assertTrue("Milestones changed" in outbox[-2]["Subject"])

ietf/ietfauth/tests.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -384,7 +384,7 @@ def test_review_overview(self):
384384
# wish to review
385385
r = self.client.post(url, {
386386
"action": "add_wish",
387-
'doc': doc.name,
387+
'doc': doc.pk,
388388
"team": review_req.team_id,
389389
})
390390
self.assertEqual(r.status_code, 302)

ietf/ipr/fields.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
# Copyright The IETF Trust 2014-2019, All Rights Reserved
2+
# -*- coding: utf-8 -*-
3+
14
import json
25

36
from django.utils.html import escape
@@ -36,6 +39,12 @@ def __init__(self,
3639
def parse_select2_value(self, value):
3740
return [x.strip() for x in value.split(",") if x.strip()]
3841

42+
def check_pks(self, pks):
43+
for pk in pks:
44+
if not pk.isdigit():
45+
raise forms.ValidationError("Unexpected value: %s" % pk)
46+
return pks
47+
3948
def prepare_value(self, value):
4049
if not value:
4150
value = ""
@@ -59,7 +68,7 @@ def prepare_value(self, value):
5968

6069
def clean(self, value):
6170
value = super(SearchableIprDisclosuresField, self).clean(value)
62-
pks = self.parse_select2_value(value)
71+
pks = self.check_pks(self.parse_select2_value(value))
6372

6473
if not all([ key.isdigit() for key in pks ]):
6574
raise forms.ValidationError(u'You must enter IPR ID(s) as integers')

ietf/ipr/tests.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -263,9 +263,9 @@ def test_new_specific(self):
263263
"ietfer_contact_info": "555-555-0101",
264264
"iprdocrel_set-TOTAL_FORMS": 2,
265265
"iprdocrel_set-INITIAL_FORMS": 0,
266-
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
266+
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
267267
"iprdocrel_set-0-revisions": '00',
268-
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name,
268+
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
269269
"patent_number": "SE12345678901",
270270
"patent_inventor": "A. Nonymous",
271271
"patent_title": "A method of transfering bits",
@@ -306,9 +306,9 @@ def test_new_thirdparty(self):
306306
"ietfer_contact_info": "555-555-0101",
307307
"iprdocrel_set-TOTAL_FORMS": 2,
308308
"iprdocrel_set-INITIAL_FORMS": 0,
309-
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
309+
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
310310
"iprdocrel_set-0-revisions": '00',
311-
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name,
311+
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
312312
"patent_number": "SE12345678901",
313313
"patent_inventor": "A. Nonymous",
314314
"patent_title": "A method of transfering bits",
@@ -354,7 +354,7 @@ def test_edit(self):
354354
"holder_legal_name": "Test Legal",
355355
"ietfer_contact_info": "555-555-0101",
356356
"ietfer_name": "Test Participant",
357-
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
357+
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
358358
"iprdocrel_set-0-revisions": '00',
359359
"iprdocrel_set-INITIAL_FORMS": 0,
360360
"iprdocrel_set-TOTAL_FORMS": 1,
@@ -403,9 +403,9 @@ def test_update(self):
403403
"ietfer_contact_info": "555-555-0101",
404404
"iprdocrel_set-TOTAL_FORMS": 2,
405405
"iprdocrel_set-INITIAL_FORMS": 0,
406-
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
406+
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
407407
"iprdocrel_set-0-revisions": '00',
408-
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name,
408+
"iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().pk,
409409
"patent_number": "SE12345678901",
410410
"patent_inventor": "A. Nonymous",
411411
"patent_title": "A method of transfering bits",
@@ -441,7 +441,7 @@ def test_update_bad_post(self):
441441
"holder_contact_email": "test@holder.com",
442442
"iprdocrel_set-TOTAL_FORMS": 1,
443443
"iprdocrel_set-INITIAL_FORMS": 0,
444-
"iprdocrel_set-0-document": "%s" % draft.docalias.first().name,
444+
"iprdocrel_set-0-document": "%s" % draft.docalias.first().pk,
445445
"iprdocrel_set-0-revisions": '00',
446446
"patent_number": "SE12345678901",
447447
"patent_inventor": "A. Nonymous",
@@ -630,7 +630,7 @@ def test_edit_using_factory(self):
630630
'iprdocrel_set-TOTAL_FORMS' : 1,
631631
'iprdocrel_set-INITIAL_FORMS' : 1,
632632
'iprdocrel_set-0-id': disclosure.pk,
633-
"iprdocrel_set-0-document": disclosure.docs.first().name,
633+
"iprdocrel_set-0-document": disclosure.docs.first().pk,
634634
"iprdocrel_set-0-revisions": disclosure.docs.first().document.rev,
635635
'holder_legal_name': disclosure.holder_legal_name,
636636
'patent_number': patent_dict['Number'],

0 commit comments

Comments
 (0)