Skip to content

Commit 65afd10

Browse files
committed
Refactor mange group views:
* Create a new models NomComGroup with public_key field. Default type is nomcom * News urls and views to separate members and chair forms * Add rolodex url when person not found. * Views access is only for secretariat and chair roles See ietf-tools#904 - Legacy-Id: 5069
1 parent 53ca2ab commit 65afd10

12 files changed

Lines changed: 426 additions & 65 deletions

File tree

ietf/nomcom/admin.py

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
from django.contrib import admin
2+
3+
from ietf.group.admin import GroupAdmin
4+
from ietf.nomcom.models import NomComGroup
5+
6+
7+
class NomComGroupAdmin(GroupAdmin):
8+
exclude = ('type',)
9+
10+
11+
admin.site.register(NomComGroup, NomComGroupAdmin)

ietf/nomcom/forms.py

Lines changed: 84 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,58 @@
11
from django import forms
22
from django.contrib.formtools.preview import FormPreview
33
from django.http import HttpResponseRedirect, HttpResponseForbidden
4+
from django.shortcuts import get_object_or_404
45
from django.core.urlresolvers import reverse
6+
from django.conf import settings
57

68
from ietf.ietfauth.decorators import has_role
79
from ietf.utils import fields as custom_fields
8-
from ietf.group.models import Group, Role
10+
from ietf.group.models import Role
11+
from ietf.nomcom.models import NomComGroup
912
from ietf.name.models import RoleName
1013
from ietf.person.models import Email
1114

1215

13-
class ManageGroupForm(forms.Form):
16+
ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None)
1417

15-
chair = forms.EmailField(label="Chair email", required=False,
16-
widget=forms.TextInput(attrs={'size': '40'}))
17-
members = custom_fields.MultiEmailField(label="Members email", required=False)
1818

19-
def __init__(self, *args, **kwargs):
20-
super(ManageGroupForm, self).__init__(*args, **kwargs)
19+
class EditMembersForm(forms.Form):
2120

21+
members = custom_fields.MultiEmailField(label="Members email", required=False)
2222

23-
class ManageGroupFormPreview(FormPreview):
24-
form_template = 'nomcom/manage_group.html'
25-
preview_template = 'nomcom/manage_group_review.html'
2623

27-
def preview_get(self, request):
28-
if not has_role(request.user, "Secretariat"):
29-
return HttpResponseForbidden("Must be a secretariat")
24+
class EditMembersFormPreview(FormPreview):
25+
form_template = 'nomcom/edit_members.html'
26+
preview_template = 'nomcom/edit_members_preview.html'
27+
28+
def __call__(self, request, *args, **kwargs):
29+
year = kwargs['year']
30+
group = get_object_or_404(NomComGroup,
31+
acronym__icontains=year,
32+
state__slug='active')
33+
is_group_chair = bool(group.role_set.filter(person__user=request.user, name__slug='chair')[:1])
34+
is_secretariat = has_role(request.user, "Secretariat")
35+
if not is_secretariat and not is_group_chair:
36+
return HttpResponseForbidden("Must be a secretariat or group chair")
3037

31-
return super(ManageGroupFormPreview, self).preview_get(request)
38+
self.state['group'] = group
39+
self.state['rolodex_url'] = ROLODEX_URL
40+
self.group = group
41+
self.year = year
3242

43+
return super(EditMembersFormPreview, self).__call__(request, *args, **kwargs)
3344

3445
def parse_params(self, *args, **kwargs):
35-
group_acronym = kwargs['acronym']
36-
group = Group.objects.get(acronym=group_acronym)
37-
chairs = group.role_set.filter(name__slug='chair')
38-
members = group.role_set.filter(name__slug='member')
39-
if chairs:
40-
self.form.base_fields['chair'].initial = chairs[0].email.address
46+
members = self.group.role_set.filter(name__slug='member')
47+
4148
if members:
4249
self.form.base_fields['members'].initial = ',\r\n'.join([role.email.address for role in members])
43-
self.state['group'] = group
4450

4551
def process_preview(self, request, form, context):
46-
chair_email = form.cleaned_data['chair']
4752
members_email = form.cleaned_data['members'].replace('\r\n', '').replace(' ', '').split(',')
53+
4854
members_info = []
4955
emails_not_found = []
50-
try:
51-
chair_email_obj = Email.objects.get(address=chair_email)
52-
chair_person = chair_email_obj.person
53-
except Email.DoesNotExist:
54-
chair_person = None
55-
chair_email_obj = None
56-
chair_info = {'email': chair_email,
57-
'email_obj': chair_email_obj,
58-
'person': chair_person}
5956

6057
for email in members_email:
6158
try:
@@ -69,29 +66,76 @@ def process_preview(self, request, form, context):
6966
'person': person})
7067
else:
7168
emails_not_found.append(email)
72-
self.state.update({'chair_info': chair_info,
73-
'members_info': members_info,
69+
self.state.update({'members_info': members_info,
7470
'emails_not_found': emails_not_found})
7571

7672
def done(self, request, cleaned_data):
77-
group = self.state['group']
78-
chair_info = self.state['chair_info']
7973
members_info = self.state['members_info']
8074
members_email = [member['email'] for member in self.state['members_info']]
81-
members_excluded = group.role_set.filter(name__slug='member').exclude(email__address__in=members_email)
75+
members_excluded = self.group.role_set.filter(name__slug='member').exclude(email__address__in=members_email)
8276
members_excluded.delete()
8377
for member in members_info:
8478
Role.objects.get_or_create(name=RoleName.objects.get(slug="member"),
85-
group=group,
79+
group=self.group,
8680
person=member['person'],
8781
email=member['email_obj'])
8882

89-
chair_exclude = group.role_set.filter(name__slug='chair').exclude(email__address=chair_info['email'])
83+
return HttpResponseRedirect(reverse('edit_members', kwargs={'year': self.year}))
84+
85+
86+
class EditChairForm(forms.Form):
87+
88+
chair = forms.EmailField(label="Chair email", required=False,
89+
widget=forms.TextInput(attrs={'size': '40'}))
90+
91+
92+
class EditChairFormPreview(FormPreview):
93+
form_template = 'nomcom/edit_chair.html'
94+
preview_template = 'nomcom/edit_chair_preview.html'
95+
96+
def __call__(self, request, *args, **kwargs):
97+
year = kwargs['year']
98+
group = get_object_or_404(NomComGroup,
99+
acronym__icontains=year,
100+
state__slug='active')
101+
is_secretariat = has_role(request.user, "Secretariat")
102+
if not is_secretariat:
103+
return HttpResponseForbidden("Must be a secretariat")
104+
105+
self.state['group'] = group
106+
self.state['rolodex_url'] = ROLODEX_URL
107+
self.group = group
108+
self.year = year
109+
110+
return super(EditChairFormPreview, self).__call__(request, *args, **kwargs)
111+
112+
def parse_params(self, *args, **kwargs):
113+
chairs = self.group.role_set.filter(name__slug='chair')
114+
if chairs:
115+
self.form.base_fields['chair'].initial = chairs[0].email.address
116+
117+
def process_preview(self, request, form, context):
118+
chair_email = form.cleaned_data['chair']
119+
try:
120+
chair_email_obj = Email.objects.get(address=chair_email)
121+
chair_person = chair_email_obj.person
122+
except Email.DoesNotExist:
123+
chair_person = None
124+
chair_email_obj = None
125+
chair_info = {'email': chair_email,
126+
'email_obj': chair_email_obj,
127+
'person': chair_person}
128+
129+
self.state.update({'chair_info': chair_info})
130+
131+
def done(self, request, cleaned_data):
132+
chair_info = self.state['chair_info']
133+
chair_exclude = self.group.role_set.filter(name__slug='chair').exclude(email__address=chair_info['email'])
90134
chair_exclude.delete()
91135
if chair_info['email_obj'] and chair_info['person']:
92136
Role.objects.get_or_create(name=RoleName.objects.get(slug="chair"),
93-
group=group,
137+
group=self.group,
94138
person=chair_info['person'],
95139
email=chair_info['email_obj'])
96140

97-
return HttpResponseRedirect(reverse('manage_group', kwargs={'acronym': group.acronym}))
141+
return HttpResponseRedirect(reverse('edit_chair', kwargs={'year': self.year}))

0 commit comments

Comments
 (0)