Example #1
0
 def post(self, request, *args, **kwargs):
     user_country = self.request.user.user_profile.country
     questionnaire = Questionnaire.objects.get(id=self.kwargs['questionnaire_id'])
     user_questionnaire = UserQuestionnaireService(user_country, questionnaire)
     if not user_questionnaire.required_sections_answered():
         return self._reload_section_with_required_answers_errors(request, user_questionnaire, *args, **kwargs)
     return self._submit_answers(request, user_questionnaire, *args, **kwargs)
Example #2
0
    def post(self, request, *args, **kwargs):
        questionnaire = Questionnaire.objects.get(
            id=self.kwargs['questionnaire_id'])
        section = Section.objects.get(id=self.kwargs['section_id'])
        user_questionnaire_service = UserQuestionnaireService(
            self.request.user, questionnaire)
        initial = {
            'country': self.request.user.user_profile.country,
            'status': 'Draft',
            'version': user_questionnaire_service.answer_version()
        }
        formsets = QuestionnaireEntryFormService(section,
                                                 initial=initial,
                                                 data=request.POST)

        context = {
            'questionnaire': questionnaire,
            'section': section,
            'formsets': formsets,
            'ordered_sections': Section.objects.order_by('order')
        }

        if formsets.is_valid():
            return self._form_valid(request, formsets,
                                    user_questionnaire_service, context)
        return self._form_invalid(request, context)
Example #3
0
    def test_user_knows_its_documents_in_a_questionnaire(self):
        m = mock_open()
        with patch('__main__.open', m, create=True):
            filename = "some_filename.txt"
            with open(filename, 'w') as document:
                document.write("Some stuff")
            self.document = open(filename, 'rb')


        document_in = SupportDocument.objects.create(path=File(self.document), country=self.country,
                                                   questionnaire=self.questionnaire)
        questionnaire_2 = Questionnaire.objects.create(name="haha", year=2013)
        document_not_in = SupportDocument.objects.create(path=File(self.document), country=self.country,
                                                   questionnaire=questionnaire_2)


        user_service = UserQuestionnaireService(self.country, self.questionnaire)
        documents = user_service.attachments()

        self.assertEqual(1, documents.count())
        self.assertIn(document_in, documents)
        self.assertNotIn(document_not_in, documents)

        os.system("rm -rf %s" % filename)
        os.system("rm -rf media/user_uploads/*")
Example #4
0
    def test_user_knows_answer_version_of_questionnaire_is_plus_1_of_the_latest_submitted_answers(
            self):
        data = self.data.copy()

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1,
                                                       question=self.question1,
                                                       **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(
            data['Number-0-response']),
                                                      question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(
            data['Number-1-response']),
                                                      question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(
            grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        user_service.submit()

        self.assertEqual(self.initial['version'] + 1,
                         user_service.answer_version())
Example #5
0
    def test_should_return_invalid_section_answers_and_the_corresponding_formset(
            self):
        data = self.data.copy()

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1,
                                                       question=self.question1,
                                                       **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(
            data['Number-0-response']),
                                                      question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(
            data['Number-1-response']),
                                                      question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(
            grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        required_question = Question.objects.create(text='required',
                                                    UID='C00330',
                                                    answer_type='Number',
                                                    is_required=True)
        self.question_group.question.add(required_question)
        QuestionGroupOrder.objects.create(question_group=self.question_group,
                                          question=required_question,
                                          order=4)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)

        self.assertFalse(user_service.required_sections_answered())
        self.assertEqual(self.section_1, user_service.unanswered_section)
Example #6
0
    def test_knows_all_sections_questionnaire_entry_services(self):
        section_2 = Section.objects.create(title="section 2",
                                           order=2,
                                           questionnaire=self.questionnaire,
                                           name="section 2")
        section_3 = Section.objects.create(title="section 3",
                                           order=3,
                                           questionnaire=self.questionnaire,
                                           name="section 3")

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        all_section_questionnaires = user_service.all_sections_questionnaires()

        self.assertEqual(3, len(all_section_questionnaires))
        self.assertIsInstance(all_section_questionnaires[self.section_1],
                              QuestionnaireEntryFormService)
        self.assertEqual(self.section_1,
                         all_section_questionnaires[self.section_1].section)
        self.assertIsInstance(all_section_questionnaires[section_2],
                              QuestionnaireEntryFormService)
        self.assertEqual(section_2,
                         all_section_questionnaires[section_2].section)
        self.assertIsInstance(all_section_questionnaires[section_3],
                              QuestionnaireEntryFormService)
        self.assertEqual(section_3,
                         all_section_questionnaires[section_3].section)
Example #7
0
    def test_submit_changes_draft_answers_to_submitted_and_not_create_new_instances(self):
        data = self.data

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2, **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3, **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user.user_profile.country, self.questionnaire)
        user_service.submit()

        primary = MultiChoiceAnswer.objects.get(response__id=int(data['MultiChoice-0-response']), question=self.question1)
        answer_1 = NumericalAnswer.objects.get(response=int(data['Number-0-response']), question=self.question2)
        answer_2 = NumericalAnswer.objects.get(response=int(data['Number-1-response']), question=self.question3)

        self.assertEqual(old_primary.id, primary.id)
        self.assertEqual(Answer.SUBMITTED_STATUS, primary.status)

        self.assertEqual(old_answer_1.id, answer_1.id)
        self.assertEqual(Answer.SUBMITTED_STATUS, answer_1.status)

        self.assertEqual(old_answer_2.id, answer_2.id)
        self.assertEqual(Answer.SUBMITTED_STATUS, answer_2.status)

        answer_group = AnswerGroup.objects.filter(grouped_question=self.question_group)
        self.assertEqual(1, answer_group.count())
Example #8
0
    def test_user_knows_its_country_answers(self):
        data = self.data

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1,
                                                       question=self.question1,
                                                       **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(
            data['Number-0-response']),
                                                      question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(
            data['Number-1-response']),
                                                      question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(
            grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        user_answers = user_service.all_answers()

        self.assertEqual(3, len(user_answers))

        self.assertIn(old_primary, user_answers)
        self.assertIn(old_answer_1, user_answers)
        self.assertIn(old_answer_2, user_answers)
 def get(self, request, *args, **kwargs):
     if kwargs.get('questionnaire_id'):
         questionnaire = Questionnaire.objects.get(id=kwargs.get('questionnaire_id'))
     else:
         questionnaire = Questionnaire.objects.get(status=Questionnaire.PUBLISHED)
     user_questionnaire_service = UserQuestionnaireService(self.request.user, questionnaire)
     context = {'all_sections_questionnaires': user_questionnaire_service.all_sections_questionnaires(),
                'ordered_sections': questionnaire.sections.order_by('order')}
     return render(request, self.template_name, context)
Example #10
0
 def post(self, request, *args, **kwargs):
     questionnaire = Questionnaire.objects.get(
         status=Questionnaire.PUBLISHED)
     user_questionnaire = UserQuestionnaireService(self.request.user,
                                                   questionnaire)
     if not user_questionnaire.required_sections_answered():
         return self._reload_section_with_required_answers_errors(
             request, user_questionnaire, *args, **kwargs)
     return self._submit_answers(request, user_questionnaire, *args,
                                 **kwargs)
Example #11
0
    def test_user_knows_answers_given_questionnaire(self):
        data = self.data
        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        other_questionnaire = Questionnaire.objects.create(name="JRF 2013 Core English",
                                                           description="From dropbox as given by Rouslan")
        other_section_1 = Section.objects.create(title="Reported Cases of Selected Vaccine Preventable Diseases (VPDs)",
                                                 order=1, questionnaire=other_questionnaire, name="Reported Cases")
        other_sub_section = SubSection.objects.create(title="Reported cases for the year 2013", order=1,
                                                      section=other_section_1)
        other_question1 = Question.objects.create(text='Disease', UID='C00011', answer_type='Number')
        other_question_group = QuestionGroup.objects.create(subsection=other_sub_section, order=1)
        other_question_group.question.add(other_question1)
        other_answer_1 = NumericalAnswer.objects.create(response=1, question=other_question1)

        section_2 = Section.objects.create(title="Section 2", order=2, questionnaire=self.questionnaire,
                                           name="section2")
        sub_section2 = SubSection.objects.create(title="subsection 2", order=1, section=section_2)
        question1 = Question.objects.create(text='question 1', UID='C00013', answer_type='Number')
        question2 = Question.objects.create(text='question 2', UID='C00014', answer_type='Number')

        question_group = QuestionGroup.objects.create(subsection=sub_section2, order=1)
        question_group.question.add(question1, question2)

        QuestionGroupOrder.objects.create(question=question1, order=1, question_group=question_group)
        QuestionGroupOrder.objects.create(question=question2, order=2, question_group=question_group)

        answer_1 = NumericalAnswer.objects.create(response=1, question=question1, status=Answer.DRAFT_STATUS,
                                                  country=self.country, questionnaire=self.questionnaire)
        answer_2 = NumericalAnswer.objects.create(response=2, question=question2, status=Answer.DRAFT_STATUS,
                                                  country=self.country, questionnaire=self.questionnaire)

        answer_group = AnswerGroup.objects.create(grouped_question=question_group)
        answer_group.answer.add(answer_1, answer_2)

        user_service = UserQuestionnaireService(self.user.user_profile.country, self.questionnaire)
        user_answers = user_service.questionnaire_answers()

        self.assertEqual(5, len(user_answers))

        self.assertIn(old_primary, user_answers)
        self.assertIn(old_answer_1, user_answers)
        self.assertIn(old_answer_2, user_answers)
        self.assertNotIn(other_answer_1, user_answers)

        self.assertIn(answer_1, user_answers)
        self.assertIn(answer_2, user_answers)
Example #12
0
    def test_user_knows_answer_version_of_questionnaire_is_the_same_as_draft_if_draft_exists(self):
        data = self.data

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2, **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3, **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        self.assertEqual(self.initial['version'], user_service.answer_version())
Example #13
0
class UploadDocument(AdvancedMultiplePermissionsRequiredMixin, CreateView):
    GET_permissions = {'any': ('auth.can_submit_responses', 'auth.can_view_users', 'auth.can_edit_questionnaire')}
    POST_permissions = {'any': ('auth.can_submit_responses', )}
    model = SupportDocument
    template_name = 'questionnaires/entry/upload.html'
    form_class = SupportDocumentUploadForm
    success_url = None

    def get(self, request, *args, **kwargs):
        self.questionnaire = Questionnaire.objects.get(id=kwargs.get('questionnaire_id'))
        self.success_url = reverse('upload_document', args=(self.questionnaire.id, ))
        self.user_questionnaire_service = UserQuestionnaireService(get_country(self.request), self.questionnaire)
        return super(UploadDocument, self).get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.questionnaire = Questionnaire.objects.get(id=kwargs.get('questionnaire_id'))
        self.success_url = reverse('upload_document', args=(self.questionnaire.id, ))
        self.user_questionnaire_service = UserQuestionnaireService(get_country(self.request), self.questionnaire)
        return super(UploadDocument, self).post(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(UploadDocument, self).get_context_data(**kwargs)
        upload_data_initial = {'questionnaire': self.questionnaire, 'country': get_country(self.request)}
        attachments = self.user_questionnaire_service.attachments()
        initial = {'questionnaire': self.questionnaire, 'user': self.request.user}
        context.update({'upload_form': self.form_class(initial=upload_data_initial),
                        'button_label': 'Upload', 'id': 'id-upload-form', 'questionnaire': self.questionnaire,
                        'action': reverse('upload_document', args=(self.questionnaire.id,)),
                        'documents': attachments,
                        'section_form': SectionForm(initial=initial),
                        'ordered_sections': self.questionnaire.sections.order_by('order'),
                        'preview': self._check_preview_mode(),
                        'new_section_action': reverse("new_section_page", args=(self.questionnaire.id,))})
        return context

    def _check_preview_mode(self):
        return self.user_questionnaire_service.preview() or self.questionnaire.is_finalized() or \
               self.questionnaire.is_published() or 'preview' in self.request.GET

    def form_valid(self, form):
        messages.success(self.request, "File was uploaded successfully")
        return super(UploadDocument, self).form_valid(form)

    def form_invalid(self, form):
        return render(self.request, self.template_name, {'upload_form': form,
                                                         'button_label': 'Upload', 'id': 'id-upload-form',
                                                         'questionnaire': self.questionnaire,
                                                         'documents': self.user_questionnaire_service.attachments(),
                                                         'ordered_sections': self.questionnaire.sections.order_by(
                                                             'order')})
Example #14
0
    def test_knows_all_sections_questionnaire_entry_services(self):
        section_2 = Section.objects.create(title="section 2", order=2, questionnaire=self.questionnaire, name="section 2")
        section_3 = Section.objects.create(title="section 3", order=3, questionnaire=self.questionnaire, name="section 3")

        user_service = UserQuestionnaireService(self.user.user_profile.country, self.questionnaire)
        all_section_questionnaires = user_service.all_sections_questionnaires()

        self.assertEqual(3, len(all_section_questionnaires))
        self.assertIsInstance(all_section_questionnaires[self.section_1], QuestionnaireEntryFormService)
        self.assertEqual(self.section_1, all_section_questionnaires[self.section_1].section)
        self.assertIsInstance(all_section_questionnaires[section_2], QuestionnaireEntryFormService)
        self.assertEqual(section_2, all_section_questionnaires[section_2].section)
        self.assertIsInstance(all_section_questionnaires[section_3], QuestionnaireEntryFormService)
        self.assertEqual(section_3, all_section_questionnaires[section_3].section)
Example #15
0
    def test_user_knows_answer_version_of_questionnaire_is_plus_1_of_the_latest_submitted_answers(self):
        data = self.data.copy()

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2, **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3, **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        user_service.submit()

        self.assertEqual(self.initial['version']+1, user_service.answer_version())
Example #16
0
    def post(self, request, *args, **kwargs):
        questionnaire = Questionnaire.objects.get(id=self.kwargs['questionnaire_id'])
        section = Section.objects.get(id=self.kwargs['section_id'])
        user_questionnaire_service = UserQuestionnaireService(self.request.user, questionnaire)
        initial = {'country': self.request.user.user_profile.country, 'status': 'Draft',
                   'version': user_questionnaire_service.answer_version()}
        formsets = QuestionnaireEntryFormService(section, initial=initial, data=request.POST)

        context = {'questionnaire': questionnaire, 'section': section,
                   'formsets': formsets, 'ordered_sections': Section.objects.order_by('order')}

        if formsets.is_valid():
            return self._form_valid(request, formsets, user_questionnaire_service, context)
        return self._form_invalid(request, context)
Example #17
0
 def get(self, request, *args, **kwargs):
     if kwargs.get('questionnaire_id'):
         questionnaire = Questionnaire.objects.get(
             id=kwargs.get('questionnaire_id'))
     else:
         questionnaire = Questionnaire.objects.get(
             status=Questionnaire.PUBLISHED)
     user_questionnaire_service = UserQuestionnaireService(
         self.request.user, questionnaire)
     context = {
         'all_sections_questionnaires':
         user_questionnaire_service.all_sections_questionnaires(),
         'ordered_sections':
         questionnaire.sections.order_by('order')
     }
     return render(request, self.template_name, context)
Example #18
0
    def get(self, request, *args, **kwargs):
        query_params = {'id': self.kwargs['questionnaire_id'],
                        'region__in': get_regions(request), 'status__in': get_questionnaire_status(request)}
        query_params = filter_empty_values(query_params)
        questionnaire = Questionnaire.objects.get(**query_params)
        section = Section.objects.get(id=self.kwargs['section_id'])
        country = get_country(self.request)
        self.user_questionnaire_service = UserQuestionnaireService(country, questionnaire, request.GET.get("version"))
        get_version = self.user_questionnaire_service.GET_version
        initial = {'status': 'Draft', 'country': country,
                   'version': get_version, 'questionnaire': questionnaire}
        required_answers = 'show' in request.GET
        formsets = QuestionnaireEntryFormService(section, initial=initial, highlight=required_answers,
                                                 edit_after_submit=self.user_questionnaire_service.edit_after_submit)
        printable = 'printable' in request.GET
        version = request.GET.get('version', None)
        preview = self._check_preview_mode(questionnaire)
        region = self.request.user.user_profile.region

        section_initial = {'questionnaire': questionnaire, 'region': region, 'user': request.user}
        context = {'questionnaire': questionnaire,
                   'section': section, 'printable': printable,
                   'preview': preview, 'formsets': formsets,
                   'ordered_sections': questionnaire.sections.order_by('order'),
                   'section_form': SectionForm(initial=section_initial),
                   'new_section_action': reverse('new_section_page', args=(questionnaire.id, )),
                   'subsection_form': SubSectionForm(initial=section_initial),
                   'subsection_action': reverse('new_subsection_page', args=(questionnaire.id, section.id)),
                   'the_version': version or get_version,
                   'country': country,
                   'documents': self.user_questionnaire_service.attachments()}
        # slow in some instances take 1.5 secs
        return self.render_to_response(context)
Example #19
0
    def test_knows_unanswered_required_question_in_section(self):
        data = self.data.copy()

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2, **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3, **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        required_question = Question.objects.create(text='required', UID='C00330', answer_type='Number', is_required=True)
        self.question_group.question.add(required_question)
        QuestionGroupOrder.objects.create(question_group=self.question_group, question=required_question, order=4)

        user_service = UserQuestionnaireService(self.user.user_profile.country, self.questionnaire)

        self.assertFalse(user_service.answered_required_questions_in(self.section_1))
Example #20
0
    def test_user_knows_answers_given_questionnaire_and_version(self):
        data = self.data
        version_1_primary_answer = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1,
                                                                    **self.initial)
        version_1_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']),
                                                            question=self.question2, **self.initial)
        version_1_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']),
                                                            question=self.question3, **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(version_1_answer_1, version_1_answer_2, version_1_primary_answer)

        user_service = UserQuestionnaireService(self.user.user_profile.country, self.questionnaire, version=1)
        user_answers = user_service.questionnaire_answers()

        self.assertEqual(3, len(user_answers))

        self.assertIn(version_1_primary_answer, user_answers)
        self.assertIn(version_1_answer_1, user_answers)
        self.assertIn(version_1_answer_2, user_answers)

        version_1_primary_answer.status = Answer.SUBMITTED_STATUS
        version_1_primary_answer.save()
        version_1_answer_1.status = Answer.SUBMITTED_STATUS
        version_1_answer_1.save()
        version_1_answer_2.status = Answer.SUBMITTED_STATUS
        version_1_answer_2.save()
        initial = self.initial.copy()
        del initial['version']
        version_2_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, version=2,
                                                             **initial)
        version_2_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']),
                                                            question=self.question2, version=2, **initial)
        version_2_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']),
                                                            question=self.question3, version=2, **initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(version_2_primary, version_2_answer_1, version_2_answer_2)

        user_service = UserQuestionnaireService(self.country, self.questionnaire, version=2)
        user_answers = user_service.questionnaire_answers()
        self.assertEqual(3, len(user_answers))

        self.assertIn(version_2_primary, user_answers)
        self.assertIn(version_2_answer_1, user_answers)
        self.assertIn(version_2_answer_2, user_answers)
Example #21
0
    def test_user_knows_if_he_should_see_preview_when_status_is_submitted(self):
        data = self.data
        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_country = self.user.user_profile.country
        user_service = UserQuestionnaireService(user_country, self.questionnaire)

        self.assertFalse(user_service.preview())
        user_service.submit()
        self.assertTrue(user_service.preview())
Example #22
0
    def test_submit_changes_draft_answers_to_submitted_and_not_create_new_instances(
            self):
        data = self.data

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1,
                                                       question=self.question1,
                                                       **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(
            data['Number-0-response']),
                                                      question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(
            data['Number-1-response']),
                                                      question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(
            grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        user_service.submit()

        primary = MultiChoiceAnswer.objects.get(response__id=int(
            data['MultiChoice-0-response']),
                                                question=self.question1)
        answer_1 = NumericalAnswer.objects.get(response=int(
            data['Number-0-response']),
                                               question=self.question2)
        answer_2 = NumericalAnswer.objects.get(response=int(
            data['Number-1-response']),
                                               question=self.question3)

        self.assertEqual(old_primary.id, primary.id)
        self.assertEqual(Answer.SUBMITTED_STATUS, primary.status)

        self.assertEqual(old_answer_1.id, answer_1.id)
        self.assertEqual(Answer.SUBMITTED_STATUS, answer_1.status)

        self.assertEqual(old_answer_2.id, answer_2.id)
        self.assertEqual(Answer.SUBMITTED_STATUS, answer_2.status)

        answer_group = AnswerGroup.objects.filter(
            grouped_question=self.question_group)
        self.assertEqual(1, answer_group.count())
Example #23
0
    def test_user_knows_its_country_answers(self):
        data = self.data

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2, **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3, **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user.user_profile.country, self.questionnaire)
        user_answers = user_service.all_answers()

        self.assertEqual(3, len(user_answers))

        self.assertIn(old_primary, user_answers)
        self.assertIn(old_answer_1, user_answers)
        self.assertIn(old_answer_2, user_answers)
Example #24
0
    def test_should_return_invalid_section_answers_and_the_corresponding_formset(self):
        data = self.data.copy()

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1, question=self.question1, **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(data['Number-0-response']), question=self.question2, **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(data['Number-1-response']), question=self.question3, **self.initial)

        answer_group = AnswerGroup.objects.create(grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        required_question = Question.objects.create(text='required', UID='C00330', answer_type='Number', is_required=True)
        self.question_group.question.add(required_question)
        QuestionGroupOrder.objects.create(question_group=self.question_group, question=required_question, order=4)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)

        self.assertFalse(user_service.required_sections_answered())
        self.assertEqual(self.section_1, user_service.unanswered_section)
Example #25
0
    def post(self, request, *args, **kwargs):
        questionnaire = Questionnaire.objects.get(id=self.kwargs['questionnaire_id'])
        section = Section.objects.get(id=self.kwargs['section_id'])
        user_questionnaire_service = UserQuestionnaireService(self.request.user.user_profile.country, questionnaire)
        initial = {'country': self.request.user.user_profile.country, 'status': 'Draft',
                   'version': user_questionnaire_service.POST_version, 'questionnaire': questionnaire}
        formsets = QuestionnaireEntryFormService(section, initial=initial, data=request.POST,
                                                 edit_after_submit=user_questionnaire_service.edit_after_submit)

        context = {'questionnaire': questionnaire, 'section': section,
                   'formsets': formsets, 'ordered_sections': questionnaire.ordered_sections(),
                   'form': SectionForm(initial={'questionnaire': questionnaire, 'user': request.user}),
                   'new_section_action': reverse('new_section_page', args=(questionnaire.id, )),
                   'subsection_form': SubSectionForm(),
                   'subsection_action': reverse('new_subsection_page', args=(questionnaire.id, section.id)),
                   'documents': user_questionnaire_service.attachments()}

        if formsets.is_valid():
            return self._form_valid(request, formsets, context)
        return self._form_invalid(request, context)
Example #26
0
class UploadDocument(CreateView):
    model = SupportDocument
    template_name = 'questionnaires/entry/upload.html'
    form_class = SupportDocumentUploadForm
    success_url = None

    def get(self, request, *args, **kwargs):
        self.questionnaire = Questionnaire.objects.get(id=kwargs.get('questionnaire_id'))
        self.success_url = reverse('upload_document', args=(self.questionnaire.id, ))
        self.user_questionnaire_service = UserQuestionnaireService(self.request.user.user_profile.country, self.questionnaire)
        return super(UploadDocument, self).get(request, *args, **kwargs)

    def post(self, request, *args, **kwargs):
        self.questionnaire = Questionnaire.objects.get(id=kwargs.get('questionnaire_id'))
        self.success_url = reverse('upload_document', args=(self.questionnaire.id, ))
        self.user_questionnaire_service = UserQuestionnaireService(self.request.user.user_profile.country, self.questionnaire)
        return super(UploadDocument, self).post(request, *args, **kwargs)

    def get_context_data(self, **kwargs):
        context = super(UploadDocument, self).get_context_data(**kwargs)
        users_country = self.request.user.user_profile.country
        upload_data_initial = {'questionnaire': self.questionnaire, 'country': users_country}
        context.update({'upload_form': self.form_class(initial=upload_data_initial),
                        'button_label': 'Upload', 'id': 'id-upload-form', 'questionnaire': self.questionnaire,
                        'documents': self.user_questionnaire_service.attachments(),
                        'ordered_sections': self.questionnaire.sections.order_by('order'),
                        'preview': self.user_questionnaire_service.preview()})
        return context

    def form_valid(self, form):
        messages.success(self.request, "File was uploaded successfully")
        return super(UploadDocument, self).form_valid(form)

    def form_invalid(self, form):
        return render(self.request, self.template_name, {'upload_form': form,
                        'button_label': 'Upload', 'id': 'id-upload-form', 'questionnaire': self.questionnaire,
                        'documents': self.user_questionnaire_service.attachments(),
                        'ordered_sections': self.questionnaire.sections.order_by('order')})
Example #27
0
    def test_user_knows_answer_version_of_questionnaire_is_the_same_as_draft_if_draft_exists(
            self):
        data = self.data

        old_primary = MultiChoiceAnswer.objects.create(response=self.option1,
                                                       question=self.question1,
                                                       **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(
            data['Number-0-response']),
                                                      question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(
            data['Number-1-response']),
                                                      question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(
            grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        self.assertEqual(self.initial['version'],
                         user_service.answer_version())
Example #28
0
    def get(self, request, *args, **kwargs):
        questionnaire = Questionnaire.objects.get(id=self.kwargs['questionnaire_id'])
        section = Section.objects.get(id=self.kwargs['section_id'])
        user_questionnaire_service = UserQuestionnaireService(self.request.user.user_profile.country, questionnaire)
        initial = {'status': 'Draft', 'country': self.request.user.user_profile.country,
                   'version': user_questionnaire_service.GET_version, 'questionnaire': questionnaire}
        required_answers = 'show' in request.GET
        formsets = QuestionnaireEntryFormService(section, initial=initial, highlight=required_answers,
                                                 edit_after_submit=user_questionnaire_service.edit_after_submit)

        printable = 'printable' in request.GET
        preview = user_questionnaire_service.preview() or 'preview' in request.GET

        context = {'questionnaire': questionnaire,
                   'section': section, 'printable': printable,
                   'preview': preview, 'formsets': formsets,
                   'ordered_sections': questionnaire.sections.order_by('order'),
                   'form': SectionForm(initial={'questionnaire': questionnaire}),
                   'action': reverse('new_section_page', args=(questionnaire.id, )),
                   'subsection_form': SubSectionForm(),
                   'subsection_action': reverse('new_subsection_page', args=(questionnaire.id, section.id)),
                   'documents': user_questionnaire_service.attachments()}

        return self.render_to_response(context)
Example #29
0
 def test_user_knows_answer_version_of_questionnaire_is_1_if_no_answer_exist_yet(self):
     user_service = UserQuestionnaireService(self.user, self.questionnaire)
     self.assertEqual(1, user_service.answer_version())
     self.assertEqual(1, user_service.POST_version)
     self.assertEqual(1, user_service.GET_version)
Example #30
0
 def post(self, request, *args, **kwargs):
     self.questionnaire = Questionnaire.objects.get(id=kwargs.get('questionnaire_id'))
     self.success_url = reverse('upload_document', args=(self.questionnaire.id, ))
     self.user_questionnaire_service = UserQuestionnaireService(get_country(self.request), self.questionnaire)
     return super(UploadDocument, self).post(request, *args, **kwargs)
Example #31
0
 def test_user_knows_answer_version_of_questionnaire_is_0_if_no_answer_exist_yet(
         self):
     user_service = UserQuestionnaireService(self.user, self.questionnaire)
     self.assertEqual(0, user_service.answer_version())
Example #32
0
 def post(self, request, *args, **kwargs):
     questionnaire = Questionnaire.objects.get(status=Questionnaire.PUBLISHED)
     user_questionnaire = UserQuestionnaireService(self.request.user, questionnaire)
     if not user_questionnaire.required_sections_answered():
         return self._reload_section_with_required_answers_errors(request, user_questionnaire, *args, **kwargs)
     return self._submit_answers(request, user_questionnaire, *args, **kwargs)
Example #33
0
    def test_user_knows_answers_given_questionnaire(self):
        data = self.data
        old_primary = MultiChoiceAnswer.objects.create(response=self.option1,
                                                       question=self.question1,
                                                       **self.initial)
        old_answer_1 = NumericalAnswer.objects.create(response=int(
            data['Number-0-response']),
                                                      question=self.question2,
                                                      **self.initial)
        old_answer_2 = NumericalAnswer.objects.create(response=int(
            data['Number-1-response']),
                                                      question=self.question3,
                                                      **self.initial)

        answer_group = AnswerGroup.objects.create(
            grouped_question=self.question_group)
        answer_group.answer.add(old_primary, old_answer_1, old_answer_2)

        other_questionnaire = Questionnaire.objects.create(
            name="JRF 2013 Core English",
            description="From dropbox as given by Rouslan")
        other_section_1 = Section.objects.create(
            title=
            "Reported Cases of Selected Vaccine Preventable Diseases (VPDs)",
            order=1,
            questionnaire=other_questionnaire,
            name="Reported Cases")
        other_sub_section = SubSection.objects.create(
            title="Reported cases for the year 2013",
            order=1,
            section=other_section_1)
        other_question1 = Question.objects.create(text='Disease',
                                                  UID='C00011',
                                                  answer_type='Number')
        other_question_group = QuestionGroup.objects.create(
            subsection=other_sub_section, order=1)
        other_question_group.question.add(other_question1)
        other_answer_1 = NumericalAnswer.objects.create(
            response=1, question=other_question1)

        section_2 = Section.objects.create(title="Section 2",
                                           order=2,
                                           questionnaire=self.questionnaire,
                                           name="section2")
        sub_section2 = SubSection.objects.create(title="subsection 2",
                                                 order=1,
                                                 section=section_2)
        question1 = Question.objects.create(text='question 1',
                                            UID='C00013',
                                            answer_type='Number')
        question2 = Question.objects.create(text='question 2',
                                            UID='C00014',
                                            answer_type='Number')

        question_group = QuestionGroup.objects.create(subsection=sub_section2,
                                                      order=1)
        question_group.question.add(question1, question2)

        QuestionGroupOrder.objects.create(question=question1,
                                          order=1,
                                          question_group=question_group)
        QuestionGroupOrder.objects.create(question=question2,
                                          order=2,
                                          question_group=question_group)

        answer_1 = NumericalAnswer.objects.create(response=1,
                                                  question=question1,
                                                  status=Answer.DRAFT_STATUS,
                                                  country=self.country)
        answer_2 = NumericalAnswer.objects.create(response=2,
                                                  question=question2,
                                                  status=Answer.DRAFT_STATUS,
                                                  country=self.country)

        answer_group = AnswerGroup.objects.create(
            grouped_question=question_group)
        answer_group.answer.add(answer_1, answer_2)

        user_service = UserQuestionnaireService(self.user, self.questionnaire)
        user_answers = user_service.questionnaire_answers()

        self.assertEqual(5, len(user_answers))

        self.assertIn(old_primary, user_answers)
        self.assertIn(old_answer_1, user_answers)
        self.assertIn(old_answer_2, user_answers)
        self.assertNotIn(other_answer_1, user_answers)

        self.assertIn(answer_1, user_answers)
        self.assertIn(answer_2, user_answers)
Example #34
0
class Entry(DoesNotExistExceptionHandlerMixin, AdvancedMultiplePermissionsRequiredMixin, FormView):
    template_name = 'questionnaires/entry/index.html'
    model = Questionnaire
    GET_permissions = {'any': ('auth.can_submit_responses', 'auth.can_view_users', 'auth.can_edit_questionnaire')}
    POST_permissions = {'any': ('auth.can_submit_responses', )}

    def get(self, request, *args, **kwargs):
        query_params = {'id': self.kwargs['questionnaire_id'],
                        'region__in': get_regions(request), 'status__in': get_questionnaire_status(request)}
        query_params = filter_empty_values(query_params)
        questionnaire = Questionnaire.objects.get(**query_params)
        section = Section.objects.get(id=self.kwargs['section_id'])
        country = get_country(self.request)
        self.user_questionnaire_service = UserQuestionnaireService(country, questionnaire, request.GET.get("version"))
        get_version = self.user_questionnaire_service.GET_version
        initial = {'status': 'Draft', 'country': country,
                   'version': get_version, 'questionnaire': questionnaire}
        required_answers = 'show' in request.GET
        formsets = QuestionnaireEntryFormService(section, initial=initial, highlight=required_answers,
                                                 edit_after_submit=self.user_questionnaire_service.edit_after_submit)
        printable = 'printable' in request.GET
        version = request.GET.get('version', None)
        preview = self._check_preview_mode(questionnaire)
        region = self.request.user.user_profile.region

        section_initial = {'questionnaire': questionnaire, 'region': region, 'user': request.user}
        context = {'questionnaire': questionnaire,
                   'section': section, 'printable': printable,
                   'preview': preview, 'formsets': formsets,
                   'ordered_sections': questionnaire.sections.order_by('order'),
                   'section_form': SectionForm(initial=section_initial),
                   'new_section_action': reverse('new_section_page', args=(questionnaire.id, )),
                   'subsection_form': SubSectionForm(initial=section_initial),
                   'subsection_action': reverse('new_subsection_page', args=(questionnaire.id, section.id)),
                   'the_version': version or get_version,
                   'country': country,
                   'documents': self.user_questionnaire_service.attachments()}
        # slow in some instances take 1.5 secs
        return self.render_to_response(context)

    def _check_preview_mode(self, questionnaire):
        user = self.request.user
        perm = None
        if user.has_perm('auth.can_edit_questionnaire'):
            perm = questionnaire.is_finalized() or questionnaire.is_published()
        return perm or self.user_questionnaire_service.preview() or 'preview' in self.request.GET

    def post(self, request, *args, **kwargs):
        questionnaire = Questionnaire.objects.get(id=self.kwargs['questionnaire_id'])
        section = Section.objects.get(id=self.kwargs['section_id'])
        user_questionnaire_service = UserQuestionnaireService(self.request.user.user_profile.country, questionnaire)
        initial = {'country': self.request.user.user_profile.country, 'status': 'Draft',
                   'version': user_questionnaire_service.POST_version, 'questionnaire': questionnaire}
        formsets = QuestionnaireEntryFormService(section, initial=initial, data=request.POST,
                                                 edit_after_submit=user_questionnaire_service.edit_after_submit)

        context = {'questionnaire': questionnaire, 'section': section,
                   'formsets': formsets, 'ordered_sections': questionnaire.ordered_sections(),
                   'form': SectionForm(initial={'questionnaire': questionnaire, 'user': request.user}),
                   'new_section_action': reverse('new_section_page', args=(questionnaire.id, )),
                   'subsection_form': SubSectionForm(),
                   'subsection_action': reverse('new_subsection_page', args=(questionnaire.id, section.id)),
                   'documents': user_questionnaire_service.attachments()}

        if formsets.is_valid():
            return self._form_valid(request, formsets, context)
        return self._form_invalid(request, context)

    def _form_valid(self, request, formsets, context):
        formsets.save()
        message = 'Draft saved.'
        messages.success(request, message)
        if request.POST.get('redirect_url', None):
            return HttpResponseRedirect(request.POST['redirect_url'].replace('preview=1', ''))
        return self.render_to_response(context)

    def _form_invalid(self, request, context):
        message = 'Draft NOT saved. See errors below.'
        messages.error(request, message)
        return self.render_to_response(context)