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:
parent
e6a49e03b9
commit
d9df44e2b1
|
@ -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)
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
|
|
@ -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"])
|
||||
|
||||
|
|
|
@ -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'),
|
||||
)
|
||||
|
|
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue