diff --git a/molo/surveys/forms.py b/molo/surveys/forms.py index b183e02..e382eee 100644 --- a/molo/surveys/forms.py +++ b/molo/surveys/forms.py @@ -58,6 +58,11 @@ def create_multiline_field(self, field, options): @property def formfields(self): + ''' + Override parent function in order to ensure that the + overridden create_..._field methods are referenced + instead of the parent class methods. + ''' formfields = OrderedDict() for field in self.fields: diff --git a/molo/surveys/models.py b/molo/surveys/models.py index 02d61cf..92e9d8a 100644 --- a/molo/surveys/models.py +++ b/molo/surveys/models.py @@ -89,7 +89,7 @@ def create_survey_index_pages(sender, instance, **kwargs): if not instance.get_children().filter( title='Surveys').exists(): survey_index = SurveysIndexPage( - title='Surveys', slug=('surveys-%s' % ( + title='Surveys', slug=('surveys-{}'.format( generate_slug(instance.title), ))) instance.add_child(instance=survey_index) survey_index.save_revision().publish() @@ -268,7 +268,7 @@ def serve_questions(self, request): When the last step is submitted correctly, the whole form is saved in the DB. """ - session_key_data = 'survey_data-%s' % self.pk + session_key_data = 'survey_data-{}'.format(self.pk) survey_data = json.loads(request.session.get(session_key_data, '{}')) paginator = SkipLogicPaginator( @@ -366,8 +366,8 @@ def has_page_breaks(self): ) def serve(self, request, *args, **kwargs): - if not self.allow_multiple_submissions_per_user \ - and self.has_user_submitted_survey(request, self.id): + if (not self.allow_multiple_submissions_per_user and + self.has_user_submitted_survey(request, self.id)): return render(request, self.template, self.get_context(request)) if self.has_page_breaks or self.multi_step: @@ -582,15 +582,16 @@ def get_data_fields(self): if there's one associated. """ data_fields = [ + ('username', _('Username')), ('created_at', _('Submission Date')), ] # Add segment name to a field label if it is segmented. for field in self.get_form_fields(): - label = field.label + label = field.admin_label if field.segment: - label = '%s (%s)' % (label, field.segment.name) + label = '{} ({})'.format(label, field.segment.name) data_fields.append((field.clean_name, label)) @@ -631,7 +632,7 @@ class PersonalisableSurveyFormField(SkipLogicMixin, AdminLabelMixin, ] + AbstractFormField.panels def __str__(self): - return '%s - %s' % (self.page, self.label) + return '{} - {}'.format(self.page, self.label) class Meta(AbstractFormField.Meta): verbose_name = _('personalisable form field') diff --git a/molo/surveys/tests/test_admin.py b/molo/surveys/tests/test_admin.py index fac06d8..43650cf 100644 --- a/molo/surveys/tests/test_admin.py +++ b/molo/surveys/tests/test_admin.py @@ -1,12 +1,21 @@ +import json + +from django.core.serializers.json import DjangoJSONEncoder from django.contrib.auth import get_user_model from django.test import TestCase from django.test.client import Client from molo.core.models import SiteLanguageRelation, Main, Languages, ArticlePage from molo.core.tests.base import MoloTestCaseMixin -from molo.surveys.models import (MoloSurveyPage, MoloSurveyFormField, - SurveysIndexPage) - +from molo.surveys.models import ( + MoloSurveyPage, + MoloSurveyFormField, + SurveysIndexPage, + PersonalisableSurvey, + PersonalisableSurveyFormField, +) +from wagtail_personalisation.models import Segment +from wagtail_personalisation.rules import UserIsLoggedInRule User = get_user_model() @@ -61,6 +70,32 @@ def create_molo_survey_page(self, parent, **kwargs): ) return molo_survey_page, molo_survey_form_field + def create_personalisable_molo_survey_page(self, parent, **kwargs): + # create segment for personalisation + test_segment = Segment.objects.create(name="Test Segment") + UserIsLoggedInRule.objects.create( + segment=test_segment, + is_logged_in=True) + + personalisable_survey = PersonalisableSurvey( + title='Test Survey', slug='test-survey', + intro='Introduction to Test Survey ...', + thank_you_text='Thank you for taking the Test Survey', + **kwargs + ) + + parent.add_child(instance=personalisable_survey) + personalisable_survey.save_revision().publish() + + molo_survey_form_field = PersonalisableSurveyFormField.objects.create( + field_type='singleline', + label='Question 1', + admin_label='question_1', + page=personalisable_survey, + segment=test_segment) + + return personalisable_survey, molo_survey_form_field + def test_convert_to_article(self): molo_survey_page, molo_survey_form_field = \ self.create_molo_survey_page(parent=self.section_index) @@ -123,7 +158,7 @@ def test_convert_to_article(self): # it should not show convert to article as there is already article self.assertNotContains(response, 'Convert to Article') - def test_export_submission(self): + def test_export_submission_standard_survey(self): molo_survey_page, molo_survey_form_field = \ self.create_molo_survey_page(parent=self.section_index) @@ -144,3 +179,36 @@ def test_export_submission(self): self.assertNotContains(response, molo_survey_form_field.label) self.assertContains(response, molo_survey_form_field.admin_label) self.assertContains(response, answer) + + def test_export_submission_personalisable_survey(self): + molo_survey_page, molo_survey_form_field = ( + self.create_personalisable_molo_survey_page( + parent=self.section_index)) + + answer = 'PYTHON' + + molo_survey_page.get_submission_class().objects.create( + form_data=json.dumps({"question-1": answer}, + cls=DjangoJSONEncoder), + page=molo_survey_page, + user=self.user + ) + + self.client.force_login(self.super_user) + response = self.client.get( + '/admin/surveys/submissions/{}/'.format(molo_survey_page.id), + {'action': 'CSV'}, + ) + + self.assertEquals(response.status_code, 200) + self.assertContains(response, 'Username') + self.assertContains(response, 'Submission Date') + self.assertNotContains(response, molo_survey_form_field.label) + + self.assertContains( + response, + '{} ({})'.format(molo_survey_form_field.admin_label, + molo_survey_form_field.segment.name)) + + self.assertContains(response, self.user.username) + self.assertContains(response, answer)