225 lines
8.7 KiB
Python
225 lines
8.7 KiB
Python
# Copyright The IETF Trust 2007, All Rights Reserved
|
|
|
|
from django.http import HttpResponse
|
|
from django.views.generic.list_detail import object_list
|
|
from django.db.models import Q
|
|
from django.http import Http404
|
|
from django.template import RequestContext, loader
|
|
from django.shortcuts import render_to_response, get_object_or_404
|
|
from ietf.idtracker.models import Acronym, IETFWG, InternetDraft, Rfc
|
|
from ietf.idindex.forms import IDIndexSearchForm
|
|
from ietf.idindex.models import alphabet, orgs, orgs_dict
|
|
from ietf.utils import orl, flattenl
|
|
|
|
base_extra = { 'alphabet': alphabet, 'orgs': orgs }
|
|
|
|
def wgdocs(request, **kwargs):
|
|
if kwargs.has_key('id'):
|
|
queryset = InternetDraft.objects.filter(group=kwargs['id'])
|
|
group = Acronym.objects.get(acronym_id=kwargs['id'])
|
|
else:
|
|
wg = kwargs['slug']
|
|
try:
|
|
group = Acronym.objects.get(acronym=wg)
|
|
except Acronym.DoesNotExist: # try a search
|
|
if wg == 'other':
|
|
queryset = IETFWG.objects.filter(
|
|
orl([Q(group_acronym__acronym__istartswith="%d" % i) for i in range(0,10)])
|
|
)
|
|
else:
|
|
queryset = IETFWG.objects.filter(group_acronym__acronym__istartswith=wg)
|
|
queryset = queryset.filter(group_type__type='WG').select_related().order_by('status_id', 'acronym.acronym')
|
|
return object_list(request, queryset=queryset, template_name='idindex/wglist.html', allow_empty=True, extra_context=base_extra)
|
|
queryset = InternetDraft.objects.filter(group__acronym=wg)
|
|
queryset = queryset.order_by('status_id', 'filename')
|
|
extra = base_extra
|
|
extra['group'] = group
|
|
return object_list(request, queryset=queryset, template_name='idindex/wgdocs.html', allow_empty=True, extra_context=extra)
|
|
|
|
def inddocs(request, filter=None):
|
|
ind_exception = orl(
|
|
[Q(filename__istartswith='draft-%s-' % e) for e in
|
|
flattenl([org.get('prefixes', [ org['key'] ]) for org in orgs]) + ['ietf']])
|
|
if filter == 'other':
|
|
queryset = InternetDraft.objects.filter(
|
|
orl([Q(filename__istartswith="draft-%d" % i) for i in range(0,10)])
|
|
)
|
|
else:
|
|
queryset = InternetDraft.objects.filter(filename__istartswith='draft-' + filter)
|
|
queryset = queryset.exclude(ind_exception).filter(group__acronym='none').order_by('filename')
|
|
extra = base_extra
|
|
extra['filter'] = filter
|
|
return object_list(request, queryset=queryset, template_name='idindex/inddocs.html', allow_empty=True, extra_context=extra)
|
|
|
|
def otherdocs(request, cat=None):
|
|
try:
|
|
org = orgs_dict[cat]
|
|
except KeyError:
|
|
raise Http404
|
|
queryset = InternetDraft.objects.filter(
|
|
orl([Q(filename__istartswith="draft-%s-" % p)|
|
|
Q(filename__istartswith="draft-ietf-%s-" % p)
|
|
for p in org.get('prefixes', [ org['key'] ])]))
|
|
queryset = queryset.order_by('status_id','filename')
|
|
extra = base_extra
|
|
extra['category'] = cat
|
|
return object_list(request, queryset=queryset, template_name='idindex/otherdocs.html', allow_empty=True, extra_context=extra)
|
|
|
|
def showdocs(request, cat=None):
|
|
catmap = {
|
|
'all': { 'extra': { 'header': 'All' } },
|
|
'current': { 'extra': { 'header': 'Current', 'norfc': 1 },
|
|
'query': Q(status__status="Active") },
|
|
'rfc': { 'extra': { 'header': 'Published' },
|
|
'query': Q(status__status="RFC") },
|
|
'dead': { 'extra': { 'header': "Expired/Withdrawn/Replaced", 'norfc': 1 },
|
|
'query': Q(status__in=[2,4,5,6]) }, # Using the words seems fragile here for some reason
|
|
}
|
|
if not(catmap.has_key(cat)):
|
|
raise Http404
|
|
sortmap = { 'date': { 'header': "Submission Date",
|
|
'fields': ['revision_date','filename'] },
|
|
'name': { 'header': "Filename",
|
|
'fields': ['filename'] },
|
|
'': { 'header': "WHA?",
|
|
'fields': ['filename'] },
|
|
}
|
|
sortby = request.GET.get('sort', 'name')
|
|
if not(sortmap.has_key(sortby)):
|
|
sortby = 'name'
|
|
queryset = InternetDraft.objects.all()
|
|
if catmap[cat].has_key('query'):
|
|
queryset = queryset.filter(catmap[cat]['query'])
|
|
queryset = queryset.order_by(*list(['status_id'] + sortmap[sortby]['fields']))
|
|
extra = catmap[cat]['extra']
|
|
extra['sort_header'] = sortmap[sortby]['header']
|
|
extra.update(base_extra)
|
|
return object_list(request, queryset=queryset, template_name='idindex/showdocs.html', allow_empty=True, extra_context=extra)
|
|
|
|
|
|
def search(request):
|
|
form = IDIndexSearchForm()
|
|
t = loader.get_template('idindex/search.html')
|
|
# if there's a query, do the search and supply results to the template
|
|
searching = False
|
|
qdict = { 'filename': 'filename__icontains',
|
|
'id_tracker_state_id': 'idinternal__cur_state',
|
|
'wg_id': 'group',
|
|
'status_id': 'status',
|
|
'last_name': 'authors__person__last_name__icontains',
|
|
'first_name': 'authors__person__first_name__icontains',
|
|
}
|
|
for key in qdict.keys() + ['other_group']:
|
|
if key in request.REQUEST:
|
|
searching = True
|
|
if searching:
|
|
# '0' and '-1' are flag values for "any"
|
|
# in the original .cgi search page.
|
|
# They are compared as strings because the
|
|
# query dict is always strings.
|
|
q_objs = [Q(**{qdict[k]: request.REQUEST[k]})
|
|
for k in qdict.keys()
|
|
if request.REQUEST.get(k, '') != '' and
|
|
request.REQUEST[k] != '0' and
|
|
request.REQUEST[k] != '-1']
|
|
try:
|
|
other = orgs_dict[request.REQUEST['other_group']]
|
|
q_objs += [orl(
|
|
[Q(filename__istartswith="draft-%s-" % p)|
|
|
Q(filename__istartswith="draft-ietf-%s-" % p)
|
|
for p in other.get('prefixes', [ other['key'] ])])]
|
|
except KeyError:
|
|
pass # either no other_group arg or no orgs_dict entry
|
|
matches = InternetDraft.objects.all().filter(*q_objs)
|
|
matches = matches.order_by('status_id', 'filename')
|
|
searched = True
|
|
else:
|
|
matches = None
|
|
searched = False
|
|
|
|
c = RequestContext(request, {
|
|
'form': form,
|
|
'object_list': matches,
|
|
'didsearch': searched,
|
|
'alphabet': alphabet,
|
|
'orgs': orgs,
|
|
})
|
|
return HttpResponse(t.render(c))
|
|
|
|
def all_id(request, template_name):
|
|
from django.db import connection
|
|
from ietf.utils import flattenl
|
|
cursor = connection.cursor()
|
|
# 99 = Dead
|
|
# 32 = RFC Published
|
|
cursor.execute("SELECT id_document_tag FROM id_internal WHERE rfc_flag=0 AND cur_state NOT IN (99,32)")
|
|
in_tracker = flattenl(cursor.fetchall())
|
|
tracker_list = InternetDraft.objects.all().filter(id_document_tag__in=in_tracker).order_by('status_id','filename').select_related(depth=1)
|
|
object_list = []
|
|
for o in tracker_list:
|
|
object_list.append({'tracker': True, 'id': o})
|
|
notracker_list = InternetDraft.objects.all().exclude(id_document_tag__in=in_tracker).order_by('status_id','filename').select_related(depth=1)
|
|
for o in notracker_list:
|
|
object_list.append({'tracker': False, 'id': o})
|
|
return render_to_response(template_name, {'object_list': object_list},
|
|
context_instance=RequestContext(request))
|
|
|
|
def related_docs(startdoc):
|
|
related = []
|
|
processed = []
|
|
|
|
def handle(otherdoc,status,doc,skip=(0,0,0)):
|
|
new = (otherdoc, status, doc)
|
|
if otherdoc in processed:
|
|
return
|
|
related.append(new)
|
|
process(otherdoc,skip)
|
|
|
|
def process(doc, skip=(0,0,0)):
|
|
processed.append(doc)
|
|
if type(doc) == InternetDraft:
|
|
if doc.replaced_by_id != 0 and not(skip[0]):
|
|
handle(doc.replaced_by, "that replaces", doc, (0,1,0))
|
|
if not(skip[1]):
|
|
for replaces in doc.replaces_set.all():
|
|
handle(replaces, "that was replaced by", doc, (1,0,0))
|
|
if doc.rfc_number != 0 and not(skip[0]):
|
|
# should rfc be an FK in the model?
|
|
try:
|
|
handle(Rfc.objects.get(rfc_number=doc.rfc_number), "which came from", doc, (1,0,0))
|
|
# In practice, there are missing rows in the RFC table.
|
|
except Rfc.DoesNotExist:
|
|
pass
|
|
if type(doc) == Rfc:
|
|
if not(skip[0]):
|
|
try:
|
|
draft = InternetDraft.objects.get(rfc_number=doc.rfc_number)
|
|
handle(draft, "that was published as", doc, (0,0,1))
|
|
except InternetDraft.DoesNotExist:
|
|
pass
|
|
# The table has multiple documents published as the same RFC.
|
|
# This raises an AssertionError because using get
|
|
# presumes there is exactly one.
|
|
except AssertionError:
|
|
pass
|
|
if not(skip[1]):
|
|
for obsoleted_by in doc.updated_or_obsoleted_by.all():
|
|
handle(obsoleted_by.rfc, "that %s" % obsoleted_by.action.lower(), doc)
|
|
if not(skip[2]):
|
|
for obsoletes in doc.updates_or_obsoletes.all():
|
|
handle(obsoletes.rfc_acted_on, "that was %s by" % obsoletes.action.lower().replace("tes", "ted"), doc)
|
|
|
|
process(startdoc, (0,0,0))
|
|
return related
|
|
|
|
def view_related_docs(request, **kwargs):
|
|
if kwargs.has_key('id'):
|
|
startdoc = get_object_or_404(InternetDraft, id_document_tag=kwargs['id'])
|
|
else:
|
|
startdoc = get_object_or_404(InternetDraft, filename=kwargs['slug'])
|
|
related = related_docs(startdoc)
|
|
context = {'related': related, 'numdocs': len(related)}
|
|
context.update(base_extra)
|
|
return render_to_response("idindex/view_related_docs.html", context,
|
|
context_instance=RequestContext(request))
|