|
23 | 23 | from ietf.person.models import Person, Email |
24 | 24 | from ietf.group.mails import ( email_admin_re_charter, email_personnel_change) |
25 | 25 | from ietf.utils.ordereddict import insert_after_in_ordered_dict |
| 26 | +from ietf.utils.text import skip_suffix |
| 27 | + |
26 | 28 |
|
27 | 29 | MAX_GROUP_DELEGATES = 3 |
28 | 30 |
|
| 31 | +def roles_for_group_type(group_type): |
| 32 | + roles = ["chair", "secr", "techadv", "delegate"] |
| 33 | + if group_type == "dir": |
| 34 | + roles.append("reviewer") |
| 35 | + return roles |
| 36 | + |
29 | 37 | class GroupForm(forms.Form): |
30 | 38 | name = forms.CharField(max_length=255, label="Name", required=True) |
31 | 39 | acronym = forms.CharField(max_length=10, label="Acronym", required=True) |
32 | 40 | state = forms.ModelChoiceField(GroupStateName.objects.all(), label="State", required=True) |
33 | | - chairs = SearchableEmailsField(label="Chairs", required=False, only_users=True) |
34 | | - secretaries = SearchableEmailsField(label="Secretaries", required=False, only_users=True) |
35 | | - techadv = SearchableEmailsField(label="Technical Advisors", required=False, only_users=True) |
36 | | - delegates = SearchableEmailsField(label="Delegates", required=False, only_users=True, max_entries=MAX_GROUP_DELEGATES, |
| 41 | + |
| 42 | + # roles |
| 43 | + chair_roles = SearchableEmailsField(label="Chairs", required=False, only_users=True) |
| 44 | + secr_roles = SearchableEmailsField(label="Secretaries", required=False, only_users=True) |
| 45 | + techadv_roles = SearchableEmailsField(label="Technical Advisors", required=False, only_users=True) |
| 46 | + delegate_roles = SearchableEmailsField(label="Delegates", required=False, only_users=True, max_entries=MAX_GROUP_DELEGATES, |
37 | 47 | help_text=mark_safe("Chairs can delegate the authority to update the state of group documents - at most %s persons at a given time." % MAX_GROUP_DELEGATES)) |
| 48 | + reviewer_roles = SearchableEmailsField(label="Reviewers", required=False, only_users=True) |
38 | 49 | ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active", role__group__type='area').order_by('name'), label="Shepherding AD", empty_label="(None)", required=False) |
| 50 | + |
39 | 51 | parent = forms.ModelChoiceField(Group.objects.filter(state="active").order_by('name'), empty_label="(None)", required=False) |
40 | 52 | list_email = forms.CharField(max_length=64, required=False) |
41 | 53 | list_subscribe = forms.CharField(max_length=255, required=False) |
@@ -69,6 +81,11 @@ def __init__(self, *args, **kwargs): |
69 | 81 | self.fields['parent'].queryset = self.fields['parent'].queryset.filter(type="area") |
70 | 82 | self.fields['parent'].label = "IETF Area" |
71 | 83 |
|
| 84 | + role_fields_to_remove = (set(roles_for_group_type(self.group_type)) |
| 85 | + - set(skip_suffix(attr, "_roles") for attr in self.fields if attr.endswith("_roles"))) |
| 86 | + for r in role_fields_to_remove: |
| 87 | + del self.fields[r + "_roles"] |
| 88 | + |
72 | 89 | def clean_acronym(self): |
73 | 90 | # Changing the acronym of an already existing group will cause 404s all |
74 | 91 | # over the place, loose history, and generally muck up a lot of |
@@ -211,7 +228,8 @@ def edit(request, group_type=None, acronym=None, action="edit"): |
211 | 228 | group = get_group_or_404(acronym, group_type) |
212 | 229 | if not group_type and group: |
213 | 230 | group_type = group.type_id |
214 | | - if not (can_manage_group(request.user, group) or group.has_role(request.user, "chair")): |
| 231 | + if not (can_manage_group(request.user, group) |
| 232 | + or group.has_role(request.user, group.features.admin_roles)): |
215 | 233 | return HttpResponseForbidden("You don't have permission to access this view") |
216 | 234 |
|
217 | 235 | if request.method == 'POST': |
@@ -274,10 +292,18 @@ def diff(attr, name): |
274 | 292 | personnel_change_text="" |
275 | 293 | changed_personnel = set() |
276 | 294 | # update roles |
277 | | - for attr, slug, title in [('ad','ad','Shepherding AD'), ('chairs', 'chair', "Chairs"), ('secretaries', 'secr', "Secretaries"), ('techadv', 'techadv', "Tech Advisors"), ('delegates', 'delegate', "Delegates")]: |
| 295 | + for attr, f in form.fields.iteritems(): |
| 296 | + if not (attr.endswith("_roles") or attr == "ad"): |
| 297 | + continue |
| 298 | + |
| 299 | + slug = attr |
| 300 | + slug = skip_suffix(slug, "_roles") |
| 301 | + |
| 302 | + title = f.label |
| 303 | + |
278 | 304 | new = clean[attr] |
279 | 305 | if attr == 'ad': |
280 | | - new = [ new.role_email('ad'),] if new else [] |
| 306 | + new = [ new.role_email('ad') ] if new else [] |
281 | 307 | old = Email.objects.filter(role__group=group, role__name=slug).select_related("person") |
282 | 308 | if set(new) != set(old): |
283 | 309 | changes.append((attr, new, desc(title, |
@@ -336,17 +362,16 @@ def diff(attr, name): |
336 | 362 | init = dict(name=group.name, |
337 | 363 | acronym=group.acronym, |
338 | 364 | state=group.state, |
339 | | - chairs=Email.objects.filter(role__group=group, role__name="chair"), |
340 | | - secretaries=Email.objects.filter(role__group=group, role__name="secr"), |
341 | | - techadv=Email.objects.filter(role__group=group, role__name="techadv"), |
342 | | - delegates=Email.objects.filter(role__group=group, role__name="delegate"), |
343 | 365 | ad=ad_role and ad_role.person and ad_role.person.id, |
344 | 366 | parent=group.parent.id if group.parent else None, |
345 | 367 | list_email=group.list_email if group.list_email else None, |
346 | 368 | list_subscribe=group.list_subscribe if group.list_subscribe else None, |
347 | 369 | list_archive=group.list_archive if group.list_archive else None, |
348 | 370 | urls=format_urls(group.groupurl_set.all()), |
349 | 371 | ) |
| 372 | + |
| 373 | + for slug in roles_for_group_type(group_type): |
| 374 | + init[slug + "_roles"] = Email.objects.filter(role__group=group, role__name=slug) |
350 | 375 | else: |
351 | 376 | init = dict(ad=request.user.person.id if group_type == "wg" and has_role(request.user, "Area Director") else None, |
352 | 377 | ) |
@@ -400,8 +425,8 @@ def customize_workflow(request, group_type=None, acronym=None): |
400 | 425 | if not group.features.customize_workflow: |
401 | 426 | raise Http404 |
402 | 427 |
|
403 | | - if (not has_role(request.user, "Secretariat") and |
404 | | - not group.role_set.filter(name="chair", person__user=request.user)): |
| 428 | + if not (can_manage_group(request.user, group) |
| 429 | + or group.has_role(request.user, group.features.admin_roles)): |
405 | 430 | return HttpResponseForbidden("You don't have permission to access this view") |
406 | 431 |
|
407 | 432 | if group_type == "rg": |
|
0 commit comments