datatracker/ietf/nomcom/models.py
Emilio A. Sánchez López 20320ea9ff Views for manage nomcom positions
Views for edit templates related to nomcom group and nomcom positions
Refactored some strings in html templates
Allow the secretariat to access the same views and view the same links as the chair
Fixes #914
 - Legacy-Id: 5334
2013-01-30 08:26:15 +00:00

152 lines
5.6 KiB
Python

import os
from django.db import models
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from south.modelsinspector import add_introspection_rules
from ietf.nomcom.fields import EncryptedTextField
from ietf.person.models import Email
from ietf.group.models import Group
from ietf.name.models import NomineePositionState, FeedbackType
from ietf.dbtemplate.models import DBTemplate
from ietf.nomcom.utils import (initialize_templates_for_group,
initialize_questionnaire_for_position,
initialize_requirements_for_position)
def upload_path_handler(instance, filename):
return os.path.join(instance.group.acronym, 'public.cert')
class NomCom(models.Model):
public_key = models.FileField(storage=FileSystemStorage(location=settings.PUBLIC_KEYS_URL),
upload_to=upload_path_handler, blank=True, null=True)
group = models.ForeignKey(Group)
send_questionnaire = models.BooleanField(verbose_name='Send automatically questionnaires"',
help_text='If you check this box, questionnaires are sent automatically after nominations')
class Meta:
verbose_name_plural = 'NomComs'
verbose_name = 'NomCom'
def __unicode__(self):
return self.group.acronym
def save(self, *args, **kwargs):
created = not self.id
super(NomCom, self).save(*args, **kwargs)
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)
candidate_email = models.EmailField(verbose_name='Candidate email', max_length=255)
candidate_phone = models.CharField(verbose_name='Candidate phone', blank=True, max_length=255)
nominee = models.ForeignKey('Nominee')
comments = models.ForeignKey('Feedback')
nominator_email = models.EmailField(verbose_name='Nominator Email', blank=True)
class Meta:
verbose_name_plural = 'Nominations'
def __unicode__(self):
return u"%s (%s)" % (self.candidate_name, self.candidate_email)
class Nominee(models.Model):
email = models.ForeignKey(Email)
nominee_position = models.ManyToManyField('Position', through='NomineePosition')
duplicated = models.ForeignKey('Nominee', blank=True, null=True)
class Meta:
verbose_name_plural = 'Nominees'
def __unicode__(self):
return u'%s' % self.email
class NomineePosition(models.Model):
position = models.ForeignKey('Position')
nominee = models.ForeignKey('Nominee')
state = models.ForeignKey(NomineePositionState)
questionnaires = models.ManyToManyField('Feedback',
related_name='questionnaires',
blank=True, null=True)
feedback = models.ManyToManyField('Feedback', blank=True, null=True)
time = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = 'Nominee position'
verbose_name_plural = 'Nominee positions'
unique_together = ('position', 'nominee')
def save(self, **kwargs):
if not self.pk and not self.state_id:
self.state = NomineePositionState.objects.get(slug='pending')
super(NomineePosition, self).save(**kwargs)
def __unicode__(self):
return u"%s - %s" % (self.nominee, self.position)
class Position(models.Model):
nomcom = models.ForeignKey('NomCom')
name = models.CharField(verbose_name='Name', max_length=255)
description = models.TextField(verbose_name='Description')
initial_text = models.TextField(verbose_name='Initial text for nominations',
blank=True)
requirement = models.ForeignKey(DBTemplate, related_name='requirement', null=True, editable=False)
questionnaire = models.ForeignKey(DBTemplate, related_name='questionnaire', null=True, editable=False)
is_open = models.BooleanField(verbose_name='Is open')
incumbent = models.ForeignKey(Email)
class Meta:
verbose_name_plural = 'Positions'
def __unicode__(self):
return u"%s: %s" % (self.nomcom, self.name)
def save(self, *args, **kwargs):
created = not self.id
super(Position, self).save(*args, **kwargs)
changed = False
if created and self.id and not self.requirement_id:
self.requirement = initialize_requirements_for_position(self)
changed = True
if created and self.id and not self.questionnaire_id:
self.questionnaire = initialize_questionnaire_for_position(self)
changed = True
if changed:
self.save()
def get_templates(self):
if hasattr(self, '_templates'):
return self._templates
from ietf.dbtemplate.models import DBTemplate
self._templates = DBTemplate.objects.filter(group=self.nomcom.group).filter(path__contains='/%s/position/' % self.id).order_by('title')
return self._templates
class Feedback(models.Model):
author = models.EmailField(verbose_name='Author', blank=True)
position = models.ForeignKey('Position')
nominee = models.ForeignKey('Nominee')
comments = EncryptedTextField(verbose_name='Comments')
type = models.ForeignKey(FeedbackType)
time = models.DateTimeField(auto_now_add=True)
def __unicode__(self):
return u"%s - %s" % (self.author, self.nominee)
# ----- adding south rules to help introspection -----
add_introspection_rules([], ["^ietf\.nomcom\.fields\.EncryptedTextField"])