diff --git a/ietf/nomcom/forms.py b/ietf/nomcom/forms.py index 1d7f42c61..730f392ca 100644 --- a/ietf/nomcom/forms.py +++ b/ietf/nomcom/forms.py @@ -17,7 +17,7 @@ from ietf.nomcom.utils import (NOMINATION_RECEIPT_TEMPLATE, FEEDBACK_RECEIPT_TEM get_user_email, validate_private_key, validate_public_key, get_or_create_nominee, create_feedback_email) from ietf.person.models import Email -from ietf.utils import fields as custom_fields +from ietf.utils.fields import MultiEmailField from ietf.utils.mail import send_mail @@ -31,10 +31,6 @@ def get_nomcom_group_or_404(year): nomcom__isnull=False) -def get_list(string): - return map(unicode.strip, string.replace('\r\n', '').split(',')) - - class PositionNomineeField(forms.ChoiceField): def __init__(self, *args, **kwargs): @@ -109,7 +105,7 @@ class BaseNomcomForm(object): class EditMembersForm(BaseNomcomForm, forms.Form): - members = custom_fields.MultiEmailField(label="Members email", required=False) + members = MultiEmailField(label="Members email", required=False, widget=forms.Textarea) fieldsets = [('Members', ('members',))] @@ -133,7 +129,7 @@ class EditMembersFormPreview(FormPreview): def preview_get(self, request): "Displays the form" - f = self.form(auto_id=AUTO_ID) + f = self.form(auto_id=self.get_auto_id(), initial=self.get_initial(request)) return render_to_response(self.form_template, {'form': f, 'stage_field': self.unused_name('stage'), @@ -143,14 +139,14 @@ class EditMembersFormPreview(FormPreview): 'selected': 'edit_members'}, context_instance=RequestContext(request)) - def parse_params(self, *args, **kwargs): + def get_initial(self, request): members = self.group.role_set.filter(name__slug='member') - if members: - self.form.base_fields['members'].initial = ',\r\n'.join([role.email.address for role in members]) + return { "members": ",\r\n".join(role.email.address for role in members) } + return {} def process_preview(self, request, form, context): - members_email = get_list(form.cleaned_data['members']) + members_email = form.cleaned_data['members'] members_info = [] emails_not_found = [] @@ -233,10 +229,11 @@ class EditChairFormPreview(FormPreview): return super(EditChairFormPreview, self).__call__(request, *args, **kwargs) - def parse_params(self, *args, **kwargs): + def get_initial(self, request): chair = self.group.get_chair() if chair: - self.form.base_fields['chair'].initial = chair.email.address + return { "chair": chair.email.address } + return {} def process_preview(self, request, form, context): chair_email = form.cleaned_data['chair'] @@ -297,8 +294,8 @@ class EditNomcomForm(BaseNomcomForm, forms.ModelForm): class MergeForm(BaseNomcomForm, forms.Form): - secondary_emails = custom_fields.MultiEmailField(label="Secondary email addresses", - help_text="Provide a comma separated list of email addresses. Nominations already received with any of these email address will be moved to show under the primary address") + secondary_emails = MultiEmailField(label="Secondary email addresses", + help_text="Provide a comma separated list of email addresses. Nominations already received with any of these email address will be moved to show under the primary address", widget=forms.Textarea) primary_email = forms.EmailField(label="Primary email address", widget=forms.TextInput(attrs={'size': '40'})) @@ -312,22 +309,21 @@ class MergeForm(BaseNomcomForm, forms.Form): email = self.cleaned_data['primary_email'] nominees = Nominee.objects.get_by_nomcom(self.nomcom).not_duplicated().filter(email__address=email) if not nominees: - msg = "Does not exist a nomiee with this email" + msg = "No nominee with this email exists" self._errors["primary_email"] = self.error_class([msg]) return email def clean_secondary_emails(self): - data = self.cleaned_data['secondary_emails'] - emails = get_list(data) + emails = self.cleaned_data['secondary_emails'] for email in emails: nominees = Nominee.objects.get_by_nomcom(self.nomcom).not_duplicated().filter(email__address=email) if not nominees: - msg = "Does not exist a nomiee with email %s" % email + msg = "No nominee with email %s exists" % email self._errors["primary_email"] = self.error_class([msg]) break - return data + return emails def clean(self): primary_email = self.cleaned_data.get("primary_email") @@ -340,7 +336,7 @@ class MergeForm(BaseNomcomForm, forms.Form): def save(self): primary_email = self.cleaned_data.get("primary_email") - secondary_emails = get_list(self.cleaned_data.get("secondary_emails")) + secondary_emails = self.cleaned_data.get("secondary_emails") primary_nominee = Nominee.objects.get_by_nomcom(self.nomcom).get(email__address=primary_email) while primary_nominee.duplicated: diff --git a/ietf/secr/announcement/forms.py b/ietf/secr/announcement/forms.py index 95c499efb..29c49c08c 100644 --- a/ietf/secr/announcement/forms.py +++ b/ietf/secr/announcement/forms.py @@ -1,10 +1,10 @@ from django import forms -from django.core.validators import validate_email from ietf.group.models import Group, Role from ietf.ietfauth.utils import has_role from ietf.message.models import Message from ietf.secr.utils.group import current_nomcom +from ietf.utils.fields import MultiEmailField # --------------------------------------------- # Globals @@ -42,33 +42,6 @@ TO_LIST = ('IETF Announcement List ', 'Working Group Chairs ', 'BoF Chairs ', 'Other...') -# --------------------------------------------- -# Custom Fields -# --------------------------------------------- - -class MultiEmailField(forms.Field): - def to_python(self, value): - "Normalize data to a list of strings." - - # Return an empty list if no input was given. - if not value: - return [] - - import types - if isinstance(value, types.StringTypes): - values = value.split(',') - return [ x.strip() for x in values ] - else: - return value - - def validate(self, value): - "Check if value consists only of valid emails." - - # Use the parent's handling of required fields, etc. - super(MultiEmailField, self).validate(value) - - for email in value: - validate_email(email) # --------------------------------------------- # Helper Functions diff --git a/ietf/utils/fields.py b/ietf/utils/fields.py index 9508bd31e..e5c0dfeb2 100644 --- a/ietf/utils/fields.py +++ b/ietf/utils/fields.py @@ -1,23 +1,25 @@ from django import forms -from django.core.validators import validate_email, ValidationError +from django.core.validators import validate_email +class MultiEmailField(forms.Field): + def to_python(self, value): + "Normalize data to a list of strings." -class MultiEmailField(forms.CharField): - widget = forms.widgets.Textarea - - def clean(self, value): - super(MultiEmailField, self).clean(value) + # Return an empty list if no input was given. if not value: + return [] + + if isinstance(value, basestring): + values = value.split(',') + return [ x.strip() for x in values if x.strip() ] + else: return value - if value.endswith(','): - value = value[:-1] - emails = [v.strip() for v in value.split(',') if v.strip()] + def validate(self, value): + "Check if value consists only of valid emails." - for email in emails: - try: - validate_email(email) - except ValidationError: - raise ValidationError("This is not a valid comma separated email list.") + # Use the parent's handling of required fields, etc. + super(MultiEmailField, self).validate(value) - return value + for email in value: + validate_email(email)