@@ -323,7 +323,7 @@ def friendly_state(self):
323323 elif state .slug == "repl" :
324324 rs = self .related_that ("replaces" )
325325 if rs :
326- 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 ))
326+ 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 ))
327327 else :
328328 return "Replaced"
329329 elif state .slug == "active" :
@@ -411,9 +411,9 @@ def relations_that(self, relationship):
411411 if not isinstance (relationship , tuple ):
412412 raise TypeError ("Expected a string or tuple, received %s" % type (relationship ))
413413 if isinstance (self , Document ):
414- return RelatedDocument .objects .filter (target__document = self , relationship__in = relationship ).select_related ('source' )
414+ return RelatedDocument .objects .filter (target__docs = self , relationship__in = relationship ).select_related ('source' )
415415 elif isinstance (self , DocHistory ):
416- return RelatedDocHistory .objects .filter (target__document = self .doc , relationship__in = relationship ).select_related ('source' )
416+ return RelatedDocHistory .objects .filter (target__docs = self .doc , relationship__in = relationship ).select_related ('source' )
417417 else :
418418 raise TypeError ("Expected method called on Document or DocHistory" )
419419
@@ -434,9 +434,9 @@ def relations_that_doc(self, relationship):
434434 if not isinstance (relationship , tuple ):
435435 raise TypeError ("Expected a string or tuple, received %s" % type (relationship ))
436436 if isinstance (self , Document ):
437- return RelatedDocument .objects .filter (source = self , relationship__in = relationship ).select_related ('target__document ' )
437+ return RelatedDocument .objects .filter (source = self , relationship__in = relationship ).select_related ('target ' )
438438 elif isinstance (self , DocHistory ):
439- return RelatedDocHistory .objects .filter (source = self , relationship__in = relationship ).select_related ('target__document ' )
439+ return RelatedDocHistory .objects .filter (source = self , relationship__in = relationship ).select_related ('target ' )
440440 else :
441441 raise TypeError ("Expected method called on Document or DocHistory" )
442442
@@ -447,14 +447,15 @@ def all_relations_that_doc(self, relationship, related=None):
447447 for r in rels :
448448 if not r in related :
449449 related += ( r , )
450- related = r .target .document .all_relations_that_doc (relationship , related )
450+ for doc in r .target .docs .all ():
451+ related = doc .all_relations_that_doc (relationship , related )
451452 return related
452453
453454 def related_that (self , relationship ):
454- return list (set ([x .source .docalias_set .get (name = x .source .name ) for x in self .relations_that (relationship )]))
455+ return list (set ([x .source .docalias .get (name = x .source .name ) for x in self .relations_that (relationship )]))
455456
456457 def all_related_that (self , relationship , related = None ):
457- return list (set ([x .source .docalias_set .get (name = x .source .name ) for x in self .all_relations_that (relationship )]))
458+ return list (set ([x .source .docalias .get (name = x .source .name ) for x in self .all_relations_that (relationship )]))
458459
459460 def related_that_doc (self , relationship ):
460461 return list (set ([x .target for x in self .relations_that_doc (relationship )]))
@@ -463,7 +464,7 @@ def all_related_that_doc(self, relationship, related=None):
463464 return list (set ([x .target for x in self .all_relations_that_doc (relationship )]))
464465
465466 def replaces (self ):
466- return set ([ r . document for r in self .related_that_doc ("replaces" )])
467+ return set ([ d for r in self .related_that_doc ("replaces" ) for d in r . docs . all () ])
467468
468469 def replaces_canonical_name (self ):
469470 s = set ([ r .document for r in self .related_that_doc ("replaces" )])
@@ -657,7 +658,7 @@ def canonical_name(self):
657658 if not hasattr (self , '_canonical_name' ):
658659 name = self .name
659660 if self .type_id == "draft" and self .get_state_slug () == "rfc" :
660- a = self .docalias_set .filter (name__startswith = "rfc" ).order_by ('-name' ).first ()
661+ a = self .docalias .filter (name__startswith = "rfc" ).order_by ('-name' ).first ()
661662 if a :
662663 name = a .name
663664 elif self .type_id == "charter" :
@@ -671,7 +672,7 @@ def canonical_name(self):
671672
672673
673674 def canonical_docalias (self ):
674- return self .docalias_set .get (name = self .name )
675+ return self .docalias .get (name = self .name )
675676
676677 def display_name (self ):
677678 name = self .canonical_name ()
@@ -766,14 +767,14 @@ def displayname_with_link(self):
766767 def ipr (self ,states = ('posted' ,'removed' )):
767768 """Returns the IPR disclosures against this document (as a queryset over IprDocRel)."""
768769 from ietf .ipr .models import IprDocRel
769- return IprDocRel .objects .filter (document__document = self ,disclosure__state__in = states )
770+ return IprDocRel .objects .filter (document__docs = self , disclosure__state__in = states )
770771
771772 def related_ipr (self ):
772773 """Returns the IPR disclosures against this document and those documents this
773774 document directly or indirectly obsoletes or replaces
774775 """
775776 from ietf .ipr .models import IprDocRel
776- 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 ()
777+ 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 ()
777778 return iprs
778779
779780 def future_presentations (self ):
@@ -889,8 +890,9 @@ def groupmilestone_set(self):
889890 return self .doc .groupmilestone_set
890891
891892 @property
892- def docalias_set (self ):
893- return self .doc .docalias_set
893+ def docalias (self ):
894+ log .unreachable ('2019-06-11' )
895+ return self .doc .docalias
894896
895897 def is_dochistory (self ):
896898 return True
@@ -909,11 +911,14 @@ class DocAlias(models.Model):
909911 to by RFC number, primarily, after achieving RFC status.
910912 """
911913 name = models .CharField (max_length = 255 , unique = True )
912- document = ForeignKey (Document )
913- # docs = models.ManyToManyField(Document, related_name='aliases')
914+ docs = models .ManyToManyField (Document , related_name = 'docalias' )
915+
916+ @property
917+ def document (self ):
918+ return self .docs .first ()
914919
915920 def __unicode__ (self ):
916- return "%s-->%s" % (self .name , self . document .name )
921+ return "%s-->%s" % (self .name , ',' . join ([ unicode ( d .name ) for d in self . docs . all () if isinstance ( d , Document ) ]) )
917922 document_link = admin_link ("document" )
918923 class Meta :
919924 verbose_name = "document alias"
0 commit comments