Changed DocAlias to be many-to-many, in order to be able to handle STD aliases referring to multiple RFCs.

- Legacy-Id: 16249
This commit is contained in:
Henrik Levkowetz 2019-06-14 20:38:14 +00:00
parent 815602351f
commit a2cafded25
50 changed files with 228 additions and 203 deletions

View file

@ -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 = []

View file

@ -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)

View file

@ -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:

View file

@ -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)

View file

@ -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("<a href=\"%s\">%s</a>" % (urlreverse('ietf.doc.views_doc.document_main', kwargs=dict(name=alias.document)), alias.document) for alias in rs))
return mark_safe("Replaced by " + ", ".join("<a href=\"%s\">%s</a>" % (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"

View file

@ -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)

View file

@ -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)

View file

@ -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)

View file

@ -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"))

View file

@ -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')

View file

@ -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()

View file

@ -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):

View file

@ -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

View file

@ -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]

View file

@ -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"))

View file

@ -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')

View file

@ -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)

View file

@ -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)

View file

@ -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")

View file

@ -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)

View file

@ -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),

View file

@ -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))

View file

@ -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)

View file

@ -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)

View file

@ -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
#

View file

@ -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"))

View file

@ -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")

View file

@ -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")

View file

@ -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)

View file

@ -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):

View file

@ -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",

View file

@ -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))

View file

@ -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)

View file

@ -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())

View file

@ -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',

View file

@ -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():

View file

@ -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 = {

View file

@ -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]

View file

@ -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',

View file

@ -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')

View file

@ -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()

View file

@ -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

View file

@ -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

View file

@ -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(

View file

@ -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 = []

View file

@ -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 <random@example.com>")
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

View file

@ -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"))

View file

@ -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:

View file

@ -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('<html><a href="/go/rfc1234/">RFC 1234</a></html>')
@ -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.")

View file

@ -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')