Implement custom form rendering for step 0.

Implement javascript to disable form elements that aren't used
when wg or non-wg items are selected.

Implement javascript to reload the page with the right set of
non-wg mailing lists to close.
 - Legacy-Id: 274
This commit is contained in:
Bill Fenner 2007-06-10 02:00:51 +00:00
parent ebe29bc1af
commit fdca154e75
3 changed files with 105 additions and 22 deletions

View file

@ -1,6 +1,7 @@
from django import newforms as forms
from models import NonWgMailingList, ImportedMailingList
from ietf.idtracker.models import PersonOrOrgInfo, IETFWG, Acronym
import re
class NonWgStep1(forms.Form):
add_edit = forms.ChoiceField(choices=(
@ -42,28 +43,27 @@ class ListReqStep1(forms.Form):
('newnon', 'Create new non-WG email list at selected domain above'),
('movenon', 'Move existing non-WG email list to selected domain above'),
('closenon', 'Close existing non-WG email list at selected domain above'),
), widget=forms.RadioSelect)
), widget=forms.RadioSelect())
#group = forms.ChoiceField(required=False)
group = forms.ModelChoiceField(queryset=IETFWG.objects.all().select_related().order_by('acronym.acronym'), required=False, empty_label="-- Select Working Group")
domain_name = forms.ChoiceField(choices=DOMAIN_CHOICES, required=False)
domain_name = forms.ChoiceField(choices=DOMAIN_CHOICES, required=False, widget = forms.Select(attrs={'onChange': 'set_domain(this)'}))
list_to_close = forms.ModelChoiceField(queryset=ImportedMailingList.objects.all(), required=False, empty_label="-- Select List To Close")
def mail_type_fields(self):
field = self['mail_type']
return field.as_widget(field.field.widget)
# RadioSelect() doesn't pass its attributes through to the <input>
# elements, so in order to get the javascript onClick we add it here.
return [re.sub(r'input ','input onClick="activate_widgets()" ',str(i)) for i in field.as_widget(field.field.widget)]
def __init__(self, *args, **kwargs):
initial = kwargs.get('initial', None)
# could pass initial = None, so can't use a trick on the
# above get.
if initial:
dname = initial.get('domain_name', 'ietf.org')
else:
dname = 'ietf.org'
if args and args[0]:
dn = 'domain_name'
if kwargs.has_key('prefix'):
dn = kwargs['prefix'] + '-' + dn
dname = args[0][dn]
dname = kwargs.get('dname', dname)
super(ListReqStep1, self).__init__(*args, **kwargs)
#self.fields['group'].choices = [('', '-- Select Working Group')] + IETFWG.choices()
#self.fields['list_to_close'].choices = [('', '-- Select List To Close')] + ImportedMailingList.choices(dname)
#XXX This doesn't work yet. Maybe switch back to choices.
self.fields['list_to_close'].queryset = ImportedMailingList.choices(dname)
print "dname %s list_to_close values: %s" % (dname, self.fields['list_to_close'].queryset)
self.fields['list_to_close'].widget.choices = self.fields['list_to_close'].choices
self.fields['domain_name'].initial = dname
def clean_group(self):
group = self.clean_data['group']
@ -181,7 +181,7 @@ class AdminRequestor(forms.MultiWidget):
# check the checkbox, but for now let's try this.
return ['', '', value]
def __init__(self, attrs=None):
widgets = (forms.CheckboxInput(), forms.TextInput(attrs={'size': 55, 'disabled': True}), forms.Textarea(attrs=attrs))
widgets = (forms.CheckboxInput(attrs={'onClick': 'checkthis()'}), forms.TextInput(attrs={'size': 55, 'disabled': True}), forms.Textarea(attrs=attrs))
super(AdminRequestor, self).__init__(widgets, attrs)
def format_output(self, rendered_widgets):
return u'<br/>\n'.join(["<label>%s Same as requestor</label>" % rendered_widgets[0]] + rendered_widgets[1:])

View file

@ -192,19 +192,14 @@ class ListReqWizard(wizard.Wizard):
requestor_is_approver = False
mlist_known = True
def get_template(self):
'''Start with form class, then step number, then the base form.'''
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")
print templates
return templates
def render_template(self, *args, **kwargs):
#self.extra_context['clean_forms'] = self.clean_forms
self.extra_context['mlist_known'] = self.mlist_known
if self.step > self.main_step:
self.extra_context['main_form'] = self.clean_forms[self.main_step]
@ -212,7 +207,11 @@ class ListReqWizard(wizard.Wizard):
if self.step == self.main_step + 1:
self.extra_context['list'] = self.getlist()
return super(ListReqWizard, self).render_template(*args, **kwargs)
# want to implement parse_params to get domain for list
def parse_params(self, request, *args, **kwargs):
super(ListReqWizard, self).parse_params(request, *args, **kwargs)
if self.step == 0:
# allow javascript "redirects" to set initial values
self.initial[0] = request.GET
def process_step(self, request, form, step):
form.full_clean()
if step == 0:

View file

@ -0,0 +1,84 @@
{% extends "mailinglists/list_wizard_base.html" %}
{% block head %}
<script language="javascript">
function get_mail_type() {
buttons = document.form_post["0-mail_type"]
selected = ""
for (i = 0; i < buttons.length; i++)
if (buttons[i].checked)
selected = buttons[i].value
return selected
}
function set_domain (widget) {
loc = "./?domain_name=" + widget.options[widget.selectedIndex].value
mail_type = get_mail_type()
if (mail_type != "")
loc = loc + "&mail_type=" + mail_type
window.location = loc
}
function activate_widgets() {
selected = get_mail_type()
if (selected == "") {
return
}
wg = (selected.substr(-2) == "wg")
document.form_post["0-group"].disabled = !wg
document.form_post["0-domain_name"].disabled = wg
document.form_post["0-list_to_close"].disabled = wg
}
</script>
{% endblock %}
{% block body_attributes %}onLoad="activate_widgets()"{% endblock %}
{% block mlform %}
<tr valign="top"><td bgcolor="#dfe9ef"><h3>WG email list
&nbsp;&nbsp;&nbsp;&nbsp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
{{ form.group }}
{% if form.group.errors %}
<ul class="errorlist">
{% for error in form.group.errors %}
<li>{{ error|escape }}</li>
{% endfor %}
</ul>
{% endif %}
</h3>
{% if form.mail_type.errors %}
<ul class="errorlist">
{% for error in form.mail_type.errors %}
<li>{{ error|escape }}</li>
{% endfor %}
</ul>
{% endif %}
{{ form.mail_type_fields.0 }}<br>
{{ form.mail_type_fields.1 }}<br>
{{ form.mail_type_fields.2 }}<br>
</td></tr>
<tr>
<td bgcolor="#ccdcec"><h3>Non-WG email list</h3>
<b>Select Domain Name: </b>{{ form.domain_name }}<br>
{{ form.mail_type_fields.3 }}<br>
{{ form.mail_type_fields.4 }}<br>
{{ form.mail_type_fields.5 }}<br>
{{ form.list_to_close }}
{% if form.list_to_close.errors %}
<ul class="errorlist">
{% for error in form.list_to_close.errors %}
<li>{{ error|escape }}</li>
{% endfor %}
</ul>
{% endif %}
<br>
</td></tr>
<tr><td colspan="2">
<font color="red">Note: Only members of the IAB (or their designees) and active
participants in the IRTF may create or close a mailing list at iab.org and irtf.
org, respectively, or move an existing list to one of these domains."</font>
<br><br>
</td></tr>
{% endblock %}