diff --git a/opentech/apply/review/forms.py b/opentech/apply/review/forms.py index d16b99a989fe44c4049fb5e55c720b4dea085f48..69e0961a0362e55f0742db79ea7caa48c97b4b1e 100644 --- a/opentech/apply/review/forms.py +++ b/opentech/apply/review/forms.py @@ -81,6 +81,9 @@ class ReviewModelForm(StreamBaseForm, forms.ModelForm, metaclass=MixedMetaClass) self.instance.form_data = self.cleaned_data['form_data'] + # Capture the revision against which the user was reviewing + self.instance.revision = self.instance.submission.live_revision + return super().save(commit) def calculate_score(self, data): @@ -91,10 +94,11 @@ class ReviewModelForm(StreamBaseForm, forms.ModelForm, metaclass=MixedMetaClass) try: score = int(value[1]) - if score != NA: - scores.append(score) except TypeError: pass + else: + if score != NA: + scores.append(score) try: return sum(scores) / len(scores) diff --git a/opentech/apply/review/migrations/0007_review_revision.py b/opentech/apply/review/migrations/0007_review_revision.py new file mode 100644 index 0000000000000000000000000000000000000000..7c58d56bd34589073d755de95f43caa26c7b5578 --- /dev/null +++ b/opentech/apply/review/migrations/0007_review_revision.py @@ -0,0 +1,20 @@ +# Generated by Django 2.0.2 on 2018-08-14 13:35 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('funds', '0041_roundbasereviewform'), + ('review', '0006_remove_review_review'), + ] + + operations = [ + migrations.AddField( + model_name='review', + name='revision', + field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='reviews', to='funds.ApplicationRevision'), + ), + ] diff --git a/opentech/apply/review/models.py b/opentech/apply/review/models.py index 5d093e7b87e00f8a4c5c69a8db60fd0f68388e56..b55297626f558e92c6c2cff60e81ee621be5b092 100644 --- a/opentech/apply/review/models.py +++ b/opentech/apply/review/models.py @@ -70,6 +70,7 @@ class ReviewQuerySet(models.QuerySet): class Review(BaseStreamForm, models.Model): submission = models.ForeignKey('funds.ApplicationSubmission', on_delete=models.CASCADE, related_name='reviews') + revision = models.ForeignKey('funds.ApplicationRevision', on_delete=models.SET_NULL, related_name='reviews', null=True) author = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.PROTECT, diff --git a/opentech/apply/review/tests/factories/blocks.py b/opentech/apply/review/tests/factories/blocks.py index 600291d33423712a1daca8884756e507457651a3..c688e8d06ce34063207789e0b2ad4d6cb9febf2c 100644 --- a/opentech/apply/review/tests/factories/blocks.py +++ b/opentech/apply/review/tests/factories/blocks.py @@ -31,7 +31,7 @@ class ScoreFieldBlockFactory(FormFieldBlockFactory): @classmethod def make_answer(cls, params=dict()): - return json.dumps([random.randint(0, 5), factory.Faker('word').generate(params)]) + return json.dumps([random.randint(0, 5), factory.Faker('paragraph').generate(params)]) ReviewFormFieldsFactory = StreamFieldUUIDFactory({ diff --git a/opentech/apply/review/tests/factories/models.py b/opentech/apply/review/tests/factories/models.py index 8110443c9ff94ad4c9dd990478fc2d31ad1c69af..9155c940611d1a112495eee0c39300a160b03eec 100644 --- a/opentech/apply/review/tests/factories/models.py +++ b/opentech/apply/review/tests/factories/models.py @@ -26,8 +26,9 @@ class ReviewFactory(factory.DjangoModelFactory): draft = factory.Trait(is_draft=True) submission = factory.SubFactory(ApplicationSubmissionFactory) + revision = factory.SelfAttribute('submission.live_revision') author = factory.SubFactory(StaffFactory) - form_fields = blocks.ReviewFormFieldsFactory + form_fields = factory.LazyAttribute(lambda o: o.submission.round.review_forms.first().fields) form_data = factory.SubFactory( ReviewFormDataFactory, form_fields=factory.SelfAttribute('..form_fields'), diff --git a/opentech/apply/review/tests/test_views.py b/opentech/apply/review/tests/test_views.py index 09b4fefaa5195a26a001c85b9ffa3bbd6b25fc0f..db97ab51a2a4d3aa3be6a1ff12a34e8f6e7d175e 100644 --- a/opentech/apply/review/tests/test_views.py +++ b/opentech/apply/review/tests/test_views.py @@ -3,6 +3,7 @@ from django.urls import reverse from opentech.apply.funds.tests.factories.models import ApplicationSubmissionFactory from opentech.apply.users.tests.factories import StaffFactory, UserFactory from opentech.apply.utils.testing.tests import BaseViewTestCase + from .factories import ReviewFactory @@ -79,6 +80,13 @@ class StaffReviewFormTestCase(BaseViewTestCase): self.assertEqual(response.context['has_submitted_review'], False) self.assertEqual(response.context['title'], 'Update Review draft') + def test_revision_captured_on_review(self): + submission = ApplicationSubmissionFactory(status='internal_review') + review_data = ReviewFactory.build(submission=submission) + review_answers = review_data.form_data + response = self.post_page(submission, review_answers, 'form') + review = submission.reviews.first() + class UserReviewFormTestCase(BaseViewTestCase): user_factory = UserFactory diff --git a/opentech/apply/stream_forms/testing/factories.py b/opentech/apply/stream_forms/testing/factories.py index a7a12f3feb1a72840e9fa2e1effa207cd0d01160..da27577429008c30007fa9f100bcc88bd404c8fc 100644 --- a/opentech/apply/stream_forms/testing/factories.py +++ b/opentech/apply/stream_forms/testing/factories.py @@ -21,6 +21,9 @@ class AnswerFactory(factory.Factory): def _create(self, *args, sub_factory=None, **kwargs): return sub_factory.make_answer(kwargs) + def _build(self, *args, sub_factory=None, **kwargs): + return sub_factory.make_answer(kwargs) + class AddFormFieldsMetaclass(factory.base.FactoryMetaClass): def __new__(mcs, class_name, bases, attrs):