From e38f1dc967b6e0a1310b2fb2ec9e45dcb0608916 Mon Sep 17 00:00:00 2001 From: Bill Fenner Date: Mon, 28 May 2007 18:51:55 +0000 Subject: [PATCH] A little progress on the mailing list request tool. - Legacy-Id: 177 --- ietf/mailinglists/forms.py | 29 +++++++++++++++++--- ietf/mailinglists/models.py | 8 +++--- ietf/mailinglists/urls.py | 4 +-- ietf/mailinglists/views.py | 54 ++++++++++++++++++++++++++++++------- 4 files changed, 76 insertions(+), 19 deletions(-) diff --git a/ietf/mailinglists/forms.py b/ietf/mailinglists/forms.py index 3f6b5cc21..7caad75d3 100644 --- a/ietf/mailinglists/forms.py +++ b/ietf/mailinglists/forms.py @@ -1,6 +1,6 @@ from django import newforms as forms from models import NonWgMailingList, ImportedMailingList -from ietf.idtracker.models import PersonOrOrgInfo, GroupIETF +from ietf.idtracker.models import PersonOrOrgInfo, GroupIETF, Acronym class NonWgStep1(forms.Form): add_edit = forms.ChoiceField(choices=( @@ -56,9 +56,20 @@ class ListReqStep1(forms.Form): self.fields['list_to_close'].choices = [('', '-- Select List To Close')] + ImportedMailingList.choices(dname) self.fields['domain_name'].initial = dname def clean_group(self): - if self.clean_data.get('mail_type', '').endswith('wg'): + group = self.clean_data['group'] + action = self.clean_data.get('mail_type', '') + if action.endswith('wg'): if not self.clean_data.get('group'): raise forms.ValidationError, 'Please pick a working group' + group_name = Acronym.objects.get(pk=group).acronym + #group_list_exists = ImportedMailingList.objects.filter(acronym=group_name).count() + group_list_exists = ImportedMailingList.objects.filter(group_acronym=group).count() + if action.startswith('close'): + if group_list_exists == 0: + raise forms.ValidationError, 'The %s mailing list does not exist.' % group_name + else: + if group_list_exists: + raise forms.ValidationError, 'The %s mailing list already exists.' % group_name return self.clean_data['group'] def clean_list_to_close(self): if self.clean_data.get('mail_type', '') == 'closenon': @@ -122,4 +133,16 @@ class DeletionPickApprover(PickApprover): # A form with no required fields, to allow a preview action class Preview(forms.Form): - preview = forms.BooleanField(required=False) + #preview = forms.BooleanField(required=False) + pass + +class ListReqAuthorized(forms.Form): + authorized = forms.BooleanField() + def clean_authorized(self): + if not(self.clean_data.get('authorized', 0)): + raise forms.ValidationError, 'You must assert that you are authorized to perform this action.' + return self.clean_data['authorized'] + +# subclass pickapprover here too? +class ListReqClose(forms.Form): + pass diff --git a/ietf/mailinglists/models.py b/ietf/mailinglists/models.py index e5f62984a..cf52a2666 100644 --- a/ietf/mailinglists/models.py +++ b/ietf/mailinglists/models.py @@ -1,5 +1,5 @@ from django.db import models -from ietf.idtracker.models import Acronym, Areas, PersonOrOrgInfo +from ietf.idtracker.models import Acronym, Area, PersonOrOrgInfo import random class ImportedMailingList(models.Model): @@ -44,7 +44,7 @@ class MailingList(models.Model): ('2', 'Non-WG Mailing List'), ('3', 'Close Non-WG Mailing List'), ) - mailing_list_id = models.CharField('Unique ID', primary_key=True, maxlength=25) + mailing_list_id = models.CharField('Unique ID', primary_key=True, maxlength=25, editable=False) request_date = models.DateField() mlist_name = models.CharField('Mailing list name', maxlength=250) short_desc = models.CharField(maxlength=250) @@ -68,7 +68,7 @@ class MailingList(models.Model): approved = models.BooleanField() approved_date = models.DateField(null=True, blank=True) reason_to_delete = models.TextField(blank=True) - domain_name = models.CharField(blank=True, maxlength=10) + domain_name = models.CharField(maxlength=10) def __str__(self): return self.mlist_name def save(self, *args, **kwargs): @@ -94,7 +94,7 @@ class NonWgMailingList(models.Model): list_url = models.CharField("List URL", maxlength=255) admin = models.TextField("Administrator(s)' Email Address(es)", blank=True) purpose = models.TextField(blank=True) - area = models.ForeignKey(Areas, db_column='area_acronym_id') + area = models.ForeignKey(Area, db_column='area_acronym_id') subscribe_url = models.CharField("Subscribe URL", blank=True, maxlength=255) subscribe_other = models.TextField("Subscribe Other", blank=True) # Can be 0, 1, -1, or what looks like a person_or_org_tag, positive or neg. diff --git a/ietf/mailinglists/urls.py b/ietf/mailinglists/urls.py index f12942a7d..cc8dc5833 100644 --- a/ietf/mailinglists/urls.py +++ b/ietf/mailinglists/urls.py @@ -1,11 +1,11 @@ from django.conf.urls.defaults import * -from ietf.idtracker.models import Areas +from ietf.idtracker.models import Area from ietf.mailinglists import views from ietf.mailinglists.models import NonWgMailingList from ietf.mailinglists.forms import NonWgStep1 urlpatterns = patterns('django.views.generic.list_detail', - (r'^area_lists/$', 'object_list', { 'queryset': Areas.objects.filter(status=1).select_related().order_by('acronym.acronym'), 'template_name': 'mailinglists/areas_list.html' }), + (r'^area_lists/$', 'object_list', { 'queryset': Area.objects.filter(status=1).select_related().order_by('acronym.acronym'), 'template_name': 'mailinglists/areas_list.html' }), (r'^nonwg_lists/$', 'object_list', { 'queryset': NonWgMailingList.objects.filter(status__gt=0) }), ) urlpatterns += patterns('', diff --git a/ietf/mailinglists/views.py b/ietf/mailinglists/views.py index 12134045d..2abb53c6c 100644 --- a/ietf/mailinglists/views.py +++ b/ietf/mailinglists/views.py @@ -1,6 +1,6 @@ -from forms import NonWgStep1, ListReqStep1, PickApprover, DeletionPickApprover, UrlMultiWidget, Preview -from models import NonWgMailingList -from ietf.idtracker.models import Areas, PersonOrOrgInfo +from forms import NonWgStep1, ListReqStep1, PickApprover, DeletionPickApprover, UrlMultiWidget, Preview, ListReqAuthorized, ListReqClose +from models import NonWgMailingList, MailingList +from ietf.idtracker.models import Area, PersonOrOrgInfo from django import newforms as forms from django.shortcuts import render_to_response from django.template import RequestContext @@ -46,7 +46,7 @@ nonwg_widgets = { } nonwg_querysets = { - 'area': Areas.objects.filter(status=1) + 'area': Area.objects.filter(status=1) } nonwg_callback = form_decorator(fields=nonwg_fields, widgets=nonwg_widgets, attrs=nonwg_attrs, querysets=nonwg_querysets) @@ -102,7 +102,7 @@ class NonWgWizard(wizard.Wizard): form0 = self.clean_forms[0] add_edit = form0.clean_data['add_edit'] if add_edit == 'add' or add_edit == 'edit': - self.form_list.append(gen_approval([ad.person_id for ad in Areas.objects.get(area_acronym=form.clean_data['area']).areadirectors_set.all()], PickApprover)) + self.form_list.append(gen_approval([ad.person_id for ad in Area.objects.get(area_acronym=form.clean_data['area']).areadirectors_set.all()], PickApprover)) self.form_list.append(Preview) super(NonWgWizard, self).process_step(request, form, step) def done(self, request, form_list): @@ -133,18 +133,52 @@ def non_wg_wizard(request): wiz = NonWgWizard([ NonWgStep1 ]) return wiz(request) +list_fields = { + 'mailing_list_id': None, + 'request_date': None, + 'auth_person': None, + 'approved': None, + 'approved_date': None, + 'reason_to_delete': None, +} + +list_widgets = { +} + +list_attrs = { +} + +list_callback = form_decorator(fields=list_fields, widgets=list_widgets, attrs=list_attrs) + class ListReqWizard(wizard.Wizard): def get_template(self): - return "mailinglists/nwg_wizard.html" + templates = [] + #if self.step > 0: + # action = {'add': 'addedit', 'edit': 'addedit', 'delete': 'delete'}[self.clean_forms[0].clean_data['add_edit']] + # templates.append("mailinglists/nwg_wizard_%s_step%d.html" % (action, self.step)) + # templates.append("mailinglists/nwg_wizard_%s.html" % (action)) + c = self.form_list[self.step].__name__ + templates.append("mailinglists/list_wizard_%s.html" % (c)) + templates.append("mailinglists/list_wizard_step%d.html" % (self.step)) + templates.append("mailinglists/list_wizard.html") + return templates # want to implement parse_params to get domain for list def process_step(self, request, form, step): form.full_clean() + if step == 0: + self.clean_forms = [ form ] + else: + self.clean_forms.append(form) + if step == 0: + if form.clean_data['mail_type'].endswith('non') and form.clean_data['domain_name'] != 'ietf.org': + self.form_list.append(ListReqAuthorized) + if form.clean_data['mail_type'].startswith('close'): + self.form_list.append(ListReqClose) + else: + self.form_list.append(forms.form_for_model(MailingList)) + #XXX not quite super(ListReqWizard, self).process_step(request, form, step) def list_req_wizard(request): wiz = ListReqWizard([ ListReqStep1 ]) return wiz(request) - -def non_wg_submit(request): - form = NonWgStep1() - return render_to_response('mailinglists/step1.html', { 'form': form })