Refactor feedback, now feedback belong many to many nominees
See #913 #929 #930 #965 #970 #975 - Legacy-Id: 5598
This commit is contained in:
parent
da031d0a7b
commit
85ab39f1ab
|
@ -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)
|
||||
|
|
|
@ -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')
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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'}),
|
||||
|
|
|
@ -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']
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue