Skip to content
This repository has been archived by the owner on Feb 13, 2022. It is now read-only.

Commit

Permalink
Merge branch 'develop' into feature/issue-110-ga-campaign-tag-manager
Browse files Browse the repository at this point in the history
  • Loading branch information
moh-moola committed Jul 19, 2018
2 parents 89cbffd + 710fe70 commit b4ca0b3
Show file tree
Hide file tree
Showing 3 changed files with 140 additions and 67 deletions.
46 changes: 33 additions & 13 deletions molo/surveys/models.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import json
import datetime

from unidecode import unidecode
from django.conf import settings
from django.utils.http import urlencode
from django.core.exceptions import ValidationError
Expand All @@ -15,6 +15,8 @@
from django.shortcuts import redirect, render
from django.utils.functional import cached_property
from django.utils.translation import ugettext_lazy as _
from django.utils.text import slugify
from django.utils.six import text_type
from modelcluster.fields import ParentalKey
from molo.core.blocks import MarkDownBlock
from molo.core.models import (
Expand Down Expand Up @@ -70,6 +72,17 @@
FooterPage.parent_page_types += ['surveys.TermsAndConditionsIndexPage']


class SurveyAbstractFormField(AbstractFormField):
class Meta:
abstract = True
ordering = ['sort_order']

@property
def clean_name(self):
return str(slugify(text_type(unidecode(
'{} {}'.format(self.pk, self.label.lower())))))


class TermsAndConditionsIndexPage(TranslatablePageMixinNotRoutable, MoloPage):
parent_page_types = ['surveys.SurveysIndexPage']
subpage_types = ['core.Footerpage']
Expand Down Expand Up @@ -468,7 +481,7 @@ class Meta:
abstract = True


surveys_models.AbstractFormField.panels.append(FieldPanel('page_break'))
SurveyAbstractFormField.panels.append(FieldPanel('page_break'))


class AdminLabelMixin(models.Model):
Expand All @@ -483,8 +496,8 @@ class Meta:
abstract = True


surveys_models.AbstractFormField.panels.append(FieldPanel('admin_label'))
surveys_models.AbstractFormField._meta.get_field('label').verbose_name = (
SurveyAbstractFormField.panels.append(FieldPanel('admin_label'))
SurveyAbstractFormField._meta.get_field('label').verbose_name = (
'Question'
)

Expand Down Expand Up @@ -543,8 +556,10 @@ def save(self, *args, **kwargs):


class MoloSurveyFormField(SkipLogicMixin, AdminLabelMixin,
QuestionPaginationMixin, AbstractFormField):
AbstractFormField.FORM_FIELD_CHOICES += (
QuestionPaginationMixin, SurveyAbstractFormField):

page = ParentalKey(MoloSurveyPage, related_name='survey_form_fields')
SurveyAbstractFormField.FORM_FIELD_CHOICES += (
('positive_number', _("Positive Number")),)
choices = models.TextField(
verbose_name=_('choices'),
Expand All @@ -555,10 +570,12 @@ class MoloSurveyFormField(SkipLogicMixin, AdminLabelMixin,
)
field_type = models.CharField(
verbose_name=_('field type'),
max_length=16, choices=AbstractFormField.FORM_FIELD_CHOICES)
page = ParentalKey(MoloSurveyPage, related_name='survey_form_fields')
max_length=16, choices=SurveyAbstractFormField.FORM_FIELD_CHOICES)

def __init__(self, *args, **kwargs):
super(MoloSurveyFormField, self).__init__(*args, **kwargs)

class Meta(AbstractFormField.Meta):
class Meta(SurveyAbstractFormField.Meta):
pass

def clean(self):
Expand All @@ -573,7 +590,7 @@ def clean(self):
{'default_value': ["Must be a valid date", ]})


surveys_models.AbstractFormField.panels[4] = SkipLogicStreamPanel('skip_logic')
SurveyAbstractFormField.panels[4] = SkipLogicStreamPanel('skip_logic')


class MoloSurveySubmission(surveys_models.AbstractFormSubmission):
Expand Down Expand Up @@ -697,7 +714,7 @@ def serve(self, request, *args, **kwargs):

class PersonalisableSurveyFormField(SkipLogicMixin, AdminLabelMixin,
QuestionPaginationMixin,
AbstractFormField):
SurveyAbstractFormField):
"""
Form field that has a segment assigned.
"""
Expand All @@ -713,12 +730,15 @@ class PersonalisableSurveyFormField(SkipLogicMixin, AdminLabelMixin,

panels = [
FieldPanel('segment')
] + AbstractFormField.panels
] + SurveyAbstractFormField.panels

def __init__(self, *args, **kwargs):
super(PersonalisableSurveyFormField, self).__init__(*args, **kwargs)

def __str__(self):
return '{} - {}'.format(self.page, self.label)

class Meta(AbstractFormField.Meta):
class Meta(SurveyAbstractFormField.Meta):
verbose_name = _('personalisable form field')

def clean(self):
Expand Down
28 changes: 20 additions & 8 deletions molo/surveys/tests/test_admin.py
Original file line number Diff line number Diff line change
Expand Up @@ -107,9 +107,13 @@ def test_convert_to_article(self):
self.assertContains(response, molo_survey_page.title)
self.assertContains(response, molo_survey_page.introduction)
self.assertContains(response, molo_survey_form_field.label)
response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)

key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.client.logout()
self.client.login(
username='testuser',
Expand Down Expand Up @@ -173,9 +177,12 @@ def test_export_submission_standard_survey(self):

self.client.force_login(self.user)
answer = 'PYTHON'
response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): answer
})
key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(molo_survey_page.url, {key: answer})
self.assertEqual(response.status_code, 302)

self.client.force_login(self.super_user)
response = self.client.get(
Expand All @@ -195,10 +202,15 @@ def test_export_submission_personalisable_survey(self):
parent=self.section_index))

answer = 'PYTHON'
key = '{}-{}'.format(
molo_survey_page.get_form_fields().first().pk,
molo_survey_page.get_form_fields().first(
).label.lower().replace(' ', '-')
)

molo_survey_page.get_submission_class().objects.create(
form_data=json.dumps({"question-1": answer},
cls=DjangoJSONEncoder),
form_data=json.dumps(
{key: answer}, cls=DjangoJSONEncoder),
page=molo_survey_page,
user=self.user
)
Expand Down
133 changes: 87 additions & 46 deletions molo/surveys/tests/test_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -129,10 +129,12 @@ def test_submit_survey_as_logged_in_user(self):
self.assertContains(response, molo_survey_form_field.label)
self.assertContains(response, molo_survey_page.submit_text)

response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)

key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)

# for test_multiple_submissions_not_allowed_by_default
Expand All @@ -151,9 +153,13 @@ def test_anonymous_submissions_option(self):
self.assertContains(response, molo_survey_page.title)
self.assertContains(response, molo_survey_page.introduction)
self.assertContains(response, molo_survey_form_field.label)
response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)

key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)

# for test_multiple_submissions_not_allowed_by_default_anonymous
Expand Down Expand Up @@ -193,11 +199,12 @@ def test_multiple_submissions_option(self, anonymous=False):
self.assertContains(response, molo_survey_page.introduction)
self.assertContains(response, molo_survey_form_field.label)

response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'):
'python'
}, follow=True)

key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)

def test_multiple_submissions_option_anonymous(self):
Expand All @@ -215,10 +222,12 @@ def test_show_results_option(self):
self.assertContains(response, molo_survey_page.title)
self.assertContains(response, molo_survey_page.introduction)
self.assertContains(response, molo_survey_form_field.label)

response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)
key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)
self.assertContains(response, 'Results')
self.assertContains(response, molo_survey_form_field.label)
Expand All @@ -238,18 +247,23 @@ def test_show_results_as_percentage_option(self):
self.assertContains(response, molo_survey_page.title)
self.assertContains(response, molo_survey_page.introduction)
self.assertContains(response, molo_survey_form_field.label)

response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)
key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)
self.assertContains(response, 'Results')
self.assertContains(response, molo_survey_form_field.label)
self.assertContains(response, 'python</span> 100%')

response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'java'
}, follow=True)
key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'java'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)
self.assertContains(response, 'Results')
self.assertContains(response, molo_survey_form_field.label)
Expand Down Expand Up @@ -278,9 +292,12 @@ def test_multi_step_option(self):
self.assertContains(response, molo_survey_form_field.label)
self.assertNotContains(response, extra_molo_survey_form_field.label)
self.assertContains(response, 'Next Question')

key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(molo_survey_page.url + '?p=2', {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
key: 'python'
})

self.assertContains(response, molo_survey_page.title)
Expand All @@ -289,10 +306,15 @@ def test_multi_step_option(self):
self.assertContains(response, extra_molo_survey_form_field.label)
self.assertContains(response, molo_survey_page.submit_text)

response = self.client.post(molo_survey_page.url + '?p=3', {
extra_molo_survey_form_field.label.lower().replace(' ', '-'):
'Steven Seagal ;)'
}, follow=True)
key = '{}-{}'.format(
extra_molo_survey_form_field.pk,
extra_molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url + '?p=3',
{key: 'Steven Seagal ;)'},
follow=True
)

self.assertContains(response, molo_survey_page.thank_you_text)

Expand All @@ -316,10 +338,12 @@ def test_can_submit_after_validation_error(self):

self.assertContains(response, 'This field is required.')

response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)

key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)

def test_multi_step_multi_submissions_anonymous(self):
Expand Down Expand Up @@ -423,13 +447,20 @@ def test_can_see_translated_survey_submissions_in_admin(self):
self.assertContains(response, 'French translation of Test Survey')

# Submit responses to both surveys
key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'):
'an english answer'
key: 'an english answer'
})

key = '{}-{}'.format(
translated_survey_form_field.pk,
translated_survey_form_field.label.lower().replace(' ', '-')
)
self.client.post(translated_survey.url, {
translated_survey_form_field.label.lower().replace(' ', '-'):
'a french answer'
key: 'a french answer'
})

# Check the responses are shown on the submission pages
Expand Down Expand Up @@ -586,9 +617,12 @@ def test_survey_list_display_direct_logged_in(self):
self.assertNotContains(response, 'Please log in to take this survey')
self.assertContains(response, molo_survey_form_field.label)

response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)
key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)

self.assertContains(response, molo_survey_page.thank_you_text)

Expand All @@ -608,9 +642,12 @@ def test_anonymous_submissions_option_display_direct(self):
response = self.client.get('/')

self.assertContains(response, molo_survey_form_field.label)
response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)
key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)

response = self.client.get('/')
Expand All @@ -627,9 +664,13 @@ def test_multiple_submissions_display_direct(self):
)

self.user = self.login()
response = self.client.post(molo_survey_page.url, {
molo_survey_form_field.label.lower().replace(' ', '-'): 'python'
}, follow=True)

key = '{}-{}'.format(
molo_survey_form_field.pk,
molo_survey_form_field.label.lower().replace(' ', '-')
)
response = self.client.post(
molo_survey_page.url, {key: 'python'}, follow=True)
self.assertContains(response, molo_survey_page.thank_you_text)

response = self.client.get('/')
Expand Down

0 comments on commit b4ca0b3

Please sign in to comment.