Skip to content

Commit 7b36280

Browse files
committed
Rename EmailsField to AutocompletedEmailsField and add a singular
AutocompletedEmailField that cleans to a single Email to make it easier to use with ModelForms - Legacy-Id: 8280
1 parent 5703dc3 commit 7b36280

6 files changed

Lines changed: 28 additions & 20 deletions

File tree

ietf/doc/views_draft.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
from ietf.ietfauth.utils import role_required
3030
from ietf.message.models import Message
3131
from ietf.name.models import IntendedStdLevelName, DocTagName, StreamName
32-
from ietf.person.fields import EmailsField
32+
from ietf.person.fields import AutocompletedEmailField
3333
from ietf.person.models import Person, Email
3434
from ietf.secr.lib.template import jsonapi
3535
from ietf.utils.mail import send_mail, send_mail_message
@@ -1043,7 +1043,7 @@ def edit_shepherd_writeup(request, name):
10431043
context_instance=RequestContext(request))
10441044

10451045
class ShepherdForm(forms.Form):
1046-
shepherd = EmailsField(label="Shepherd", required=False, max_entries=1)
1046+
shepherd = AutocompletedEmailField(required=False)
10471047

10481048
def edit_shepherd(request, name):
10491049
"""Change the shepherd for a Document"""
@@ -1060,7 +1060,7 @@ def edit_shepherd(request, name):
10601060
if form.is_valid():
10611061
save_document_in_history(doc)
10621062

1063-
doc.shepherd = form.cleaned_data['shepherd'].first()
1063+
doc.shepherd = form.cleaned_data['shepherd']
10641064
doc.save()
10651065

10661066
login = request.user.person

ietf/group/edit.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@
1919
from ietf.group.utils import save_group_in_history, can_manage_group_type
2020
from ietf.group.utils import get_group_or_404
2121
from ietf.ietfauth.utils import has_role
22-
from ietf.person.fields import EmailsField
22+
from ietf.person.fields import AutocompletedEmailsField
2323
from ietf.person.models import Person, Email
2424
from ietf.group.mails import email_iesg_secretary_re_charter
2525

@@ -29,10 +29,10 @@ class GroupForm(forms.Form):
2929
name = forms.CharField(max_length=255, label="Name", required=True)
3030
acronym = forms.CharField(max_length=10, label="Acronym", required=True)
3131
state = forms.ModelChoiceField(GroupStateName.objects.all(), label="State", required=True)
32-
chairs = EmailsField(label="Chairs", required=False)
33-
secretaries = EmailsField(label="Secretaries", required=False)
34-
techadv = EmailsField(label="Technical Advisors", required=False)
35-
delegates = EmailsField(label="Delegates", required=False, help_text=mark_safe("Chairs can delegate the authority to update the state of group documents - max %s persons at a given time" % MAX_GROUP_DELEGATES), max_entries=MAX_GROUP_DELEGATES)
32+
chairs = AutocompletedEmailsField(label="Chairs", required=False)
33+
secretaries = AutocompletedEmailsField(label="Secretaries", required=False)
34+
techadv = AutocompletedEmailsField(label="Technical Advisors", required=False)
35+
delegates = AutocompletedEmailsField(label="Delegates", required=False, help_text=mark_safe("Chairs can delegate the authority to update the state of group documents - max %s persons at a given time" % MAX_GROUP_DELEGATES), max_entries=MAX_GROUP_DELEGATES)
3636
ad = forms.ModelChoiceField(Person.objects.filter(role__name="ad", role__group__state="active").order_by('name'), label="Shepherding AD", empty_label="(None)", required=False)
3737
parent = forms.ModelChoiceField(Group.objects.filter(state="active").order_by('name'), empty_label="(None)", required=False)
3838
list_email = forms.CharField(max_length=64, required=False)

ietf/group/views_stream.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from ietf.group.utils import save_group_in_history
1111
from ietf.ietfauth.utils import has_role
1212
from ietf.name.models import StreamName
13-
from ietf.person.fields import EmailsField
13+
from ietf.person.fields import AutocompletedEmailsField
1414
from ietf.person.models import Email
1515

1616
import debug # pyflakes:ignore
@@ -31,7 +31,7 @@ def stream_documents(request, acronym):
3131
return render_to_response('group/stream_documents.html', {'stream':stream, 'docs':docs, 'meta':meta }, context_instance=RequestContext(request))
3232

3333
class StreamEditForm(forms.Form):
34-
delegates = EmailsField(label="Delegates", required=False)
34+
delegates = AutocompletedEmailsField(label="Delegates", required=False)
3535

3636
def stream_edit(request, acronym):
3737
group = get_object_or_404(Group, acronym=acronym)

ietf/person/fields.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ def json_emails(emails):
1313
emails = Email.objects.filter(address__in=[x.strip() for x in emails.split(",") if x.strip()]).select_related("person")
1414
return json.dumps([{"id": e.address + "", "name": escape(u"%s <%s>" % (e.person.name, e.address))} for e in emails])
1515

16-
class EmailsField(forms.CharField):
16+
class AutocompletedEmailsField(forms.CharField):
1717
"""Multi-select field using jquery.tokeninput.js. Since the API of
1818
tokeninput" is asymmetric, we have to pass it a JSON
1919
representation on the way out and parse the ids coming back as a
@@ -25,7 +25,7 @@ def __init__(self, max_entries=None, hint_text="Type in name or email to search
2525
self.max_entries = max_entries
2626
self.only_users = only_users
2727

28-
super(EmailsField, self).__init__(*args, **kwargs)
28+
super(AutocompletedEmailsField, self).__init__(*args, **kwargs)
2929

3030
self.widget.attrs["class"] = "tokenized-field"
3131
self.widget.attrs["data-hint-text"] = hint_text
@@ -41,6 +41,8 @@ def prepare_value(self, value):
4141
if isinstance(value, basestring):
4242
addresses = self.parse_tokenized_value(value)
4343
value = Email.objects.filter(address__in=addresses).select_related("person")
44+
if isinstance(value, Email):
45+
value = [value]
4446

4547
self.widget.attrs["data-pre"] = json_emails(value)
4648
# doing this in the constructor is difficult because the URL
@@ -52,7 +54,7 @@ def prepare_value(self, value):
5254
return ",".join(e.address for e in value)
5355

5456
def clean(self, value):
55-
value = super(EmailsField, self).clean(value)
57+
value = super(AutocompletedEmailsField, self).clean(value)
5658
addresses = self.parse_tokenized_value(value)
5759

5860
emails = Email.objects.filter(address__in=addresses).exclude(person=None).select_related("person")
@@ -70,3 +72,12 @@ def clean(self, value):
7072

7173
return emails
7274

75+
class AutocompletedEmailField(AutocompletedEmailsField):
76+
"""Version of AutocompletedEmailsField specialized to a single Email."""
77+
78+
def __init__(self, *args, **kwargs):
79+
kwargs["max_entries"] = 1
80+
super(AutocompletedEmailField, self).__init__(*args, **kwargs)
81+
82+
def clean(self, value):
83+
return super(AutocompletedEmailField, self).clean(value).first()

ietf/secr/drafts/forms.py

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from ietf.name.models import IntendedStdLevelName, DocRelationshipName
99
from ietf.group.models import Group
1010
from ietf.person.models import Person, Email
11-
from ietf.person.fields import EmailsField
11+
from ietf.person.fields import AutocompletedEmailField
1212
from ietf.secr.groups.forms import get_person
1313

1414

@@ -132,7 +132,7 @@ class EditModelForm(forms.ModelForm):
132132
iesg_state = forms.ModelChoiceField(queryset=State.objects.filter(type='draft-iesg'),required=False)
133133
group = GroupModelChoiceField(required=True)
134134
review_by_rfc_editor = forms.BooleanField(required=False)
135-
shepherd = EmailsField(required=False, max_entries=1)
135+
shepherd = AutocompletedEmailField(required=False)
136136

137137
class Meta:
138138
model = Document
@@ -190,9 +190,6 @@ def clean_replaced_by(self):
190190
raise forms.ValidationError("ERROR: Draft does not exist")
191191
return name
192192

193-
def clean_shepherd(self):
194-
return self.cleaned_data["shepherd"].first()
195-
196193
def clean(self):
197194
super(EditModelForm, self).clean()
198195
cleaned_data = self.cleaned_data

ietf/secr/sreq/forms.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
from ietf.group.models import Group
44
from ietf.meeting.models import ResourceAssociation
5-
from ietf.person.fields import EmailsField
5+
from ietf.person.fields import AutocompletedEmailsField
66

77

88
# -------------------------------------------------
@@ -67,7 +67,7 @@ class SessionForm(forms.Form):
6767
wg_selector3 = forms.ChoiceField(choices=WG_CHOICES,required=False)
6868
third_session = forms.BooleanField(required=False)
6969
resources = forms.MultipleChoiceField(choices=[(x.pk,x.desc) for x in ResourceAssociation.objects.all()], widget=forms.CheckboxSelectMultiple,required=False)
70-
bethere = EmailsField(label="Must be present", required=False)
70+
bethere = AutocompletedEmailsField(label="Must be present", required=False)
7171

7272
def __init__(self, *args, **kwargs):
7373
super(SessionForm, self).__init__(*args, **kwargs)

0 commit comments

Comments
 (0)