11from django import forms
22from django .contrib .formtools .preview import FormPreview
33from django .http import HttpResponseRedirect , HttpResponseForbidden
4+ from django .shortcuts import get_object_or_404
45from django .core .urlresolvers import reverse
6+ from django .conf import settings
57
68from ietf .ietfauth .decorators import has_role
79from 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
912from ietf .name .models import RoleName
1013from 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