Merged in [19488] from rcross@amsl.com:

Change view /ipr/by-draft-recursive to use static content
 - Legacy-Id: 19524
Note: SVN reference [19488] has been migrated to Git commit 93d5d193e5
This commit is contained in:
Robert Sparks 2021-11-02 15:55:20 +00:00
commit 2eb2ced685
4 changed files with 53 additions and 31 deletions

View file

@ -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)

View file

@ -13,7 +13,7 @@ from django.urls import reverse as urlreverse
import debug # pyflakes:ignore import debug # pyflakes:ignore
from ietf.doc.models import DocAlias 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.group.factories import RoleFactory
from ietf.ipr.factories import HolderIprDisclosureFactory, GenericIprDisclosureFactory, IprEventFactory from ietf.ipr.factories import HolderIprDisclosureFactory, GenericIprDisclosureFactory, IprEventFactory
from ietf.ipr.mail import (process_response_email, get_reply_to, get_update_submitter_emails, 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, draft.name)
self.assertContains(r, str(ipr.pk)) 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): def test_about(self):
r = self.client.get(urlreverse("ietf.ipr.views.about")) r = self.client.get(urlreverse("ietf.ipr.views.about"))
self.assertContains(r, "File a disclosure") self.assertContains(r, "File a disclosure")
@ -723,4 +713,4 @@ Subject: test
removed_docevent = doc.docevent_set.filter(type='removed_related_ipr').first() removed_docevent = doc.docevent_set.filter(type='removed_related_ipr').first()
self.assertIn(ipr.title, removed_docevent.desc, self.assertIn(ipr.title, removed_docevent.desc,
'IprDisclosure title does not appear in DocEvent desc when removed') 'IprDisclosure title does not appear in DocEvent desc when removed')

View file

@ -1,6 +1,7 @@
# Copyright The IETF Trust 2014-2020, All Rights Reserved # Copyright The IETF Trust 2014-2020, All Rights Reserved
# -*- coding: utf-8 -*- # -*- coding: utf-8 -*-
from ietf.ipr.models import IprDocRel
import debug # pyflakes:ignore import debug # pyflakes:ignore
@ -61,4 +62,30 @@ def related_docs(alias, relationship=('replaces', 'obs')):
return list(set(results)) 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)

View file

@ -459,26 +459,14 @@ def by_draft_txt(request):
return HttpResponse("\n".join(lines), content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET) return HttpResponse("\n".join(lines), content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET)
def by_draft_recursive_txt(request): 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'): with open('/a/ietfdata/derived/ipr_draft_recursive.txt') as f:
alias = o.document content = f.read()
name = alias.name return HttpResponse(content, content_type="text/plain; charset=%s"%settings.DEFAULT_CHARSET)
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)
def new(request, type, updates=None): def new(request, type, updates=None):