From a2cafded254ff15ee98256ef844b05a942513aa4 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Fri, 14 Jun 2019 20:38:14 +0000 Subject: [PATCH] Changed DocAlias to be many-to-many, in order to be able to handle STD aliases referring to multiple RFCs. - Legacy-Id: 16249 --- bin/add-old-drafts-from-archive.py | 2 +- ietf/doc/admin.py | 16 +++++------ ietf/doc/factories.py | 42 ++++++++++++++++++----------- ietf/doc/fields.py | 2 +- ietf/doc/models.py | 41 +++++++++++++++------------- ietf/doc/tests.py | 20 +++++++------- ietf/doc/tests_ballot.py | 6 ++--- ietf/doc/tests_downref.py | 6 ++--- ietf/doc/tests_draft.py | 4 +-- ietf/doc/tests_material.py | 2 +- ietf/doc/tests_review.py | 4 +-- ietf/doc/tests_status_change.py | 2 +- ietf/doc/utils.py | 6 ++--- ietf/doc/utils_search.py | 11 ++++---- ietf/doc/views_charter.py | 2 +- ietf/doc/views_conflict_review.py | 5 ++-- ietf/doc/views_doc.py | 6 ++--- ietf/doc/views_material.py | 3 ++- ietf/doc/views_review.py | 2 +- ietf/doc/views_search.py | 4 +-- ietf/doc/views_status_change.py | 2 +- ietf/group/dot.py | 4 +-- ietf/group/tests.py | 2 +- ietf/group/tests_info.py | 2 +- ietf/group/views.py | 4 +-- ietf/idindex/index.py | 8 +++--- ietf/idindex/tests.py | 8 +++--- ietf/iesg/tests.py | 6 ++--- ietf/ipr/admin.py | 2 +- ietf/ipr/factories.py | 2 +- ietf/ipr/tests.py | 12 ++++----- ietf/ipr/utils.py | 22 +++++++++++---- ietf/ipr/views.py | 22 +++++++-------- ietf/liaisons/forms.py | 4 +-- ietf/meeting/forms.py | 2 +- ietf/meeting/views.py | 12 ++++----- ietf/review/utils.py | 2 +- ietf/secr/drafts/views.py | 2 +- ietf/secr/proceedings/proc_utils.py | 6 ++--- ietf/secr/proceedings/tests.py | 4 +-- ietf/secr/telechat/tests.py | 2 +- ietf/secr/utils/document.py | 4 +-- ietf/stats/backfill_data.py | 4 +-- ietf/stats/tests.py | 4 +-- ietf/stats/views.py | 22 +++++++-------- ietf/submit/tests.py | 12 ++++----- ietf/submit/utils.py | 8 +++--- ietf/sync/rfceditor.py | 9 ++++--- ietf/sync/tests.py | 14 +++++----- ietf/utils/test_data.py | 38 +++++++++++--------------- 50 files changed, 228 insertions(+), 203 deletions(-) diff --git a/bin/add-old-drafts-from-archive.py b/bin/add-old-drafts-from-archive.py index 195501a26..9717e607b 100755 --- a/bin/add-old-drafts-from-archive.py +++ b/bin/add-old-drafts-from-archive.py @@ -79,7 +79,7 @@ for name in sorted(names): words=draft.get_wordcount(), expires=time+datetime.timedelta(settings.INTERNET_DRAFT_DAYS_TO_EXPIRE), ) - doc.docalias_set.create(name=doc.name) + DocAlias.objects.create(name=doc.name).docs.add(doc) doc.states.add(expired) # update authors authors = [] diff --git a/ietf/doc/admin.py b/ietf/doc/admin.py index d61ccb191..73c1a37ed 100644 --- a/ietf/doc/admin.py +++ b/ietf/doc/admin.py @@ -19,9 +19,9 @@ class StateAdmin(admin.ModelAdmin): filter_horizontal = ["next_states"] admin.site.register(State, StateAdmin) -class DocAliasInline(admin.TabularInline): - model = DocAlias - extra = 1 +# class DocAliasInline(admin.TabularInline): +# model = DocAlias +# extra = 1 class DocAuthorInline(admin.TabularInline): model = DocumentAuthor @@ -58,7 +58,7 @@ class DocumentAdmin(admin.ModelAdmin): search_fields = ['name'] list_filter = ['type'] raw_id_fields = ['group', 'shepherd', 'ad'] - inlines = [DocAliasInline, DocAuthorInline, RelatedDocumentInline, ] + inlines = [DocAuthorInline, RelatedDocumentInline, ] form = DocumentForm def save_model(self, request, obj, form, change): @@ -88,9 +88,9 @@ class DocHistoryAdmin(admin.ModelAdmin): admin.site.register(DocHistory, DocHistoryAdmin) class DocAliasAdmin(admin.ModelAdmin): - list_display = ['name', 'document_link'] - search_fields = ['name', 'document__name'] - raw_id_fields = ['document'] +# list_display = ['name', 'document_link'] +# search_fields = ['name', 'document__name'] + raw_id_fields = ['docs'] admin.site.register(DocAlias, DocAliasAdmin) class DocReminderAdmin(admin.ModelAdmin): @@ -102,7 +102,7 @@ admin.site.register(DocReminder, DocReminderAdmin) class RelatedDocumentAdmin(admin.ModelAdmin): list_display = ['source', 'target', 'relationship', ] list_filter = ['relationship', ] - search_fields = ['source__name', 'target__name', 'target__document__name', ] + search_fields = ['source__name', 'target__name', 'target__docs__name', ] raw_id_fields = ['source', 'target', ] admin.site.register(RelatedDocument, RelatedDocumentAdmin) diff --git a/ietf/doc/factories.py b/ietf/doc/factories.py index f5f669181..6d12779ac 100644 --- a/ietf/doc/factories.py +++ b/ietf/doc/factories.py @@ -33,13 +33,14 @@ class BaseDocumentFactory(factory.DjangoModelFactory): newrevisiondocevent = factory.RelatedFactory('ietf.doc.factories.NewRevisionDocEventFactory','doc') - alias = factory.RelatedFactory('ietf.doc.factories.DocAliasFactory','document') - @factory.post_generation def other_aliases(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument + alias = DocAliasFactory(name=obj.name) + alias.docs.add(obj) if create and extracted: - for alias in extracted: - obj.docalias_set.create(name=alias) + for name in extracted: + alias = DocAliasFactory(name=name) + alias.docs.add(obj) @factory.post_generation def states(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument @@ -61,10 +62,14 @@ class BaseDocumentFactory(factory.DjangoModelFactory): @factory.post_generation def relations(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument if create and extracted: - for (rel_id,docalias) in extracted: - if isinstance(docalias,Document): - docalias = docalias.docalias_set.first() - obj.relateddocument_set.create(relationship_id=rel_id,target=docalias) + for (rel_id, doc) in extracted: + if isinstance(doc, Document): + docalias = doc.docalias.first() + elif isinstance(doc, DocAlias): + docalias = doc + else: + continue + obj.relateddocument_set.create(relationship_id=rel_id, target=docalias) @classmethod def _after_postgeneration(cls, obj, create, results=None): @@ -195,9 +200,9 @@ class ConflictReviewFactory(BaseDocumentFactory): if not create: return if extracted: - obj.relateddocument_set.create(relationship_id='conflrev',target=extracted.docalias_set.first()) + obj.relateddocument_set.create(relationship_id='conflrev',target=extracted.docalias.first()) else: - obj.relateddocument_set.create(relationship_id='conflrev',target=DocumentFactory(type_id='draft',group=Group.objects.get(type_id='individ')).docalias_set.first()) + obj.relateddocument_set.create(relationship_id='conflrev',target=DocumentFactory(type_id='draft',group=Group.objects.get(type_id='individ')).docalias.first()) @factory.post_generation def states(obj, create, extracted, **kwargs): @@ -219,12 +224,19 @@ class DocAliasFactory(factory.DjangoModelFactory): class Meta: model = DocAlias - document = factory.SubFactory('ietf.doc.factories.DocumentFactory') + @factory.post_generation + def document(self, create, extracted, **kwargs): + if create and extracted: + self.docs.add(extracted) + self.name = extracted.name + + @factory.post_generation + def docs(self, create, extracted, **kwargs): + if create and extracted: + for doc in extracted: + if not doc in self.docs.all(): + self.docs.add(doc) - @factory.lazy_attribute - def name(self): - return self.document.name - class DocEventFactory(factory.DjangoModelFactory): class Meta: diff --git a/ietf/doc/fields.py b/ietf/doc/fields.py index 3285e1416..0ec3d10c9 100644 --- a/ietf/doc/fields.py +++ b/ietf/doc/fields.py @@ -59,7 +59,7 @@ class SearchableDocumentsField(forms.CharField): value = self.model.objects.filter(Q(name__in=names)|Q(id__in=ids)) filter_args = {} if self.model == DocAlias: - filter_args["document__type"] = self.doc_type + filter_args["docs__type"] = self.doc_type else: filter_args["type"] = self.doc_type value = value.filter(**filter_args) diff --git a/ietf/doc/models.py b/ietf/doc/models.py index 87ada27cc..746bb6b90 100644 --- a/ietf/doc/models.py +++ b/ietf/doc/models.py @@ -323,7 +323,7 @@ class DocumentInfo(models.Model): elif state.slug == "repl": rs = self.related_that("replaces") if rs: - return mark_safe("Replaced by " + ", ".join("%s" % (urlreverse('ietf.doc.views_doc.document_main', kwargs=dict(name=alias.document)), alias.document) for alias in rs)) + return mark_safe("Replaced by " + ", ".join("%s" % (urlreverse('ietf.doc.views_doc.document_main', kwargs=dict(name=alias.document.name)), alias.document) for alias in rs)) else: return "Replaced" elif state.slug == "active": @@ -411,9 +411,9 @@ class DocumentInfo(models.Model): if not isinstance(relationship, tuple): raise TypeError("Expected a string or tuple, received %s" % type(relationship)) if isinstance(self, Document): - return RelatedDocument.objects.filter(target__document=self, relationship__in=relationship).select_related('source') + return RelatedDocument.objects.filter(target__docs=self, relationship__in=relationship).select_related('source') elif isinstance(self, DocHistory): - return RelatedDocHistory.objects.filter(target__document=self.doc, relationship__in=relationship).select_related('source') + return RelatedDocHistory.objects.filter(target__docs=self.doc, relationship__in=relationship).select_related('source') else: raise TypeError("Expected method called on Document or DocHistory") @@ -434,9 +434,9 @@ class DocumentInfo(models.Model): if not isinstance(relationship, tuple): raise TypeError("Expected a string or tuple, received %s" % type(relationship)) if isinstance(self, Document): - return RelatedDocument.objects.filter(source=self, relationship__in=relationship).select_related('target__document') + return RelatedDocument.objects.filter(source=self, relationship__in=relationship).select_related('target') elif isinstance(self, DocHistory): - return RelatedDocHistory.objects.filter(source=self, relationship__in=relationship).select_related('target__document') + return RelatedDocHistory.objects.filter(source=self, relationship__in=relationship).select_related('target') else: raise TypeError("Expected method called on Document or DocHistory") @@ -447,14 +447,15 @@ class DocumentInfo(models.Model): for r in rels: if not r in related: related += ( r, ) - related = r.target.document.all_relations_that_doc(relationship, related) + for doc in r.target.docs.all(): + related = doc.all_relations_that_doc(relationship, related) return related def related_that(self, relationship): - return list(set([x.source.docalias_set.get(name=x.source.name) for x in self.relations_that(relationship)])) + return list(set([x.source.docalias.get(name=x.source.name) for x in self.relations_that(relationship)])) def all_related_that(self, relationship, related=None): - return list(set([x.source.docalias_set.get(name=x.source.name) for x in self.all_relations_that(relationship)])) + return list(set([x.source.docalias.get(name=x.source.name) for x in self.all_relations_that(relationship)])) def related_that_doc(self, relationship): return list(set([x.target for x in self.relations_that_doc(relationship)])) @@ -463,7 +464,7 @@ class DocumentInfo(models.Model): return list(set([x.target for x in self.all_relations_that_doc(relationship)])) def replaces(self): - return set([ r.document for r in self.related_that_doc("replaces")]) + return set([ d for r in self.related_that_doc("replaces") for d in r.docs.all() ]) def replaces_canonical_name(self): s = set([ r.document for r in self.related_that_doc("replaces")]) @@ -657,7 +658,7 @@ class Document(DocumentInfo): if not hasattr(self, '_canonical_name'): name = self.name if self.type_id == "draft" and self.get_state_slug() == "rfc": - a = self.docalias_set.filter(name__startswith="rfc").order_by('-name').first() + a = self.docalias.filter(name__startswith="rfc").order_by('-name').first() if a: name = a.name elif self.type_id == "charter": @@ -671,7 +672,7 @@ class Document(DocumentInfo): def canonical_docalias(self): - return self.docalias_set.get(name=self.name) + return self.docalias.get(name=self.name) def display_name(self): name = self.canonical_name() @@ -766,14 +767,14 @@ class Document(DocumentInfo): def ipr(self,states=('posted','removed')): """Returns the IPR disclosures against this document (as a queryset over IprDocRel).""" from ietf.ipr.models import IprDocRel - return IprDocRel.objects.filter(document__document=self,disclosure__state__in=states) + return IprDocRel.objects.filter(document__docs=self, disclosure__state__in=states) def related_ipr(self): """Returns the IPR disclosures against this document and those documents this document directly or indirectly obsoletes or replaces """ from ietf.ipr.models import IprDocRel - iprs = IprDocRel.objects.filter(document__in=list(self.docalias_set.all())+self.all_related_that_doc(('obs','replaces'))).filter(disclosure__state__in=('posted','removed')).values_list('disclosure', flat=True).distinct() + iprs = IprDocRel.objects.filter(document__in=list(self.docalias.all())+self.all_related_that_doc(('obs','replaces'))).filter(disclosure__state__in=('posted','removed')).values_list('disclosure', flat=True).distinct() return iprs def future_presentations(self): @@ -889,8 +890,9 @@ class DocHistory(DocumentInfo): return self.doc.groupmilestone_set @property - def docalias_set(self): - return self.doc.docalias_set + def docalias(self): + log.unreachable('2019-06-11') + return self.doc.docalias def is_dochistory(self): return True @@ -909,11 +911,14 @@ class DocAlias(models.Model): to by RFC number, primarily, after achieving RFC status. """ name = models.CharField(max_length=255, unique=True) - document = ForeignKey(Document) -# docs = models.ManyToManyField(Document, related_name='aliases') + docs = models.ManyToManyField(Document, related_name='docalias') + + @property + def document(self): + return self.docs.first() def __unicode__(self): - return "%s-->%s" % (self.name, self.document.name) + return "%s-->%s" % (self.name, ','.join([unicode(d.name) for d in self.docs.all() if isinstance(d, Document) ])) document_link = admin_link("document") class Meta: verbose_name = "document alias" diff --git a/ietf/doc/tests.py b/ietf/doc/tests.py index 7fac55de8..43629e278 100644 --- a/ietf/doc/tests.py +++ b/ietf/doc/tests.py @@ -216,7 +216,7 @@ class SearchTests(TestCase): draft.set_state(State.objects.get(type='draft-iesg', slug='lc')) rfc = IndividualDraftFactory(ad=ad) rfc.set_state(State.objects.get(type='draft', slug='rfc')) - rfc.docalias_set.create(name='rfc6666') + DocAlias.objects.create(name='rfc6666').docs.add(rfc) conflrev = DocumentFactory(type_id='conflrev',ad=ad) conflrev.set_state(State.objects.get(type='conflrev', slug='iesgeval')) statchg = DocumentFactory(type_id='statchg',ad=ad) @@ -278,7 +278,7 @@ class SearchTests(TestCase): self.assertEqual(data[0]["id"], draft.pk) # DocAlias - doc_alias = draft.docalias_set.get() + doc_alias = draft.docalias.first() url = urlreverse('ietf.doc.views_search.ajax_select2_search_docs', kwargs={ "model_name": "docalias", @@ -499,7 +499,7 @@ Man Expires September 22, 2015 [Page 3] draft = WgDraftFactory(name='draft-ietf-mars-test',rev='01') HolderIprDisclosureFactory(docs=[draft]) replaced = IndividualDraftFactory() - draft.relateddocument_set.create(relationship_id='replaces',source=draft,target=replaced.docalias_set.first()) + draft.relateddocument_set.create(relationship_id='replaces',source=draft,target=replaced.docalias.first()) # these tests aren't testing all attributes yet, feel free to # expand them @@ -580,7 +580,7 @@ Man Expires September 22, 2015 [Page 3] shepherd_id=draft.shepherd_id, ad_id=draft.ad_id, expires=draft.expires, notify=draft.notify, note=draft.note) rel = RelatedDocument.objects.create(source=replacement, - target=draft.docalias_set.get(name__startswith="draft"), + target=draft.docalias.get(name__startswith="draft"), relationship_id="replaces") r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name))) @@ -595,8 +595,10 @@ Man Expires September 22, 2015 [Page 3] draft.save_with_history([DocEvent.objects.create(doc=draft, rev=draft.rev, type="published_rfc", by=Person.objects.get(name="(System)"))]) - rfc_alias = DocAlias.objects.create(name="rfc123456", document=draft) - bcp_alias = DocAlias.objects.create(name="bcp123456", document=draft) + rfc_alias = DocAlias.objects.create(name="rfc123456") + rfc_alias.docs.add(draft) + bcp_alias = DocAlias.objects.create(name="bcp123456") + bcp_alias.docs.add(draft) r = self.client.get(urlreverse("ietf.doc.views_doc.document_main", kwargs=dict(name=draft.name))) self.assertEqual(r.status_code, 302) @@ -759,8 +761,8 @@ class DocTestCase(TestCase): self.assertFalse('more YES or NO' in unicontent(r)) # status change - IndividualDraftFactory().docalias_set.create(name='rfc9998') - IndividualDraftFactory().docalias_set.create(name='rfc9999') + DocAlias.objects.create(name='rfc9998').docs.add(IndividualDraftFactory()) + DocAlias.objects.create(name='rfc9999').docs.add(IndividualDraftFactory()) doc = DocumentFactory(type_id='statchg',name='status-change-imaginary-mid-review') iesgeval_pk = str(State.objects.get(slug='iesgeval',type__slug='statchg').pk) self.client.login(username='ad', password='ad+password') @@ -1003,7 +1005,7 @@ class ReferencesTest(TestCase): def test_references(self): doc1 = WgDraftFactory(name='draft-ietf-mars-test') - doc2 = IndividualDraftFactory(name='draft-imaginary-independent-submission').docalias_set.first() + doc2 = IndividualDraftFactory(name='draft-imaginary-independent-submission').docalias.first() RelatedDocument.objects.get_or_create(source=doc1,target=doc2,relationship=DocRelationshipName.objects.get(slug='refnorm')) url = urlreverse('ietf.doc.views_doc.document_references', kwargs=dict(name=doc1.name)) r = self.client.get(url) diff --git a/ietf/doc/tests_ballot.py b/ietf/doc/tests_ballot.py index 46340abf8..dcd24ebeb 100644 --- a/ietf/doc/tests_ballot.py +++ b/ietf/doc/tests_ballot.py @@ -741,7 +741,7 @@ class ApproveBallotTests(TestCase): self.assertTrue("No downward references for" in r.content) # Add a downref, the page should ask if it should be added to the registry - rel = draft.relateddocument_set.create(target=rfc.docalias_set.get(name='rfc6666'),relationship_id='refnorm') + rel = draft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'),relationship_id='refnorm') d = [rdoc for rdoc in draft.relateddocument_set.all() if rel.is_approved_downref()] original_len = len(d) r = self.client.get(url) @@ -970,7 +970,7 @@ class RegenerateLastCallTestCase(TestCase): std_level_id='inf', ) - draft.relateddocument_set.create(target=rfc.docalias_set.get(name='rfc6666'),relationship_id='refnorm') + draft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'),relationship_id='refnorm') r = self.client.post(url, dict(regenerate_last_call_text="1")) self.assertEqual(r.status_code, 200) @@ -980,7 +980,7 @@ class RegenerateLastCallTestCase(TestCase): self.assertTrue("rfc6666" in lc_text) self.assertTrue("Independent Submission Editor stream" in lc_text) - draft.relateddocument_set.create(target=rfc.docalias_set.get(name='rfc6666'),relationship_id='downref-approval') + draft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'),relationship_id='downref-approval') r = self.client.post(url, dict(regenerate_last_call_text="1")) self.assertEqual(r.status_code, 200) diff --git a/ietf/doc/tests_downref.py b/ietf/doc/tests_downref.py index ad35e89c1..41b2a165c 100644 --- a/ietf/doc/tests_downref.py +++ b/ietf/doc/tests_downref.py @@ -21,7 +21,7 @@ class Downref(TestCase): 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_set.get(name='rfc9998'),relationship_id='downref-approval') + RelatedDocument.objects.create(source=doc, target=rfc.docalias.get(name='rfc9998'),relationship_id='downref-approval') def test_downref_registry(self): url = urlreverse('ietf.doc.views_downref.downref_registry') @@ -118,7 +118,7 @@ class Downref(TestCase): draft = WgDraftFactory(name='draft-ietf-mars-ready-for-lc-document',intended_std_level_id='ps',states=[('draft-iesg','iesg-eva')]) WgDraftFactory(name='draft-ietf-mars-another-approved-document',states=[('draft-iesg','rfcqueue')]) rfc9999 = WgRfcFactory(alias2__name='rfc9999', std_level_id=None) - RelatedDocument.objects.create(source=draft, target=rfc9999.docalias_set.get(name='rfc9999'), relationship_id='refnorm') + RelatedDocument.objects.create(source=draft, target=rfc9999.docalias.get(name='rfc9999'), relationship_id='refnorm') url = urlreverse('ietf.doc.views_ballot.lastcalltext', kwargs=dict(name=draft.name)) login_testing_unauthorized(self, "secretary", url) @@ -130,7 +130,7 @@ class Downref(TestCase): self.assertIn('The document contains these normative downward references', text) # now, the announcement text about the downref to RFC 9999 should be gone - RelatedDocument.objects.create(source=draft, target=rfc9999.docalias_set.get(name='rfc9999'),relationship_id='downref-approval') + RelatedDocument.objects.create(source=draft, target=rfc9999.docalias.get(name='rfc9999'),relationship_id='downref-approval') r = self.client.post(url, dict(regenerate_last_call_text="1")) self.assertEqual(r.status_code, 200) q = PyQuery(r.content) diff --git a/ietf/doc/tests_draft.py b/ietf/doc/tests_draft.py index 13c551d1c..9aa2f909b 100644 --- a/ietf/doc/tests_draft.py +++ b/ietf/doc/tests_draft.py @@ -1569,7 +1569,7 @@ class ChangeReplacesTests(TestCase): # Post that says replacea replaces base a empty_outbox() - RelatedDocument.objects.create(source=self.replacea, target=self.basea.docalias_set.first(), + 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)) @@ -1617,7 +1617,7 @@ class ChangeReplacesTests(TestCase): def test_review_possibly_replaces(self): - replaced = self.basea.docalias_set.first() + replaced = self.basea.docalias.first() RelatedDocument.objects.create(source=self.replacea, target=replaced, relationship=DocRelationshipName.objects.get(slug="possibly-replaces")) diff --git a/ietf/doc/tests_material.py b/ietf/doc/tests_material.py index 687719a5c..a963ac1a6 100644 --- a/ietf/doc/tests_material.py +++ b/ietf/doc/tests_material.py @@ -52,7 +52,7 @@ class GroupMaterialTests(TestCase): doc = Document.objects.create(name="slides-testteam-test-file", rev="01", type_id="slides", group=group) doc.set_state(State.objects.get(type="slides", slug="active")) doc.set_state(State.objects.get(type="reuse_policy", slug="multiple")) - DocAlias.objects.create(name=doc.name, document=doc) + DocAlias.objects.create(name=doc.name).docs.add(doc) NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='00',type='new_revision',desc='New revision available') NewRevisionDocEvent.objects.create(doc=doc,by=Person.objects.get(name="(System)"),rev='01',type='new_revision',desc='New revision available') diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py index d78c31437..857cc1155 100644 --- a/ietf/doc/tests_review.py +++ b/ietf/doc/tests_review.py @@ -144,8 +144,8 @@ class ReviewTests(TestCase): # check we can fish it out old_doc = WgDraftFactory(name="draft-foo-mars-test") older_doc = WgDraftFactory(name="draft-older") - RelatedDocument.objects.create(source=old_doc, target=older_doc.docalias_set.first(), relationship_id='replaces') - RelatedDocument.objects.create(source=doc, target=old_doc.docalias_set.first(), relationship_id='replaces') + RelatedDocument.objects.create(source=old_doc, target=older_doc.docalias.first(), relationship_id='replaces') + RelatedDocument.objects.create(source=doc, target=old_doc.docalias.first(), relationship_id='replaces') review_req.doc = older_doc review_req.save() diff --git a/ietf/doc/tests_status_change.py b/ietf/doc/tests_status_change.py index 937191d6c..30477b9e8 100644 --- a/ietf/doc/tests_status_change.py +++ b/ietf/doc/tests_status_change.py @@ -74,7 +74,7 @@ class StatusChangeTests(TestCase): self.assertEqual(status_change.rev,u'00') self.assertEqual(status_change.ad.name,u'AreaĆ° Irector') self.assertEqual(status_change.notify,u'ipu@ietf.org') - self.assertTrue(status_change.relateddocument_set.filter(relationship__slug='tois',target__document__name='draft-ietf-random-thing')) + self.assertTrue(status_change.relateddocument_set.filter(relationship__slug='tois',target__docs__name='draft-ietf-random-thing')) def test_change_state(self): diff --git a/ietf/doc/utils.py b/ietf/doc/utils.py index c5a05ad1e..d07d158c1 100644 --- a/ietf/doc/utils.py +++ b/ietf/doc/utils.py @@ -684,10 +684,8 @@ def extract_complete_replaces_ancestor_mapping_for_docs(names): if not front: break - relations = RelatedDocument.objects.filter( - source__name__in=front, relationship="replaces" - ).select_related("target").values_list("source__name", "target__document__name") - + relations = ( RelatedDocument.objects.filter(source__name__in=front, relationship="replaces") + .select_related("target").values_list("source__name", "target__docs__name") ) if not relations: break diff --git a/ietf/doc/utils_search.py b/ietf/doc/utils_search.py index d042616d1..f99b7a24f 100644 --- a/ietf/doc/utils_search.py +++ b/ietf/doc/utils_search.py @@ -49,7 +49,7 @@ def fill_in_document_table_attributes(docs, have_telechat_date=False): doc_dict = dict((d.pk, d) for d in docs) doc_ids = doc_dict.keys() - rfc_aliases = dict(DocAlias.objects.filter(name__startswith="rfc", document__id__in=doc_ids).values_list("document__id", "name")) + rfc_aliases = dict([ (a.document.id, a.name) for a in DocAlias.objects.filter(name__startswith="rfc", docs__id__in=doc_ids) ]) # latest event cache event_types = ("published_rfc", @@ -122,11 +122,10 @@ def fill_in_document_table_attributes(docs, have_telechat_date=False): d.updated_by_list = [] xed_by = RelatedDocument.objects.filter(target__name__in=rfc_aliases.values(), - relationship__in=("obs", "updates")).select_related('target__document') - rel_rfc_aliases = dict(DocAlias.objects.filter(name__startswith="rfc", - document__in=[rel.source_id for rel in xed_by]).values_list('document', 'name')) + relationship__in=("obs", "updates")).select_related('target') + rel_rfc_aliases = dict([ (a.document.id, a.name) for a in DocAlias.objects.filter(name__startswith="rfc", docs__id__in=[rel.source_id for rel in xed_by]) ]) for rel in xed_by: - d = doc_dict[rel.target.document_id] + d = doc_dict[rel.target.document.id] if rel.relationship_id == "obs": l = d.obsoleted_by_list elif rel.relationship_id == "updates": @@ -146,7 +145,7 @@ def prepare_document_table(request, docs, query=None, max_results=200): # the number of queries docs = docs.select_related("ad", "std_level", "intended_std_level", "group", "stream", "shepherd", ) docs = docs.prefetch_related("states__type", "tags", "groupmilestone_set__group", "reviewrequest_set__team", - "submission_set__checks", "ad__email_set", "docalias_set__iprdocrel_set") + "submission_set__checks", "ad__email_set", "docalias__iprdocrel_set") if docs.count() > max_results: docs = docs[:max_results] diff --git a/ietf/doc/views_charter.py b/ietf/doc/views_charter.py index 39e8eac99..8aae5b259 100644 --- a/ietf/doc/views_charter.py +++ b/ietf/doc/views_charter.py @@ -392,7 +392,7 @@ def submit(request, name, option=None): abstract=group.name, rev=next_rev, ) - DocAlias.objects.create(name=charter.name, document=charter) + DocAlias.objects.create(name=charter.name).docs.add(charter) charter.set_state(State.objects.get(used=True, type="charter", slug="notrev")) diff --git a/ietf/doc/views_conflict_review.py b/ietf/doc/views_conflict_review.py index 350d5a4c4..5705bbf39 100644 --- a/ietf/doc/views_conflict_review.py +++ b/ietf/doc/views_conflict_review.py @@ -388,7 +388,7 @@ def start_review_sanity_check(request, name): raise Http404 # sanity check that there's not already a conflict review document for this document - if [ rel.source for alias in doc_to_review.docalias_set.all() for rel in alias.relateddocument_set.filter(relationship='conflrev') ]: + if [ rel.source for alias in doc_to_review.docalias.all() for rel in alias.relateddocument_set.filter(relationship='conflrev') ]: raise Http404 return doc_to_review @@ -421,7 +421,8 @@ def build_conflict_review_document(login, doc_to_review, ad, notify, create_in_s ) conflict_review.set_state(create_in_state) - DocAlias.objects.create( name=review_name , document=conflict_review ) + DocAlias.objects.create( name=review_name).docs.add( conflict_review ) + conflict_review.relateddocument_set.create(target=DocAlias.objects.get(name=doc_to_review.name),relationship_id='conflrev') diff --git a/ietf/doc/views_doc.py b/ietf/doc/views_doc.py index cd2ee59a9..444d071f0 100644 --- a/ietf/doc/views_doc.py +++ b/ietf/doc/views_doc.py @@ -103,7 +103,7 @@ def document_main(request, name, rev=None): doc = get_object_or_404(Document.objects.select_related(), docalias__name=name) # take care of possible redirections - aliases = DocAlias.objects.filter(document=doc).values_list("name", flat=True) + aliases = DocAlias.objects.filter(docs=doc).values_list("name", flat=True) if rev==None and doc.type_id == "draft" and not name.startswith("rfc"): for a in aliases: if a.startswith("rfc"): @@ -714,7 +714,7 @@ def document_history(request, name): if doc.get_state_slug() == "rfc": e = doc.latest_event(type="published_rfc") - aliases = doc.docalias_set.filter(name__startswith="rfc") + aliases = doc.docalias.filter(name__startswith="rfc") if aliases: name = aliases[0].name diff_revisions.append((name, "", e.time if e else doc.time, name)) @@ -1009,7 +1009,7 @@ def document_json(request, name, rev=None): data["expires"] = doc.expires.strftime("%Y-%m-%d %H:%M:%S") if doc.expires else None data["title"] = doc.title data["abstract"] = doc.abstract - data["aliases"] = list(doc.docalias_set.values_list("name", flat=True)) + data["aliases"] = list(doc.docalias.values_list("name", flat=True)) data["state"] = extract_name(doc.get_state()) data["intended_std_level"] = extract_name(doc.intended_std_level) data["std_level"] = extract_name(doc.std_level) diff --git a/ietf/doc/views_material.py b/ietf/doc/views_material.py index dbbc98369..d270e5cd1 100644 --- a/ietf/doc/views_material.py +++ b/ietf/doc/views_material.py @@ -142,7 +142,8 @@ def edit_material(request, name=None, acronym=None, action=None, doc_type=None): dest.write(chunk) if action == "new": - DocAlias.objects.get_or_create(name=doc.name, document=doc) + alias, __ = DocAlias.objects.get_or_create(name=doc.name) + alias.docs.add(doc) if prev_rev != doc.rev: e = NewRevisionDocEvent(type="new_revision", doc=doc, rev=doc.rev) diff --git a/ietf/doc/views_review.py b/ietf/doc/views_review.py index 8101226b7..2c00abe63 100644 --- a/ietf/doc/views_review.py +++ b/ietf/doc/views_review.py @@ -593,7 +593,7 @@ def complete_review(request, name, assignment_id): name = "-".join(c for c in name_components if c).lower() if not Document.objects.filter(name=name).exists(): review = Document.objects.create(name=name) - DocAlias.objects.create(document=review, name=review.name) + DocAlias.objects.create(name=review.name).docs.add(review) break review.type = DocTypeName.objects.get(slug="review") diff --git a/ietf/doc/views_search.py b/ietf/doc/views_search.py index f91a20254..f93f139d9 100644 --- a/ietf/doc/views_search.py +++ b/ietf/doc/views_search.py @@ -478,7 +478,7 @@ def index_all_drafts(request): else: heading = "%s Internet-Drafts" % state.name - draft_names = DocAlias.objects.filter(document__states=state).values_list("name", "document__name") + draft_names = DocAlias.objects.filter(docs__states=state).values_list("name", "docs__name") names = [] names_to_skip = set() @@ -528,7 +528,7 @@ def ajax_select2_search_docs(request, model_name, doc_type): if model == Document: qs = qs.filter(type=doc_type) elif model == DocAlias: - qs = qs.filter(document__type=doc_type) + qs = qs.filter(docs__type=doc_type) for t in q: qs = qs.filter(name__icontains=t) diff --git a/ietf/doc/views_status_change.py b/ietf/doc/views_status_change.py index 5be43e3c7..f1f4b7080 100644 --- a/ietf/doc/views_status_change.py +++ b/ietf/doc/views_status_change.py @@ -527,7 +527,7 @@ def start_rfc_status_change(request,name): ) status_change.set_state(form.cleaned_data['create_in_state']) - DocAlias.objects.create( name= 'status-change-'+form.cleaned_data['document_name'], document=status_change ) + DocAlias.objects.create( name= 'status-change-'+form.cleaned_data['document_name']).docs.add(status_change) for key in form.cleaned_data['relations']: status_change.relateddocument_set.create(target=DocAlias.objects.get(name=key), diff --git a/ietf/group/dot.py b/ietf/group/dot.py index 00a65f733..adafb111e 100644 --- a/ietf/group/dot.py +++ b/ietf/group/dot.py @@ -100,7 +100,7 @@ def get_node_styles(node, group): def make_dot(group): references = Q(source__group=group, source__type='draft', relationship__slug__startswith='ref') - both_rfcs = Q(source__states__slug='rfc', target__document__states__slug='rfc') + both_rfcs = Q(source__states__slug='rfc', target__docs__states__slug='rfc') inactive = Q(source__states__slug__in=['expired', 'repl']) attractor = Q(target__name__in=['rfc5000', 'rfc5741']) removed = Q(source__states__slug__in=['auth-rm', 'ietf-rm']) @@ -114,7 +114,7 @@ def make_dot(group): edges.add(Edge(x)) replacements = RelatedDocument.objects.filter(relationship__slug='replaces', - target__document__in=[x.relateddocument.target.document for x in edges]) + target__docs__in=[x.relateddocument.target.document for x in edges]) for x in replacements: edges.add(Edge(x)) diff --git a/ietf/group/tests.py b/ietf/group/tests.py index 752eb2584..bae5be447 100644 --- a/ietf/group/tests.py +++ b/ietf/group/tests.py @@ -71,7 +71,7 @@ class GroupDocDependencyGraphTests(TestCase): set_coverage_checking(False) a = WgDraftFactory() b = WgDraftFactory() - RelatedDocument.objects.create(source=a,target=b.docalias_set.first(),relationship_id='normref') + RelatedDocument.objects.create(source=a,target=b.docalias.first(),relationship_id='normref') def tearDown(self): set_coverage_checking(True) diff --git a/ietf/group/tests_info.py b/ietf/group/tests_info.py index c6e7bf186..89d35b5fa 100644 --- a/ietf/group/tests_info.py +++ b/ietf/group/tests_info.py @@ -325,7 +325,7 @@ class GroupPagesTests(TestCase): type_id="slides", ) doc.set_state(State.objects.get(type="slides", slug="active")) - DocAlias.objects.create(name=doc.name, document=doc) + DocAlias.objects.create(name=doc.name).docs.add(doc) for url in group_urlreverse_list(group, 'ietf.group.views.materials'): r = self.client.get(url) diff --git a/ietf/group/views.py b/ietf/group/views.py index 18c407de4..6fce21fd4 100644 --- a/ietf/group/views.py +++ b/ietf/group/views.py @@ -188,7 +188,7 @@ def fill_in_wg_roles(group): group.secretaries = get_roles("secr", []) def fill_in_wg_drafts(group): - aliases = DocAlias.objects.filter(document__type="draft", document__group=group).select_related('document').order_by("name") + aliases = DocAlias.objects.filter(docs__type="draft", docs__group=group).prefetch_related('docs').order_by("name") group.drafts = [] group.rfcs = [] for a in aliases: @@ -804,7 +804,7 @@ def group_photos(request, group_type=None, acronym=None): # charter.set_state(State.objects.get(used=True, type="charter", slug="notrev")) # # # Create an alias as well -# DocAlias.objects.create(name=charter.name, document=charter) +# DocAlias.objects.create(name=charter.name).docs.add(charter) # # return charter # diff --git a/ietf/idindex/index.py b/ietf/idindex/index.py index d97f9b544..8eb0f6e6b 100644 --- a/ietf/idindex/index.py +++ b/ietf/idindex/index.py @@ -29,9 +29,9 @@ def all_id_txt(): return t.strftime("%Y-%m-%d") if t else "" rfc_aliases = dict(DocAlias.objects.filter(name__startswith="rfc", - document__states=State.objects.get(type="draft", slug="rfc")).values_list("document__name", "name")) + docs__states=State.objects.get(type="draft", slug="rfc")).values_list("docs__name", "name")) - replacements = dict(RelatedDocument.objects.filter(target__document__states=State.objects.get(type="draft", slug="repl"), + replacements = dict(RelatedDocument.objects.filter(target__docs__states=State.objects.get(type="draft", slug="repl"), relationship="replaces").values_list("target__name", "source__name")) @@ -110,9 +110,9 @@ def all_id2_txt(): drafts = drafts.prefetch_related("states") rfc_aliases = dict(DocAlias.objects.filter(name__startswith="rfc", - document__states=State.objects.get(type="draft", slug="rfc")).values_list("document__name", "name")) + docs__states=State.objects.get(type="draft", slug="rfc")).values_list("docs__name", "name")) - replacements = dict(RelatedDocument.objects.filter(target__document__states=State.objects.get(type="draft", slug="repl"), + replacements = dict(RelatedDocument.objects.filter(target__docs__states=State.objects.get(type="draft", slug="repl"), relationship="replaces").values_list("target__name", "source__name")) revision_time = dict(DocEvent.objects.filter(type="new_revision", doc__name__startswith="draft-").order_by('time').values_list("doc__name", "time")) diff --git a/ietf/idindex/tests.py b/ietf/idindex/tests.py index d4979087e..2412e7c76 100644 --- a/ietf/idindex/tests.py +++ b/ietf/idindex/tests.py @@ -47,7 +47,7 @@ class IndexTests(TestCase): # published draft.set_state(State.objects.get(type="draft", slug="rfc")) - DocAlias.objects.create(name="rfc1234", document=draft) + DocAlias.objects.create(name="rfc1234").docs.add(draft) txt = all_id_txt() self.assertTrue(draft.name + "-" + draft.rev in txt) @@ -59,7 +59,7 @@ class IndexTests(TestCase): RelatedDocument.objects.create( relationship=DocRelationshipName.objects.get(slug="replaces"), source=Document.objects.create(type_id="draft", rev="00", name="draft-test-replacement"), - target=draft.docalias_set.get(name__startswith="draft")) + target=draft.docalias.get(name__startswith="draft")) txt = all_id_txt() self.assertTrue(draft.name + "-" + draft.rev in txt) @@ -109,7 +109,7 @@ class IndexTests(TestCase): # test RFC draft.set_state(State.objects.get(type="draft", slug="rfc")) - DocAlias.objects.create(name="rfc1234", document=draft) + DocAlias.objects.create(name="rfc1234").docs.add(draft) t = get_fields(all_id2_txt()) self.assertEqual(t[4], "1234") @@ -118,7 +118,7 @@ class IndexTests(TestCase): RelatedDocument.objects.create( relationship=DocRelationshipName.objects.get(slug="replaces"), source=Document.objects.create(type_id="draft", rev="00", name="draft-test-replacement"), - target=draft.docalias_set.get(name__startswith="draft")) + target=draft.docalias.get(name__startswith="draft")) t = get_fields(all_id2_txt()) self.assertEqual(t[5], "draft-test-replacement") diff --git a/ietf/iesg/tests.py b/ietf/iesg/tests.py index 16a738512..5a8e91751 100644 --- a/ietf/iesg/tests.py +++ b/ietf/iesg/tests.py @@ -92,7 +92,7 @@ class IESGAgendaTests(TestCase): mars = GroupFactory(acronym='mars',parent=Group.objects.get(acronym='farfut')) wgdraft = WgDraftFactory(name='draft-ietf-mars-test', group=mars, intended_std_level_id='ps') rfc = IndividualRfcFactory.create(stream_id='irtf', other_aliases=['rfc6666',], states=[('draft','rfc'),('draft-iesg','pub')], std_level_id='inf', ) - wgdraft.relateddocument_set.create(target=rfc.docalias_set.get(name='rfc6666'), relationship_id='refnorm') + wgdraft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'), relationship_id='refnorm') ise_draft = IndividualDraftFactory(name='draft-imaginary-independent-submission') ise_draft.stream = StreamName.objects.get(slug="ise") ise_draft.save_with_history([DocEvent(doc=ise_draft, rev=ise_draft.rev, type="changed_stream", by=Person.objects.get(user__username="secretary"), desc="Test")]) @@ -216,7 +216,7 @@ class IESGAgendaTests(TestCase): relation = RelatedDocument.objects.create( source=statchg, - target=DocAlias.objects.filter(name__startswith='rfc', document__std_level="ps")[0], + target=DocAlias.objects.filter(name__startswith='rfc', docs__std_level="ps")[0], relationship_id="tohist") statchg.group = Group.objects.get(acronym="mars") @@ -234,7 +234,7 @@ class IESGAgendaTests(TestCase): self.assertTrue(statchg in agenda_data(date_str)["sections"]["2.3.3"]["docs"]) # 3.3 document status changes - relation.target = DocAlias.objects.filter(name__startswith='rfc', document__std_level="inf")[0] + relation.target = DocAlias.objects.filter(name__startswith='rfc', docs__std_level="inf")[0] relation.save() statchg.group = Group.objects.get(acronym="mars") diff --git a/ietf/ipr/admin.py b/ietf/ipr/admin.py index 2656dce90..c22a57f40 100644 --- a/ietf/ipr/admin.py +++ b/ietf/ipr/admin.py @@ -91,7 +91,7 @@ admin.site.register(IprDocRel, IprDocRelAdmin) class RelatedIprAdmin(admin.ModelAdmin): list_display = ['source', 'target', 'relationship', ] - search_fields = ['source__name', 'target__name', 'target__document__name', ] + search_fields = ['source__name', 'target__name', 'target__docs__name', ] raw_id_fields = ['source', 'target', ] admin.site.register(RelatedIpr, RelatedIprAdmin) diff --git a/ietf/ipr/factories.py b/ietf/ipr/factories.py index f7c333625..8758b5fc7 100644 --- a/ietf/ipr/factories.py +++ b/ietf/ipr/factories.py @@ -34,7 +34,7 @@ class IprDisclosureBaseFactory(factory.DjangoModelFactory): return if extracted: for doc in extracted: - IprDocRel.objects.create(disclosure=self,document=doc.docalias_set.first()) + IprDocRel.objects.create(disclosure=self,document=doc.docalias.first()) @factory.post_generation def updates(self, create, extracted, **kwargs): diff --git a/ietf/ipr/tests.py b/ietf/ipr/tests.py index fe03a3c28..4870170d8 100644 --- a/ietf/ipr/tests.py +++ b/ietf/ipr/tests.py @@ -157,7 +157,7 @@ class IprTests(TestCase): self.assertTrue(draft.name in unicontent(r)) self.assertTrue(ipr.title not in unicontent(r)) - DocAlias.objects.create(name="rfc321", document=draft) + DocAlias.objects.create(name="rfc321").docs.add(draft) # find RFC r = self.client.get(url + "?submit=rfc&rfc=321") @@ -260,7 +260,7 @@ 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_set.first().name, + "iprdocrel_set-0-document": "%s" % draft.docalias.first().name, "iprdocrel_set-0-revisions": '00', "iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name, "patent_number": "SE12345678901", @@ -303,7 +303,7 @@ 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_set.first().name, + "iprdocrel_set-0-document": "%s" % draft.docalias.first().name, "iprdocrel_set-0-revisions": '00', "iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name, "patent_number": "SE12345678901", @@ -351,7 +351,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_set.first().name, + "iprdocrel_set-0-document": "%s" % draft.docalias.first().name, "iprdocrel_set-0-revisions": '00', "iprdocrel_set-INITIAL_FORMS": 0, "iprdocrel_set-TOTAL_FORMS": 1, @@ -400,7 +400,7 @@ 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_set.first().name, + "iprdocrel_set-0-document": "%s" % draft.docalias.first().name, "iprdocrel_set-0-revisions": '00', "iprdocrel_set-1-document": DocAlias.objects.filter(name__startswith="rfc").first().name, "patent_number": "SE12345678901", @@ -438,7 +438,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_set.first().name, + "iprdocrel_set-0-document": "%s" % draft.docalias.first().name, "iprdocrel_set-0-revisions": '00', "patent_number": "SE12345678901", "patent_inventor": "A. Nonymous", diff --git a/ietf/ipr/utils.py b/ietf/ipr/utils.py index 04bab1e39..2cb05aa29 100644 --- a/ietf/ipr/utils.py +++ b/ietf/ipr/utils.py @@ -1,3 +1,8 @@ +# Copyright The IETF Trust 2014-2019, All Rights Reserved +# -*- coding: utf-8 -*- + +import debug # pyflakes:ignore + def get_genitive(name): """Return the genitive form of name""" return name + "'" if name.endswith('s') else name + "'s" @@ -29,23 +34,30 @@ def iprs_from_docs(aliases,**kwargs): """Returns a list of IPRs related to doc aliases""" iprdocrels = [] for alias in aliases: - if alias.document.ipr(**kwargs): - iprdocrels += alias.document.ipr(**kwargs) + for document in alias.docs.all(): + if document.ipr(**kwargs): + iprdocrels += document.ipr(**kwargs) return list(set([i.disclosure for i in iprdocrels])) def related_docs(alias, relationship=('replaces', 'obs')): """Returns list of related documents""" - results = list(alias.document.docalias_set.all()) + + results = [] + for doc in alias.docs.all(): + results += list(doc.docalias.all()) - rels = alias.document.all_relations_that_doc(relationship) + rels = [] + for doc in alias.docs.all(): + rels += list(doc.all_relations_that_doc(relationship)) for rel in rels: - rel_aliases = list(rel.target.document.docalias_set.all()) + rel_aliases = list(rel.target.document.docalias.all()) for x in rel_aliases: x.related = rel x.relation = rel.relationship.revname results += rel_aliases + return list(set(results)) diff --git a/ietf/ipr/views.py b/ietf/ipr/views.py index c5d9614df..4f150d016 100644 --- a/ietf/ipr/views.py +++ b/ietf/ipr/views.py @@ -460,16 +460,16 @@ def by_draft_recursive_txt(request): for o in IprDocRel.objects.filter(disclosure__state='posted').select_related('document'): alias = o.document - document = alias.document name = alias.name - related = set(document.docalias_set.all()) | set(document.all_related_that_doc(('obs', 'replaces'))) - for alias in related: - name = alias.name - if name.startswith("rfc"): - name = name.upper() - if not name in docipr: - docipr[name] = [] - docipr[name].append(o.disclosure_id) + for document in alias.docs.all(): + related = set(document.docalias.all()) | set(document.all_related_that_doc(('obs', 'replaces'))) + for alias in related: + name = alias.name + if name.startswith("rfc"): + name = name.upper() + if not name in docipr: + docipr[name] = [] + docipr[name].append(o.disclosure_id) lines = [ u"# Machine-readable list of IPR disclosures by draft name" ] for name, iprs in docipr.iteritems(): @@ -700,7 +700,7 @@ def search(request): # Search by wg acronym # Document list with IPRs elif search_type == "group": - docs = list(DocAlias.objects.filter(document__group=q)) + docs = list(DocAlias.objects.filter(docs__group=q)) related = [] for doc in docs: doc.product_of_this_wg = True @@ -714,7 +714,7 @@ def search(request): # Search by rfc and id title # Document list with IPRs elif search_type == "doctitle": - docs = list(DocAlias.objects.filter(document__title__icontains=q)) + docs = list(DocAlias.objects.filter(docs__title__icontains=q)) related = [] for doc in docs: related += related_docs(doc) diff --git a/ietf/liaisons/forms.py b/ietf/liaisons/forms.py index b059ed5f2..8ec66e40a 100644 --- a/ietf/liaisons/forms.py +++ b/ietf/liaisons/forms.py @@ -25,7 +25,7 @@ from ietf.liaisons.fields import SearchableLiaisonStatementsField from ietf.group.models import Group from ietf.person.models import Email from ietf.person.fields import SearchableEmailField -from ietf.doc.models import Document +from ietf.doc.models import Document, DocAlias from ietf.utils.fields import DatepickerDateField ''' @@ -370,7 +370,7 @@ class LiaisonModelForm(BetterModelForm): ) ) if created: - attach.docalias_set.create(name=attach.name) + DocAlias.objects.create(name=attach.name).docs.add(attach) LiaisonStatementAttachment.objects.create(statement=self.instance,document=attach) attach_file = open(os.path.join(settings.LIAISON_ATTACH_PATH, attach.name + extension), 'w') attach_file.write(attached_file.read()) diff --git a/ietf/meeting/forms.py b/ietf/meeting/forms.py index 645ad6b40..3a1a3ae5e 100644 --- a/ietf/meeting/forms.py +++ b/ietf/meeting/forms.py @@ -271,7 +271,7 @@ class InterimSessionModelForm(forms.ModelForm): # FIXME: What about agendas in html or markdown format? uploaded_filename='{}-00.txt'.format(filename)) doc.set_state(State.objects.get(type__slug=doc.type.slug, slug='active')) - DocAlias.objects.create(name=doc.name, document=doc) + DocAlias.objects.create(name=doc.name).docs.add(doc) self.instance.sessionpresentation_set.create(document=doc, rev=doc.rev) NewRevisionDocEvent.objects.create( type='new_revision', diff --git a/ietf/meeting/views.py b/ietf/meeting/views.py index 19de5cf03..57d906da1 100644 --- a/ietf/meeting/views.py +++ b/ietf/meeting/views.py @@ -38,7 +38,7 @@ from django.views.generic import RedirectView from ietf.doc.fields import SearchableDocumentsField -from ietf.doc.models import Document, State, DocEvent, NewRevisionDocEvent +from ietf.doc.models import Document, State, DocEvent, NewRevisionDocEvent, DocAlias from ietf.group.models import Group from ietf.group.utils import can_manage_materials from ietf.ietfauth.utils import role_required, has_role @@ -1218,7 +1218,7 @@ def upload_session_bluesheets(request, session_id, num): rev = '00', ) doc.states.add(State.objects.get(type_id='bluesheets',slug='active')) - doc.docalias_set.create(name=doc.name) + DocAlias.objects.create(name=doc.name).docs.add(doc) session.sessionpresentation_set.create(document=doc,rev='00') filename = '%s-%s%s'% ( doc.name, doc.rev, ext) doc.uploaded_filename = filename @@ -1307,7 +1307,7 @@ def upload_session_minutes(request, session_id, num): group = session.group, rev = '00', ) - doc.docalias_set.create(name=doc.name) + DocAlias.objects.create(name=doc.name).docs.add(doc) doc.states.add(State.objects.get(type_id='minutes',slug='active')) if session.sessionpresentation_set.filter(document=doc).exists(): sp = session.sessionpresentation_set.get(document=doc) @@ -1410,7 +1410,7 @@ def upload_session_agenda(request, session_id, num): group = session.group, rev = '00', ) - doc.docalias_set.create(name=doc.name) + DocAlias.objects.create(name=doc.name).docs.add(doc) doc.states.add(State.objects.get(type_id='agenda',slug='active')) if session.sessionpresentation_set.filter(document=doc).exists(): sp = session.sessionpresentation_set.get(document=doc) @@ -1513,7 +1513,7 @@ def upload_session_slides(request, session_id, num, name): group = session.group, rev = '00', ) - doc.docalias_set.create(name=doc.name) + DocAlias.objects.create(name=doc.name).docs.add(doc) doc.states.add(State.objects.get(type_id='slides',slug='active')) doc.states.add(State.objects.get(type_id='reuse_policy',slug='single')) if session.sessionpresentation_set.filter(document=doc).exists(): @@ -2448,7 +2448,7 @@ def approve_proposed_slides(request, slidesubmission_id, num): group = submission.session.group, rev = '00', ) - doc.docalias_set.create(name=doc.name) + DocAlias.objects.create(name=doc.name).docs.add(doc) doc.states.add(State.objects.get(type_id='slides',slug='active')) doc.states.add(State.objects.get(type_id='reuse_policy',slug='single')) if submission.session.sessionpresentation_set.filter(document=doc).exists(): diff --git a/ietf/review/utils.py b/ietf/review/utils.py index 5b8ce5bc5..3d2754423 100644 --- a/ietf/review/utils.py +++ b/ietf/review/utils.py @@ -834,7 +834,7 @@ def make_assignment_choices(email_queryset, review_req): possible_emails = list(email_queryset) possible_person_ids = [e.person_id for e in possible_emails] - aliases = DocAlias.objects.filter(document=doc).values_list("name", flat=True) + aliases = DocAlias.objects.filter(docs=doc).values_list("name", flat=True) # settings reviewer_settings = { diff --git a/ietf/secr/drafts/views.py b/ietf/secr/drafts/views.py index 3c0b0f621..524e9f47a 100644 --- a/ietf/secr/drafts/views.py +++ b/ietf/secr/drafts/views.py @@ -579,7 +579,7 @@ def view(request, id): draft.rfc_number = get_rfc_num(draft) # check for replaced bys - qs = Document.objects.filter(relateddocument__target__document=draft, relateddocument__relationship='replaces') + qs = Document.objects.filter(relateddocument__target__docs=draft, relateddocument__relationship='replaces') if qs: draft.replaced_by = qs[0] diff --git a/ietf/secr/proceedings/proc_utils.py b/ietf/secr/proceedings/proc_utils.py index f696c5e27..5a4e5245b 100644 --- a/ietf/secr/proceedings/proc_utils.py +++ b/ietf/secr/proceedings/proc_utils.py @@ -113,10 +113,10 @@ def attach_recording(doc, sessions): document=doc, rev=doc.rev) session.sessionpresentation_set.add(presentation) - if not doc.docalias_set.filter(name__startswith='recording-{}-{}'.format(session.meeting.number,session.group.acronym)): + if not doc.docalias.filter(name__startswith='recording-{}-{}'.format(session.meeting.number,session.group.acronym)): sequence = get_next_sequence(session.group,session.meeting,'recording') name = 'recording-{}-{}-{}'.format(session.meeting.number,session.group.acronym,sequence) - doc.docalias_set.create(name=name) + DocAlias.objects.create(name=name).docs.add(doc) def normalize_room_name(name): '''Returns room name converted to be used as portion of filename''' @@ -150,7 +150,7 @@ def create_recording(session, url, title=None, user=None): type_id='recording') doc.set_state(State.objects.get(type='recording', slug='active')) - doc.docalias_set.create(name=name) + DocAlias.objects.create(name=doc.name).docs.add(doc) # create DocEvent NewRevisionDocEvent.objects.create(type='new_revision', diff --git a/ietf/secr/proceedings/tests.py b/ietf/secr/proceedings/tests.py index 8da4b99a8..5997c6463 100644 --- a/ietf/secr/proceedings/tests.py +++ b/ietf/secr/proceedings/tests.py @@ -132,8 +132,8 @@ class RecordingTestCase(TestCase): import_audio_files(meeting) doc = mars_session.materials.filter(type='recording').first() self.assertTrue(doc in ames_session.materials.all()) - self.assertTrue(doc.docalias_set.filter(name='recording-42-mars-1')) - self.assertTrue(doc.docalias_set.filter(name='recording-42-ames-1')) + self.assertTrue(doc.docalias.filter(name='recording-42-mars-1')) + self.assertTrue(doc.docalias.filter(name='recording-42-ames-1')) def test_normalize_room_name(self): self.assertEqual(normalize_room_name('Test Room'),'testroom') diff --git a/ietf/secr/telechat/tests.py b/ietf/secr/telechat/tests.py index 3dd066e6e..8c01842b8 100644 --- a/ietf/secr/telechat/tests.py +++ b/ietf/secr/telechat/tests.py @@ -63,7 +63,7 @@ class SecrTelechatTestCase(TestCase): draft = WgDraftFactory(ad=ad, intended_std_level_id='ps', states=[('draft-iesg','pub-req'),]) rfc = IndividualRfcFactory.create(stream_id='irtf', other_aliases=['rfc6666',], states=[('draft','rfc'),('draft-iesg','pub')], std_level_id='inf', ) - draft.relateddocument_set.create(target=rfc.docalias_set.get(name='rfc6666'), + draft.relateddocument_set.create(target=rfc.docalias.get(name='rfc6666'), relationship_id='refnorm') create_ballot_if_not_open(None, draft, ad, 'approve') d = get_next_telechat_date() diff --git a/ietf/secr/utils/document.py b/ietf/secr/utils/document.py index 535758425..ecdc1166f 100644 --- a/ietf/secr/utils/document.py +++ b/ietf/secr/utils/document.py @@ -10,11 +10,11 @@ def get_full_path(doc): return os.path.join(doc.get_file_path(), doc.uploaded_filename) def get_rfc_num(doc): - qs = doc.docalias_set.filter(name__startswith='rfc') + qs = doc.docalias.filter(name__startswith='rfc') return qs[0].name[3:] if qs else None def is_draft(doc): - if doc.docalias_set.filter(name__startswith='rfc'): + if doc.docalias.filter(name__startswith='rfc'): return False else: return True diff --git a/ietf/stats/backfill_data.py b/ietf/stats/backfill_data.py index 8af30442f..88819adb0 100755 --- a/ietf/stats/backfill_data.py +++ b/ietf/stats/backfill_data.py @@ -68,9 +68,9 @@ def unicode(text): start = time.time() say("Running query for documents to process ...") -for doc in docs_qs.prefetch_related("docalias_set", "formal_languages", "documentauthor_set", "documentauthor_set__person", "documentauthor_set__person__alias_set"): +for doc in docs_qs.prefetch_related("docalias", "formal_languages", "documentauthor_set", "documentauthor_set__person", "documentauthor_set__person__alias_set"): canonical_name = doc.name - for n in doc.docalias_set.all(): + for n in doc.docalias.all(): if n.name.startswith("rfc"): canonical_name = n.name diff --git a/ietf/stats/tests.py b/ietf/stats/tests.py index 13656a723..c2ca7ccec 100644 --- a/ietf/stats/tests.py +++ b/ietf/stats/tests.py @@ -71,10 +71,10 @@ class StatisticsTests(TestCase): words=100 ) referencing_draft.set_state(State.objects.get(used=True, type="draft", slug="active")) - DocAlias.objects.create(document=referencing_draft, name=referencing_draft.name) + DocAlias.objects.create(name=referencing_draft.name).docs.add(referencing_draft) RelatedDocument.objects.create( source=referencing_draft, - target=draft.docalias_set.first(), + target=draft.docalias.first(), relationship=DocRelationshipName.objects.get(slug="refinfo") ) NewRevisionDocEvent.objects.create( diff --git a/ietf/stats/views.py b/ietf/stats/views.py index 4eeac6506..baf888d7d 100644 --- a/ietf/stats/views.py +++ b/ietf/stats/views.py @@ -205,13 +205,13 @@ def document_stats(request, stats_type=None): if any(stats_type == t[0] for t in possible_document_stats_types): # filter documents - docalias_filters = Q(document__type="draft") + docalias_filters = Q(docs__type="draft") rfc_state = State.objects.get(type="draft", slug="rfc") if document_type == "rfc": - docalias_filters &= Q(document__states=rfc_state) + docalias_filters &= Q(docs__states=rfc_state) elif document_type == "draft": - docalias_filters &= ~Q(document__states=rfc_state) + docalias_filters &= ~Q(docs__states=rfc_state) if from_time: # this is actually faster than joining in the database, @@ -222,7 +222,7 @@ def document_stats(request, stats_type=None): docevent__type__in=["published_rfc", "new_revision"], ).values_list("pk")) - docalias_filters &= Q(document__in=docs_within_time_constraint) + docalias_filters &= Q(docs__in=docs_within_time_constraint) docalias_qs = DocAlias.objects.filter(docalias_filters) @@ -233,10 +233,10 @@ def document_stats(request, stats_type=None): else: doc_label = "document" - total_docs = docalias_qs.values_list("document").distinct().count() + total_docs = docalias_qs.values_list("docs__name").distinct().count() def generate_canonical_names(docalias_qs): - for doc_id, ts in itertools.groupby(docalias_qs.order_by("document"), lambda t: t[0]): + for doc_id, ts in itertools.groupby(docalias_qs.order_by("docs__name"), lambda t: t[0]): chosen = None for t in ts: if chosen is None: @@ -254,7 +254,7 @@ def document_stats(request, stats_type=None): bins = defaultdict(set) - for name, canonical_name, author_count in generate_canonical_names(docalias_qs.values_list("document", "name").annotate(Count("document__documentauthor"))): + for name, canonical_name, author_count in generate_canonical_names(docalias_qs.values_list("docs__name", "name").annotate(Count("docs__documentauthor"))): bins[author_count].add(canonical_name) series_data = [] @@ -270,7 +270,7 @@ def document_stats(request, stats_type=None): bins = defaultdict(set) - for name, canonical_name, pages in generate_canonical_names(docalias_qs.values_list("document", "name", "document__pages")): + for name, canonical_name, pages in generate_canonical_names(docalias_qs.values_list("docs__name", "name", "docs__pages")): bins[pages].add(canonical_name) series_data = [] @@ -289,7 +289,7 @@ def document_stats(request, stats_type=None): bins = defaultdict(set) - for name, canonical_name, words in generate_canonical_names(docalias_qs.values_list("document", "name", "document__words")): + for name, canonical_name, words in generate_canonical_names(docalias_qs.values_list("docs__name", "name", "docs__words")): bins[put_into_bin(words, bin_size)].add(canonical_name) series_data = [] @@ -314,7 +314,7 @@ def document_stats(request, stats_type=None): submission_types[doc_name] = file_types doc_names_with_missing_types = {} - for doc_name, canonical_name, rev in generate_canonical_names(docalias_qs.values_list("document", "name", "document__rev")): + for doc_name, canonical_name, rev in generate_canonical_names(docalias_qs.values_list("docs__name", "name", "docs__rev")): types = submission_types.get(doc_name) if types: for dot_ext in types.split(","): @@ -359,7 +359,7 @@ def document_stats(request, stats_type=None): bins = defaultdict(set) - for name, canonical_name, formal_language_name in generate_canonical_names(docalias_qs.values_list("document", "name", "document__formal_languages__name")): + for name, canonical_name, formal_language_name in generate_canonical_names(docalias_qs.values_list("docs__name", "name", "docs__formal_languages__name")): bins[formal_language_name].add(canonical_name) series_data = [] diff --git a/ietf/submit/tests.py b/ietf/submit/tests.py index 7f978d4a5..c33f1fe2b 100644 --- a/ietf/submit/tests.py +++ b/ietf/submit/tests.py @@ -224,8 +224,8 @@ class SubmitTests(TestCase): note="", ) sug_replaced_draft.set_state(State.objects.get(used=True, type="draft", slug="active")) - sug_replaced_alias = DocAlias.objects.create(document=sug_replaced_draft, name=sug_replaced_draft.name) - + sug_replaced_alias = DocAlias.objects.create(name=sug_replaced_draft.name) + sug_replaced_alias.docs.add(sug_replaced_draft) name = "draft-ietf-mars-testing-tests" rev = "00" @@ -235,7 +235,7 @@ class SubmitTests(TestCase): # supply submitter info, then draft should be in and ready for approval mailbox_before = len(outbox) - replaced_alias = draft.docalias_set.first() + 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)) @@ -593,7 +593,7 @@ class SubmitTests(TestCase): rev = '%02d'%(int(draft.rev)+1) status_url, author = self.do_submission(name,rev) mailbox_before = len(outbox) - replaced_alias = draft.docalias_set.first() + replaced_alias = draft.docalias.first() r = self.supply_extra_metadata(name, status_url, "Submitter Name", "author@example.com", replaces=str(replaced_alias.name)) self.assertEqual(r.status_code, 200) self.assertTrue('cannot replace itself' in unicontent(r)) @@ -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_set.all().first().name), + "replaces": str(draft.docalias.first().name), "edit-note": "no comments", "authors-0-name": "Person 1", "authors-0-email": "person1@example.com", @@ -757,7 +757,7 @@ class SubmitTests(TestCase): self.assertEqual(submission.pages, 123) self.assertEqual(submission.note, "no comments") self.assertEqual(submission.submitter, "Some Random Test Person ") - self.assertEqual(submission.replaces, draft.docalias_set.all().first().name) + self.assertEqual(submission.replaces, draft.docalias.first().name) self.assertEqual(submission.state_id, "manual") authors = submission.authors diff --git a/ietf/submit/utils.py b/ietf/submit/utils.py index 3aa6c05db..43b1b07f2 100644 --- a/ietf/submit/utils.py +++ b/ietf/submit/utils.py @@ -1,8 +1,9 @@ # Copyright The IETF Trust 2011-2019, All Rights Reserved # -*- coding: utf-8 -*- -import os import datetime +import os +import re import six # pyflakes:ignore import xml2rfc @@ -259,7 +260,8 @@ def post_submission(request, submission, approvedDesc): events.append(e) # update related objects - DocAlias.objects.get_or_create(name=submission.name, document=draft) + alias, __ = DocAlias.objects.get_or_create(name=submission.name) + alias.docs.add(draft) draft.set_state(State.objects.get(used=True, type="draft", slug="active")) @@ -373,7 +375,7 @@ def update_replaces_from_submission(request, submission, draft): if request.user.is_authenticated: is_chair_of = list(Group.objects.filter(role__person__user=request.user, role__name="chair")) - replaces = DocAlias.objects.filter(name__in=submission.replaces.split(",")).select_related("document", "document__group") + replaces = DocAlias.objects.filter(name__in=submission.replaces.split(",")).prefetch_related("docs", "docs__group") existing_replaces = list(draft.related_that_doc("replaces")) existing_suggested = set(draft.related_that_doc("possibly-replaces")) diff --git a/ietf/sync/rfceditor.py b/ietf/sync/rfceditor.py index aad98a0e5..834937902 100644 --- a/ietf/sync/rfceditor.py +++ b/ietf/sync/rfceditor.py @@ -370,7 +370,7 @@ def update_docs_from_rfc_index(data, skip_older_than_date=None): # make sure we got the document and alias doc = None name = "rfc%s" % rfc_number - a = DocAlias.objects.filter(name=name).select_related("document") + a = DocAlias.objects.filter(name=name) if a: doc = a[0].document else: @@ -385,7 +385,8 @@ def update_docs_from_rfc_index(data, skip_older_than_date=None): doc = Document.objects.create(name=name, type=DocTypeName.objects.get(slug="draft")) # add alias - DocAlias.objects.get_or_create(name=name, document=doc) + alias, __ = DocAlias.objects.get_or_create(name=name) + alias.docs.add(doc) changes.append("created alias %s" % prettify_std_name(name)) # check attributes @@ -458,7 +459,7 @@ def update_docs_from_rfc_index(data, skip_older_than_date=None): if x[:3] in ("NIC", "IEN", "STD", "RTR"): # try translating this to RFCs that we can handle # sensibly; otherwise we'll have to ignore them - l = DocAlias.objects.filter(name__startswith="rfc", document__docalias__name=x.lower()) + l = DocAlias.objects.filter(name__startswith="rfc", docs__docalias__name=x.lower()) else: l = DocAlias.objects.filter(name=x.lower()) @@ -481,7 +482,7 @@ def update_docs_from_rfc_index(data, skip_older_than_date=None): for a in also: a = a.lower() if not DocAlias.objects.filter(name=a): - DocAlias.objects.create(name=a, document=doc) + DocAlias.objects.create(name=a).docs.add(doc) changes.append("created alias %s" % prettify_std_name(a)) if has_errata: diff --git a/ietf/sync/tests.py b/ietf/sync/tests.py index 134c307ac..6b1aae3a5 100644 --- a/ietf/sync/tests.py +++ b/ietf/sync/tests.py @@ -22,7 +22,7 @@ from ietf.utils.test_utils import TestCase class IANASyncTests(TestCase): def test_protocol_page_sync(self): draft = WgDraftFactory() - DocAlias.objects.create(name="rfc1234", document=draft) + DocAlias.objects.create(name="rfc1234").docs.add(draft) DocEvent.objects.create(doc=draft, rev=draft.rev, type="published_rfc", by=Person.objects.get(name="(System)")) rfc_names = iana.parse_protocol_page('RFC 1234') @@ -234,8 +234,8 @@ class RFCSyncTests(TestCase): # too, but for testing purposes ... updated_doc = Document.objects.create(name="draft-ietf-something") - DocAlias.objects.create(name=updated_doc.name, document=updated_doc) - DocAlias.objects.create(name="rfc123", document=updated_doc) + DocAlias.objects.create(name=updated_doc.name).docs.add(updated_doc) + DocAlias.objects.create(name="rfc123").docs.add(updated_doc) today = datetime.date.today() @@ -337,10 +337,10 @@ class RFCSyncTests(TestCase): self.assertEqual(doc.docevent_set.all()[1].type, "published_rfc") self.assertEqual(doc.docevent_set.all()[1].time.date(), today) self.assertTrue("errata" in doc.tags.all().values_list("slug", flat=True)) - self.assertTrue(DocAlias.objects.filter(name="rfc1234", document=doc)) - self.assertTrue(DocAlias.objects.filter(name="bcp1", document=doc)) - self.assertTrue(DocAlias.objects.filter(name="fyi1", document=doc)) - self.assertTrue(DocAlias.objects.filter(name="std1", document=doc)) + self.assertTrue(DocAlias.objects.filter(name="rfc1234", docs=doc)) + self.assertTrue(DocAlias.objects.filter(name="bcp1", docs=doc)) + self.assertTrue(DocAlias.objects.filter(name="fyi1", docs=doc)) + self.assertTrue(DocAlias.objects.filter(name="std1", docs=doc)) self.assertTrue(RelatedDocument.objects.filter(source=doc, target__name="rfc123", relationship="updates")) self.assertEqual(doc.title, "A Testing RFC") self.assertEqual(doc.abstract, "This is some interesting text.") diff --git a/ietf/utils/test_data.py b/ietf/utils/test_data.py index 04fc0f3a9..d47fff226 100644 --- a/ietf/utils/test_data.py +++ b/ietf/utils/test_data.py @@ -158,10 +158,7 @@ def make_test_data(): charter.set_state(State.objects.get(used=True, slug="approved", type="charter")) group.charter = charter group.save() - DocAlias.objects.create( - name=charter.name, - document=charter - ) + DocAlias.objects.create(name=charter.name).docs.add(charter) setup_default_community_list_for_group(group) # ames WG @@ -183,10 +180,7 @@ def make_test_data(): rev="00", ) charter.set_state(State.objects.get(used=True, slug="infrev", type="charter")) - DocAlias.objects.create( - name=charter.name, - document=charter - ) + DocAlias.objects.create(name=charter.name).docs.add(charter) group.charter = charter group.save() setup_default_community_list_for_group(group) @@ -220,10 +214,7 @@ def make_test_data(): # rev="00", # ) #charter.set_state(State.objects.get(used=True, slug="infrev", type="charter")) - #DocAlias.objects.create( - # name=charter.name, - # document=charter - # ) + #DocAlias.objects.create(name=charter.name).docs.add(charter) #group.charter = charter #group.save() @@ -266,7 +257,8 @@ def make_test_data(): expires=datetime.datetime.now(), ) old_draft.set_state(State.objects.get(used=True, type="draft", slug="expired")) - old_alias = DocAlias.objects.create(document=old_draft, name=old_draft.name) + old_alias = DocAlias.objects.create(name=old_draft.name) + old_alias.docs.add(old_draft) # draft draft = Document.objects.create( @@ -291,10 +283,8 @@ def make_test_data(): draft.set_state(State.objects.get(used=True, type="draft-iesg", slug="pub-req")) draft.set_state(State.objects.get(used=True, type="draft-stream-%s" % draft.stream_id, slug="wg-doc")) - doc_alias = DocAlias.objects.create( - document=draft, - name=draft.name, - ) + doc_alias = DocAlias.objects.create(name=draft.name) + doc_alias.docs.add(draft) RelatedDocument.objects.create(source=draft, target=old_alias, relationship=DocRelationshipName.objects.get(slug='replaces')) old_draft.set_state(State.objects.get(type='draft', slug='repl')) @@ -371,16 +361,17 @@ def make_test_data(): doc = Document.objects.create(name='draft-imaginary-independent-submission',type_id='draft',rev='00', title="Some Independent Notes on Imagination") doc.set_state(State.objects.get(used=True, type="draft", slug="active")) - DocAlias.objects.create(name=doc.name, document=doc) + DocAlias.objects.create(name=doc.name).docs.add(doc) # an irtf submission mid review doc = Document.objects.create(name='draft-imaginary-irtf-submission', type_id='draft',rev='00', stream=StreamName.objects.get(slug='irtf'), title="The Importance of Research Imagination") - docalias = DocAlias.objects.create(name=doc.name, document=doc) + docalias = DocAlias.objects.create(name=doc.name) + docalias.docs.add(doc) doc.set_state(State.objects.get(type="draft", slug="active")) crdoc = Document.objects.create(name='conflict-review-imaginary-irtf-submission', type_id='conflrev', rev='00', notify="fsm@ietf.org", title="Conflict Review of IRTF Imagination Document") - DocAlias.objects.create(name=crdoc.name, document=crdoc) + DocAlias.objects.create(name=crdoc.name).docs.add(crdoc) crdoc.set_state(State.objects.get(name='Needs Shepherd', type__slug='conflrev')) crdoc.relateddocument_set.create(target=docalias,relationship_id='conflrev') @@ -389,14 +380,15 @@ def make_test_data(): doc = Document.objects.create(name='status-change-imaginary-mid-review',type_id='statchg', rev='00', notify="fsm@ietf.org", group=iesg, title="Status Change Review without Imagination") doc.set_state(State.objects.get(slug='needshep',type__slug='statchg')) - docalias = DocAlias.objects.create(name='status-change-imaginary-mid-review',document=doc) + docalias = DocAlias.objects.create(name='status-change-imaginary-mid-review') + docalias.docs.add(doc) # Some things for a status change to affect def rfc_for_status_change_test_factory(name,rfc_num,std_level_id): target_rfc = Document.objects.create(name=name, type_id='draft', std_level_id=std_level_id, notify="%s@ietf.org"%name) target_rfc.set_state(State.objects.get(slug='rfc',type__slug='draft')) - docalias = DocAlias.objects.create(name=name,document=target_rfc) - docalias = DocAlias.objects.create(name='rfc%d'%rfc_num,document=target_rfc) # pyflakes:ignore + DocAlias.objects.create(name=name).docs.add(target_rfc) + DocAlias.objects.create(name='rfc%d'%rfc_num).docs.add(target_rfc) return target_rfc rfc_for_status_change_test_factory('draft-ietf-random-thing',9999,'ps') rfc_for_status_change_test_factory('draft-ietf-random-otherthing',9998,'inf')