Skip to content

Commit 7122faf

Browse files
committed
Refactor questionnaire form te select position and nominee in one widget. See ietf-tools#970
- Legacy-Id: 5666
1 parent f81dd9a commit 7122faf

2 files changed

Lines changed: 49 additions & 7 deletions

File tree

ietf/nomcom/forms.py

Lines changed: 48 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from django.shortcuts import render_to_response
1212
from django.template.context import RequestContext
1313
from django.contrib.sites.models import Site
14+
from django.contrib.admin.widgets import FilteredSelectMultiple
1415

1516
from ietf.dbtemplate.forms import DBTemplateForm
1617
from ietf.utils import unaccent
@@ -43,6 +44,35 @@ def get_list(string):
4344
return map(unicode.strip, string.replace('\r\n', '').split(','))
4445

4546

47+
class PositionNomineeField(forms.ChoiceField):
48+
49+
def __init__(self, *args, **kwargs):
50+
self.nomcom = kwargs.pop('nomcom')
51+
positions = Position.objects.get_by_nomcom(self.nomcom).opened().order_by('name')
52+
results = []
53+
for position in positions:
54+
nominees = [('%s_%s' % (position.id, i.id), unicode(i)) for i in Nominee.objects.get_by_nomcom(self.nomcom).filter(nominee_position=position)]
55+
if nominees:
56+
results.append((position.name, nominees))
57+
kwargs['choices'] = results
58+
super(PositionNomineeField, self).__init__(*args, **kwargs)
59+
60+
def clean(self, value):
61+
nominee = super(PositionNomineeField, self).clean(value)
62+
if not nominee:
63+
return nominee
64+
(position_id, nominee_id) = nominee.split('_')
65+
try:
66+
position = Position.objects.get_by_nomcom(self.nomcom).opened().get(id=position_id)
67+
except Position.DoesNotExist:
68+
raise forms.ValidationError('Invalid nominee')
69+
try:
70+
nominee = position.nominee_set.get_by_nomcom(self.nomcom).get(id=nominee_id)
71+
except Nominee.DoesNotExist:
72+
raise forms.ValidationError('Invalid nominee')
73+
return (position, nominee)
74+
75+
4676
class BaseNomcomForm(object):
4777
def __unicode__(self):
4878
return self.as_div()
@@ -604,20 +634,22 @@ class Media:
604634

605635
class QuestionnaireForm(BaseNomcomForm, forms.ModelForm):
606636

607-
comments = forms.CharField(label='Comments on this candidate',
637+
comments = forms.CharField(label='Questionnaire on this candidate',
608638
widget=forms.Textarea())
609-
fieldsets = [('Provide questionnaires', ('nominees',
610-
'positions',
639+
fieldsets = [('Provide questionnaires', ('nominee',
611640
'comments'))]
612641

613642
def __init__(self, *args, **kwargs):
614643
self.nomcom = kwargs.pop('nomcom', None)
615644
self.user = kwargs.pop('user', None)
616645

617646
super(QuestionnaireForm, self).__init__(*args, **kwargs)
647+
self.fields['nominee'] = PositionNomineeField(nomcom=self.nomcom, required=True)
648+
618649

619650
def save(self, commit=True):
620651
feedback = super(QuestionnaireForm, self).save(commit=False)
652+
(position, nominee) = self.cleaned_data['nominee']
621653

622654
author = get_user_email(self.user)
623655

@@ -629,16 +661,26 @@ def save(self, commit=True):
629661
feedback.type = FeedbackType.objects.get(slug='questio')
630662
feedback.save()
631663
self.save_m2m()
664+
feedback.nominees.add(nominee)
665+
feedback.positions.add(position)
632666

633667
class Meta:
634668
model = Feedback
635-
fields = ('nominees',
669+
fields = ('nominee',
636670
'positions',
637671
'comments')
638672

639673
class Media:
640-
js = ("/js/jquery-1.5.1.min.js",
641-
"/js/nomcom.js", )
674+
admin_js = ['js/core.js',
675+
"js/jquery.js",
676+
"js/jquery.init.js",
677+
'js/admin/RelatedObjectLookups.js',
678+
"js/getElementsBySelector.js",
679+
'js/SelectBox.js',
680+
'js/SelectFilter2.js',
681+
]
682+
admin_js = ['%s%s' % (settings.ADMIN_MEDIA_PREFIX, url) for url in admin_js]
683+
js = ["/js/jquery-1.5.1.min.js", "/js/nomcom.js"] + admin_js
642684

643685

644686
class NomComTemplateForm(BaseNomcomForm, DBTemplateForm):

ietf/nomcom/models.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -89,7 +89,7 @@ class Meta:
8989
unique_together = ('email', 'nomcom')
9090

9191
def __unicode__(self):
92-
return u'%s' % self.email
92+
return u'%s' % self.email.get_name()
9393

9494

9595
class NomineePosition(models.Model):

0 commit comments

Comments
 (0)