Skip to content

Commit d9df44e

Browse files
committed
Add initial view for nominations
Chage migrate step with another state: Pending Improve admin views of nomcom app. See ietf-tools#913 - Legacy-Id: 5117
1 parent e6a49e0 commit d9df44e

6 files changed

Lines changed: 103 additions & 12 deletions

File tree

ietf/name/migrations/0007_add_nomineepositionstates.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
class Migration(DataMigration):
88

99
def forwards(self, orm):
10-
types = ['Accepted', 'Declined']
10+
types = ['Pending', 'Accepted', 'Declined']
1111
for type in types:
1212
NomineePositionState.objects.get_or_create(slug=type.lower(), name=type, used=True)
1313

ietf/nomcom/admin.py

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,23 +9,27 @@ class NomComAdmin(admin.ModelAdmin):
99

1010

1111
class NominationAdmin(admin.ModelAdmin):
12-
pass
12+
list_display = ('candidate_email', 'nominator_email', 'position')
1313

1414

1515
class NomineeAdmin(admin.ModelAdmin):
16-
pass
16+
list_display = ('email',)
1717

1818

1919
class NomineePositionAdmin(admin.ModelAdmin):
2020
pass
21+
list_display = ('nominee', 'position', 'state')
22+
list_filter = ('state',)
2123

2224

2325
class PositionAdmin(admin.ModelAdmin):
24-
pass
26+
list_display = ('name', 'nomcom', 'is_open', 'incumbent')
27+
list_filter = ('nomcom',)
2528

2629

2730
class FeedbackAdmin(admin.ModelAdmin):
28-
pass
31+
list_display = ('nominee', 'author', 'position', 'type')
32+
list_filter = ('type',)
2933

3034
admin.site.register(NomCom, NomComAdmin)
3135
admin.site.register(Nomination, NominationAdmin)

ietf/nomcom/forms.py

Lines changed: 61 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,14 @@
55
from django.core.urlresolvers import reverse
66
from django.conf import settings
77

8+
from ietf.utils import unaccent
89
from ietf.ietfauth.decorators import has_role
910
from ietf.utils import fields as custom_fields
1011
from ietf.group.models import Group, Role
11-
from ietf.name.models import RoleName
12-
from ietf.person.models import Email
13-
from ietf.nomcom.models import NomCom
12+
from ietf.name.models import RoleName, FeedbackType
13+
from ietf.person.models import Email, Person
14+
from ietf.nomcom.models import NomCom, Nomination, Nominee, NomineePosition, \
15+
Position, Feedback
1416

1517

1618
ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None)
@@ -148,3 +150,59 @@ class EditPublicKeyForm(forms.ModelForm):
148150
class Meta:
149151
model = NomCom
150152
fields = ('public_key',)
153+
154+
155+
class NominateForm(forms.ModelForm):
156+
comments = forms.CharField(label='Comments', widget=forms.Textarea())
157+
158+
def __init__(self, *args, **kwargs):
159+
self.nomcom = kwargs.pop('nomcom', None)
160+
self.user = kwargs.pop('user', None)
161+
super(NominateForm, self).__init__(*args, **kwargs)
162+
if self.nomcom:
163+
self.fields['position'].queryset = Position.objects.filter(nomcom=self.nomcom)
164+
165+
def save(self, commit=True):
166+
# Create nomination
167+
nomination = super(NominateForm, self).save(commit=False)
168+
candidate_email = self.cleaned_data['candidate_email']
169+
candidate_name = self.cleaned_data['candidate_name']
170+
position = self.cleaned_data['position']
171+
comments = self.cleaned_data['comments']
172+
173+
# Create person and email if candidate email does't exist and send email
174+
email, created = Email.objects.get_or_create(address=candidate_email)
175+
if created:
176+
email.person = Person.objects.create(name=candidate_name,
177+
ascii=unaccent.asciify(candidate_name),
178+
address=candidate_email)
179+
email.save()
180+
181+
# Add the nomination for a particular position
182+
nominee, created = Nominee.objects.get_or_create(email=email)
183+
NomineePosition.objects.get_or_create(position=position, nominee=nominee)
184+
185+
# Complete nomination data
186+
author_emails = Email.objects.filter(person__user=self.user)
187+
author = author_emails and author_emails[0] or None
188+
feedback = Feedback.objects.create(position=position,
189+
nominee=nominee,
190+
comments=comments,
191+
type=FeedbackType.objects.get(slug='nomina'))
192+
if author:
193+
feedback.author = author
194+
feedback.save()
195+
196+
nomination.nominee = nominee
197+
nomination.comments = feedback
198+
199+
if commit:
200+
nomination.save()
201+
202+
# TODO: send mail to chair and secretariat with the new person
203+
# TODO: send mails about nominations
204+
return nomination
205+
206+
class Meta:
207+
model = Nomination
208+
fields = ('position', 'candidate_name', 'candidate_email', 'candidate_phone')

ietf/nomcom/models.py

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ def save(self, *args, **kwargs):
4242
if created:
4343
initialize_templates_for_group(self)
4444

45+
4546
class Nomination(models.Model):
4647
position = models.ForeignKey('Position')
4748
candidate_name = models.CharField(verbose_name='Candidate name', max_length=255)
@@ -70,11 +71,18 @@ def __unicode__(self):
7071
return u'%s' % self.email
7172

7273

74+
def get_state_default():
75+
try:
76+
return NomineePositionState.objects.get(slug='pending').slug
77+
except NomineePositionState.DoesNotExist:
78+
return None
79+
80+
7381
class NomineePosition(models.Model):
7482

7583
position = models.ForeignKey('Position')
7684
nominee = models.ForeignKey('Nominee')
77-
state = models.ForeignKey(NomineePositionState)
85+
state = models.ForeignKey(NomineePositionState, default=get_state_default())
7886
questionnaire = models.ForeignKey('Feedback',
7987
related_name='questionnaire',
8088
blank=True, null=True)
@@ -121,7 +129,7 @@ def save(self, *args, **kwargs):
121129

122130

123131
class Feedback(models.Model):
124-
author = models.EmailField(verbose_name='Author')
132+
author = models.EmailField(verbose_name='Author', blank=True)
125133
position = models.ForeignKey('Position')
126134
nominee = models.ForeignKey('Nominee')
127135
comments = EncriptedTextField(verbose_name='Comments')
@@ -134,4 +142,3 @@ def __unicode__(self):
134142
# ----- adding south rules to help introspection -----
135143

136144
add_introspection_rules([], ["^ietf\.nomcom\.fields\.EncriptedTextField"])
137-

ietf/nomcom/urls.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
url(r'^(?P<year>\d{4})/edit-chair/$', EditChairFormPreview(EditChairForm), name='edit_chair'),
77
url(r'^(?P<year>\d{4})/edit-members/$', EditMembersFormPreview(EditMembersForm), name='edit_members'),
88
url(r'^(?P<year>\d{4})/edit-publickey/$', 'edit_publickey', name='edit_publickey'),
9+
url(r'^(?P<year>\d{4})/nominate/$', 'nominate', name='nominate'),
910
)

ietf/nomcom/views.py

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
11
from django.shortcuts import get_object_or_404, render_to_response
22
from django.template import RequestContext
33
from django.http import HttpResponseForbidden
4+
from django.contrib.auth.decorators import login_required
45

5-
from ietf.nomcom.forms import EditPublicKeyForm
6+
from ietf.nomcom.forms import EditPublicKeyForm, NominateForm
67
from ietf.nomcom.models import NomCom
78

89

10+
@login_required
911
def edit_publickey(request, year):
1012
nomcom = get_object_or_404(NomCom,
1113
group__acronym__icontains=year,
@@ -30,3 +32,22 @@ def edit_publickey(request, year):
3032
{'form': form,
3133
'group': nomcom.group,
3234
'message': message}, RequestContext(request))
35+
36+
37+
@login_required
38+
def nominate(request, year):
39+
nomcom = get_object_or_404(NomCom,
40+
group__acronym__icontains=year,
41+
group__state__slug='active')
42+
message = None
43+
if request.method == 'POST':
44+
form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user)
45+
if form.is_valid():
46+
form.save()
47+
message = ('success', 'The nomination has been successfully done')
48+
else:
49+
form = NominateForm(nomcom=nomcom, user=request.user)
50+
51+
return render_to_response('nomcom/nominate.html',
52+
{'form': form,
53+
'message': message}, RequestContext(request))

0 commit comments

Comments
 (0)