diff --git a/ietf/nomcom/forms.py b/ietf/nomcom/forms.py index f16d0d51b..061d7a4c3 100644 --- a/ietf/nomcom/forms.py +++ b/ietf/nomcom/forms.py @@ -345,7 +345,7 @@ class NominateForm(BaseNomcomForm, forms.ModelForm): email.save() # Add the nomination for a particular position - nominee, created = Nominee.objects.get_or_create(email=email) + nominee, created = Nominee.objects.get_or_create(email=email, nomcom=self.nomcom) nominee_position, nominee_position_created = NomineePosition.objects.get_or_create(position=position, nominee=nominee) # Complete nomination data diff --git a/ietf/nomcom/managers.py b/ietf/nomcom/managers.py index b9d3be07c..850571b88 100644 --- a/ietf/nomcom/managers.py +++ b/ietf/nomcom/managers.py @@ -38,7 +38,7 @@ class NomineePositionManager(models.Manager, MixinManager): class NomineeManager(models.Manager): def get_by_nomcom(self, nomcom): - return self.filter(nominee_position__nomcom=nomcom) + return self.filter(nomcom=nomcom) class PositionQuerySet(QuerySet): diff --git a/ietf/nomcom/migrations/0001_initial.py b/ietf/nomcom/migrations/0001_initial.py index e25e3543d..d9f94c888 100644 --- a/ietf/nomcom/migrations/0001_initial.py +++ b/ietf/nomcom/migrations/0001_initial.py @@ -37,9 +37,13 @@ class Migration(SchemaMigration): ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('email', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['person.Email'])), ('duplicated', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['nomcom.Nominee'], null=True, blank=True)), + ('nomcom', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['nomcom.NomCom'])), )) db.send_create_signal('nomcom', ['Nominee']) + # Adding unique constraint on 'Nominee', fields ['email', 'nomcom'] + db.create_unique('nomcom_nominee', ['email_id', 'nomcom_id']) + # Adding model 'NomineePosition' db.create_table('nomcom_nomineeposition', ( ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), @@ -94,6 +98,9 @@ class Migration(SchemaMigration): # Removing unique constraint on 'NomineePosition', fields ['position', 'nominee'] db.delete_unique('nomcom_nomineeposition', ['position_id', 'nominee_id']) + # Removing unique constraint on 'Nominee', fields ['email', 'nomcom'] + db.delete_unique('nomcom_nominee', ['email_id', 'nomcom_id']) + # Deleting model 'NomCom' db.delete_table('nomcom_nomcom') @@ -364,10 +371,11 @@ class Migration(SchemaMigration): 'user': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['auth.User']"}) }, 'nomcom.nominee': { - 'Meta': {'object_name': 'Nominee'}, + 'Meta': {'unique_together': "(('email', 'nomcom'),)", 'object_name': 'Nominee'}, 'duplicated': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['nomcom.Nominee']", 'null': 'True', 'blank': 'True'}), 'email': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['person.Email']"}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), + 'nomcom': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['nomcom.NomCom']"}), 'nominee_position': ('django.db.models.fields.related.ManyToManyField', [], {'to': "orm['nomcom.Position']", 'through': "orm['nomcom.NomineePosition']", 'symmetrical': 'False'}) }, 'nomcom.nomineeposition': { diff --git a/ietf/nomcom/models.py b/ietf/nomcom/models.py index 97bf56f0d..249f3e2bb 100644 --- a/ietf/nomcom/models.py +++ b/ietf/nomcom/models.py @@ -1,6 +1,8 @@ +# -*- coding: utf-8 -*- import os from django.db import models +from django.db.models.signals import post_delete from django.conf import settings from django.core.files.storage import FileSystemStorage from django.contrib.auth.models import User @@ -17,7 +19,8 @@ from ietf.nomcom.managers import NomineePositionManager, NomineeManager, \ PositionManager, FeedbackManager from ietf.nomcom.utils import (initialize_templates_for_group, initialize_questionnaire_for_position, - initialize_requirements_for_position) + initialize_requirements_for_position, + delete_nomcom_templates) def upload_path_handler(instance, filename): @@ -46,6 +49,14 @@ class NomCom(models.Model): initialize_templates_for_group(self) +def delete_nomcom(sender, **kwargs): + nomcom = kwargs.get('instance', None) + delete_nomcom_templates(nomcom) + storage, path = nomcom.public_key.storage, nomcom.public_key.path + storage.delete(path) +post_delete.connect(delete_nomcom, sender=NomCom) + + class Nomination(models.Model): position = models.ForeignKey('Position') candidate_name = models.CharField(verbose_name='Candidate name', max_length=255) @@ -69,11 +80,13 @@ class Nominee(models.Model): email = models.ForeignKey(Email) nominee_position = models.ManyToManyField('Position', through='NomineePosition') duplicated = models.ForeignKey('Nominee', blank=True, null=True) + nomcom = models.ForeignKey('NomCom') objects = NomineeManager() class Meta: verbose_name_plural = 'Nominees' + unique_together = ('email', 'nomcom') def __unicode__(self): return u'%s' % self.email diff --git a/ietf/nomcom/test_data.py b/ietf/nomcom/test_data.py index 076d0f454..ef840e721 100644 --- a/ietf/nomcom/test_data.py +++ b/ietf/nomcom/test_data.py @@ -150,7 +150,7 @@ def nomcom_test_data(): email=email) # nominee email = Email.objects.get(person__name=COMMUNITY_USER) - nominee, created = Nominee.objects.get_or_create(email=email) + nominee, created = Nominee.objects.get_or_create(email=email, nomcom=nomcom) # positions for name, description in POSITIONS.iteritems(): diff --git a/ietf/nomcom/utils.py b/ietf/nomcom/utils.py index d0fcfaa11..8eaa980ed 100644 --- a/ietf/nomcom/utils.py +++ b/ietf/nomcom/utils.py @@ -112,6 +112,11 @@ def initialize_requirements_for_position(position): content=template.content) +def delete_nomcom_templates(nomcom): + nomcom_template_path = '/nomcom/' + nomcom.group.acronym + DBTemplate.objects.filter(path__contains=nomcom_template_path).delete() + + def retrieve_nomcom_private_key(request, year): private_key = request.session.get('NOMCOM_PRIVATE_KEY_%s' % year, None) diff --git a/ietf/settings.py b/ietf/settings.py index 8a6f18bfc..0758b2b33 100644 --- a/ietf/settings.py +++ b/ietf/settings.py @@ -261,10 +261,11 @@ IDSUBMIT_ANNOUNCE_LIST_EMAIL = 'i-d-announce@ietf.org' # NomCom Tool settings ROLODEX_URL = "" -PUBLIC_KEYS_URL = BASE_DIR + '/public_keys/' +PUBLIC_KEYS_URL = BASE_DIR + '/nomcom/public_keys/' NOMCOM_FROM_EMAIL = DEFAULT_FROM_EMAIL NOMCOM_ADMIN_EMAIL = DEFAULT_FROM_EMAIL OPENSSL_COMMAND = '/usr/bin/openssl' +DAYS_TO_EXPIRE_NOMINATION_LINK = '' # Days from meeting to cut off dates on submit FIRST_CUTOFF_DAYS = 19