Add initial view for nominations

Chage migrate step with another state: Pending
Improve admin views of nomcom app.
See #913
 - Legacy-Id: 5117
This commit is contained in:
Emilio Jiménez 2012-12-11 15:13:06 +00:00
parent e6a49e03b9
commit d9df44e2b1
6 changed files with 103 additions and 12 deletions

View file

@ -7,7 +7,7 @@ from name.models import NomineePositionState
class Migration(DataMigration):
def forwards(self, orm):
types = ['Accepted', 'Declined']
types = ['Pending', 'Accepted', 'Declined']
for type in types:
NomineePositionState.objects.get_or_create(slug=type.lower(), name=type, used=True)

View file

@ -9,23 +9,27 @@ class NomComAdmin(admin.ModelAdmin):
class NominationAdmin(admin.ModelAdmin):
pass
list_display = ('candidate_email', 'nominator_email', 'position')
class NomineeAdmin(admin.ModelAdmin):
pass
list_display = ('email',)
class NomineePositionAdmin(admin.ModelAdmin):
pass
list_display = ('nominee', 'position', 'state')
list_filter = ('state',)
class PositionAdmin(admin.ModelAdmin):
pass
list_display = ('name', 'nomcom', 'is_open', 'incumbent')
list_filter = ('nomcom',)
class FeedbackAdmin(admin.ModelAdmin):
pass
list_display = ('nominee', 'author', 'position', 'type')
list_filter = ('type',)
admin.site.register(NomCom, NomComAdmin)
admin.site.register(Nomination, NominationAdmin)

View file

@ -5,12 +5,14 @@ from django.shortcuts import get_object_or_404
from django.core.urlresolvers import reverse
from django.conf import settings
from ietf.utils import unaccent
from ietf.ietfauth.decorators import has_role
from ietf.utils import fields as custom_fields
from ietf.group.models import Group, Role
from ietf.name.models import RoleName
from ietf.person.models import Email
from ietf.nomcom.models import NomCom
from ietf.name.models import RoleName, FeedbackType
from ietf.person.models import Email, Person
from ietf.nomcom.models import NomCom, Nomination, Nominee, NomineePosition, \
Position, Feedback
ROLODEX_URL = getattr(settings, 'ROLODEX_URL', None)
@ -148,3 +150,59 @@ class EditPublicKeyForm(forms.ModelForm):
class Meta:
model = NomCom
fields = ('public_key',)
class NominateForm(forms.ModelForm):
comments = forms.CharField(label='Comments', widget=forms.Textarea())
def __init__(self, *args, **kwargs):
self.nomcom = kwargs.pop('nomcom', None)
self.user = kwargs.pop('user', None)
super(NominateForm, self).__init__(*args, **kwargs)
if self.nomcom:
self.fields['position'].queryset = Position.objects.filter(nomcom=self.nomcom)
def save(self, commit=True):
# Create nomination
nomination = super(NominateForm, self).save(commit=False)
candidate_email = self.cleaned_data['candidate_email']
candidate_name = self.cleaned_data['candidate_name']
position = self.cleaned_data['position']
comments = self.cleaned_data['comments']
# Create person and email if candidate email does't exist and send email
email, created = Email.objects.get_or_create(address=candidate_email)
if created:
email.person = Person.objects.create(name=candidate_name,
ascii=unaccent.asciify(candidate_name),
address=candidate_email)
email.save()
# Add the nomination for a particular position
nominee, created = Nominee.objects.get_or_create(email=email)
NomineePosition.objects.get_or_create(position=position, nominee=nominee)
# Complete nomination data
author_emails = Email.objects.filter(person__user=self.user)
author = author_emails and author_emails[0] or None
feedback = Feedback.objects.create(position=position,
nominee=nominee,
comments=comments,
type=FeedbackType.objects.get(slug='nomina'))
if author:
feedback.author = author
feedback.save()
nomination.nominee = nominee
nomination.comments = feedback
if commit:
nomination.save()
# TODO: send mail to chair and secretariat with the new person
# TODO: send mails about nominations
return nomination
class Meta:
model = Nomination
fields = ('position', 'candidate_name', 'candidate_email', 'candidate_phone')

View file

@ -42,6 +42,7 @@ class NomCom(models.Model):
if created:
initialize_templates_for_group(self)
class Nomination(models.Model):
position = models.ForeignKey('Position')
candidate_name = models.CharField(verbose_name='Candidate name', max_length=255)
@ -70,11 +71,18 @@ class Nominee(models.Model):
return u'%s' % self.email
def get_state_default():
try:
return NomineePositionState.objects.get(slug='pending').slug
except NomineePositionState.DoesNotExist:
return None
class NomineePosition(models.Model):
position = models.ForeignKey('Position')
nominee = models.ForeignKey('Nominee')
state = models.ForeignKey(NomineePositionState)
state = models.ForeignKey(NomineePositionState, default=get_state_default())
questionnaire = models.ForeignKey('Feedback',
related_name='questionnaire',
blank=True, null=True)
@ -121,7 +129,7 @@ class Position(models.Model):
class Feedback(models.Model):
author = models.EmailField(verbose_name='Author')
author = models.EmailField(verbose_name='Author', blank=True)
position = models.ForeignKey('Position')
nominee = models.ForeignKey('Nominee')
comments = EncriptedTextField(verbose_name='Comments')
@ -134,4 +142,3 @@ class Feedback(models.Model):
# ----- adding south rules to help introspection -----
add_introspection_rules([], ["^ietf\.nomcom\.fields\.EncriptedTextField"])

View file

@ -6,4 +6,5 @@ urlpatterns = patterns('ietf.nomcom.views',
url(r'^(?P<year>\d{4})/edit-chair/$', EditChairFormPreview(EditChairForm), name='edit_chair'),
url(r'^(?P<year>\d{4})/edit-members/$', EditMembersFormPreview(EditMembersForm), name='edit_members'),
url(r'^(?P<year>\d{4})/edit-publickey/$', 'edit_publickey', name='edit_publickey'),
url(r'^(?P<year>\d{4})/nominate/$', 'nominate', name='nominate'),
)

View file

@ -1,11 +1,13 @@
from django.shortcuts import get_object_or_404, render_to_response
from django.template import RequestContext
from django.http import HttpResponseForbidden
from django.contrib.auth.decorators import login_required
from ietf.nomcom.forms import EditPublicKeyForm
from ietf.nomcom.forms import EditPublicKeyForm, NominateForm
from ietf.nomcom.models import NomCom
@login_required
def edit_publickey(request, year):
nomcom = get_object_or_404(NomCom,
group__acronym__icontains=year,
@ -30,3 +32,22 @@ def edit_publickey(request, year):
{'form': form,
'group': nomcom.group,
'message': message}, RequestContext(request))
@login_required
def nominate(request, year):
nomcom = get_object_or_404(NomCom,
group__acronym__icontains=year,
group__state__slug='active')
message = None
if request.method == 'POST':
form = NominateForm(data=request.POST, nomcom=nomcom, user=request.user)
if form.is_valid():
form.save()
message = ('success', 'The nomination has been successfully done')
else:
form = NominateForm(nomcom=nomcom, user=request.user)
return render_to_response('nomcom/nominate.html',
{'form': form,
'message': message}, RequestContext(request))