diff --git a/ietf/idtracker/forms.py b/ietf/idtracker/forms.py index 1a2886db8..897a3eb4d 100644 --- a/ietf/idtracker/forms.py +++ b/ietf/idtracker/forms.py @@ -1,4 +1,18 @@ from django import newforms as forms +from models import IESGLogin, IDStatus, Area, IDState, IDSubState + +class IDSearch(forms.Form): + search_job_owner = forms.ChoiceField(choices=()) + search_group_acronym = forms.CharField(widget=forms.TextInput(attrs={'size': 6, 'maxlength': 10})) + search_status_id = forms.ModelChoiceField(IDStatus.objects.all(), empty_label="--All") + search_area_acronym = forms.ModelChoiceField(Area.objects.filter(status=Area.ACTIVE), empty_label="--All/Any") + search_cur_state = forms.ModelChoiceField(IDState.objects.all(), empty_label="--All/Any") + sub_state_id = forms.ModelChoiceField(IDSubState.objects.all(), empty_label="--All Substates") + search_filename = forms.CharField(widget=forms.TextInput(attrs={'size': 15, 'maxlength': 60})) + search_rfcnumber = forms.CharField(widget=forms.TextInput(attrs={'size': 5, 'maxlength': 60})) + def __init__(self, *args, **kwargs): + super(IDSearch, self).__init__(*args, **kwargs) + self.fields['search_job_owner'].choices = [('', '--All/Any')] + [(ad.id, str(ad)) for ad in IESGLogin.objects.filter(user_level=1).order_by('last_name')] + [('-99', '----------')] + [(ad.id, str(ad)) for ad in IESGLogin.objects.filter(user_level=2).order_by('last_name')] class EmailFeedback(forms.Form): category = forms.CharField(widget=forms.HiddenInput()) diff --git a/ietf/idtracker/models.py b/ietf/idtracker/models.py index a02f09e56..b89348aff 100644 --- a/ietf/idtracker/models.py +++ b/ietf/idtracker/models.py @@ -66,6 +66,7 @@ class IDSubState(models.Model): pass class Area(models.Model): + ACTIVE=1 area_acronym = models.ForeignKey(Acronym, primary_key=True, unique=True) start_date = models.DateField(auto_now_add=True) concluded_date = models.DateField(null=True, blank=True) diff --git a/ietf/idtracker/views.py b/ietf/idtracker/views.py index 1e467f799..0b0e6899b 100644 --- a/ietf/idtracker/views.py +++ b/ietf/idtracker/views.py @@ -6,7 +6,7 @@ from django.shortcuts import get_object_or_404, render_to_response from django.db.models import Q from django.views.generic.list_detail import object_detail, object_list from ietf.idtracker.models import InternetDraft, IDInternal, IDState, IDSubState, Rfc -from ietf.idtracker.forms import EmailFeedback +from ietf.idtracker.forms import IDSearch, EmailFeedback from ietf.utils.mail import send_mail_text # Override default form field mappings @@ -22,43 +22,44 @@ def myfields(f): return f.formfield() def search(request): - # todo: check if these field names work for backwards - # compatability - InternetDraftForm = forms.models.form_for_model(InternetDraft, formfield_callback=myfields) - idform = InternetDraftForm(request.REQUEST) - InternalForm = forms.models.form_for_model(IDInternal, formfield_callback=myfields) - form = InternalForm(request.REQUEST) + # for compatability with old tracker form, which has + # "all substates" = 6. + args = request.REQUEST + if args.get('sub_state_id', '') == '6': + args['sub_state_id'] = '0' + form = IDSearch(args) # if there's a post, do the search and supply results to the template searching = False # filename, rfc_number, group searches are seperate because # they can't be represented as simple searches in the data model. qdict = { - 'job_owner': 'job_owner', - 'cur_state': 'cur_state', - 'cur_sub_state': 'cur_sub_state', - 'area_acronym': 'area_acronym', - 'note': 'note__icontains', + 'search_job_owner': 'job_owner', + 'search_cur_state': 'cur_state', + 'sub_state_id': 'cur_sub_state', + 'search_area_acronym': 'area_acronym', } q_objs = [] - for k in qdict.keys() + ['group', 'rfc_number', 'filename']: - if request.REQUEST.has_key(k): + for k in qdict.keys() + ['search_group_acronym', 'search_rfcnumber', 'search_filename', 'search_status_id']: + if args.has_key(k): searching = True - if request.REQUEST[k] != '' and qdict.has_key(k): - q_objs.append(Q(**{qdict[k]: request.REQUEST[k]})) + if args[k] != '' and qdict.has_key(k): + q_objs.append(Q(**{qdict[k]: args[k]})) if searching: - group = request.REQUEST.get('group', '') + group = args.get('search_group_acronym', '') if group != '': rfclist = [rfc.rfc_number for rfc in Rfc.objects.all().filter(group_acronym=group)] draftlist = [draft.id_document_tag for draft in InternetDraft.objects.all().filter(group__acronym=group)] q_objs.append(Q(draft__in=draftlist)&Q(rfc_flag=0)|Q(draft__in=rfclist)&Q(rfc_flag=1)) - rfc_number = request.REQUEST.get('rfc_number', '') + rfc_number = args.get('search_rfcnumber', '') if rfc_number != '': draftlist = [draft.id_document_tag for draft in InternetDraft.objects.all().filter(rfc_number=rfc_number)] q_objs.append(Q(draft__in=draftlist)&Q(rfc_flag=0)|Q(draft=rfc_number)&Q(rfc_flag=1)) - filename = request.REQUEST.get('filename', '') + filename = args.get('search_filename', '') if filename != '': - draftlist = [draft.id_document_tag for draft in InternetDraft.objects.all().filter(filename__icontains=filename)] - q_objs.append(Q(draft__in=draftlist,rfc_flag=0)) + q_objs.append(Q(draft__filename__icontains=filename,rfc_flag=0)) + status = args.get('search_status_id', '') + if status != '': + q_objs.append(Q(draft__status=status,rfc_flag=0)) matches = IDInternal.objects.all().filter(*q_objs).filter(primary_flag=1) matches = matches.order_by('cur_state', 'cur_sub_state_id') else: @@ -66,7 +67,6 @@ def search(request): return render_to_response('idtracker/idtracker_search.html', { 'form': form, - 'idform': idform, 'matches': matches, 'searching': searching, }, context_instance=RequestContext(request)) diff --git a/ietf/templates/idtracker/idtracker_search.html b/ietf/templates/idtracker/idtracker_search.html index ca6939493..34cb73852 100644 --- a/ietf/templates/idtracker/idtracker_search.html +++ b/ietf/templates/idtracker/idtracker_search.html @@ -4,37 +4,58 @@ {% block idcontent %} -
+ {# does this belong here or is it better in the head? #} + + +
+{% if searching %} +{% else %} +
+

IETF I-D TRACKER

+{% endif %} + - - + - - + - +"id_search_filename">Filename: +
I-D - Search Criteria
{{ form.job_owner }}   {{ idform.group }}    -{{ idform.status }}{{ form.search_job_owner }}   {{ form.search_group_acronym }}    +{{ form.search_status_id }}
{{ form.cur_state }} {{ form.search_cur_state }}
{{ idform.filename }}     {{ idform.rfc_number }} -    -{{ form.area_acronym }}{{ form.search_filename }}     {{ form.search_rfcnumber }} +    +{{ form.search_area_acronym }}