edit form. the url for this described with  '^(?P<name>[^/]+)/edit/managing-shepherd/$'
 - Legacy-Id: 2694
This commit is contained in:
Alexey Zarubin 2010-12-02 20:34:50 +00:00
parent 273ae03734
commit 21e73c9d37
11 changed files with 222 additions and 4 deletions

3
.gitignore vendored
View file

@ -15,3 +15,6 @@
.*.swp .*.swp
.DS_store .DS_store
# Simulated Subversion default ignores end here # Simulated Subversion default ignores end here
/.project
/.pydevproject
/.settings

1
ietf/.gitignore vendored
View file

@ -1,2 +1,3 @@
/*.pyc /*.pyc
/settings_local.py /settings_local.py
/ietfdb.sql.gz

68
ietf/idrfc/forms.py Normal file
View file

@ -0,0 +1,68 @@
from django.conf import settings
from django import forms
from idtracker.models import PersonOrOrgInfo
from django.db.models import Q
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
class ManagingShepherdForm(forms.Form):
email = forms.EmailField(required=False)
is_assign_current = forms.BooleanField(required=False)
def __init__(self, *args, **kwargs):
if kwargs.has_key('current_person'):
self.current_person = kwargs.pop('current_person')
return super(ManagingShepherdForm, self).__init__(*args, **kwargs)
def clean_email(self):
email = self.cleaned_data.get('email')
if not email:
return None
try:
PersonOrOrgInfo.objects. \
filter(emailaddress__type__in=[ "INET", "Prim",],
emailaddress__address=email) \
[:1].get()
except PersonOrOrgInfo.DoesNotExist:
if self.cleaned_data.get('is_assign_current'):
self._send_email(email)
raise forms.ValidationError("Person with such email does not exist")
return email
def clean(self):
print self.cleaned_data.get('email') and self.cleaned_data.get('is_assign_current')
if self.cleaned_data.get('email') and \
self.cleaned_data.get('is_assign_current'):
raise forms.ValidationError("You should choose to assign to current \
person or input the email. Not both at te same time. ")
return self.cleaned_data
def change_shepherd(self, document, save=True):
email = self.cleaned_data.get('email')
if email:
person = PersonOrOrgInfo.objects. \
filter(emailaddress__type__in=[ "INET", "Prim",],
emailaddress__address=email) \
[:1].get()
else:
person = self.current_person
document.shepherd = person
if save:
document.save()
return document
def _send_email(self, email,
template='idrfc/edit_management_shepherd_email.txt'):
subject = 'WG Delegate needs system credentials'
body = render_to_string(template,
{'email': email,
})
mail = EmailMessage(subject=subject,
body=body,
to=[email, settings.DEFAULT_FROM_EMAIL, ],
from_email=settings.DEFAULT_FROM_EMAIL)
mail.send()

View file

@ -51,6 +51,8 @@ urlpatterns = patterns('',
url(r'^(?P<name>[^/]+)/edit/requestresurrect/$', views_edit.request_resurrect, name='doc_request_resurrect'), url(r'^(?P<name>[^/]+)/edit/requestresurrect/$', views_edit.request_resurrect, name='doc_request_resurrect'),
url(r'^(?P<name>[^/]+)/edit/resurrect/$', views_edit.resurrect, name='doc_resurrect'), url(r'^(?P<name>[^/]+)/edit/resurrect/$', views_edit.resurrect, name='doc_resurrect'),
url(r'^(?P<name>[^/]+)/edit/addcomment/$', views_edit.add_comment, name='doc_add_comment'), url(r'^(?P<name>[^/]+)/edit/addcomment/$', views_edit.add_comment, name='doc_add_comment'),
url(r'^(?P<name>[^/]+)/edit/managing-shepherd/$', views_edit.managing_shepherd, name='doc_managing_shepherd'),
url(r'^(?P<name>[^/]+)/edit/position/$', views_ballot.edit_position, name='doc_edit_position'), url(r'^(?P<name>[^/]+)/edit/position/$', views_ballot.edit_position, name='doc_edit_position'),
url(r'^(?P<name>[^/]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'), url(r'^(?P<name>[^/]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'),
url(r'^(?P<name>[^/]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'), url(r'^(?P<name>[^/]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'),

View file

@ -20,6 +20,7 @@ from ietf.idtracker.models import *
from ietf.iesg.models import * from ietf.iesg.models import *
from ietf.idrfc.mails import * from ietf.idrfc.mails import *
from ietf.idrfc.utils import * from ietf.idrfc.utils import *
from idrfc.forms import ManagingShepherdForm
class ChangeStateForm(forms.Form): class ChangeStateForm(forms.Form):
@ -31,6 +32,8 @@ def change_state(request, name):
"""Change state of Internet Draft, notifying parties as necessary """Change state of Internet Draft, notifying parties as necessary
and logging the change as a comment.""" and logging the change as a comment."""
doc = get_object_or_404(InternetDraft, filename=name) doc = get_object_or_404(InternetDraft, filename=name)
print doc.idinternal
print doc.status.status
if not doc.idinternal or doc.status.status == "Expired": if not doc.idinternal or doc.status.status == "Expired":
raise Http404() raise Http404()
@ -381,4 +384,21 @@ def add_comment(request, name):
form=form), form=form),
context_instance=RequestContext(request)) context_instance=RequestContext(request))
def managing_shepherd(request, name):
"""
View for managing the assigned shepherd of a document.
"""
doc = get_object_or_404(InternetDraft, filename=name)
login = IESGLogin.objects.get(login_name=request.user.username)
form = ManagingShepherdForm()
if request.method == "POST":
form = ManagingShepherdForm(request.POST, current_person=login.person)
if form.is_valid():
form.change_shepherd(doc)
return render_to_response('idrfc/edit_management_shepherd.html',
dict(doc=doc,
form=form,
user=request.user,
login=login),
context_instance=RequestContext(request))

View file

@ -85,6 +85,9 @@ class SearchForm(forms.Form):
return q return q
def search_query(query_original): def search_query(query_original):
"""
@FIXME: This method should be re-factored !
"""
query = dict(query_original.items()) query = dict(query_original.items())
drafts = query['activeDrafts'] or query['oldDrafts'] drafts = query['activeDrafts'] or query['oldDrafts']
if (not drafts) and (not query['rfcs']): if (not drafts) and (not query['rfcs']):
@ -135,6 +138,7 @@ def search_query(query_original):
matches = IDInternal.objects.filter(*q_objs) matches = IDInternal.objects.filter(*q_objs)
else: else:
matches = InternetDraft.objects.filter(*q_objs) matches = InternetDraft.objects.filter(*q_objs)
print q_objs
if not query['activeDrafts']: if not query['activeDrafts']:
matches = matches.exclude(Q(**{prefix+"status":1})) matches = matches.exclude(Q(**{prefix+"status":1}))
if not query['rfcs']: if not query['rfcs']:
@ -184,6 +188,7 @@ def search_query(query_original):
numbers = IDInternal.objects.filter(*numbers_q).values_list('draft_id',flat=True) numbers = IDInternal.objects.filter(*numbers_q).values_list('draft_id',flat=True)
q_objs.append(Q(rfc_number__in=numbers)) q_objs.append(Q(rfc_number__in=numbers))
if searchRfcIndex: if searchRfcIndex:
matches = RfcIndex.objects.filter(*q_objs)[:MAX] matches = RfcIndex.objects.filter(*q_objs)[:MAX]
else: else:
@ -205,6 +210,7 @@ def search_query(query_original):
else: else:
rfcresults.append([rfc.rfc_number, None, rfc, None]) rfcresults.append([rfc.rfc_number, None, rfc, None])
# Find missing InternetDraft objects # Find missing InternetDraft objects
for r in rfcresults: for r in rfcresults:
if not r[1]: if not r[1]:
@ -229,7 +235,7 @@ def search_query(query_original):
# TODO: require that RfcIndex is present? # TODO: require that RfcIndex is present?
results = [] results = []
for res in idresults+rfcresults: for res in idresults+rfcresults:
if len(res)==1: if len(res)==1:
doc = IdRfcWrapper(IdWrapper(res[0]), None) doc = IdRfcWrapper(IdWrapper(res[0]), None)

View file

@ -101,7 +101,7 @@ class InternetDraftAdmin(admin.ModelAdmin):
search_fields=['filename', 'title'] search_fields=['filename', 'title']
list_filter=['status'] list_filter=['status']
raw_id_fields=['replaced_by'] raw_id_fields=['replaced_by']
admin.site.register(InternetDraft, InternetDraftAdmin) admin.site.register(InternetDraft)
class PersonOrOrgInfoAdmin(admin.ModelAdmin): class PersonOrOrgInfoAdmin(admin.ModelAdmin):
fieldsets=((None, {'fields': (('first_name', 'middle_initial', 'last_name'), ('name_suffix', 'modified_by'))}), ('Obsolete Info', {'fields': ('record_type', 'created_by', 'address_type'), 'classes': 'collapse'})) fieldsets=((None, {'fields': (('first_name', 'middle_initial', 'last_name'), ('name_suffix', 'modified_by'))}), ('Obsolete Info', {'fields': ('record_type', 'created_by', 'address_type'), 'classes': 'collapse'}))

67
ietf/idtracker/forms.py Normal file
View file

@ -0,0 +1,67 @@
from django.conf import settings
from django import forms
from idtracker.models import PersonOrOrgInfo
from django.db.models import Q
from django.template.loader import render_to_string
from django.core.mail import EmailMessage
class ManagingShepherdForm(forms.Form):
email = forms.EmailField(required=False)
is_assign_current = forms.BooleanField(required=False)
def __init__(self, *args, **kwargs):
if kwargs.has_key('current_person'):
self.current_person = kwargs.pop('current_person')
return super(ManagingShepherdForm, self).__init__(*args, **kwargs)
def clean_email(self):
email = self.cleaned_data.get('email')
if not email:
return None
try:
PersonOrOrgInfo.objects. \
filter(emailaddress__type__in=[ "INET", "Prim",],
emailaddress__address=email) \
[:1].get()
except PersonOrOrgInfo.DoesNotExist:
if self.cleaned_data.get('is_assign_current'):
self._send_email(email)
raise forms.ValidationError("Person with such email does not exist")
return email
def clean(self):
if self.cleaned_data.get('email') and \
self.cleaned_data.get('is_assign_current'):
raise forms.ValidationError("You should choose to assign to current \
person or input the email. Not both at te same time. ")
return self.cleaned_data
def change_shepherd(self, document, save=True):
email = self.cleaned_data.get('email')
if email:
person = PersonOrOrgInfo.objects. \
filter(emailaddress__type__in=[ "INET", "Prim",],
emailaddress__address=email) \
[:1].get()
else:
person = self.current_person
document.shepherd = person
if save:
document.save()
return document
def _send_email(self, email,
template='idrfc/edit_management_shepherd_email.txt'):
subject = 'WG Delegate needs system credentials'
body = render_to_string(template,
{'email': email,
})
mail = EmailMessage(subject=subject,
body=body,
to=[email, settings.DEFAULT_FROM_EMAIL, ],
from_email=settings.DEFAULT_FROM_EMAIL)
mail.send()

View file

@ -263,7 +263,7 @@ class PersonOrOrgInfo(models.Model):
return u"(Person #%s)" % self.person_or_org_tag return u"(Person #%s)" % self.person_or_org_tag
return u"%s %s" % ( self.first_name or u"<nofirst>", self.last_name or u"<nolast>") return u"%s %s" % ( self.first_name or u"<nofirst>", self.last_name or u"<nolast>")
def email(self, priority=1, type=None): def email(self, priority=1, type=None):
name = str(self) name = str(self)
email = '' email = ''
types = type and [ type ] or [ "INET", "Prim", None ] types = type and [ type ] or [ "INET", "Prim", None ]
for type in types: for type in types:

View file

@ -0,0 +1,50 @@
{% extends "base.html" %}
{% block title %}Edit info on {{ doc }}{% endblock %}
{% block morecss %}
form.edit-info #id_state_change_notice_to {
width: 600px;
}
form.edit-info #id_note {
width: 600px;
height: 150px;
}
form.edit-info .actions {
padding-top: 20px;
}
{% endblock %}
{% block content %}
{% load ietf_filters %}
<h1>Edit info on {{ doc }}</h1>
Shepherd: {{ doc.shepherd }}
{{ form.non_field_errors }}
<form class="edit-info" action="" method="POST">
<table>
{% for field in form %}
<tr>
<th>{{ field.label_tag }}:</th>
<td>{{ field }}
{% ifequal field.name "telechat_date" %}{{ form.returning_item }} {{ form.returning_item.label_tag }} {{ form.returning_item.errors }}{% endifequal %}
{% ifequal field.name "job_owner" %}
{% if user|in_group:"Area_Director" %}
<label><input type="checkbox" name="job_owner" value="{{ login.id }}" /> Assign to me</label>
{% endif %}
{% endifequal %}
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
{{ field.errors }}</td>
</tr>
{% endfor %}
<tr>
<td></td>
<td class="actions">
<a href="{{ doc.idinternal.get_absolute_url }}">Back</a>
<input type="submit" value="Save"/>
</td>
</tr>
</table>
</form>
{% endblock %}

View file

@ -0,0 +1 @@
Designated person with email {{ email }} should get a user/password.