datatracker/ietf/idtracker/views.py
Bill Fenner 5f4d99a36a Implement status_of_items and last_call.
(Oddly, this status_of_items shows more than the cgi one; I can't
explain why.  Also, the cgi one showed the wrong intended status
for RFCs, and the wrong area for several documents.)
 - Legacy-Id: 186
2007-05-30 21:09:17 +00:00

145 lines
5.9 KiB
Python

# Create your views here.
from django.http import HttpResponse,HttpResponseRedirect
from django import newforms as forms
from django.template import RequestContext, Context, loader
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
from ietf.idtracker.forms import EmailFeedback
from ietf.utils.mail import send_mail_text
# Override default form field mappings
# group_acronym: CharField(max_length=10)
# note: CharField(max_length=100)
def myfields(f):
if f.name == "group":
return forms.CharField(max_length=10,
widget=forms.TextInput(attrs={'size': 5}))
if f.name == "note":
return forms.CharField(max_length=100,
widget=forms.TextInput(attrs={'size': 100}))
return f.formfield()
def search(request):
InternetDraftForm = forms.models.form_for_model(InternetDraft, formfield_callback=myfields)
idform = InternetDraftForm(request.POST)
InternalForm = forms.models.form_for_model(IDInternal, formfield_callback=myfields)
form = InternalForm(request.POST)
t = loader.get_template('idtracker/idtracker_search.html')
# if there's a post, do the search and supply results to the template
if request.method == 'POST':
qdict = { 'filename': 'draft__filename__contains',
'job_owner': 'job_owner',
'group': 'draft__group__acronym',
'cur_state': 'cur_state',
'cur_sub_state': 'cur_sub_state',
'rfc_number': 'draft__rfc_number',
'area_acronym': 'area_acronym',
'note': 'note__contains',
}
q_objs = [Q(**{qdict[k]: request.POST[k]})
for k in qdict.keys()
if request.POST[k] != '']
matches = IDInternal.objects.all().filter(*q_objs)
# matches = IDInternal.objects.all()
# if request.POST['filename']:
# matches = matches.filter(draft__filename__contains=request.POST["filename"])
# if request.POST['job_owner']:
# matches = matches.filter(job_owner=request.POST['job_owner'])
# if request.POST['group']:
# matches = matches.filter(draft__group__acronym=request.POST['group_acronym'])
# if request.POST['cur_state']:
# matches = matches.filter(cur_state=request.POST['cur_state'])
# if request.POST['cur_sub_state']:
# matches = matches.filter(cur_sub_state=request.POST['cur_sub_state'])
# if request.POST['rfc_number']:
# matches = matches.filter(draft__rfc_number=request.POST['rfc_number'])
# if request.POST['area_acronym']:
# matches = matches.filter(area_acronym=request.POST['area_acronym'])
# if request.POST['note']:
# matches = matches.filter(note__contains=request.POST['note'])
matches = matches.order_by('cur_state', 'cur_sub_state_id')
else:
matches = None
c = RequestContext(request, {
'form': form,
'idform': idform,
'matches': matches,
})
return HttpResponse(t.render(c))
def edit_idinternal(request, id=None):
#draft = InternetDraft.objects.get(pk=id)
draft = get_object_or_404(InternetDraft.objects, pk=id)
IDEntryForm = forms.models.form_for_instance(draft)
# todo: POST handling for idform
idform = IDEntryForm()
idinternal = draft.idinternal
if idinternal:
EntryForm = forms.models.form_for_instance(idinternal)
if request.method == 'POST':
form = EntryForm(request.POST)
if form.is_valid():
form.save()
return HttpResponseRedirect("/") # really want here
else:
form = EntryForm()
else:
form = None
t = loader.get_template('idtracker/idtracker_edit.html')
c = RequestContext(request, {
'form': form,
'idform': idform,
'draft': draft,
})
return HttpResponse(t.render(c))
def state_desc(request, state, is_substate=0):
if int(state) == 100:
object = {
'state': 'I-D Exists',
'description': """
Initial (default) state for all internet drafts. Such documents are
not being tracked by the IESG as no request has been made of the
IESG to do anything with the document.
"""
}
elif is_substate:
sub = get_object_or_404(IDSubState, pk=state)
object = { 'state': sub.sub_state, 'description': sub.description }
else:
object = get_object_or_404(IDState, pk=state)
return render_to_response('idtracker/state_desc.html', {'state': object},
context_instance=RequestContext(request))
def comment(request, slug, object_id, queryset):
draft = get_object_or_404(InternetDraft, filename=slug)
queryset = queryset.filter(document=draft.id_document_tag)
return object_detail(request, queryset=queryset, object_id=object_id)
def send_email(request):
if request.method == 'POST':
form = EmailFeedback(request.POST)
cat = request.POST.get('category', 'bugs')
if form.is_valid():
send_mail_text(request, "idtracker-%s@ietf.org" % form.clean_data['category'], (form.clean_data['name'], form.clean_data['email']), '[ID TRACKER %s] %s' % (form.clean_data['category'].upper(), form.clean_data['subject']), form.clean_data['message'])
return render_to_response('idtracker/email_sent.html', {},
context_instance=RequestContext(request))
else:
cat = request.REQUEST.get('cat', 'bugs')
form = EmailFeedback(initial={'category': cat})
return render_to_response('idtracker/email_form.html', {'category': cat, 'form': form},
context_instance=RequestContext(request))
def status(request):
queryset = IDInternal.objects.filter(primary_flag=1).exclude(cur_state__state__in=('AD is watching', 'Dead')).order_by('cur_state', 'status_date', 'ballot_id')
return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'IESG Status of Items'})
def last_call(request):
queryset = IDInternal.objects.filter(primary_flag=1).filter(cur_state__state__in=('In Last Call', 'Waiting for Writeup', 'Waiting for AD Go-Ahead')).order_by('cur_state', 'status_date', 'ballot_id')
return object_list(request, template_name="idtracker/status_of_items.html", queryset=queryset, extra_context={'title': 'Documents in Last Call'})