Skip to content

Commit 94f4e9a

Browse files
committed
Simplify the edit nomcom members forms. Fixes ietf-tools#1756. Commit ready for merge.
- Legacy-Id: 14504
1 parent 15d2329 commit 94f4e9a

9 files changed

Lines changed: 76 additions & 215 deletions

File tree

ietf/nomcom/forms.py

Lines changed: 5 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,13 @@
11
from django.conf import settings
22
from django import forms
3-
from formtools.preview import FormPreview, AUTO_ID
4-
from django.shortcuts import get_object_or_404, redirect
5-
from django.utils.decorators import method_decorator
6-
from django.shortcuts import render
3+
from django.shortcuts import get_object_or_404
74
from django.urls import reverse
85
from django.utils.html import mark_safe
96
from django.forms.widgets import FileInput
107

118
from ietf.dbtemplate.forms import DBTemplateForm
12-
from ietf.group.models import Group, Role
13-
from ietf.ietfauth.utils import role_required
14-
from ietf.name.models import RoleName, FeedbackTypeName, NomineePositionStateName
9+
from ietf.group.models import Group
10+
from ietf.name.models import FeedbackTypeName, NomineePositionStateName
1511
from ietf.nomcom.models import ( NomCom, Nomination, Nominee, NomineePosition,
1612
Position, Feedback, ReminderDates, Topic )
1713
from ietf.nomcom.utils import (NOMINATION_RECEIPT_TEMPLATE, FEEDBACK_RECEIPT_TEMPLATE,
@@ -21,7 +17,6 @@
2117
from ietf.person.models import Email
2218
from ietf.person.fields import (SearchableEmailField, SearchableEmailsField,
2319
SearchablePersonField, SearchablePersonsField )
24-
from ietf.utils.fields import MultiEmailField
2520
from ietf.utils.mail import send_mail
2621
from ietf.mailtrigger.utils import gather_address_lists
2722

@@ -94,107 +89,9 @@ def clean(self, value):
9489
return result
9590

9691

97-
class EditMembersForm(forms.Form):
98-
99-
members = MultiEmailField(label="Members email", required=False, widget=forms.Textarea)
100-
101-
class EditMembersFormPreview(FormPreview):
102-
form_template = 'nomcom/edit_members.html'
103-
preview_template = 'nomcom/edit_members_preview.html'
104-
105-
@method_decorator(role_required("Nomcom Chair", "Nomcom Advisor"))
106-
def __call__(self, request, *args, **kwargs):
107-
year = kwargs['year']
108-
group = get_nomcom_group_or_404(year)
109-
self.state['group'] = group
110-
self.state['rolodex_url'] = ROLODEX_URL
111-
groups = group.nomcom_set.all()
112-
self.nomcom = groups and groups[0] or None
113-
self.group = group
114-
self.year = year
115-
116-
return super(EditMembersFormPreview, self).__call__(request, *args, **kwargs)
117-
118-
def preview_get(self, request):
119-
"Displays the form"
120-
f = self.form(auto_id=self.get_auto_id(), initial=self.get_initial(request))
121-
return render(request, self.form_template,
122-
{
123-
'form': f,
124-
'stage_field': self.unused_name('stage'),
125-
'state': self.state,
126-
'year': self.year,
127-
'nomcom': self.nomcom,
128-
'selected': 'edit_members',
129-
}
130-
)
131-
132-
def get_initial(self, request):
133-
members = self.group.role_set.filter(name__slug='member')
134-
if members:
135-
return { "members": ",\r\n".join(role.email.address for role in members) }
136-
return {}
137-
138-
def process_preview(self, request, form, context):
139-
members_email = form.cleaned_data['members']
140-
141-
members_info = []
142-
emails_not_found = []
143-
144-
for email in members_email:
145-
try:
146-
email_obj = Email.objects.get(address=email)
147-
person = email_obj.person
148-
except Email.DoesNotExist:
149-
person = None
150-
if person:
151-
members_info.append({'email': email,
152-
'email_obj': email_obj,
153-
'person': person})
154-
else:
155-
emails_not_found.append(email)
156-
self.state.update({'members_info': members_info,
157-
'emails_not_found': emails_not_found})
158-
159-
def preview_post(self, request):
160-
"Validates the POST data. If valid, displays the preview page. Else, redisplays form."
161-
f = self.form(request.POST, auto_id=AUTO_ID)
162-
context = {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state,
163-
'year': self.year}
164-
if f.is_valid():
165-
self.process_preview(request, f, context)
166-
context['hash_field'] = self.unused_name('hash')
167-
context['hash_value'] = self.security_hash(request, f)
168-
return render(request, self.preview_template, context )
169-
else:
170-
return render(request, self.form_template, context )
171-
172-
def post_post(self, request):
173-
"Validates the POST data. If valid, calls done(). Else, redisplays form."
174-
f = self.form(request.POST, auto_id=AUTO_ID)
175-
context = {'form': f, 'stage_field': self.unused_name('stage'), 'state': self.state,
176-
'year': self.year}
177-
if f.is_valid():
178-
if self.security_hash(request, f) != request.POST.get(self.unused_name('hash')):
179-
return self.failed_hash(request) # Security hash failed.
180-
self.process_preview(request, f, context)
181-
return self.done(request, f.cleaned_data)
182-
else:
183-
return render(request, self.form_template, context )
184-
185-
def done(self, request, cleaned_data):
186-
members_info = self.state['members_info']
187-
members_email = [member['email'] for member in self.state['members_info']]
188-
members_excluded = self.group.role_set.filter(name__slug='member').exclude(email__address__in=members_email)
189-
members_excluded.delete()
190-
for member in members_info:
191-
Role.objects.get_or_create(name=RoleName.objects.get(slug="member"),
192-
group=self.group,
193-
person=member['person'],
194-
email=member['email_obj'])
195-
196-
return redirect('ietf.nomcom.forms.EditMembersFormPreview', year=self.year)
92+
class NewEditMembersForm(forms.Form):
19793

94+
members = SearchableEmailsField(only_users=True,all_emails=True)
19895

19996
class EditNomcomForm(forms.ModelForm):
20097

ietf/nomcom/test_data.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,8 @@ def nomcom_test_data():
114114
nomcom.public_key.save('cert', File(open(nomcom_test_cert_file.name, 'r')))
115115

116116
# chair and member
117-
create_person(group, "chair", username=CHAIR_USER)
118-
create_person(group, "member", username=MEMBER_USER)
117+
create_person(group, "chair", username=CHAIR_USER, email_address='%s%s'%(CHAIR_USER,EMAIL_DOMAIN))
118+
create_person(group, "member", username=MEMBER_USER, email_address='%s%s'%(MEMBER_USER,EMAIL_DOMAIN))
119119

120120
# nominee
121121
u, created = User.objects.get_or_create(username=COMMUNITY_USER)

ietf/nomcom/tests.py

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@
2727
from ietf.nomcom.models import NomineePosition, Position, Nominee, \
2828
NomineePositionStateName, Feedback, FeedbackTypeName, \
2929
Nomination, FeedbackLastSeen, TopicFeedbackLastSeen
30-
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
3130
from ietf.nomcom.utils import get_nomcom_by_year, make_nomineeposition, get_hash_nominee_position
3231
from ietf.nomcom.management.commands.send_reminders import Command, is_time_to_send
3332

@@ -75,7 +74,7 @@ def setUp(self):
7574
self.private_index_url = reverse('ietf.nomcom.views.private_index', kwargs={'year': self.year})
7675
self.private_merge_person_url = reverse('ietf.nomcom.views.private_merge_person', kwargs={'year': self.year})
7776
self.private_merge_nominee_url = reverse('ietf.nomcom.views.private_merge_nominee', kwargs={'year': self.year})
78-
self.edit_members_url = reverse('ietf.nomcom.forms.EditMembersFormPreview', kwargs={'year': self.year})
77+
self.edit_members_url = reverse('ietf.nomcom.views.edit_members', kwargs={'year': self.year})
7978
self.edit_nomcom_url = reverse('ietf.nomcom.views.edit_nomcom', kwargs={'year': self.year})
8079
self.private_nominate_url = reverse('ietf.nomcom.views.private_nominate', kwargs={'year': self.year})
8180
self.private_nominate_newperson_url = reverse('ietf.nomcom.views.private_nominate_newperson', kwargs={'year': self.year})
@@ -380,15 +379,7 @@ def test_private_merge_view(self):
380379

381380
def change_members(self, members):
382381
members_emails = u','.join(['%s%s' % (member, EMAIL_DOMAIN) for member in members])
383-
test_data = {'members': members_emails,
384-
'stage': 1}
385-
# preview
386-
self.client.post(self.edit_members_url, test_data)
387-
388-
hash = EditMembersFormPreview(EditMembersForm).security_hash(None, EditMembersForm(test_data))
389-
test_data.update({'hash': hash, 'stage': 2})
390-
391-
# submit
382+
test_data = {'members': members_emails,}
392383
self.client.post(self.edit_members_url, test_data)
393384

394385
def test_edit_members_view(self):

ietf/nomcom/urls.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11

2-
from ietf.nomcom.forms import EditMembersForm, EditMembersFormPreview
32
from ietf.nomcom import views
43
from ietf.message import views as message_views
54
from ietf.utils.urls import url
@@ -24,7 +23,7 @@
2423
url(r'^(?P<year>\d{4})/private/merge-nominee/?$', views.private_merge_nominee),
2524
url(r'^(?P<year>\d{4})/private/merge-person/?$', views.private_merge_person),
2625
url(r'^(?P<year>\d{4})/private/send-reminder-mail/(?P<type>\w+)/$', views.send_reminder_mail),
27-
url(r'^(?P<year>\d{4})/private/edit-members/$', EditMembersFormPreview(EditMembersForm), name='ietf.nomcom.forms.EditMembersFormPreview'),
26+
url(r'^(?P<year>\d{4})/private/edit-members/$', views.edit_members),
2827
url(r'^(?P<year>\d{4})/private/edit-nomcom/$', views.edit_nomcom),
2928
url(r'^(?P<year>\d{4})/private/chair/templates/$', views.list_templates),
3029
url(r'^(?P<year>\d{4})/private/chair/templates/(?P<template_id>\d+)/$', views.edit_template),

ietf/nomcom/views.py

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,15 +16,16 @@
1616
from ietf.dbtemplate.models import DBTemplate
1717
from ietf.dbtemplate.views import template_edit, template_show
1818
from ietf.name.models import NomineePositionStateName, FeedbackTypeName
19-
from ietf.group.models import Group, GroupEvent
19+
from ietf.group.models import Group, GroupEvent
2020
from ietf.message.models import Message
2121

2222
from ietf.nomcom.decorators import nomcom_private_key_required
2323
from ietf.nomcom.forms import (NominateForm, NominateNewPersonForm, FeedbackForm, QuestionnaireForm,
2424
MergeNomineeForm, MergePersonForm, NomComTemplateForm, PositionForm,
2525
PrivateKeyForm, EditNomcomForm, EditNomineeForm,
2626
PendingFeedbackForm, ReminderDatesForm, FullFeedbackFormSet,
27-
FeedbackEmailForm, NominationResponseCommentForm, TopicForm)
27+
FeedbackEmailForm, NominationResponseCommentForm, TopicForm,
28+
NewEditMembersForm,)
2829
from ietf.nomcom.models import (Position, NomineePosition, Nominee, Feedback, NomCom, ReminderDates,
2930
FeedbackLastSeen, Topic, TopicFeedbackLastSeen, )
3031
from ietf.nomcom.utils import (get_nomcom_by_year, store_nomcom_private_key,
@@ -1174,3 +1175,30 @@ def edit_topic(request, year, topic_id=None):
11741175
@role_required("Nomcom Chair", "Nomcom Advisor")
11751176
def configuration_help(request, year):
11761177
return render(request,'nomcom/chair_help.html',{'year':year})
1178+
1179+
@role_required("Nomcom Chair", "Nomcom Advisor")
1180+
def edit_members(request, year):
1181+
nomcom = get_nomcom_by_year(year)
1182+
1183+
if nomcom.group.state_id=='conclude':
1184+
return HttpResponseForbidden('This nomcom is closed.')
1185+
1186+
old_members_email = [r.email for r in nomcom.group.role_set.filter(name='member')]
1187+
1188+
if request.method=='POST':
1189+
form = NewEditMembersForm(data=request.POST)
1190+
if form.is_valid():
1191+
new_members_email = form.cleaned_data['members']
1192+
nomcom.group.role_set.filter( email__in=set(old_members_email)-set(new_members_email) ).delete()
1193+
for email in set(new_members_email)-set(old_members_email):
1194+
nomcom.group.role_set.create(email=email,person=email.person,name_id='member')
1195+
return HttpResponseRedirect(reverse('ietf.nomcom.views.private_index',kwargs={'year':year}))
1196+
else:
1197+
form = NewEditMembersForm(initial={ 'members' : old_members_email })
1198+
1199+
return render(request, 'nomcom/new_edit_members.html',
1200+
{'nomcom' : nomcom,
1201+
'year' : year,
1202+
'form': form,
1203+
})
1204+

ietf/templates/nomcom/edit_members.html

Lines changed: 0 additions & 39 deletions
This file was deleted.

ietf/templates/nomcom/edit_members_preview.html

Lines changed: 0 additions & 50 deletions
This file was deleted.
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
{% extends "nomcom/nomcom_private_base.html" %}
2+
{# Copyright The IETF Trust 2015, All Rights Reserved #}
3+
{% load origin %}
4+
5+
{% load bootstrap3 %}
6+
{% load staticfiles %}
7+
8+
{% block pagehead %}
9+
<link rel="stylesheet" href="{% static 'select2/select2.css' %}">
10+
<link rel="stylesheet" href="{% static 'select2-bootstrap-css/select2-bootstrap.min.css' %}">
11+
{% endblock %}
12+
13+
{% block subtitle %} - Edit members{% endblock %}
14+
15+
{% block nomcom_content %}
16+
{% origin %}
17+
<h2>
18+
Edit members
19+
</h2>
20+
21+
<form method="post">
22+
{% csrf_token %}
23+
{% bootstrap_form form %}
24+
{% buttons %}
25+
<button class="btn btn-primary" type="submit">Save</button>
26+
<a class="btn btn-default" href="{% url 'ietf.nomcom.views.private_index' year %}">Cancel</a>
27+
{% endbuttons %}
28+
</form>
29+
30+
{% endblock %}
31+
32+
{% block js %}
33+
<script src="{% static 'select2/select2.min.js' %}"></script>
34+
<script src="{% static 'ietf/js/select2-field.js' %}"></script>
35+
{% endblock %}

ietf/templates/nomcom/nomcom_private_base.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ <h1>NomCom {{ year }} {% if nomcom.group.state_id == 'conclude' %}(Concluded){%
4242
<li {% if selected == "edit_positions" %}class="active"{% endif %}><a href="{% url 'ietf.nomcom.views.list_positions' year %}">Edit Positions</a></li>
4343
<li {% if selected == "edit_topics" %}class="active"{% endif %}><a href="{% url 'ietf.nomcom.views.list_topics' year %}">Edit Topics</a></li>
4444
{% if nomcom.group.state_id == 'active' %}
45-
<li {% if selected == "edit_members" %}class="active"{% endif %}><a href="{% url 'ietf.nomcom.forms.EditMembersFormPreview' year %}">Edit Members</a></li>
45+
<li {% if selected == "edit_members" %}class="active"{% endif %}><a href="{% url 'ietf.nomcom.views.edit_members' year %}">Edit Members</a></li>
4646
{% endif %}
4747
<li {% if selected == "help" %}class="active"{% endif %}><a href="{% url 'ietf.nomcom.views.configuration_help' year %}">Configuration Help</a></li>
4848
</ul>

0 commit comments

Comments
 (0)