diff --git a/ietf/nomcom/admin.py b/ietf/nomcom/admin.py index 59396a663..1c8b35d9f 100644 --- a/ietf/nomcom/admin.py +++ b/ietf/nomcom/admin.py @@ -28,7 +28,7 @@ class PositionAdmin(admin.ModelAdmin): class FeedbackAdmin(admin.ModelAdmin): - list_display = ('nominee', 'author', 'type') + list_display = ('author', 'type') list_filter = ('type',) admin.site.register(NomCom, NomComAdmin) diff --git a/ietf/nomcom/forms.py b/ietf/nomcom/forms.py index 5c72455a3..1ee950fdd 100644 --- a/ietf/nomcom/forms.py +++ b/ietf/nomcom/forms.py @@ -254,7 +254,9 @@ class MergeForm(BaseNomcomForm, forms.Form): # move nominations nominee.nomination_set.all().update(nominee=primary_nominee) # move feedback - nominee.feedback_set.all().update(nominee=primary_nominee) + for fb in nominee.feedback_set.all(): + fb.nominees.remove(nominee) + fb.nominees.add(primary_nominee) # move nomineepositions for nominee_position in nominee.nomineeposition_set.all(): primary_nominee_positions = NomineePosition.objects.filter(position=nominee_position.position, @@ -346,11 +348,11 @@ class NominateForm(BaseNomcomForm, forms.ModelForm): # Complete nomination data feedback = Feedback.objects.create(nomcom=self.nomcom, - nominee=nominee, comments=comments, type=FeedbackType.objects.get(slug='nomina'), user=self.user) feedback.positions.add(position) + feedback.nominees.add(nominee) author = None if self.public: author = get_user_email(self.user) @@ -562,11 +564,11 @@ class FeedbackForm(BaseNomcomForm, forms.ModelForm): feedback.author = author feedback.nomcom = self.nomcom - feedback.nominee = self.nominee feedback.user = self.user feedback.type = FeedbackType.objects.get(slug='comment') feedback.save() feedback.positions.add(self.position) + feedback.nominees.add(self.nominee) # send receipt email to feedback author if confirmation: @@ -599,7 +601,7 @@ class QuestionnaireForm(BaseNomcomForm, forms.ModelForm): comments = forms.CharField(label='Comments on this candidate', widget=forms.Textarea()) - fieldsets = [('Provide questionnaires', ('nominee', + fieldsets = [('Provide questionnaires', ('nominees', 'positions', 'comments'))] @@ -625,7 +627,7 @@ class QuestionnaireForm(BaseNomcomForm, forms.ModelForm): class Meta: model = Feedback - fields = ('nominee', + fields = ('nominees', 'positions', 'comments') diff --git a/ietf/nomcom/management/commands/feedback_email.py b/ietf/nomcom/management/commands/feedback_email.py index 0ffc8bafd..e4413105b 100644 --- a/ietf/nomcom/management/commands/feedback_email.py +++ b/ietf/nomcom/management/commands/feedback_email.py @@ -46,7 +46,8 @@ class Command(BaseCommand): feedback = Feedback(nomcom=nomcom, comments=body) - if nominee: - feedback.nominee = nominee feedback.save() + if nominee: + feedback.nominees.add(nominee) + syslog.syslog(u"Read feedback email by %s" % by) diff --git a/ietf/nomcom/migrations/0001_initial.py b/ietf/nomcom/migrations/0001_initial.py index d9f94c888..3c278bb66 100644 --- a/ietf/nomcom/migrations/0001_initial.py +++ b/ietf/nomcom/migrations/0001_initial.py @@ -76,7 +76,6 @@ class Migration(SchemaMigration): ('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)), ('nomcom', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['nomcom.NomCom'])), ('author', self.gf('django.db.models.fields.EmailField')(max_length=75, blank=True)), - ('nominee', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['nomcom.Nominee'], null=True, blank=True)), ('comments', self.gf('ietf.nomcom.fields.EncryptedTextField')()), ('type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.FeedbackType'], null=True, blank=True)), ('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)), @@ -92,6 +91,14 @@ class Migration(SchemaMigration): )) db.create_unique('nomcom_feedback_positions', ['feedback_id', 'position_id']) + # Adding M2M table for field nominees on 'Feedback' + db.create_table('nomcom_feedback_nominees', ( + ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)), + ('feedback', models.ForeignKey(orm['nomcom.feedback'], null=False)), + ('nominee', models.ForeignKey(orm['nomcom.nominee'], null=False)) + )) + db.create_unique('nomcom_feedback_nominees', ['feedback_id', 'nominee_id']) + def backwards(self, orm): @@ -122,6 +129,9 @@ class Migration(SchemaMigration): # Removing M2M table for field positions on 'Feedback' db.delete_table('nomcom_feedback_positions') + # Removing M2M table for field nominees on 'Feedback' + db.delete_table('nomcom_feedback_nominees') + models = { 'auth.group': { @@ -344,7 +354,7 @@ class Migration(SchemaMigration): 'comments': ('ietf.nomcom.fields.EncryptedTextField', [], {}), 'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}), 'nomcom': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['nomcom.NomCom']"}), - 'nominee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['nomcom.Nominee']", 'null': 'True', 'blank': 'True'}), + 'nominees': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['nomcom.Nominee']", 'null': 'True', 'blank': 'True'}), 'positions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['nomcom.Position']", 'null': 'True', 'blank': 'True'}), 'time': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}), 'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.FeedbackType']", 'null': 'True', 'blank': 'True'}), diff --git a/ietf/nomcom/models.py b/ietf/nomcom/models.py index d10ea1699..3a948a75c 100644 --- a/ietf/nomcom/models.py +++ b/ietf/nomcom/models.py @@ -118,7 +118,7 @@ class NomineePosition(models.Model): @property def questionnaires(self): return Feedback.objects.questionnaires().filter(positions__in=[self.position], - nominee=self.nominee) + nominees__in=[self.nominee]) class Position(models.Model): @@ -165,7 +165,7 @@ 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', blank=True, null=True) + nominees = models.ManyToManyField('Nominee', blank=True, null=True) comments = EncryptedTextField(verbose_name='Comments') type = models.ForeignKey(FeedbackType, blank=True, null=True) user = models.ForeignKey(User, editable=False, blank=True, null=True) @@ -174,7 +174,7 @@ class Feedback(models.Model): objects = FeedbackManager() def __unicode__(self): - return u"from %s to %s" % (self.author, self.nominee) + return u"from %s" % self.author class Meta: ordering = ['time'] diff --git a/ietf/nomcom/templatetags/nomcom_tags.py b/ietf/nomcom/templatetags/nomcom_tags.py index 2081e9abc..7ad6f0914 100644 --- a/ietf/nomcom/templatetags/nomcom_tags.py +++ b/ietf/nomcom/templatetags/nomcom_tags.py @@ -31,7 +31,7 @@ def add_num_nominations(user, position, nominee): author = get_user_email(user) count = Feedback.objects.filter(positions__in=[position], - nominee=nominee, + nominees__in=[nominee], author=author, type='comment').count() if count: diff --git a/ietf/nomcom/tests.py b/ietf/nomcom/tests.py index 8994f03fe..57babea8c 100644 --- a/ietf/nomcom/tests.py +++ b/ietf/nomcom/tests.py @@ -170,11 +170,11 @@ class NomcomViewsTest(TestCase): self.assertEqual(Feedback.objects.comments().count(), 4) self.assertEqual(Feedback.objects.nominations().count(), 16) for nominee in nominees: - self.assertEqual(Feedback.objects.nominations().filter(nominee__email__address=nominee).count(), + self.assertEqual(Feedback.objects.nominations().filter(nominees__email__address=nominee).count(), 4) - self.assertEqual(Feedback.objects.comments().filter(nominee__email__address=nominee).count(), + self.assertEqual(Feedback.objects.comments().filter(nominees__email__address=nominee).count(), 1) - self.assertEqual(Feedback.objects.questionnaires().filter(nominee__email__address=nominee).count(), + self.assertEqual(Feedback.objects.questionnaires().filter(nominees__email__address=nominee).count(), 1) self.client.logout() @@ -231,19 +231,19 @@ class NomcomViewsTest(TestCase): nominee = Nominee.objects.get(email__address=nominees[0]) self.assertEqual(Nomination.objects.filter(nominee=nominee).count(), 16) - self.assertEqual(Feedback.objects.nominations().filter(nominee=nominee).count(), + self.assertEqual(Feedback.objects.nominations().filter(nominees__in=[nominee]).count(), 16) - self.assertEqual(Feedback.objects.comments().filter(nominee=nominee).count(), + self.assertEqual(Feedback.objects.comments().filter(nominees__in=[nominee]).count(), 4) - self.assertEqual(Feedback.objects.questionnaires().filter(nominee=nominee).count(), + self.assertEqual(Feedback.objects.questionnaires().filter(nominees__in=[nominee]).count(), 4) for nominee_email in nominees[1:]: - self.assertEqual(Feedback.objects.nominations().filter(nominee__email__address=nominee_email).count(), + self.assertEqual(Feedback.objects.nominations().filter(nominees__email__address=nominee_email).count(), 0) - self.assertEqual(Feedback.objects.comments().filter(nominee__email__address=nominee_email).count(), + self.assertEqual(Feedback.objects.comments().filter(nominees__email__address=nominee_email).count(), 0) - self.assertEqual(Feedback.objects.questionnaires().filter(nominee__email__address=nominee_email).count(), + self.assertEqual(Feedback.objects.questionnaires().filter(nominees__email__address=nominee_email).count(), 0) self.assertEqual(NomineePosition.objects.filter(nominee=nominee).count(), 3) @@ -328,10 +328,10 @@ class NomcomViewsTest(TestCase): comments = 'plain text' nomcom = get_nomcom_by_year(self.year) feedback = Feedback.objects.create(nomcom=nomcom, - nominee=nominee, comments=comments, type=FeedbackType.objects.get(slug='nomina')) feedback.positions.add(position) + feedback.nominees.add(nominee) # to check feedback comments are saved like enrypted data self.assertNotEqual(feedback.comments, comments) @@ -413,7 +413,7 @@ class NomcomViewsTest(TestCase): nominee = Nominee.objects.get(email=email) NomineePosition.objects.get(position=position, nominee=nominee) feedback = Feedback.objects.filter(positions__in=[position], - nominee=nominee, + nominees__in=[nominee], type=FeedbackType.objects.get(slug='nomina')).latest('id') if public: self.assertEqual(feedback.author, nominator_email) @@ -468,7 +468,7 @@ class NomcomViewsTest(TestCase): test_data = {'comments': comments, 'positions': [position.id], - 'nominee': nominee.id} + 'nominees': [nominee.id]} response = self.client.post(self.add_questionnaire_url, test_data) @@ -477,7 +477,7 @@ class NomcomViewsTest(TestCase): ## check objects feedback = Feedback.objects.filter(positions__in=[position], - nominee=nominee, + nominees__in=[nominee], type=FeedbackType.objects.get(slug='questio')).latest('id') ## to check feedback comments are saved like enrypted data @@ -558,7 +558,7 @@ class NomcomViewsTest(TestCase): ## check objects feedback = Feedback.objects.filter(positions__in=[position], - nominee=nominee, + nominees__in=[nominee], type=FeedbackType.objects.get(slug='comment')).latest('id') if public: self.assertEqual(feedback.author, nominator_email) @@ -626,10 +626,10 @@ class FeedbackTest(TestCase): comments = 'plain text' feedback = Feedback.objects.create(nomcom=nomcom, - nominee=nominee, comments=comments, type=FeedbackType.objects.get(slug='nomina')) feedback.positions.add(position) + feedback.nominees.add(nominee) # to check feedback comments are saved like enrypted data self.assertNotEqual(feedback.comments, comments) diff --git a/ietf/nomcom/views.py b/ietf/nomcom/views.py index 179ea28c0..97a93b000 100644 --- a/ietf/nomcom/views.py +++ b/ietf/nomcom/views.py @@ -397,7 +397,7 @@ def view_feedback_pending(request, year): exclude=('nomcom', 'comments'), extra=0) feedbacks = Feedback.objects.filter(Q(type__isnull=True) | - Q(nominee__isnull=True) | + Q(nominees__isnull=True) | Q(positions__isnull=True)) if request.method == 'POST': formset = FeedbackFormSet(request.POST)