From 21e73c9d37f7098265f49d64c10ed75b8b0da4b2 Mon Sep 17 00:00:00 2001 From: Alexey Zarubin <azarubin@yaco.es> Date: Thu, 2 Dec 2010 20:34:50 +0000 Subject: [PATCH] Fixes #563 edit form. the url for this described with '^(?P<name>[^/]+)/edit/managing-shepherd/$' - Legacy-Id: 2694 --- .gitignore | 3 + ietf/.gitignore | 1 + ietf/idrfc/forms.py | 68 +++++++++++++++++++ ietf/idrfc/urls.py | 2 + ietf/idrfc/views_edit.py | 22 +++++- ietf/idrfc/views_search.py | 8 ++- ietf/idtracker/admin.py | 2 +- ietf/idtracker/forms.py | 67 ++++++++++++++++++ ietf/idtracker/models.py | 2 +- .../idrfc/edit_management_shepherd.html | 50 ++++++++++++++ .../idrfc/edit_management_shepherd_email.txt | 1 + 11 files changed, 222 insertions(+), 4 deletions(-) create mode 100644 ietf/idrfc/forms.py create mode 100644 ietf/idtracker/forms.py create mode 100644 ietf/templates/idrfc/edit_management_shepherd.html create mode 100644 ietf/templates/idrfc/edit_management_shepherd_email.txt diff --git a/.gitignore b/.gitignore index 674deb69e..fbd9b09c5 100644 --- a/.gitignore +++ b/.gitignore @@ -15,3 +15,6 @@ .*.swp .DS_store # Simulated Subversion default ignores end here +/.project +/.pydevproject +/.settings diff --git a/ietf/.gitignore b/ietf/.gitignore index c7013ced9..2cc1317c1 100644 --- a/ietf/.gitignore +++ b/ietf/.gitignore @@ -1,2 +1,3 @@ /*.pyc /settings_local.py +/ietfdb.sql.gz diff --git a/ietf/idrfc/forms.py b/ietf/idrfc/forms.py new file mode 100644 index 000000000..eae1fc611 --- /dev/null +++ b/ietf/idrfc/forms.py @@ -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() \ No newline at end of file diff --git a/ietf/idrfc/urls.py b/ietf/idrfc/urls.py index 88bf31d16..128d6793c 100644 --- a/ietf/idrfc/urls.py +++ b/ietf/idrfc/urls.py @@ -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/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/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/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'), url(r'^(?P<name>[^/]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'), diff --git a/ietf/idrfc/views_edit.py b/ietf/idrfc/views_edit.py index bc39d3302..63b688b91 100644 --- a/ietf/idrfc/views_edit.py +++ b/ietf/idrfc/views_edit.py @@ -20,6 +20,7 @@ from ietf.idtracker.models import * from ietf.iesg.models import * from ietf.idrfc.mails import * from ietf.idrfc.utils import * +from idrfc.forms import ManagingShepherdForm class ChangeStateForm(forms.Form): @@ -31,6 +32,8 @@ def change_state(request, name): """Change state of Internet Draft, notifying parties as necessary and logging the change as a comment.""" doc = get_object_or_404(InternetDraft, filename=name) + print doc.idinternal + print doc.status.status if not doc.idinternal or doc.status.status == "Expired": raise Http404() @@ -381,4 +384,21 @@ def add_comment(request, name): form=form), 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)) \ No newline at end of file diff --git a/ietf/idrfc/views_search.py b/ietf/idrfc/views_search.py index 32c4dd1a8..eee1a792e 100644 --- a/ietf/idrfc/views_search.py +++ b/ietf/idrfc/views_search.py @@ -85,6 +85,9 @@ class SearchForm(forms.Form): return q def search_query(query_original): + """ + @FIXME: This method should be re-factored ! + """ query = dict(query_original.items()) drafts = query['activeDrafts'] or query['oldDrafts'] if (not drafts) and (not query['rfcs']): @@ -135,6 +138,7 @@ def search_query(query_original): matches = IDInternal.objects.filter(*q_objs) else: matches = InternetDraft.objects.filter(*q_objs) + print q_objs if not query['activeDrafts']: matches = matches.exclude(Q(**{prefix+"status":1})) 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) q_objs.append(Q(rfc_number__in=numbers)) + if searchRfcIndex: matches = RfcIndex.objects.filter(*q_objs)[:MAX] else: @@ -205,6 +210,7 @@ def search_query(query_original): else: rfcresults.append([rfc.rfc_number, None, rfc, None]) + # Find missing InternetDraft objects for r in rfcresults: if not r[1]: @@ -229,7 +235,7 @@ def search_query(query_original): # TODO: require that RfcIndex is present? - results = [] + results = [] for res in idresults+rfcresults: if len(res)==1: doc = IdRfcWrapper(IdWrapper(res[0]), None) diff --git a/ietf/idtracker/admin.py b/ietf/idtracker/admin.py index 43f9abdb6..95a6cc1eb 100644 --- a/ietf/idtracker/admin.py +++ b/ietf/idtracker/admin.py @@ -101,7 +101,7 @@ class InternetDraftAdmin(admin.ModelAdmin): search_fields=['filename', 'title'] list_filter=['status'] raw_id_fields=['replaced_by'] -admin.site.register(InternetDraft, InternetDraftAdmin) +admin.site.register(InternetDraft) 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'})) diff --git a/ietf/idtracker/forms.py b/ietf/idtracker/forms.py new file mode 100644 index 000000000..a5f511d11 --- /dev/null +++ b/ietf/idtracker/forms.py @@ -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() \ No newline at end of file diff --git a/ietf/idtracker/models.py b/ietf/idtracker/models.py index c1492ea56..d5e4673f3 100644 --- a/ietf/idtracker/models.py +++ b/ietf/idtracker/models.py @@ -263,7 +263,7 @@ class PersonOrOrgInfo(models.Model): 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>") def email(self, priority=1, type=None): - name = str(self) + name = str(self) email = '' types = type and [ type ] or [ "INET", "Prim", None ] for type in types: diff --git a/ietf/templates/idrfc/edit_management_shepherd.html b/ietf/templates/idrfc/edit_management_shepherd.html new file mode 100644 index 000000000..8b8007b52 --- /dev/null +++ b/ietf/templates/idrfc/edit_management_shepherd.html @@ -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 %} diff --git a/ietf/templates/idrfc/edit_management_shepherd_email.txt b/ietf/templates/idrfc/edit_management_shepherd_email.txt new file mode 100644 index 000000000..09d7215c1 --- /dev/null +++ b/ietf/templates/idrfc/edit_management_shepherd_email.txt @@ -0,0 +1 @@ +Designated person with email {{ email }} should get a user/password. \ No newline at end of file