From 93d5d193e5697f986a9dd58963fb204d2b11ad12 Mon Sep 17 00:00:00 2001 From: Ryan Cross Date: Thu, 28 Oct 2021 18:45:07 +0000 Subject: [PATCH] Change view /ipr/by-draft-recursive to use static content - Legacy-Id: 19488 --- .../commands/generate_draft_recursive_txt.py | 17 +++++++++++ .../0009_generate_draft_recursive_txt.py | 26 +++++++++++++++++ ietf/ipr/utils.py | 29 +++++++++++++++++++ ietf/ipr/views.py | 26 +++++------------ 4 files changed, 79 insertions(+), 19 deletions(-) create mode 100644 ietf/ipr/management/commands/generate_draft_recursive_txt.py create mode 100644 ietf/ipr/migrations/0009_generate_draft_recursive_txt.py 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/migrations/0009_generate_draft_recursive_txt.py b/ietf/ipr/migrations/0009_generate_draft_recursive_txt.py new file mode 100644 index 000000000..81dba4c44 --- /dev/null +++ b/ietf/ipr/migrations/0009_generate_draft_recursive_txt.py @@ -0,0 +1,26 @@ +# Generated by Django 2.2.24 on 2021-10-28 11:20 + +import os + +from django.core.management import call_command +from django.db import migrations + + +def forwards(apps, schema_editor): + call_command('generate_draft_recursive_txt') + os.chmod('/a/ietfdata/derived/ipr_draft_recursive.txt', 0o666) + + +def reverse(apps, schema_editor): + pass + + +class Migration(migrations.Migration): + + dependencies = [ + ('ipr', '0008_auto_20201109_0439'), + ] + + operations = [ + migrations.RunPython(forwards, reverse), + ] diff --git a/ietf/ipr/utils.py b/ietf/ipr/utils.py index 69e03087f..b0d425e5a 100644 --- a/ietf/ipr/utils.py +++ b/ietf/ipr/utils.py @@ -1,6 +1,9 @@ # Copyright The IETF Trust 2014-2020, All Rights Reserved # -*- coding: utf-8 -*- +import sys + +from ietf.ipr.models import IprDocRel import debug # pyflakes:ignore @@ -61,4 +64,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):