Integrate Secretariat tools MultiEmailField with the one in

utils/fields.py, also fix a couple of issues in NomCom tool (spelling
bugs and avoid overwriting base_fields on forms with dynamic data)
 - Legacy-Id: 8276
This commit is contained in:
Ole Laursen 2014-08-17 14:39:23 +00:00
parent 92e4763d9f
commit f7ac066059
3 changed files with 35 additions and 64 deletions

View file

@ -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:

View file

@ -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 <ietf-announce@ietf.org>',
'Working Group Chairs <wgchairs@ietf.org>',
'BoF Chairs <bofchairs@ietf.org>',
'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

View file

@ -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)