Skip to content

Commit 21e73c9

Browse files
author
Alexey Zarubin
committed
edit form. the url for this described with '^(?P<name>[^/]+)/edit/managing-shepherd/$' - Legacy-Id: 2694
1 parent 273ae03 commit 21e73c9

11 files changed

Lines changed: 222 additions & 4 deletions

File tree

.gitignore

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,3 +15,6 @@
1515
.*.swp
1616
.DS_store
1717
# Simulated Subversion default ignores end here
18+
/.project
19+
/.pydevproject
20+
/.settings

ietf/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
/*.pyc
22
/settings_local.py
3+
/ietfdb.sql.gz

ietf/idrfc/forms.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
from django.conf import settings
2+
from django import forms
3+
from idtracker.models import PersonOrOrgInfo
4+
from django.db.models import Q
5+
from django.template.loader import render_to_string
6+
from django.core.mail import EmailMessage
7+
8+
9+
class ManagingShepherdForm(forms.Form):
10+
email = forms.EmailField(required=False)
11+
is_assign_current = forms.BooleanField(required=False)
12+
13+
14+
def __init__(self, *args, **kwargs):
15+
if kwargs.has_key('current_person'):
16+
self.current_person = kwargs.pop('current_person')
17+
return super(ManagingShepherdForm, self).__init__(*args, **kwargs)
18+
19+
def clean_email(self):
20+
email = self.cleaned_data.get('email')
21+
if not email:
22+
return None
23+
24+
try:
25+
PersonOrOrgInfo.objects. \
26+
filter(emailaddress__type__in=[ "INET", "Prim",],
27+
emailaddress__address=email) \
28+
[:1].get()
29+
except PersonOrOrgInfo.DoesNotExist:
30+
if self.cleaned_data.get('is_assign_current'):
31+
self._send_email(email)
32+
raise forms.ValidationError("Person with such email does not exist")
33+
return email
34+
35+
def clean(self):
36+
print self.cleaned_data.get('email') and self.cleaned_data.get('is_assign_current')
37+
if self.cleaned_data.get('email') and \
38+
self.cleaned_data.get('is_assign_current'):
39+
raise forms.ValidationError("You should choose to assign to current \
40+
person or input the email. Not both at te same time. ")
41+
42+
return self.cleaned_data
43+
44+
def change_shepherd(self, document, save=True):
45+
email = self.cleaned_data.get('email')
46+
if email:
47+
person = PersonOrOrgInfo.objects. \
48+
filter(emailaddress__type__in=[ "INET", "Prim",],
49+
emailaddress__address=email) \
50+
[:1].get()
51+
else:
52+
person = self.current_person
53+
document.shepherd = person
54+
if save:
55+
document.save()
56+
return document
57+
58+
def _send_email(self, email,
59+
template='idrfc/edit_management_shepherd_email.txt'):
60+
subject = 'WG Delegate needs system credentials'
61+
body = render_to_string(template,
62+
{'email': email,
63+
})
64+
mail = EmailMessage(subject=subject,
65+
body=body,
66+
to=[email, settings.DEFAULT_FROM_EMAIL, ],
67+
from_email=settings.DEFAULT_FROM_EMAIL)
68+
mail.send()

ietf/idrfc/urls.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151
url(r'^(?P<name>[^/]+)/edit/requestresurrect/$', views_edit.request_resurrect, name='doc_request_resurrect'),
5252
url(r'^(?P<name>[^/]+)/edit/resurrect/$', views_edit.resurrect, name='doc_resurrect'),
5353
url(r'^(?P<name>[^/]+)/edit/addcomment/$', views_edit.add_comment, name='doc_add_comment'),
54+
url(r'^(?P<name>[^/]+)/edit/managing-shepherd/$', views_edit.managing_shepherd, name='doc_managing_shepherd'),
55+
5456
url(r'^(?P<name>[^/]+)/edit/position/$', views_ballot.edit_position, name='doc_edit_position'),
5557
url(r'^(?P<name>[^/]+)/edit/deferballot/$', views_ballot.defer_ballot, name='doc_defer_ballot'),
5658
url(r'^(?P<name>[^/]+)/edit/undeferballot/$', views_ballot.undefer_ballot, name='doc_undefer_ballot'),

ietf/idrfc/views_edit.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
from ietf.iesg.models import *
2121
from ietf.idrfc.mails import *
2222
from ietf.idrfc.utils import *
23+
from idrfc.forms import ManagingShepherdForm
2324

2425

2526
class ChangeStateForm(forms.Form):
@@ -31,6 +32,8 @@ def change_state(request, name):
3132
"""Change state of Internet Draft, notifying parties as necessary
3233
and logging the change as a comment."""
3334
doc = get_object_or_404(InternetDraft, filename=name)
35+
print doc.idinternal
36+
print doc.status.status
3437
if not doc.idinternal or doc.status.status == "Expired":
3538
raise Http404()
3639

@@ -381,4 +384,21 @@ def add_comment(request, name):
381384
form=form),
382385
context_instance=RequestContext(request))
383386

384-
387+
def managing_shepherd(request, name):
388+
"""
389+
View for managing the assigned shepherd of a document.
390+
"""
391+
doc = get_object_or_404(InternetDraft, filename=name)
392+
login = IESGLogin.objects.get(login_name=request.user.username)
393+
form = ManagingShepherdForm()
394+
if request.method == "POST":
395+
form = ManagingShepherdForm(request.POST, current_person=login.person)
396+
if form.is_valid():
397+
form.change_shepherd(doc)
398+
399+
return render_to_response('idrfc/edit_management_shepherd.html',
400+
dict(doc=doc,
401+
form=form,
402+
user=request.user,
403+
login=login),
404+
context_instance=RequestContext(request))

ietf/idrfc/views_search.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,9 @@ def clean(self):
8585
return q
8686

8787
def search_query(query_original):
88+
"""
89+
@FIXME: This method should be re-factored !
90+
"""
8891
query = dict(query_original.items())
8992
drafts = query['activeDrafts'] or query['oldDrafts']
9093
if (not drafts) and (not query['rfcs']):
@@ -135,6 +138,7 @@ def search_query(query_original):
135138
matches = IDInternal.objects.filter(*q_objs)
136139
else:
137140
matches = InternetDraft.objects.filter(*q_objs)
141+
print q_objs
138142
if not query['activeDrafts']:
139143
matches = matches.exclude(Q(**{prefix+"status":1}))
140144
if not query['rfcs']:
@@ -184,6 +188,7 @@ def search_query(query_original):
184188
numbers = IDInternal.objects.filter(*numbers_q).values_list('draft_id',flat=True)
185189
q_objs.append(Q(rfc_number__in=numbers))
186190

191+
187192
if searchRfcIndex:
188193
matches = RfcIndex.objects.filter(*q_objs)[:MAX]
189194
else:
@@ -205,6 +210,7 @@ def search_query(query_original):
205210
else:
206211
rfcresults.append([rfc.rfc_number, None, rfc, None])
207212

213+
208214
# Find missing InternetDraft objects
209215
for r in rfcresults:
210216
if not r[1]:
@@ -229,7 +235,7 @@ def search_query(query_original):
229235

230236
# TODO: require that RfcIndex is present?
231237

232-
results = []
238+
results = []
233239
for res in idresults+rfcresults:
234240
if len(res)==1:
235241
doc = IdRfcWrapper(IdWrapper(res[0]), None)

ietf/idtracker/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class InternetDraftAdmin(admin.ModelAdmin):
101101
search_fields=['filename', 'title']
102102
list_filter=['status']
103103
raw_id_fields=['replaced_by']
104-
admin.site.register(InternetDraft, InternetDraftAdmin)
104+
admin.site.register(InternetDraft)
105105

106106
class PersonOrOrgInfoAdmin(admin.ModelAdmin):
107107
fieldsets=((None, {'fields': (('first_name', 'middle_initial', 'last_name'), ('name_suffix', 'modified_by'))}), ('Obsolete Info', {'fields': ('record_type', 'created_by', 'address_type'), 'classes': 'collapse'}))

ietf/idtracker/forms.py

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
from django.conf import settings
2+
from django import forms
3+
from idtracker.models import PersonOrOrgInfo
4+
from django.db.models import Q
5+
from django.template.loader import render_to_string
6+
from django.core.mail import EmailMessage
7+
8+
9+
class ManagingShepherdForm(forms.Form):
10+
email = forms.EmailField(required=False)
11+
is_assign_current = forms.BooleanField(required=False)
12+
13+
14+
def __init__(self, *args, **kwargs):
15+
if kwargs.has_key('current_person'):
16+
self.current_person = kwargs.pop('current_person')
17+
return super(ManagingShepherdForm, self).__init__(*args, **kwargs)
18+
19+
def clean_email(self):
20+
email = self.cleaned_data.get('email')
21+
if not email:
22+
return None
23+
24+
try:
25+
PersonOrOrgInfo.objects. \
26+
filter(emailaddress__type__in=[ "INET", "Prim",],
27+
emailaddress__address=email) \
28+
[:1].get()
29+
except PersonOrOrgInfo.DoesNotExist:
30+
if self.cleaned_data.get('is_assign_current'):
31+
self._send_email(email)
32+
raise forms.ValidationError("Person with such email does not exist")
33+
return email
34+
35+
def clean(self):
36+
if self.cleaned_data.get('email') and \
37+
self.cleaned_data.get('is_assign_current'):
38+
raise forms.ValidationError("You should choose to assign to current \
39+
person or input the email. Not both at te same time. ")
40+
41+
return self.cleaned_data
42+
43+
def change_shepherd(self, document, save=True):
44+
email = self.cleaned_data.get('email')
45+
if email:
46+
person = PersonOrOrgInfo.objects. \
47+
filter(emailaddress__type__in=[ "INET", "Prim",],
48+
emailaddress__address=email) \
49+
[:1].get()
50+
else:
51+
person = self.current_person
52+
document.shepherd = person
53+
if save:
54+
document.save()
55+
return document
56+
57+
def _send_email(self, email,
58+
template='idrfc/edit_management_shepherd_email.txt'):
59+
subject = 'WG Delegate needs system credentials'
60+
body = render_to_string(template,
61+
{'email': email,
62+
})
63+
mail = EmailMessage(subject=subject,
64+
body=body,
65+
to=[email, settings.DEFAULT_FROM_EMAIL, ],
66+
from_email=settings.DEFAULT_FROM_EMAIL)
67+
mail.send()

ietf/idtracker/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ def __unicode__(self):
263263
return u"(Person #%s)" % self.person_or_org_tag
264264
return u"%s %s" % ( self.first_name or u"<nofirst>", self.last_name or u"<nolast>")
265265
def email(self, priority=1, type=None):
266-
name = str(self)
266+
name = str(self)
267267
email = ''
268268
types = type and [ type ] or [ "INET", "Prim", None ]
269269
for type in types:
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
{% extends "base.html" %}
2+
3+
{% block title %}Edit info on {{ doc }}{% endblock %}
4+
5+
{% block morecss %}
6+
form.edit-info #id_state_change_notice_to {
7+
width: 600px;
8+
}
9+
form.edit-info #id_note {
10+
width: 600px;
11+
height: 150px;
12+
}
13+
form.edit-info .actions {
14+
padding-top: 20px;
15+
}
16+
{% endblock %}
17+
18+
{% block content %}
19+
{% load ietf_filters %}
20+
<h1>Edit info on {{ doc }}</h1>
21+
22+
Shepherd: {{ doc.shepherd }}
23+
24+
{{ form.non_field_errors }}
25+
<form class="edit-info" action="" method="POST">
26+
<table>
27+
{% for field in form %}
28+
<tr>
29+
<th>{{ field.label_tag }}:</th>
30+
<td>{{ field }}
31+
{% ifequal field.name "telechat_date" %}{{ form.returning_item }} {{ form.returning_item.label_tag }} {{ form.returning_item.errors }}{% endifequal %}
32+
{% ifequal field.name "job_owner" %}
33+
{% if user|in_group:"Area_Director" %}
34+
<label><input type="checkbox" name="job_owner" value="{{ login.id }}" /> Assign to me</label>
35+
{% endif %}
36+
{% endifequal %}
37+
{% if field.help_text %}<div class="help">{{ field.help_text }}</div>{% endif %}
38+
{{ field.errors }}</td>
39+
</tr>
40+
{% endfor %}
41+
<tr>
42+
<td></td>
43+
<td class="actions">
44+
<a href="{{ doc.idinternal.get_absolute_url }}">Back</a>
45+
<input type="submit" value="Save"/>
46+
</td>
47+
</tr>
48+
</table>
49+
</form>
50+
{% endblock %}

0 commit comments

Comments
 (0)