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
This commit is contained in:
Ole Laursen 2013-09-19 11:04:31 +00:00
parent 3562c5ef06
commit 81ba5ef959
5 changed files with 32 additions and 9 deletions

View file

@ -105,6 +105,17 @@ is occasionally incorrect.</span>
</tr>
{% endif %}
{% if group.delegates %}
<tr>
<td>Delegate{{ group.delegates|pluralize }}:</td>
<td>
{% for delegate in group.delegates %}
<a href="mailto:{{ delegate.address }}">{{ delegate.person.plain_name }} &lt;{{ delegate.address }}&gt;</a><br/>
{% endfor %}
</td>
</tr>
{% endif %}
<tr><th colspan="2">Mailing List</th></tr>
<tr><td>Address:</td><td>{{ group.list_email|urlize }}</td></tr>

View file

@ -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<br>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,

View file

@ -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")

View file

@ -30,5 +30,4 @@ urlpatterns = patterns('',
(r'^(?P<acronym>[a-zA-Z0-9-]+)/milestones/charter/reset/$', milestones.reset_charter_milestones, None, "wg_reset_charter_milestones"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/ajax/searchdocs/$', milestones.ajax_search_docs, None, "wg_ajax_search_docs"),
(r'^(?P<acronym>[a-zA-Z0-9-]+)/workflow/$', edit.customize_workflow),
(r'^(?P<acronym>[^/]+)/management/', include('ietf.wgchairs.urls')),
)

View file

@ -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',