@@ -375,54 +375,52 @@ def meeting_related(self):
375375 return self .type_id != "slides" or self .get_state_slug ('reuse_policy' )== 'single'
376376 return False
377377
378+ @memoize
378379 def relations_that (self , relationship ):
379380 """Return the related-document objects that describe a given relationship targeting self."""
380381 if isinstance (relationship , str ):
381- relationship = [ relationship ]
382- if isinstance (relationship , tuple ):
383- relationship = list (relationship )
384- if not isinstance (relationship , list ):
385- raise TypeError ("Expected a string, tuple or list, received %s" % type (relationship ))
382+ relationship = ( relationship , )
383+ if not isinstance (relationship , tuple ):
384+ raise TypeError ("Expected a string or tuple, received %s" % type (relationship ))
386385 if isinstance (self , Document ):
387386 return RelatedDocument .objects .filter (target__document = self , relationship__in = relationship ).select_related ('source' )
388387 elif isinstance (self , DocHistory ):
389388 return RelatedDocHistory .objects .filter (target__document = self .doc , relationship__in = relationship ).select_related ('source' )
390389 else :
391- return RelatedDocument . objects . none ( )
390+ raise TypeError ( "Expected method called on Document or DocHistory" )
392391
393392 def all_relations_that (self , relationship , related = None ):
394393 if not related :
395- related = []
394+ related = tuple ([])
396395 rels = self .relations_that (relationship )
397396 for r in rels :
398397 if not r in related :
399- related += [ r ]
398+ related += ( r , )
400399 related = r .source .all_relations_that (relationship , related )
401400 return related
402401
402+ @memoize
403403 def relations_that_doc (self , relationship ):
404404 """Return the related-document objects that describe a given relationship from self to other documents."""
405405 if isinstance (relationship , six .string_types ):
406- relationship = [ relationship ]
407- if isinstance (relationship , tuple ):
408- relationship = list (relationship )
409- if not isinstance (relationship , list ):
410- raise TypeError ("Expected a string, tuple or list, received %s" % type (relationship ))
406+ relationship = ( relationship , )
407+ if not isinstance (relationship , tuple ):
408+ raise TypeError ("Expected a string or tuple, received %s" % type (relationship ))
411409 if isinstance (self , Document ):
412410 return RelatedDocument .objects .filter (source = self , relationship__in = relationship ).select_related ('target__document' )
413411 elif isinstance (self , DocHistory ):
414412 return RelatedDocHistory .objects .filter (source = self , relationship__in = relationship ).select_related ('target__document' )
415413 else :
416- return RelatedDocument .objects .none ()
417-
414+ raise TypeError ("Expected method called on Document or DocHistory" )
418415
416+ @memoize
419417 def all_relations_that_doc (self , relationship , related = None ):
420418 if not related :
421- related = []
419+ related = tuple ([])
422420 rels = self .relations_that_doc (relationship )
423421 for r in rels :
424422 if not r in related :
425- related += [ r ]
423+ related += ( r , )
426424 related = r .target .document .all_relations_that_doc (relationship , related )
427425 return related
428426
@@ -757,7 +755,7 @@ def related_ipr(self):
757755 document directly or indirectly obsoletes or replaces
758756 """
759757 from ietf .ipr .models import IprDocRel
760- 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 ()
758+ 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 ()
761759 return iprs
762760
763761 def future_presentations (self ):
0 commit comments