From 41b788ad303e3404def4eeab7d207f98ff408268 Mon Sep 17 00:00:00 2001 From: Bill Fenner <fenner@fenron.net> Date: Tue, 22 May 2007 19:56:20 +0000 Subject: [PATCH] Rearrange nwg model to get the fields in the right order. Allow nwg wizard to have a per-step template. Write templates for step 0 and add/edit step 1. - Legacy-Id: 149 --- ietf/mailinglists/forms.py | 12 +++++- ietf/mailinglists/models.py | 16 ++++---- ietf/mailinglists/views.py | 38 +++++++++++++++---- ietf/templates/mailinglists/nwg_wizard.html | 8 +--- .../nwg_wizard_addedit_step1.html | 28 ++++++++++++++ .../mailinglists/nwg_wizard_base.html | 25 ++++++++++++ .../mailinglists/nwg_wizard_step0.html | 19 ++++++++++ 7 files changed, 123 insertions(+), 23 deletions(-) create mode 100644 ietf/templates/mailinglists/nwg_wizard_addedit_step1.html create mode 100644 ietf/templates/mailinglists/nwg_wizard_base.html create mode 100644 ietf/templates/mailinglists/nwg_wizard_step0.html diff --git a/ietf/mailinglists/forms.py b/ietf/mailinglists/forms.py index a1d5ad32a..812a92242 100644 --- a/ietf/mailinglists/forms.py +++ b/ietf/mailinglists/forms.py @@ -67,7 +67,6 @@ class ListReqStep1(forms.Form): return self.clean_data['list_to_close'] # multiwidget for separate scheme and rest for urls -# todo: can the clean return the "smart" value? class UrlMultiWidget(forms.MultiWidget): def decompress(self, value): if value: @@ -88,6 +87,17 @@ class UrlMultiWidget(forms.MultiWidget): def format_output(self, rendered_widgets): return u'%s\n%s\n<br/>' % ( u'<br/>\n'.join(["%s" % w for w in rendered_widgets[0]]), rendered_widgets[1] ) + # If we have two widgets, return the concatenation of the values + # (Except, if _0 is "n/a" then return an empty string) + # Otherwise, just return the value. + def value_from_datadict(self, data, name): + try: + scheme = data[name + '_0'] + if scheme == 'n/a': + return '' + return scheme + data[name + '_1'] + except KeyError: + return data[name] class PickApprover(forms.Form): """ diff --git a/ietf/mailinglists/models.py b/ietf/mailinglists/models.py index 136abd0d9..f3007c6fc 100644 --- a/ietf/mailinglists/models.py +++ b/ietf/mailinglists/models.py @@ -77,20 +77,20 @@ class MailingList(models.Model): class NonWgMailingList(models.Model): id = models.CharField(primary_key=True, maxlength=35) + s_name = models.CharField("Submitter's Name", blank=True, maxlength=255) + s_email = models.EmailField("Submitter's Email Address", blank=True, maxlength=255) + list_name = models.CharField("Mailing List Name", unique=True, maxlength=255) + 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') - admin = models.TextField("Administrator(s)' Email Address(es)", blank=True) - list_url = models.CharField("List URL", maxlength=255) - s_name = models.CharField("Submitter's Name", blank=True, maxlength=255) - s_email = models.CharField("Submitter's Email Address", blank=True, maxlength=255) + 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. # The values less than 1 don't get displayed on the list of lists. status = models.IntegerField() - list_name = models.CharField("Mailing List Name", unique=True, maxlength=255) - subscribe_url = models.CharField("Subscribe URL", blank=True, maxlength=255) - subscribe_other = models.TextField("Subscribe Other", blank=True) ds_name = models.CharField(blank=True, maxlength=255) - ds_email = models.CharField(blank=True, maxlength=255) + ds_email = models.EmailField(blank=True, maxlength=255) msg_to_ad = models.TextField(blank=True) def __str__(self): return self.list_name diff --git a/ietf/mailinglists/views.py b/ietf/mailinglists/views.py index df8faddc1..edaf16db3 100644 --- a/ietf/mailinglists/views.py +++ b/ietf/mailinglists/views.py @@ -13,12 +13,25 @@ nonwg_fields = { 'msg_to_ad': None, } -nonwg_widgets = { - 'list_url': UrlMultiWidget(choices=(('http://', 'http://'), ('https://', 'https://'), ('mailto:', 'mailto:'))), - 'subscribe_url': UrlMultiWidget(choices=(('n/a', 'Not Applicable'), ('http://', 'http://'), ('https://', 'https://'))), +nonwg_attrs = { + 's_name': {'size': 50}, + 's_email': {'size': 50}, + 'list_name': {'size': 80}, } -nonwg_callback = form_decorator(fields=nonwg_fields, widgets=nonwg_widgets) +nonwg_widgets = { + 'list_url': UrlMultiWidget(choices=(('http://', 'http://'), ('https://', 'https://'), ('mailto:', 'mailto:'))), + 'admin': forms.Textarea(attrs = {'rows': 3, 'cols': 50}), + 'purpose': forms.Textarea(attrs = {'rows': 4, 'cols': 70}), + 'subscribe_url': UrlMultiWidget(choices=(('n/a', 'Not Applicable'), ('http://', 'http://'), ('https://', 'https://'))), + 'subscribe_other': forms.Textarea(attrs = {'rows': 3, 'cols': 50}), +} + +nonwg_querysets = { + 'area': Areas.objects.filter(status=1) +} + +nonwg_callback = form_decorator(fields=nonwg_fields, widgets=nonwg_widgets, attrs=nonwg_attrs, querysets=nonwg_querysets) def gen_approval(approvers, parent): class BoundApproval(parent): @@ -28,13 +41,22 @@ def gen_approval(approvers, parent): return BoundApproval class NonWgWizard(wizard.Wizard): + form0 = None def get_template(self): - return "mailinglists/nwg_wizard.html" - def hash_failed(self, step): + templates = [] + if self.form0: + action = {'add': 'addedit', 'edit': 'addedit', 'delete': 'delete'}[self.form0.clean_data['add_edit']] + templates.append("mailinglists/nwg_wizard_%s_step%d.html" % (action, self.step)) + templates.append("mailinglists/nwg_wizard_%s.html" % (action)) + templates.append("mailinglists/nwg_wizard_step%d.html" % (self.step)) + templates.append("mailinglists/nwg_wizard.html") + return templates + def failed_hash(self, step): raise NotImplementedError("step %d hash failed" % step) def process_step(self, request, form, step): form.full_clean() if step == 0: + self.form0 = form if form.clean_data['add_edit'] == 'add': self.form_list.append(forms.form_for_model(NonWgMailingList, formfield_callback=nonwg_callback)) elif form.clean_data['add_edit'] == 'edit': @@ -45,6 +67,7 @@ class NonWgWizard(wizard.Wizard): if step == 1: form0 = self.get_form(0, request.POST) form0.full_clean() + self.form0 = form0 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)) @@ -57,8 +80,7 @@ def non_wg_wizard(request): class ListReqWizard(wizard.Wizard): def get_template(self): return "mailinglists/nwg_wizard.html" - def hash_failed(self, step): - raise NotImplementedError("step %d hash failed" % step) + # want to implement parse_params to get domain for list def process_step(self, request, form, step): form.full_clean() super(ListReqWizard, self).process_step(request, form, step) diff --git a/ietf/templates/mailinglists/nwg_wizard.html b/ietf/templates/mailinglists/nwg_wizard.html index 89b352182..fd0585254 100644 --- a/ietf/templates/mailinglists/nwg_wizard.html +++ b/ietf/templates/mailinglists/nwg_wizard.html @@ -1,10 +1,6 @@ -{% extends "base.html" %} +{% extends "mailinglists/nwg_wizard_base.html" %} -{% block css %} -ul.errorlist { color: red; border: 1px solid red; } -{% endblock %} - -{% block content %} +{% block nwgcontent %} <form action="." method="POST"> FORM( {{ step }} ):<table> {{ form }} </table> diff --git a/ietf/templates/mailinglists/nwg_wizard_addedit_step1.html b/ietf/templates/mailinglists/nwg_wizard_addedit_step1.html new file mode 100644 index 000000000..ffdbeda52 --- /dev/null +++ b/ietf/templates/mailinglists/nwg_wizard_addedit_step1.html @@ -0,0 +1,28 @@ +{% extends "mailinglists/nwg_wizard_base.html" %} + +{% block nwgcss %} +tr > th { text-align: left; vertical-align: top; } +{% endblock %} + +{% block nwgcontent %} +<h2>Step 2</h2> +<h4>Please provide the following information:</h4> + +<form action="." method="POST"> +<table bgcolor="#88AED2" cellspacing="1" border="0" width="714"> +<tr valign="top"><td> +<table bgcolor="#f3f8fd" cellpadding="3" cellspacing="0" border="0"> +{{ form }} +<tr> +<td></td> +<td> +<input type="submit" value=" SUBMIT "> +</td> +</tr> +</table> +</td></tr> +</table> +{{ previous_fields }} +<input type="hidden" name="{{ step_field }}" value="{{ step }}" /> +</form> +{% endblock %} diff --git a/ietf/templates/mailinglists/nwg_wizard_base.html b/ietf/templates/mailinglists/nwg_wizard_base.html new file mode 100644 index 000000000..11a3ed3d1 --- /dev/null +++ b/ietf/templates/mailinglists/nwg_wizard_base.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block title %}IETF Non WG Mailing List Submit Form{% endblock %} + +{% block css %} +ul.errorlist { color: red; border: 1px solid red; } +{% block nwgcss %}{% endblock %} +{% endblock %} + +{% block head %} +<link rel="stylesheet" type="text/css" href="http://www.ietf.org/css/base.css" /> +{% endblock %} + +{% block content %} +<blockquote> +<img src="/images/nwg/mail_title_submission.gif" border="0"><br> +<img src="/images/nwg/t_un1.gif" border="0"> +<!-- form step {{ step }} --> +<br> +{% block nwgcontent %} +form goes here +{% endblock %} +</blockquote> + +{% endblock %} diff --git a/ietf/templates/mailinglists/nwg_wizard_step0.html b/ietf/templates/mailinglists/nwg_wizard_step0.html new file mode 100644 index 000000000..a643e7d6c --- /dev/null +++ b/ietf/templates/mailinglists/nwg_wizard_step0.html @@ -0,0 +1,19 @@ +{% extends "mailinglists/nwg_wizard_base.html" %} + +{% block nwgcontent %} +<h4>Please use this Web tool to add a new entry to the <a href="/mailinglists/nonwg_lists/">IETF Non-WG Mailing Lists</a> Web page, to update the information on an existing entry, or to delete an existing entry.</h4> +<a href="/mailinglists/nonwg_lists/"><b>View Current list</b></a><br> + +</p><p> +<h2>Step 1</h2> +<h3>Please select one:</h3> +<form action="." method="POST"> +{{ form.add_edit_fields.0 }}<br> +{{ form.add_edit_fields.1 }}{{ form.list_id }}<br> +{{ form.add_edit_fields.2 }}{{ form.list_id_delete }}<br> +<input type="submit" value=" Proceed "> +<!-- + onClick="if (document.form_get.add_edit[0].checked == false && document.form_get.add_edit[1].checked == false && document.form_get.add_edit[2].checked == false) {alert('Please select one of three options');return false;}"> +--> +</form> +{% endblock %}