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
This commit is contained in:
parent
d44c2dc92c
commit
5446ae642a
|
@ -375,54 +375,52 @@ class DocumentInfo(models.Model):
|
||||||
return self.type_id != "slides" or self.get_state_slug('reuse_policy')=='single'
|
return self.type_id != "slides" or self.get_state_slug('reuse_policy')=='single'
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@memoize
|
||||||
def relations_that(self, relationship):
|
def relations_that(self, relationship):
|
||||||
"""Return the related-document objects that describe a given relationship targeting self."""
|
"""Return the related-document objects that describe a given relationship targeting self."""
|
||||||
if isinstance(relationship, str):
|
if isinstance(relationship, str):
|
||||||
relationship = [ relationship ]
|
relationship = ( relationship, )
|
||||||
if isinstance(relationship, tuple):
|
if not isinstance(relationship, tuple):
|
||||||
relationship = list(relationship)
|
raise TypeError("Expected a string or tuple, received %s" % type(relationship))
|
||||||
if not isinstance(relationship, list):
|
|
||||||
raise TypeError("Expected a string, tuple or list, received %s" % type(relationship))
|
|
||||||
if isinstance(self, Document):
|
if isinstance(self, Document):
|
||||||
return RelatedDocument.objects.filter(target__document=self, relationship__in=relationship).select_related('source')
|
return RelatedDocument.objects.filter(target__document=self, relationship__in=relationship).select_related('source')
|
||||||
elif isinstance(self, DocHistory):
|
elif isinstance(self, DocHistory):
|
||||||
return RelatedDocHistory.objects.filter(target__document=self.doc, relationship__in=relationship).select_related('source')
|
return RelatedDocHistory.objects.filter(target__document=self.doc, relationship__in=relationship).select_related('source')
|
||||||
else:
|
else:
|
||||||
return RelatedDocument.objects.none()
|
raise TypeError("Expected method called on Document or DocHistory")
|
||||||
|
|
||||||
def all_relations_that(self, relationship, related=None):
|
def all_relations_that(self, relationship, related=None):
|
||||||
if not related:
|
if not related:
|
||||||
related = []
|
related = tuple([])
|
||||||
rels = self.relations_that(relationship)
|
rels = self.relations_that(relationship)
|
||||||
for r in rels:
|
for r in rels:
|
||||||
if not r in related:
|
if not r in related:
|
||||||
related += [ r ]
|
related += ( r, )
|
||||||
related = r.source.all_relations_that(relationship, related)
|
related = r.source.all_relations_that(relationship, related)
|
||||||
return related
|
return related
|
||||||
|
|
||||||
|
@memoize
|
||||||
def relations_that_doc(self, relationship):
|
def relations_that_doc(self, relationship):
|
||||||
"""Return the related-document objects that describe a given relationship from self to other documents."""
|
"""Return the related-document objects that describe a given relationship from self to other documents."""
|
||||||
if isinstance(relationship, six.string_types):
|
if isinstance(relationship, six.string_types):
|
||||||
relationship = [ relationship ]
|
relationship = ( relationship, )
|
||||||
if isinstance(relationship, tuple):
|
if not isinstance(relationship, tuple):
|
||||||
relationship = list(relationship)
|
raise TypeError("Expected a string or tuple, received %s" % type(relationship))
|
||||||
if not isinstance(relationship, list):
|
|
||||||
raise TypeError("Expected a string, tuple or list, received %s" % type(relationship))
|
|
||||||
if isinstance(self, Document):
|
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__document')
|
||||||
elif isinstance(self, DocHistory):
|
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__document')
|
||||||
else:
|
else:
|
||||||
return RelatedDocument.objects.none()
|
raise TypeError("Expected method called on Document or DocHistory")
|
||||||
|
|
||||||
|
|
||||||
|
@memoize
|
||||||
def all_relations_that_doc(self, relationship, related=None):
|
def all_relations_that_doc(self, relationship, related=None):
|
||||||
if not related:
|
if not related:
|
||||||
related = []
|
related = tuple([])
|
||||||
rels = self.relations_that_doc(relationship)
|
rels = self.relations_that_doc(relationship)
|
||||||
for r in rels:
|
for r in rels:
|
||||||
if not r in related:
|
if not r in related:
|
||||||
related += [ r ]
|
related += ( r, )
|
||||||
related = r.target.document.all_relations_that_doc(relationship, related)
|
related = r.target.document.all_relations_that_doc(relationship, related)
|
||||||
return related
|
return related
|
||||||
|
|
||||||
|
@ -757,7 +755,7 @@ class Document(DocumentInfo):
|
||||||
document directly or indirectly obsoletes or replaces
|
document directly or indirectly obsoletes or replaces
|
||||||
"""
|
"""
|
||||||
from ietf.ipr.models import IprDocRel
|
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_set.all())+self.all_related_that_doc(('obs','replaces'))).filter(disclosure__state__in=('posted','removed')).values_list('disclosure', flat=True).distinct()
|
||||||
return iprs
|
return iprs
|
||||||
|
|
||||||
def future_presentations(self):
|
def future_presentations(self):
|
||||||
|
|
|
@ -31,7 +31,7 @@ def iprs_from_docs(aliases,**kwargs):
|
||||||
iprdocrels += alias.document.ipr(**kwargs)
|
iprdocrels += alias.document.ipr(**kwargs)
|
||||||
return list(set([i.disclosure for i in iprdocrels]))
|
return list(set([i.disclosure for i in iprdocrels]))
|
||||||
|
|
||||||
def related_docs(alias, relationship=['replaces', 'obs']):
|
def related_docs(alias, relationship=('replaces', 'obs')):
|
||||||
"""Returns list of related documents"""
|
"""Returns list of related documents"""
|
||||||
results = list(alias.document.docalias_set.all())
|
results = list(alias.document.docalias_set.all())
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue