Skip to content

Commit 774f4dc

Browse files
committed
Fix searching for RFCs that are processed by IESG; made 'advanced search' options mutually exclusive
- Legacy-Id: 2043
1 parent 0c5298f commit 774f4dc

4 files changed

Lines changed: 115 additions & 69 deletions

File tree

ietf/idrfc/testurl.list

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -52,17 +52,17 @@
5252

5353
200 /doc/search/
5454
200 /doc/search/?rfcs=on&name=snmp
55-
200 /doc/search/?rfcs=on&name=nfs&ad=53
55+
200 /doc/search/?rfcs=on&name=nfs&by=ad&ad=53
5656
200 /doc/search/?activeDrafts=on&name=sipping
5757
200 /doc/search/?oldDrafts=on&name=tls
58-
200 /doc/search/?activeDrafts=on&oldDrafts=on&ad=53
59-
200 /doc/search/?activeDrafts=on&state=20
60-
200 /doc/search/?activeDrafts=on&oldDrafts=on&subState=5
61-
200 /doc/search/?activeDrafts=on&oldDrafts=on&rfcs=on&ad=53&name=nfs
62-
200 /doc/search/?rfcs=on&group=tls
63-
200 /doc/search/?activeDrafts=on&group=tls
64-
200 /doc/search/?activeDrafts=on&oldDrafts=on&rfcs=on&author=eronen
65-
200 /doc/search/?activeDrafts=on&oldDrafts=on&rfcs=on&area=934&name=ldap
58+
200 /doc/search/?activeDrafts=on&oldDrafts=on&ad=53&by=ad
59+
200 /doc/search/?activeDrafts=on&state=20&by=state
60+
200 /doc/search/?activeDrafts=on&oldDrafts=on&subState=5&by=state
61+
200 /doc/search/?activeDrafts=on&oldDrafts=on&rfcs=on&ad=53&name=nfs&by=ad
62+
200 /doc/search/?rfcs=on&group=tls&by=group
63+
200 /doc/search/?activeDrafts=on&group=tls&by=group
64+
200 /doc/search/?activeDrafts=on&oldDrafts=on&rfcs=on&author=eronen&by=author
65+
200 /doc/search/?activeDrafts=on&oldDrafts=on&rfcs=on&area=934&name=ldap&by=area
6666
200 /doc/search/?activeDrafts=on&name=asdfsadfsdfasdf
6767
200 /doc/search/?activeDrafts=on&name=%EF%BD%8C #non-ASCII
6868

ietf/idrfc/views_search.py

Lines changed: 65 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -44,25 +44,44 @@
4444

4545
class SearchForm(forms.Form):
4646
name = forms.CharField(required=False)
47-
author = forms.CharField(required=False)
4847
rfcs = forms.BooleanField(required=False,initial=True)
4948
activeDrafts = forms.BooleanField(required=False,initial=True)
5049
oldDrafts = forms.BooleanField(required=False,initial=False)
5150

51+
by = forms.ChoiceField(choices=[(x,x) for x in ('author','group','area','ad','state')], required=False, initial='wg', label='Foobar')
52+
author = forms.CharField(required=False)
5253
group = forms.CharField(required=False)
5354
area = forms.ModelChoiceField(Area.active_areas(), empty_label="any area", required=False)
54-
5555
ad = forms.ChoiceField(choices=(), required=False)
5656
state = forms.ModelChoiceField(IDState.objects.all(), empty_label="any state", required=False)
5757
subState = forms.ChoiceField(choices=(), required=False)
5858

59-
def clean_name(self):
60-
value = self.cleaned_data.get('name','')
61-
return normalize_draftname(value)
6259
def __init__(self, *args, **kwargs):
6360
super(SearchForm, self).__init__(*args, **kwargs)
6461
self.fields['ad'].choices = [('', 'any AD')] + [(ad.id, "%s %s" % (ad.first_name, ad.last_name)) for ad in IESGLogin.objects.filter(user_level=1).order_by('last_name')] + [('-99', '------------------')] + [(ad.id, "%s %s" % (ad.first_name, ad.last_name)) for ad in IESGLogin.objects.filter(user_level=2).order_by('last_name')]
6562
self.fields['subState'].choices = [('', 'any substate'), ('0', 'no substate')] + [(state.sub_state_id, state.sub_state) for state in IDSubState.objects.all()]
63+
def clean_name(self):
64+
value = self.cleaned_data.get('name','')
65+
return normalize_draftname(value)
66+
def clean(self):
67+
q = self.cleaned_data
68+
# Reset query['by'] if needed
69+
for k in ('author','group','area','ad'):
70+
if (q['by'] == k) and not q[k]:
71+
q['by'] = None
72+
if (q['by'] == 'state') and not (q['state'] or q['subState']):
73+
q['by'] = None
74+
# Reset other fields
75+
for k in ('author','group','area','ad'):
76+
if q['by'] != k:
77+
self.data[k] = ""
78+
q[k] = ""
79+
if q['by'] != 'state':
80+
self.data['state'] = ""
81+
self.data['subState'] = ""
82+
q['state'] = ""
83+
q['subState'] = ""
84+
return q
6685

6786
def search_query(query_original):
6887
query = dict(query_original.items())
@@ -86,23 +105,24 @@ def search_query(query_original):
86105

87106
prefix = ""
88107
q_objs = []
89-
if query['ad'] or query['state'] or query['subState']:
108+
if query['by'] in ('ad','state'):
90109
prefix = "draft__"
91-
if query['ad']:
92-
q_objs.append(Q(job_owner=query['ad']))
93-
if query['state']:
94-
q_objs.append(Q(cur_state=query['state']))
95-
if query['subState']:
96-
q_objs.append(Q(cur_sub_state=query['subState']))
97-
98110
if query['name']:
99111
q_objs.append(Q(**{prefix+"filename__icontains":query['name']})|Q(**{prefix+"title__icontains":query['name']}))
100-
if query['author']:
112+
113+
if query['by'] == 'author':
101114
q_objs.append(Q(**{prefix+"authors__person__last_name__icontains":query['author']}))
102-
if query['group']:
115+
elif query['by'] == 'group':
103116
q_objs.append(Q(**{prefix+"group__acronym":query['group']}))
104-
if query['area']:
117+
elif query['by'] == 'area':
105118
q_objs.append(Q(**{prefix+"group__ietfwg__areagroup__area":query['area']}))
119+
elif query['by'] == 'ad':
120+
q_objs.append(Q(job_owner=query['ad']))
121+
elif query['by'] == 'state':
122+
if query['state']:
123+
q_objs.append(Q(cur_state=query['state']))
124+
if query['subState']:
125+
q_objs.append(Q(cur_sub_state=query['subState']))
106126
if (not query['rfcs']) and query['activeDrafts'] and (not query['oldDrafts']):
107127
q_objs.append(Q(**{prefix+"status":1}))
108128
elif query['rfcs'] and query['activeDrafts'] and (not query['oldDrafts']):
@@ -131,7 +151,7 @@ def search_query(query_original):
131151
idresults.append([id])
132152

133153
# Next, search RFCs
134-
if query['rfcs'] and not (query['ad'] or query['state'] or query['subState'] or query['area']):
154+
if query['rfcs']:
135155
q_objs = []
136156
searchRfcIndex = True
137157
if query['name']:
@@ -141,17 +161,28 @@ def search_query(query_original):
141161
q_objs.append(Q(rfc_number__contains=m.group(1))|Q(title__icontains=query['name']))
142162
else:
143163
q_objs.append(Q(title__icontains=query['name']))
144-
# We prefer searching RfcIndex, but it doesn't have group info
145-
if query['group']:
164+
if query['by'] == 'author':
165+
q_objs.append(Q(authors__icontains=query['author']))
166+
elif query['by'] == 'group':
167+
# We prefer searching RfcIndex, but it doesn't have group info
146168
searchRfcIndex = False
147169
q_objs.append(Q(group_acronym=query['group']))
148-
if query['area']:
149-
# TODO: not implemented yet
150-
pass
151-
if query['author'] and searchRfcIndex:
152-
q_objs.append(Q(authors__icontains=query['author']))
153-
elif query['author']:
154-
q_objs.append(Q(authors__person__last_name__icontains=query['author']))
170+
elif query['by'] == 'area':
171+
# Ditto for area
172+
searchRfcIndex = False
173+
q_objs.append(Q(area_acronym=query['area']))
174+
elif query['by'] == 'ad':
175+
numbers = IDInternal.objects.filter(rfc_flag=1,job_owner=query['ad']).values_list('draft_id',flat=True)
176+
q_objs.append(Q(rfc_number__in=numbers))
177+
elif query['by'] == 'state':
178+
numbers_q = [Q(rfc_flag=1)]
179+
if query['state']:
180+
numbers_q.append(Q(cur_state=query['state']))
181+
if query['subState']:
182+
numbers_q.append(Q(cur_state=query['subState']))
183+
numbers = IDInternal.objects.filter(*numbers_q).values_list('draft_id',flat=True)
184+
q_objs.append(Q(rfc_number__in=numbers))
185+
155186
if searchRfcIndex:
156187
matches = RfcIndex.objects.filter(*q_objs)[:MAX]
157188
else:
@@ -195,7 +226,7 @@ def search_query(query_original):
195226
if len(rfcs) >= 1:
196227
r[3] = rfcs[0]
197228

198-
# TODO: require that RfcINdex is present
229+
# TODO: require that RfcIndex is present?
199230

200231
results = []
201232
for res in idresults+rfcresults:
@@ -216,19 +247,19 @@ def search_query(query_original):
216247
meta = {}
217248
if maxReached:
218249
meta['max'] = MAX
219-
if query['author'] or query['group'] or query['area'] or query['ad'] or query['state'] or query['subState']:
250+
if query['by']:
220251
meta['advanced'] = True
221252
return (results,meta)
222253

223254
def search_results(request):
224255
if len(request.REQUEST.items()) == 0:
225256
return search_main(request)
226-
form = SearchForm(request.REQUEST)
257+
form = SearchForm(dict(request.REQUEST.items()))
227258
if not form.is_valid():
228259
return HttpResponse("form not valid?", mimetype="text/plain")
229-
x = form.cleaned_data
230260
(results,meta) = search_query(form.cleaned_data)
231261
meta['searching'] = True
262+
meta['by'] = form.cleaned_data['by']
232263
if 'ajax' in request.REQUEST and request.REQUEST['ajax']:
233264
return render_to_response('idrfc/search_results.html', {'docs':results, 'meta':meta}, context_instance=RequestContext(request))
234265
else:
@@ -250,15 +281,11 @@ def by_ad(request, name):
250281
break
251282
if not ad_id:
252283
raise Http404
253-
form = SearchForm(request.REQUEST)
254-
if form.is_valid():
255-
pass
256-
form.cleaned_data['ad'] = ad_id
257-
form.cleaned_data['activeDrafts'] = True
258-
form.cleaned_data['rfcs'] = True
259-
form.cleaned_data['oldDrafts'] = True
284+
form = SearchForm({'by':'ad','ad':ad_id,
285+
'rfcs':'on', 'activeDrafts':'on', 'oldDrafts':'on'})
286+
if not form.is_valid():
287+
raise ValueError("form did not validate")
260288
(results,meta) = search_query(form.cleaned_data)
261-
262289
results.sort(key=lambda obj: obj.view_sort_key_byad())
263290
return render_to_response('idrfc/by_ad.html', {'form':form, 'docs':results,'meta':meta, 'ad_name':ad_name}, context_instance=RequestContext(request))
264291

ietf/templates/idrfc/search_form.html

Lines changed: 37 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@
3232
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3333
{% endcomment %}
3434

35-
<form name="search_form" id="search_form" action="/doc/search/" method="post" {# onsubmit="submitSearch();return false;" #}>
35+
<form name="search_form" id="search_form" class="search_form" action="/doc/search/" method="post" {# onsubmit="submitSearch();return false;" #}>
3636

3737
<div class="search_field">
3838
<label>Name/number/title:</label> {{ form.name }}
@@ -47,21 +47,25 @@
4747
</table>
4848
</div>
4949

50-
<span onclick="toggleAdvanced();"><b><img src="/images/plus.png" alt="[+]" id="search_advanced-img" /> Advanced</b></span>
50+
<span onclick="toggleAdvanced();"><b><img src="/images/{% if meta.advanced %}minus{% else %}plus{% endif %}.png" alt="" id="search_advanced-img" /> Advanced</b></span>
5151

5252
<div id="search_advanced" style="{% if not meta.advanced %}display:none;{%endif%}margin-top:1em;">
53+
Additional search criteria:
5354

5455
<div class="search_field">
55-
<label>Author (last name):</label> {{ form.author }}
56+
<label><input type="radio" class="radio" name="by" value="author" {% ifequal meta.by "author" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Author (last name):</label> {{ form.author }}
5657
</div>
5758
<div class="search_field">
58-
<label>WG/Area:</label> {{ form.group }}{{ form.area }}
59+
<label><input type="radio" class="radio" name="by" value="group" {% ifequal meta.by "group" %}checked="checked"{% endifequal %} onclick="changeBy();"/> WG:</label> {{ form.group }}
5960
</div>
6061
<div class="search_field">
61-
<label>Responsible AD:</label> {{ form.ad }}
62+
<label><input type="radio" class="radio" name="by" value="area" {% ifequal meta.by "area" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Area:</label> {{ form.area }}
6263
</div>
6364
<div class="search_field">
64-
<label>IESG State:</label> {{ form.state }} :: {{ form.subState }}
65+
<label><input type="radio" class="radio" name="by" value="ad" {% ifequal meta.by "ad" %}checked="checked"{% endifequal %} onclick="changeBy();"/> Responsible AD:</label> {{ form.ad }}
66+
</div>
67+
<div class="search_field">
68+
<label><input type="radio" class="radio" name="by" value="state" {% ifequal meta.by "state" %}checked="checked"{% endifequal %} onclick="changeBy();"/> IESG State:</label> {{ form.state }} :: {{ form.subState }}
6569
</div>
6670
{% comment %}
6771
<div class="search_field" style="text-decoration:line-through;color:#808080;">
@@ -72,7 +76,7 @@
7276
</div><!-- end of advanced -->
7377

7478
<div style="padding-top:0.5em;">
75-
<input type="hidden" name="ajax" value="" />
79+
{# <input type="hidden" name="ajax" value="" /> #}
7680
<span id="search_submit_button" class="yui-button yui-submit-button">
7781
<span class="first-child">
7882
<button type="submit" id="search_submit">Search</button>
@@ -119,16 +123,34 @@
119123
}
120124
}
121125

122-
function toggleAdvanced() {
123-
togglePlusMinus("search_advanced");
126+
function changeBy() {
127+
var by='';
124128
var f = document.search_form;
125-
f.author.value = "";
126-
f.ad.selectedIndex = 0;
127-
f.group.value = "";
128-
f.area.selectedIndex = 0;
129-
f.state.selectedIndex = 0;
130-
f.subState.selectedIndex = 0;
129+
for (var i = 0; i < f.by.length; i++) {
130+
if (f.by[i].checked) {
131+
by = f.by[i].value;
132+
break;
133+
}
134+
}
135+
f.author.disabled=true;
136+
f.group.disabled=true;
137+
f.area.disabled=true;
138+
f.ad.disabled=true;
139+
f.state.disabled=true; f.subState.disabled=true;
140+
if (by=='author') { f.author.disabled=false;}
141+
if (by=='group') { f.group.disabled=false;}
142+
if (by=='area') { f.area.disabled=false;}
143+
if (by=='ad') { f.ad.disabled=false; }
144+
if (by=='state') { f.state.disabled=false; f.subState.disabled=false; }
145+
}
131146

147+
function toggleAdvanced() {
148+
togglePlusMinus("search_advanced");
149+
var f = document.search_form;
150+
for (var i = 0; i < f.by.length; i++) { f.by[i].checked = false; }
151+
changeBy();
132152
}
153+
154+
changeBy();
133155
//]]>
134156
</script>

ietf/wginfo/views.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,10 @@ def wg_charters_by_acronym(request):
7777

7878
def wg_documents(request, acronym):
7979
wg = get_object_or_404(IETFWG, group_acronym__acronym=acronym)
80-
form = SearchForm(request.REQUEST)
81-
if form.is_valid():
82-
pass
83-
form.cleaned_data['group'] = str(wg.group_acronym.acronym)
84-
form.cleaned_data['activeDrafts'] = True
85-
form.cleaned_data['rfcs'] = True
86-
#form.cleaned_data['oldDrafts'] = True
80+
form = SearchForm({'by':'group', 'group':str(wg.group_acronym.acronym),
81+
'rfcs':'on', 'activeDrafts':'on'})
82+
if not form.is_valid():
83+
raise ValueError("form did not validate")
8784
(docs,meta) = search_query(form.cleaned_data)
8885
return render_to_response('wginfo/wg_documents.html', {'wg': wg, 'selected':'documents', 'docs':docs, 'meta':meta}, RequestContext(request))
8986

0 commit comments

Comments
 (0)