datatracker/ietf/mailinglists/forms.py
Henrik Levkowetz cd030d3b43 Adding copyright notices to all python files
- Legacy-Id: 716
2007-06-27 21:16:34 +00:00

223 lines
9.8 KiB
Python

# Copyright The IETF Trust 2007, All Rights Reserved
from django import newforms as forms
from models import NonWgMailingList, ImportedMailingList
from ietf.idtracker.models import PersonOrOrgInfo, IETFWG
import re
class NonWgStep1(forms.Form):
add_edit = forms.ChoiceField(choices=(
('add', 'Add a new entry'),
('edit', 'Modify an existing entry'),
('delete', 'Delete an existing entry'),
), widget=forms.RadioSelect)
list_id = forms.ChoiceField(required=False)
list_id_delete = forms.ChoiceField(required=False)
def add_edit_fields(self):
field = self['add_edit']
#return field.as_widget(field.field.widget)
return [re.sub(r'input ','input onClick="activate_nwg_widgets()" ',str(i)) for i in field.as_widget(field.field.widget)]
def __init__(self, *args, **kwargs):
super(NonWgStep1, self).__init__(*args, **kwargs)
choices=[('', '--Select a list here')] + NonWgMailingList.choices()
self.fields['list_id'].choices = choices
self.fields['list_id_delete'].choices = choices
def clean_list_id(self):
if self.clean_data.get('add_edit', None) == 'edit':
if not self.clean_data.get('list_id'):
raise forms.ValidationError, 'Please pick a mailing list to modify'
return self.clean_data['list_id']
def clean_list_id_delete(self):
if self.clean_data.get('add_edit', None) == 'delete':
if not self.clean_data.get('list_id_delete'):
raise forms.ValidationError, 'Please pick a mailing list to delete'
return self.clean_data['list_id_delete']
class ListReqStep1(forms.Form):
DOMAIN_CHOICES = (
('ietf.org', 'ietf.org'),
('iab.org', 'iab.org'),
('irtf.org', 'irtf.org'),
)
mail_type = forms.ChoiceField(choices=(
('newwg', 'Create new WG email list at ietf.org'),
('movewg', 'Move existing WG email list to ietf.org'),
('closewg', 'Close existing WG email list at ietf.org'),
('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())
group = forms.ModelChoiceField(queryset=IETFWG.objects.all().filter(status=IETFWG.ACTIVE).select_related(depth=1).order_by('acronym.acronym'), required=False, empty_label="--Select Working Group")
domain_name = forms.ChoiceField(choices=DOMAIN_CHOICES, required=False, widget = forms.Select(attrs={'onChange': 'set_domain(this)'}), initial='ietf.org')
list_to_close = forms.ModelChoiceField(queryset=ImportedMailingList.objects.all(), required=False, empty_label="--Select Mailing List")
def mail_type_fields(self):
field = self['mail_type']
# 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):
super(ListReqStep1, self).__init__(*args, **kwargs)
# Base the queryset for list_to_close on the initial value
# for the domain_name field.
self.fields['list_to_close'].queryset = ImportedMailingList.choices(self.initial.get('domain_name', 'ietf.org'))
# This is necessary after changing a ModelChoiceField's
# queryset.
self.fields['list_to_close'].widget.choices = self.fields['list_to_close'].choices
def clean_group(self):
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_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
else:
if group_list_exists:
raise forms.ValidationError, 'The %s mailing list already exists.' % group
return self.clean_data['group']
def clean_list_to_close(self):
if self.clean_data.get('mail_type', '') == 'closenon':
if not self.clean_data.get('list_to_close'):
raise forms.ValidationError, 'Please pick a list to close'
return self.clean_data['list_to_close']
# multiwidget for separate scheme and rest for urls
class UrlMultiWidget(forms.MultiWidget):
def decompress(self, value):
if value:
if '//' in value:
(scheme, rest) = value.split('//', 1)
scheme += '//'
else:
scheme = 'http://'
rest = value
return [scheme, rest]
else:
return ['', '']
def __init__(self, choices=(('http://', 'http://'), ('https://', 'https://')), attrs=None):
widgets = (forms.RadioSelect(choices=choices, attrs=attrs), forms.TextInput(attrs=attrs))
super(UrlMultiWidget, self).__init__(widgets, attrs)
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)
# _0 might not exist if no radio button is selected (i.e., an
# empty form), so return 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:
try:
return data[name]
except KeyError:
return ''
class PickApprover(forms.Form):
"""
When instantiating, supply a list of person tags in approvers=
"""
approver = forms.ChoiceField(choices=(
('', '-- Pick an approver from the list below'),
))
def __init__(self, approvers, *args, **kwargs):
super(PickApprover, self).__init__(*args, **kwargs)
self.fields['approver'].choices = [('', '-- Pick an approver from the list below')] + [(person.person_or_org_tag, str(person)) for person in PersonOrOrgInfo.objects.filter(pk__in=approvers)]
class ListApprover(forms.Form):
"""
When instantiating, supply a list of AreaDirector, WGChair and/or Role
objects (or other objects with a person_id and appropriate str value).
"""
approver = forms.ChoiceField(choices=(
('', '-- Pick an approver from the list below'),
))
def __init__(self, approvers, requestor=None, *args, **kwargs):
super(ListApprover, self).__init__(*args, **kwargs)
self.fields['approver'].choices = [('', '-- Pick an approver from the list below')] + [(item.person_id, str(item)) for item in approvers]
if requestor:
self.fields['approver'].initial = requestor.person_id
self.fields['approver'].widget = forms.widgets.HiddenInput()
class DeletionPickApprover(PickApprover):
ds_name = forms.CharField(label = 'Enter your name', widget = forms.TextInput(attrs = {'size': 45}))
ds_email = forms.EmailField(label = 'Enter your email', widget = forms.TextInput(attrs = {'size': 45}))
msg_to_ad = forms.CharField(label = 'Message to the Area Director', widget = forms.Textarea(attrs = {'rows': 5, 'cols': 50}))
# A form with no required fields, to allow a preview action
class Preview(forms.Form):
#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']
class ListReqClose(forms.Form):
requestor = forms.CharField(label = "Requestor's full name", widget = forms.TextInput(attrs = {'size': 55}))
requestor_email = forms.EmailField(label = "Requestor's email address", widget = forms.TextInput(attrs = {'size': 55}))
mlist_name = forms.CharField(label = 'Mailing List Name') # will turn into just display field by template.
domain_name = forms.CharField(widget = forms.HiddenInput())
reason_to_delete = forms.CharField(label = 'Reason for closing list', widget = forms.Textarea(attrs = {'rows': 4, 'cols': 60}))
class AdminRequestor(forms.MultiWidget):
def decompress(self, value):
# This implementation moves the requestor to the listbox
# if there are any validation errors.
# If we could find the requestor, we could instead
# check the checkbox, but for now let's try this.
return ['', '', value]
def __init__(self, attrs=None):
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:])
def value_from_datadict(self, data, name):
try:
radio = data.get(name + '_0', "off")
rest = data[name + '_2']
if radio == 'on':
# This has some deep assumptions about how
# this is used.
key = name.replace('admins', 'requestor_email')
try:
ret = data[key] + "\r\n" + rest
return ret.strip()
except KeyError:
return rest
else:
return rest
except KeyError:
try:
return data[name]
except KeyError:
return ''
class MultiEmailField(forms.CharField):
'''Ensure that each of a carraige-return-separated
list of e-mail addresses is valid.'''
def clean(self, value):
value = super(MultiEmailField, self).clean(value)
bad = list()
for addr in value.split("\n"):
addr = addr.strip()
if addr != '' and not(forms.fields.email_re.search(addr)):
bad.append(addr)
if len(bad) > 0:
raise forms.ValidationError, "The following email addresses seem to be invalid: %s" % ", ".join(["'" + addr + "'" for addr in bad])
return value
class ApprovalComment(forms.Form):
add_comment = forms.CharField(label="Approver's comments to the requestor (will be emailed to the requestor)", widget=forms.Textarea(attrs={'cols':41, 'rows': 4}))