11# Copyright The IETF Trust 2007, All Rights Reserved
22
3- from django .http import HttpResponse
3+ from django .http import HttpResponse , HttpResponsePermanentRedirect
44from django .views .generic .list_detail import object_list
55from django .db .models import Q
66from django .http import Http404
77from django .template import RequestContext , loader
88from django .shortcuts import render_to_response , get_object_or_404
9+ from django .core .urlresolvers import reverse
10+ from django .views .generic .list_detail import object_detail
911from ietf .idtracker .models import Acronym , IETFWG , InternetDraft , Rfc
1012from ietf .idindex .forms import IDIndexSearchForm
1113from ietf .idindex .models import alphabet , orgs , orgs_dict
12- from ietf .utils import orl , flattenl
14+ from ietf .utils import orl , flattenl , normalize_draftname
1315
1416base_extra = { 'alphabet' : alphabet , 'orgs' : orgs }
1517
16- def wgdocs (request , ** kwargs ):
17- if kwargs .has_key ('id' ):
18- queryset = InternetDraft .objects .filter (group = kwargs ['id' ])
19- group = get_object_or_404 (Acronym , acronym_id = kwargs ['id' ])
20- else :
21- wg = kwargs ['slug' ]
22- try :
23- group = Acronym .objects .get (acronym = wg )
24- except Acronym .DoesNotExist : # try a search
25- if wg == 'other' :
26- queryset = IETFWG .objects .filter (
27- orl ([Q (group_acronym__acronym__istartswith = "%d" % i ) for i in range (0 ,10 )])
28- )
29- else :
30- queryset = IETFWG .objects .filter (group_acronym__acronym__istartswith = wg )
31- queryset = queryset .filter (group_type__type = 'WG' ).select_related ().order_by ('status_id' , 'acronym.acronym' )
32- return object_list (request , queryset = queryset , template_name = 'idindex/wglist.html' , allow_empty = True , extra_context = base_extra )
33- queryset = InternetDraft .objects .filter (group__acronym = wg )
18+ def wgdocs_redir (request , id ):
19+ group = get_object_or_404 (Acronym , acronym_id = id )
20+ return HttpResponsePermanentRedirect (reverse (wgdocs , args = [group .acronym ]))
21+
22+ def wgdocs (request , wg ):
23+ try :
24+ group = Acronym .objects .get (acronym = wg )
25+ except Acronym .DoesNotExist : # try a search
26+ if wg == 'other' :
27+ queryset = IETFWG .objects .filter (
28+ orl ([Q (group_acronym__acronym__istartswith = "%d" % i ) for i in range (0 ,10 )])
29+ )
30+ else :
31+ queryset = IETFWG .objects .filter (group_acronym__acronym__istartswith = wg )
32+ queryset = queryset .filter (group_type__type = 'WG' ).select_related ().order_by ('status_id' , 'acronym.acronym' )
33+ extra = base_extra .copy ()
34+ extra ['search' ] = wg
35+ return object_list (request , queryset = queryset , template_name = 'idindex/wglist.html' , allow_empty = True , extra_context = extra )
36+ queryset = InternetDraft .objects .filter (group__acronym = wg )
3437 queryset = queryset .order_by ('status_id' , 'filename' )
35- extra = base_extra
38+ extra = base_extra . copy ()
3639 extra ['group' ] = group
3740 return object_list (request , queryset = queryset , template_name = 'idindex/wgdocs.html' , allow_empty = True , extra_context = extra )
3841
@@ -47,7 +50,7 @@ def inddocs(request, filter=None):
4750 else :
4851 queryset = InternetDraft .objects .filter (filename__istartswith = 'draft-' + filter )
4952 queryset = queryset .exclude (ind_exception ).filter (group__acronym = 'none' ).order_by ('filename' )
50- extra = base_extra
53+ extra = base_extra . copy ()
5154 extra ['filter' ] = filter
5255 return object_list (request , queryset = queryset , template_name = 'idindex/inddocs.html' , allow_empty = True , extra_context = extra )
5356
@@ -61,7 +64,7 @@ def otherdocs(request, cat=None):
6164 Q (filename__istartswith = "draft-ietf-%s-" % p )
6265 for p in org .get ('prefixes' , [ org ['key' ] ])]))
6366 queryset = queryset .order_by ('status_id' ,'filename' )
64- extra = base_extra
67+ extra = base_extra . copy ()
6568 extra ['category' ] = cat
6669 return object_list (request , queryset = queryset , template_name = 'idindex/otherdocs.html' , allow_empty = True , extra_context = extra )
6770
@@ -98,6 +101,9 @@ def showdocs(request, cat=None):
98101
99102
100103def search (request ):
104+ args = request .GET .copy ()
105+ if args .has_key ('filename' ):
106+ args ['filename' ] = normalize_draftname (args ['filename' ])
101107 form = IDIndexSearchForm ()
102108 t = loader .get_template ('idindex/search.html' )
103109 # if there's a query, do the search and supply results to the template
@@ -110,20 +116,20 @@ def search(request):
110116 'first_name' : 'authors__person__first_name__icontains' ,
111117 }
112118 for key in qdict .keys () + ['other_group' ]:
113- if key in request . REQUEST :
119+ if key in args :
114120 searching = True
115121 if searching :
116122 # '0' and '-1' are flag values for "any"
117123 # in the original .cgi search page.
118124 # They are compared as strings because the
119125 # query dict is always strings.
120- q_objs = [Q (** {qdict [k ]: request . REQUEST [k ]})
126+ q_objs = [Q (** {qdict [k ]: args [k ]})
121127 for k in qdict .keys ()
122- if request . REQUEST .get (k , '' ) != '' and
123- request . REQUEST [k ] != '0' and
124- request . REQUEST [k ] != '-1' ]
128+ if args .get (k , '' ) != '' and
129+ args [k ] != '0' and
130+ args [k ] != '-1' ]
125131 try :
126- other = orgs_dict [request . REQUEST ['other_group' ]]
132+ other = orgs_dict [args ['other_group' ]]
127133 q_objs += [orl (
128134 [Q (filename__istartswith = "draft-%s-" % p )|
129135 Q (filename__istartswith = "draft-ietf-%s-" % p )
@@ -212,13 +218,25 @@ def process(doc, skip=(0,0,0)):
212218 process (startdoc , (0 ,0 ,0 ))
213219 return related
214220
215- def view_related_docs (request , ** kwargs ):
216- if kwargs .has_key ('id' ):
217- startdoc = get_object_or_404 (InternetDraft , id_document_tag = kwargs ['id' ])
218- else :
219- startdoc = get_object_or_404 (InternetDraft , filename = kwargs ['slug' ])
221+ def redirect_related (request , id ):
222+ doc = get_object_or_404 (InternetDraft , id_document_tag = id )
223+ return HttpResponsePermanentRedirect (reverse (view_related_docs , args = [doc .filename ]))
224+
225+ def view_related_docs (request , slug ):
226+ startdoc = get_object_or_404 (InternetDraft , filename = slug )
220227 related = related_docs (startdoc )
221- context = {'related' : related , 'numdocs' : len (related )}
228+ context = {'related' : related , 'numdocs' : len (related ), 'startdoc' : startdoc }
222229 context .update (base_extra )
223230 return render_to_response ("idindex/view_related_docs.html" , context ,
224231 context_instance = RequestContext (request ))
232+
233+ def redirect_id (request , object_id ):
234+ '''Redirect from historical document ID to preferred filename url.'''
235+ doc = get_object_or_404 (InternetDraft , id_document_tag = object_id )
236+ return HttpResponsePermanentRedirect (reverse (view_id , args = [doc .filename ]))
237+
238+ # Wrapper around object_detail to give permalink a handle.
239+ # The named-URLs feature in django 0.97 will eliminate the
240+ # need for these.
241+ def view_id (* args , ** kwargs ):
242+ return object_detail (* args , ** kwargs )
0 commit comments