datatracker/ietf/nomcom/models.py
Emilio Jiménez 4fec10183d Feedback refactor:
* Now Feedback have manytomany to posotions, so a feedback email can be associated to few positions.
 * Add user and time field to nomination model
 * Delete feedbacks and questionnaires field from nomineeposition model, now feedback model has all information about nominations, feedback and quiestionnaires
 * Add user field to Feedback model to know the nomcom meber who made the nomination, regardless of the real author
 * Add nomcom field to Feedback and refactor EncryptedTextField, it's necessary to encrypt the comments with the nomcom public key.
 * Template tag to decrypt feedback has been improved, now It isn't necessary the view context has the private key variable.
 * Add skel view to view feedback
 * Delete hidden fields from private and public feedback form
 * Refactor private index view to show total number of questionnaires and to show if the nomienee has questionnaires or not
See #970
 - Legacy-Id: 5571
2013-03-15 10:05:28 +00:00

167 lines
6 KiB
Python

import os
from django.db import models
from django.conf import settings
from django.core.files.storage import FileSystemStorage
from django.contrib.auth.models import User
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.managers import NomineePositionManager, NomineeManager, PositionManager
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)
user = models.ForeignKey(User)
time = models.DateTimeField(auto_now_add=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)
objects = NomineeManager()
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)
time = models.DateTimeField(auto_now_add=True)
objects = NomineePositionManager()
class Meta:
verbose_name = 'Nominee position'
verbose_name_plural = 'Nominee positions'
unique_together = ('position', 'nominee')
ordering = ['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)
@property
def questionnaires(self):
return Feedback.objects.filter(type='questio',
positions=self.position,
nominee=self.nominee)
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)
objects = PositionManager()
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):
nomcom = models.ForeignKey('NomCom')
author = models.EmailField(verbose_name='Author', blank=True)
positions = models.ManyToManyField('Position', blank=True, null=True)
nominee = models.ForeignKey('Nominee')
comments = EncryptedTextField(verbose_name='Comments')
type = models.ForeignKey(FeedbackType)
user = models.ForeignKey(User, blank=True, null=True)
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"])