Skip to content

Commit 85ab39f

Browse files
committed
Refactor feedback, now feedback belong many to many nominees
See ietf-tools#913 ietf-tools#929 ietf-tools#930 ietf-tools#965 ietf-tools#970 ietf-tools#975 - Legacy-Id: 5598
1 parent da031d0 commit 85ab39f

8 files changed

Lines changed: 43 additions & 30 deletions

File tree

ietf/nomcom/admin.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ class PositionAdmin(admin.ModelAdmin):
2828

2929

3030
class FeedbackAdmin(admin.ModelAdmin):
31-
list_display = ('nominee', 'author', 'type')
31+
list_display = ('author', 'type')
3232
list_filter = ('type',)
3333

3434
admin.site.register(NomCom, NomComAdmin)

ietf/nomcom/forms.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,9 @@ def save(self):
254254
# move nominations
255255
nominee.nomination_set.all().update(nominee=primary_nominee)
256256
# move feedback
257-
nominee.feedback_set.all().update(nominee=primary_nominee)
257+
for fb in nominee.feedback_set.all():
258+
fb.nominees.remove(nominee)
259+
fb.nominees.add(primary_nominee)
258260
# move nomineepositions
259261
for nominee_position in nominee.nomineeposition_set.all():
260262
primary_nominee_positions = NomineePosition.objects.filter(position=nominee_position.position,
@@ -346,11 +348,11 @@ def save(self, commit=True):
346348

347349
# Complete nomination data
348350
feedback = Feedback.objects.create(nomcom=self.nomcom,
349-
nominee=nominee,
350351
comments=comments,
351352
type=FeedbackType.objects.get(slug='nomina'),
352353
user=self.user)
353354
feedback.positions.add(position)
355+
feedback.nominees.add(nominee)
354356
author = None
355357
if self.public:
356358
author = get_user_email(self.user)
@@ -562,11 +564,11 @@ def save(self, commit=True):
562564
feedback.author = author
563565

564566
feedback.nomcom = self.nomcom
565-
feedback.nominee = self.nominee
566567
feedback.user = self.user
567568
feedback.type = FeedbackType.objects.get(slug='comment')
568569
feedback.save()
569570
feedback.positions.add(self.position)
571+
feedback.nominees.add(self.nominee)
570572

571573
# send receipt email to feedback author
572574
if confirmation:
@@ -599,7 +601,7 @@ class QuestionnaireForm(BaseNomcomForm, forms.ModelForm):
599601

600602
comments = forms.CharField(label='Comments on this candidate',
601603
widget=forms.Textarea())
602-
fieldsets = [('Provide questionnaires', ('nominee',
604+
fieldsets = [('Provide questionnaires', ('nominees',
603605
'positions',
604606
'comments'))]
605607

@@ -625,7 +627,7 @@ def save(self, commit=True):
625627

626628
class Meta:
627629
model = Feedback
628-
fields = ('nominee',
630+
fields = ('nominees',
629631
'positions',
630632
'comments')
631633

ietf/nomcom/management/commands/feedback_email.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@ def handle(self, *args, **options):
4646

4747
feedback = Feedback(nomcom=nomcom,
4848
comments=body)
49-
if nominee:
50-
feedback.nominee = nominee
5149
feedback.save()
50+
if nominee:
51+
feedback.nominees.add(nominee)
52+
5253
syslog.syslog(u"Read feedback email by %s" % by)

ietf/nomcom/migrations/0001_initial.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ def forwards(self, orm):
7676
('id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
7777
('nomcom', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['nomcom.NomCom'])),
7878
('author', self.gf('django.db.models.fields.EmailField')(max_length=75, blank=True)),
79-
('nominee', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['nomcom.Nominee'], null=True, blank=True)),
8079
('comments', self.gf('ietf.nomcom.fields.EncryptedTextField')()),
8180
('type', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['name.FeedbackType'], null=True, blank=True)),
8281
('user', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['auth.User'], null=True, blank=True)),
@@ -92,6 +91,14 @@ def forwards(self, orm):
9291
))
9392
db.create_unique('nomcom_feedback_positions', ['feedback_id', 'position_id'])
9493

94+
# Adding M2M table for field nominees on 'Feedback'
95+
db.create_table('nomcom_feedback_nominees', (
96+
('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
97+
('feedback', models.ForeignKey(orm['nomcom.feedback'], null=False)),
98+
('nominee', models.ForeignKey(orm['nomcom.nominee'], null=False))
99+
))
100+
db.create_unique('nomcom_feedback_nominees', ['feedback_id', 'nominee_id'])
101+
95102

96103
def backwards(self, orm):
97104

@@ -122,6 +129,9 @@ def backwards(self, orm):
122129
# Removing M2M table for field positions on 'Feedback'
123130
db.delete_table('nomcom_feedback_positions')
124131

132+
# Removing M2M table for field nominees on 'Feedback'
133+
db.delete_table('nomcom_feedback_nominees')
134+
125135

126136
models = {
127137
'auth.group': {
@@ -344,7 +354,7 @@ def backwards(self, orm):
344354
'comments': ('ietf.nomcom.fields.EncryptedTextField', [], {}),
345355
'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
346356
'nomcom': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['nomcom.NomCom']"}),
347-
'nominee': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['nomcom.Nominee']", 'null': 'True', 'blank': 'True'}),
357+
'nominees': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['nomcom.Nominee']", 'null': 'True', 'blank': 'True'}),
348358
'positions': ('django.db.models.fields.related.ManyToManyField', [], {'symmetrical': 'False', 'to': "orm['nomcom.Position']", 'null': 'True', 'blank': 'True'}),
349359
'time': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
350360
'type': ('django.db.models.fields.related.ForeignKey', [], {'to': "orm['name.FeedbackType']", 'null': 'True', 'blank': 'True'}),

ietf/nomcom/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ def __unicode__(self):
118118
@property
119119
def questionnaires(self):
120120
return Feedback.objects.questionnaires().filter(positions__in=[self.position],
121-
nominee=self.nominee)
121+
nominees__in=[self.nominee])
122122

123123

124124
class Position(models.Model):
@@ -165,7 +165,7 @@ class Feedback(models.Model):
165165
nomcom = models.ForeignKey('NomCom')
166166
author = models.EmailField(verbose_name='Author', blank=True)
167167
positions = models.ManyToManyField('Position', blank=True, null=True)
168-
nominee = models.ForeignKey('Nominee', blank=True, null=True)
168+
nominees = models.ManyToManyField('Nominee', blank=True, null=True)
169169
comments = EncryptedTextField(verbose_name='Comments')
170170
type = models.ForeignKey(FeedbackType, blank=True, null=True)
171171
user = models.ForeignKey(User, editable=False, blank=True, null=True)
@@ -174,7 +174,7 @@ class Feedback(models.Model):
174174
objects = FeedbackManager()
175175

176176
def __unicode__(self):
177-
return u"from %s to %s" % (self.author, self.nominee)
177+
return u"from %s" % self.author
178178

179179
class Meta:
180180
ordering = ['time']

ietf/nomcom/templatetags/nomcom_tags.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ def add_num_nominations(user, position, nominee):
3131
author = get_user_email(user)
3232

3333
count = Feedback.objects.filter(positions__in=[position],
34-
nominee=nominee,
34+
nominees__in=[nominee],
3535
author=author,
3636
type='comment').count()
3737
if count:

ietf/nomcom/tests.py

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,11 @@ def test_private_merge_view(self):
170170
self.assertEqual(Feedback.objects.comments().count(), 4)
171171
self.assertEqual(Feedback.objects.nominations().count(), 16)
172172
for nominee in nominees:
173-
self.assertEqual(Feedback.objects.nominations().filter(nominee__email__address=nominee).count(),
173+
self.assertEqual(Feedback.objects.nominations().filter(nominees__email__address=nominee).count(),
174174
4)
175-
self.assertEqual(Feedback.objects.comments().filter(nominee__email__address=nominee).count(),
175+
self.assertEqual(Feedback.objects.comments().filter(nominees__email__address=nominee).count(),
176176
1)
177-
self.assertEqual(Feedback.objects.questionnaires().filter(nominee__email__address=nominee).count(),
177+
self.assertEqual(Feedback.objects.questionnaires().filter(nominees__email__address=nominee).count(),
178178
1)
179179

180180
self.client.logout()
@@ -231,19 +231,19 @@ def test_private_merge_view(self):
231231
nominee = Nominee.objects.get(email__address=nominees[0])
232232

233233
self.assertEqual(Nomination.objects.filter(nominee=nominee).count(), 16)
234-
self.assertEqual(Feedback.objects.nominations().filter(nominee=nominee).count(),
234+
self.assertEqual(Feedback.objects.nominations().filter(nominees__in=[nominee]).count(),
235235
16)
236-
self.assertEqual(Feedback.objects.comments().filter(nominee=nominee).count(),
236+
self.assertEqual(Feedback.objects.comments().filter(nominees__in=[nominee]).count(),
237237
4)
238-
self.assertEqual(Feedback.objects.questionnaires().filter(nominee=nominee).count(),
238+
self.assertEqual(Feedback.objects.questionnaires().filter(nominees__in=[nominee]).count(),
239239
4)
240240

241241
for nominee_email in nominees[1:]:
242-
self.assertEqual(Feedback.objects.nominations().filter(nominee__email__address=nominee_email).count(),
242+
self.assertEqual(Feedback.objects.nominations().filter(nominees__email__address=nominee_email).count(),
243243
0)
244-
self.assertEqual(Feedback.objects.comments().filter(nominee__email__address=nominee_email).count(),
244+
self.assertEqual(Feedback.objects.comments().filter(nominees__email__address=nominee_email).count(),
245245
0)
246-
self.assertEqual(Feedback.objects.questionnaires().filter(nominee__email__address=nominee_email).count(),
246+
self.assertEqual(Feedback.objects.questionnaires().filter(nominees__email__address=nominee_email).count(),
247247
0)
248248

249249
self.assertEqual(NomineePosition.objects.filter(nominee=nominee).count(), 3)
@@ -328,10 +328,10 @@ def test_edit_nomcom_view(self):
328328
comments = 'plain text'
329329
nomcom = get_nomcom_by_year(self.year)
330330
feedback = Feedback.objects.create(nomcom=nomcom,
331-
nominee=nominee,
332331
comments=comments,
333332
type=FeedbackType.objects.get(slug='nomina'))
334333
feedback.positions.add(position)
334+
feedback.nominees.add(nominee)
335335

336336
# to check feedback comments are saved like enrypted data
337337
self.assertNotEqual(feedback.comments, comments)
@@ -413,7 +413,7 @@ def nominate_view(self, *args, **kwargs):
413413
nominee = Nominee.objects.get(email=email)
414414
NomineePosition.objects.get(position=position, nominee=nominee)
415415
feedback = Feedback.objects.filter(positions__in=[position],
416-
nominee=nominee,
416+
nominees__in=[nominee],
417417
type=FeedbackType.objects.get(slug='nomina')).latest('id')
418418
if public:
419419
self.assertEqual(feedback.author, nominator_email)
@@ -468,7 +468,7 @@ def add_questionnaire(self, *args, **kwargs):
468468

469469
test_data = {'comments': comments,
470470
'positions': [position.id],
471-
'nominee': nominee.id}
471+
'nominees': [nominee.id]}
472472

473473
response = self.client.post(self.add_questionnaire_url, test_data)
474474

@@ -477,7 +477,7 @@ def add_questionnaire(self, *args, **kwargs):
477477

478478
## check objects
479479
feedback = Feedback.objects.filter(positions__in=[position],
480-
nominee=nominee,
480+
nominees__in=[nominee],
481481
type=FeedbackType.objects.get(slug='questio')).latest('id')
482482

483483
## to check feedback comments are saved like enrypted data
@@ -558,7 +558,7 @@ def feedback_view(self, *args, **kwargs):
558558

559559
## check objects
560560
feedback = Feedback.objects.filter(positions__in=[position],
561-
nominee=nominee,
561+
nominees__in=[nominee],
562562
type=FeedbackType.objects.get(slug='comment')).latest('id')
563563
if public:
564564
self.assertEqual(feedback.author, nominator_email)
@@ -626,10 +626,10 @@ def test_encrypted_comments(self):
626626

627627
comments = 'plain text'
628628
feedback = Feedback.objects.create(nomcom=nomcom,
629-
nominee=nominee,
630629
comments=comments,
631630
type=FeedbackType.objects.get(slug='nomina'))
632631
feedback.positions.add(position)
632+
feedback.nominees.add(nominee)
633633

634634
# to check feedback comments are saved like enrypted data
635635
self.assertNotEqual(feedback.comments, comments)

ietf/nomcom/views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -397,7 +397,7 @@ def view_feedback_pending(request, year):
397397
exclude=('nomcom', 'comments'),
398398
extra=0)
399399
feedbacks = Feedback.objects.filter(Q(type__isnull=True) |
400-
Q(nominee__isnull=True) |
400+
Q(nominees__isnull=True) |
401401
Q(positions__isnull=True))
402402
if request.method == 'POST':
403403
formset = FeedbackFormSet(request.POST)

0 commit comments

Comments
 (0)