Skip to content

Commit 5446ae6

Browse files
committed
Changed the signature of some document methods to not accept lists (but still accept tuples) in order to make caching possible. Added @memoize to some methods.
- Legacy-Id: 15024
1 parent d44c2dc commit 5446ae6

2 files changed

Lines changed: 17 additions & 19 deletions

File tree

ietf/doc/models.py

Lines changed: 16 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -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):

ietf/ipr/utils.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def iprs_from_docs(aliases,**kwargs):
3131
iprdocrels += alias.document.ipr(**kwargs)
3232
return list(set([i.disclosure for i in iprdocrels]))
3333

34-
def related_docs(alias, relationship=['replaces', 'obs']):
34+
def related_docs(alias, relationship=('replaces', 'obs')):
3535
"""Returns list of related documents"""
3636
results = list(alias.document.docalias_set.all())
3737

0 commit comments

Comments
 (0)