From 81ba5ef9593db0de79f55583b366f07f79229f8c Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Thu, 19 Sep 2013 11:04:31 +0000 Subject: [PATCH] Move delegate handling to group edit page (like other group personnel), show group delegates in the charter page with the other personnel - Legacy-Id: 6195 --- ietf/templates/wginfo/group_charter.html | 11 +++++++++++ ietf/wginfo/edit.py | 25 +++++++++++++++++------- ietf/wginfo/tests.py | 2 ++ ietf/wginfo/urls.py | 1 - ietf/wginfo/views.py | 2 +- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/ietf/templates/wginfo/group_charter.html b/ietf/templates/wginfo/group_charter.html index 7175748a3..b29f6a918 100644 --- a/ietf/templates/wginfo/group_charter.html +++ b/ietf/templates/wginfo/group_charter.html @@ -105,6 +105,17 @@ is occasionally incorrect. {% endif %} + {% if group.delegates %} + + Delegate{{ group.delegates|pluralize }}: + + {% for delegate in group.delegates %} + {{ delegate.person.plain_name }} <{{ delegate.address }}>
+ {% endfor %} + + + {% endif %} + Mailing List Address:{{ group.list_email|urlize }} diff --git a/ietf/wginfo/edit.py b/ietf/wginfo/edit.py index 068a62b10..92009b0b0 100644 --- a/ietf/wginfo/edit.py +++ b/ietf/wginfo/edit.py @@ -23,13 +23,16 @@ from ietf.wgcharter.mails import email_secretariat from ietf.person.forms import EmailsField from ietf.doc.utils import get_tags_for_stream_id +MAX_GROUP_DELEGATES = 3 + class WGForm(forms.Form): - name = forms.CharField(max_length=255, label="WG Name", required=True) - acronym = forms.CharField(max_length=10, label="WG Acronym", required=True) - state = forms.ModelChoiceField(GroupStateName.objects.all(), label="WG State", required=True) - chairs = EmailsField(label="WG Chairs", required=False) - secretaries = EmailsField(label="WG Secretaries", required=False) - techadv = EmailsField(label="WG Technical Advisors", required=False) + name = forms.CharField(max_length=255, label="Name", required=True) + acronym = forms.CharField(max_length=10, label="Acronym", required=True) + state = forms.ModelChoiceField(GroupStateName.objects.all(), label="State", required=True) + chairs = EmailsField(label="Chairs", required=False) + secretaries = EmailsField(label="Secretaries", required=False) + techadv = EmailsField(label="Technical Advisors", required=False) + delegates = EmailsField(label="Delegates", required=False, help_text=mark_safe("Type in name to search for person
Chairs can delegate the authority to update the state of group documents - max %s persons at a given time" % MAX_GROUP_DELEGATES)) ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'), label="Shepherding AD", empty_label="(None)", required=False) parent = forms.ModelChoiceField(Group.objects.filter(type="area", state="active").order_by('name'), label="IETF Area", empty_label="(None)", required=False) list_email = forms.CharField(max_length=64, required=False) @@ -97,6 +100,13 @@ class WGForm(forms.Form): def clean_urls(self): return [x.strip() for x in self.cleaned_data["urls"].splitlines() if x.strip()] + def clean_delegates(self): + if len(self.cleaned_data["delegates"]) > MAX_GROUP_DELEGATES: + raise forms.ValidationError("At most %s delegates can be appointed at the same time, please remove %s delegates." % ( + MAX_GROUP_DELEGATES, len(self.cleaned_data["delegates"]) - MAX_GROUP_DELEGATES)) + return self.cleaned_data["delegates"] + + def format_urls(urls, fs="\n"): res = [] for u in urls: @@ -221,7 +231,7 @@ def edit(request, acronym=None, action="edit"): shutil.copy(old, new) # update roles - for attr, slug, title in [('chairs', 'chair', "Chairs"), ('secretaries', 'secr', "Secretaries"), ('techadv', 'techadv', "Tech Advisors")]: + for attr, slug, title in [('chairs', 'chair', "Chairs"), ('secretaries', 'secr', "Secretaries"), ('techadv', 'techadv', "Tech Advisors"), ('delegates', 'delegate', "Delegates")]: new = clean[attr] old = Email.objects.filter(role__group=wg, role__name=slug).select_related("person") if set(new) != set(old): @@ -269,6 +279,7 @@ def edit(request, acronym=None, action="edit"): chairs=Email.objects.filter(role__group=wg, role__name="chair"), secretaries=Email.objects.filter(role__group=wg, role__name="secr"), techadv=Email.objects.filter(role__group=wg, role__name="techadv"), + delegates=Email.objects.filter(role__group=wg, role__name="delegate"), ad=wg.ad_id if wg.ad else None, parent=wg.parent.id if wg.parent else None, list_email=wg.list_email if wg.list_email else None, diff --git a/ietf/wginfo/tests.py b/ietf/wginfo/tests.py index 7615e23bc..33134b233 100644 --- a/ietf/wginfo/tests.py +++ b/ietf/wginfo/tests.py @@ -355,6 +355,7 @@ class WgEditTestCase(django.test.TestCase): chairs="aread@ietf.org, ad1@ietf.org", secretaries="aread@ietf.org, ad1@ietf.org, ad2@ietf.org", techadv="aread@ietf.org", + delegates="ad2@ietf.org", list_email="mars@mail", list_subscribe="subscribe.mars", list_archive="archive.mars", @@ -375,6 +376,7 @@ class WgEditTestCase(django.test.TestCase): self.assertEquals(group.ad, ad) for k in ("chair", "secr", "techadv"): self.assertTrue(group.role_set.filter(name=k, email__address="aread@ietf.org")) + self.assertTrue(group.role_set.filter(name="delegate", email__address="ad2@ietf.org")) self.assertEquals(group.list_email, "mars@mail") self.assertEquals(group.list_subscribe, "subscribe.mars") self.assertEquals(group.list_archive, "archive.mars") diff --git a/ietf/wginfo/urls.py b/ietf/wginfo/urls.py index bad932b21..b0106f144 100644 --- a/ietf/wginfo/urls.py +++ b/ietf/wginfo/urls.py @@ -30,5 +30,4 @@ urlpatterns = patterns('', (r'^(?P[a-zA-Z0-9-]+)/milestones/charter/reset/$', milestones.reset_charter_milestones, None, "wg_reset_charter_milestones"), (r'^(?P[a-zA-Z0-9-]+)/ajax/searchdocs/$', milestones.ajax_search_docs, None, "wg_ajax_search_docs"), (r'^(?P[a-zA-Z0-9-]+)/workflow/$', edit.customize_workflow), - (r'^(?P[^/]+)/management/', include('ietf.wgchairs.urls')), ) diff --git a/ietf/wginfo/views.py b/ietf/wginfo/views.py index 87f4d8caf..27871eb8b 100644 --- a/ietf/wginfo/views.py +++ b/ietf/wginfo/views.py @@ -255,6 +255,7 @@ def group_charter(request, acronym): group = get_object_or_404(Group, type="wg", acronym=acronym) fill_in_charter_info(group, include_drafts=False) + group.delegates = Email.objects.filter(role__group=group, role__name="delegate") actions = [] if group.state_id != "conclude": @@ -269,7 +270,6 @@ def group_charter(request, acronym): is_chair = request.user.is_authenticated() and group.role_set.filter(name="chair", person__user=request.user) if is_chair or has_role(request.user, "Secretariat"): - actions.append((u"Manage delegates", urlreverse("manage_delegates", kwargs=dict(acronym=group.acronym)))) actions.append((u"Customize workflow", urlreverse("ietf.wginfo.edit.customize_workflow", kwargs=dict(acronym=group.acronym)))) return render_to_response('wginfo/group_charter.html',