From 381117c742b259c0614df9f7c036b609fc44a00f Mon Sep 17 00:00:00 2001 From: Pasi Eronen Date: Tue, 23 Mar 2010 02:03:36 +0000 Subject: [PATCH] New script to generate all_id2.txt - Legacy-Id: 2202 --- changelog | 7 +++ ietf/idindex/generate_all_id2_txt.py | 38 +++++++++++++ ietf/idindex/testurl.list | 2 + ietf/idindex/urls.py | 1 + ietf/idindex/views.py | 81 +++++++++++++++++++++++++++- ietf/templates/idindex/all_id2.txt | 33 ++++++++++++ 6 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 ietf/idindex/generate_all_id2_txt.py create mode 100644 ietf/templates/idindex/all_id2.txt diff --git a/changelog b/changelog index 3b9952773..465a5603b 100644 --- a/changelog +++ b/changelog @@ -1,3 +1,10 @@ +ietfdb (2.49) + + * New script to generate all_id2.txt. This should be called in + www6s/scripts/datatracker-updater: run "python -m + ietf.idindex.generate_all_id2_txt" and place its output + in $ID/all_id2.txt. + ietfdb (2.48) From Pasi: diff --git a/ietf/idindex/generate_all_id2_txt.py b/ietf/idindex/generate_all_id2_txt.py new file mode 100644 index 000000000..bbebdcb08 --- /dev/null +++ b/ietf/idindex/generate_all_id2_txt.py @@ -0,0 +1,38 @@ +# Portions Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies). +# All rights reserved. Contact: Pasi Eronen +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions +# are met: +# +# * Redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer. +# +# * Redistributions in binary form must reproduce the above +# copyright notice, this list of conditions and the following +# disclaimer in the documentation and/or other materials provided +# with the distribution. +# +# * Neither the name of the Nokia Corporation and/or its +# subsidiary(-ies) nor the names of its contributors may be used +# to endorse or promote products derived from this software +# without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +from ietf import settings +from django.core import management +management.setup_environ(settings) + +from ietf.idindex.views import all_id2_txt +print all_id2_txt().encode('utf-8'), diff --git a/ietf/idindex/testurl.list b/ietf/idindex/testurl.list index 17f034297..15810bc1c 100644 --- a/ietf/idindex/testurl.list +++ b/ietf/idindex/testurl.list @@ -14,5 +14,7 @@ 301 /drafts/all_id.html 301 /drafts/ 200,heavy /drafts/_test/all_id.txt +# this takes 3 minutes, so disabled by default +#200,heavy /drafts/_test/all_id2.txt 200,heavy /drafts/_test/id_index.txt 200,heavy /drafts/_test/id_abstracts.txt diff --git a/ietf/idindex/urls.py b/ietf/idindex/urls.py index cce8bded5..9d9b7e628 100644 --- a/ietf/idindex/urls.py +++ b/ietf/idindex/urls.py @@ -20,6 +20,7 @@ urlpatterns = patterns('', if settings.SERVER_MODE != 'production': urlpatterns += patterns('', (r'^_test/all_id.txt$', views.test_all_id_txt), + (r'^_test/all_id2.txt$', views.test_all_id2_txt), (r'^_test/id_index.txt$', views.test_id_index_txt), (r'^_test/id_abstracts.txt$', views.test_id_abstracts_txt) ) diff --git a/ietf/idindex/views.py b/ietf/idindex/views.py index a749dc5fd..46247838d 100644 --- a/ietf/idindex/views.py +++ b/ietf/idindex/views.py @@ -35,7 +35,9 @@ from django.http import HttpResponse, HttpResponsePermanentRedirect from django.template import loader from django.shortcuts import get_object_or_404 -from ietf.idtracker.models import Acronym, IETFWG, InternetDraft, IDInternal +from ietf.idtracker.models import Acronym, IETFWG, InternetDraft, IDInternal,PersonOrOrgInfo +from ietf.idtracker.templatetags.ietf_filters import clean_whitespace +import re def all_id_txt(): all_ids = InternetDraft.objects.order_by('filename') @@ -58,6 +60,81 @@ def all_id_txt(): 'withdrawn_ietf':withdrawn_ietf, 'replaced':replaced}) +def all_id2_entry(id): + fields = [] + # 0 + fields.append(id.filename+"-"+id.revision_display()) + # 1 + fields.append(id.id_document_tag) + # 2 + status = id.status.status + fields.append(status) + # 3 + iesgstate = id.idstate() if status=="Active" else "" + fields.append(iesgstate) + # 4 + fields.append(id.rfc_number if status=="RFC" else "") + # 5 + if status == "Replaced": + try: + fields.append(id.replaced_by.filename) + except InternetDraft.DoesNotExist: + fields.append("") + else: + fields.append("") + # 6 + fields.append(id.revision_date) + # 7 + group_acronym = id.group.acronym + if group_acronym == "none": + group_acronym = "" + fields.append(group_acronym) + + # 8 + area = "" + if id.idinternal: + area = id.idinternal.area_acronym + elif not group_acronym: + pass + else: + wgs = id.group.ietfwg_set.all() + if len(wgs) > 0: + area = wgs[0].area_acronym() or "" + fields.append(area) + # 9 + fields.append(id.idinternal.job_owner if id.idinternal else "") + # 10 + if id.intended_status and id.intended_status.intended_status not in ("None","Request"): + fields.append(id.intended_status.intended_status) + else: + fields.append("") + # 11 + if (iesgstate=="In Last Call") or iesgstate.startswith("In Last Call::"): + fields.append(id.lc_expiration_date) + else: + fields.append("") + # 12 + fields.append(id.file_type if status=="Active" else "") + # 13 + fields.append(clean_whitespace(id.title)) + # 14 + authors = [] + for author in sorted(id.authors.all(), key=lambda x: x.final_author_order()): + try: + realname = unicode(author.person) + email = author.email() or "" + name = re.sub(u"[<>@,]", u"", realname) + u" <"+re.sub(u"[<>,]", u"", email).strip()+u">" + authors.append(clean_whitespace(name)) + except PersonOrOrgInfo.DoesNotExist: + pass + fields.append(u", ".join(authors)) + return "\t".join([unicode(x) for x in fields]) + +def all_id2_txt(): + all_ids = InternetDraft.objects.order_by('filename').select_related('status__status','group__acronym','intended_status__intended_status') + data = "\n".join([all_id2_entry(id) for id in all_ids]) + return loader.render_to_string("idindex/all_id2.txt",{'data':data}) + def id_index_txt(): groups = IETFWG.objects.all() return loader.render_to_string("idindex/id_index.txt", {'groups':groups}) @@ -68,6 +145,8 @@ def id_abstracts_txt(): def test_all_id_txt(request): return HttpResponse(all_id_txt(), mimetype='text/plain') +def test_all_id2_txt(request): + return HttpResponse(all_id2_txt(), mimetype='text/plain') def test_id_index_txt(request): return HttpResponse(id_index_txt(), mimetype='text/plain') def test_id_abstracts_txt(request): diff --git a/ietf/templates/idindex/all_id2.txt b/ietf/templates/idindex/all_id2.txt new file mode 100644 index 000000000..528123c62 --- /dev/null +++ b/ietf/templates/idindex/all_id2.txt @@ -0,0 +1,33 @@ +{% autoescape off %}# +# Index of all Internet-Drafts +# generated: {% now "Y-m-d H:i:s T" %} +# +# Description of fields: +# 0 draft name and latest revision +# 1 id_document_tag (internal database identifier; avoid using +# unless you really need it) +# 2 one of "Active", "Expired", "RFC", "Withdrawn by Submitter", +# "Replaced", or "Withdrawn by IETF" +# 3 if #2 is "Active", the IESG state for the document (such as +# "In Last Call", "AD Evaluation::Revised ID Needed", or "I-D Exists"); +# otherwise empty +# 4 if #2 is "RFC", the RFC number (otherwise empty) +# 5 if #2 is "Replaced", the replacing draft name (otherwise empty) +# 6 revision date (YYYY-MM-DD) +# 7 group acronym (or empty if no group/not known) +# 8 area acronym (or empty if not known; not necessarily accurate +# for older drafts) +# 9 responsible AD name (or empty if not known) +# 10 intended maturity level (or empty if not known) +# 11 if #3 is "In Last Call" (with any substate), the last call +# end date (YYYY-MM-DD); otherwise empty +# 12 if #2 is "Active", list of file types; otherwise empty +# 13 draft title +# 14 draft authors (often quite inaccurate, especially the email +# addresses...) +# +# new fields can be added to the end in the future, so remember to +# ignore those in your code +# +{{ data }} +# end{% endautoescape %}