Refactor feedback, now feedback belong many to many nominees

See #913 #929 #930 #965 #970 #975
 - Legacy-Id: 5598
This commit is contained in:
Emilio Jiménez 2013-03-26 13:35:58 +00:00
parent da031d0a7b
commit 85ab39f1ab
8 changed files with 43 additions and 30 deletions

View file

@ -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)

View file

@ -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')

View file

@ -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)

View file

@ -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'}),

View file

@ -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']

View file

@ -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:

View file

@ -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)

View file

@ -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)