diff --git a/ietf/ipr/management/commands/generate_draft_recursive_txt.py b/ietf/ipr/management/commands/generate_draft_recursive_txt.py new file mode 100644 index 000000000..240fc5348 --- /dev/null +++ b/ietf/ipr/management/commands/generate_draft_recursive_txt.py @@ -0,0 +1,17 @@ +# Copyright The IETF Trust 2014-2021, All Rights Reserved +# -*- coding: utf-8 -*- + + +from django.core.management.base import BaseCommand, CommandError + +from ietf.ipr.utils import generate_draft_recursive_txt + + +class Command(BaseCommand): + help = ("Generate machine-readable list of IPR disclosures by draft name (recursive)") + + def handle(self, *args, **options): + try: + generate_draft_recursive_txt() + except (ValueError, IOError) as e: + raise CommandError(e) diff --git a/ietf/ipr/tests.py b/ietf/ipr/tests.py index f31a312ea..301afb10e 100644 --- a/ietf/ipr/tests.py +++ b/ietf/ipr/tests.py @@ -13,7 +13,7 @@ from django.urls import reverse as urlreverse import debug # pyflakes:ignore from ietf.doc.models import DocAlias -from ietf.doc.factories import DocumentFactory, WgDraftFactory, IndividualDraftFactory, WgRfcFactory +from ietf.doc.factories import DocumentFactory, WgDraftFactory, WgRfcFactory from ietf.group.factories import RoleFactory from ietf.ipr.factories import HolderIprDisclosureFactory, GenericIprDisclosureFactory, IprEventFactory from ietf.ipr.mail import (process_response_email, get_reply_to, get_update_submitter_emails, @@ -129,16 +129,6 @@ class IprTests(TestCase): self.assertContains(r, draft.name) self.assertContains(r, str(ipr.pk)) - def test_iprs_for_drafts_recursive(self): - draft = WgDraftFactory(relations=[('replaces', IndividualDraftFactory())]) - ipr = HolderIprDisclosureFactory(docs=[draft,]) - replaced = draft.all_related_that_doc('replaces') - r = self.client.get(urlreverse("ietf.ipr.views.by_draft_recursive_txt")) - self.assertContains(r, draft.name) - for alias in replaced: - self.assertContains(r, alias.name) - self.assertContains(r, str(ipr.pk)) - def test_about(self): r = self.client.get(urlreverse("ietf.ipr.views.about")) self.assertContains(r, "File a disclosure") @@ -723,4 +713,4 @@ Subject: test removed_docevent = doc.docevent_set.filter(type='removed_related_ipr').first() self.assertIn(ipr.title, removed_docevent.desc, 'IprDisclosure title does not appear in DocEvent desc when removed') - \ No newline at end of file + diff --git a/ietf/ipr/utils.py b/ietf/ipr/utils.py index 69e03087f..43f5494b1 100644 --- a/ietf/ipr/utils.py +++ b/ietf/ipr/utils.py @@ -1,6 +1,7 @@ # Copyright The IETF Trust 2014-2020, All Rights Reserved # -*- coding: utf-8 -*- +from ietf.ipr.models import IprDocRel import debug # pyflakes:ignore @@ -61,4 +62,30 @@ def related_docs(alias, relationship=('replaces', 'obs')): return list(set(results)) + +def generate_draft_recursive_txt(): + docipr = {} + + for o in IprDocRel.objects.filter(disclosure__state='posted').select_related('document'): + alias = o.document + name = alias.name + 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 = [ "# Machine-readable list of IPR disclosures by draft name" ] + for name, iprs in docipr.items(): + lines.append(name + "\t" + "\t".join(str(ipr_id) for ipr_id in sorted(iprs))) + + data = '\n'.join(lines) + filename = '/a/ietfdata/derived/ipr_draft_recursive.txt' + with open(filename, 'w') as f: + f.write(data) + diff --git a/ietf/ipr/views.py b/ietf/ipr/views.py index 88e6db45a..5d2d8393f 100644 --- a/ietf/ipr/views.py +++ b/ietf/ipr/views.py @@ -459,26 +459,14 @@ def by_draft_txt(request): return HttpResponse("\n".join(lines), content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET) def by_draft_recursive_txt(request): - docipr = {} + """Returns machine-readable list of IPR disclosures by draft name, recursive. + NOTE: this view is expensive and should be removed once tools.ietf.org is retired, + including util function and management commands that generate the content for + this view.""" - for o in IprDocRel.objects.filter(disclosure__state='posted').select_related('document'): - alias = o.document - name = alias.name - 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 = [ "# Machine-readable list of IPR disclosures by draft name" ] - for name, iprs in docipr.items(): - lines.append(name + "\t" + "\t".join(str(ipr_id) for ipr_id in sorted(iprs))) - - return HttpResponse("\n".join(lines), content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET) + with open('/a/ietfdata/derived/ipr_draft_recursive.txt') as f: + content = f.read() + return HttpResponse(content, content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET) def new(request, type, updates=None):