Exemple #1
0
def questionnaire_copy(request, questionnaire_id):
    if request.method == "POST":
        questionnaire = Questionnaire()
        InlineQuestionFormset = inlineformset_factory(
            Questionnaire, Question, formset=AtLeastOneFormSet, form=QuestionForm, extra=1, exclude=("questionnaire",)
        )

        form = QuestionnaireForm(request.POST, instance=questionnaire)
        formset = InlineQuestionFormset(request.POST.copy(), instance=questionnaire, save_as_new=True)

        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()

            messages.success(request, _("Successfully created questionnaire."))
            return redirect("staff:questionnaire_index")
        else:
            return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset))
    else:
        questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id)
        InlineQuestionFormset = inlineformset_factory(
            Questionnaire,
            Question,
            formset=IdLessQuestionFormSet,
            form=QuestionForm,
            extra=1,
            exclude=("questionnaire",),
        )

        form = QuestionnaireForm(instance=questionnaire)
        formset = InlineQuestionFormset(instance=Questionnaire(), queryset=questionnaire.question_set.all())

        return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset))
Exemple #2
0
    def test_automatic_order_correction_on_type_change(self):
        mommy.make(Questionnaire, order=72, type=Questionnaire.BOTTOM)

        questionnaire = mommy.make(Questionnaire,
                                   order=7,
                                   type=Questionnaire.TOP)
        question = mommy.make(Question)

        data = {
            'description_de': questionnaire.description_de,
            'description_en': questionnaire.description_en,
            'name_de': questionnaire.name_de,
            'name_en': questionnaire.name_en,
            'public_name_en': questionnaire.public_name_en,
            'public_name_de': questionnaire.public_name_de,
            'questions-0-id': question.id,
            'order': questionnaire.order,
            'type': Questionnaire.BOTTOM,
            'visibility': 2,
        }

        form = QuestionnaireForm(instance=questionnaire, data=data)
        self.assertTrue(form.is_valid())
        questionnaire = form.save()
        self.assertEqual(questionnaire.order, 73)
Exemple #3
0
    def test_automatic_order_correction_on_type_change(self):
        baker.make(Questionnaire, order=72, type=Questionnaire.Type.BOTTOM)

        questionnaire = baker.make(Questionnaire,
                                   order=7,
                                   type=Questionnaire.Type.TOP)
        question = baker.make(Question)

        data = {
            "description_de": questionnaire.description_de,
            "description_en": questionnaire.description_en,
            "name_de": questionnaire.name_de,
            "name_en": questionnaire.name_en,
            "public_name_en": questionnaire.public_name_en,
            "public_name_de": questionnaire.public_name_de,
            "questions-0-id": question.id,
            "order": questionnaire.order,
            "type": Questionnaire.Type.BOTTOM,
            "visibility": 2,
        }

        form = QuestionnaireForm(instance=questionnaire, data=data)
        self.assertTrue(form.is_valid())
        questionnaire = form.save()
        self.assertEqual(questionnaire.order, 73)
Exemple #4
0
def questionnaire_create(request):
    questionnaire = Questionnaire()
    QuestionFormset = inlineformset_factory(Questionnaire, Question, formset=AtLeastOneFormSet, form=QuestionForm, extra=1, exclude=('questionnaire',))

    form = QuestionnaireForm(request.POST or None, instance=questionnaire)
    formset = QuestionFormset(request.POST or None, instance=questionnaire)

    if form.is_valid() and formset.is_valid():
        form.save()
        formset.save()

        messages.success(request, _("Successfully created questionnaire."))
        return redirect('evap.staff.views.questionnaire_index')
    else:
        return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset))
Exemple #5
0
def questionnaire_new_version(request, questionnaire_id):
    old_questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id)

    if old_questionnaire.obsolete:
        raise PermissionDenied

    # Check if we can use the old name with the current time stamp.
    timestamp = datetime.date.today()
    new_name_de = '{} (until {})'.format(old_questionnaire.name_de, str(timestamp))
    new_name_en = '{} (until {})'.format(old_questionnaire.name_en, str(timestamp))

    # If not, redirect back and suggest to edit the already created version.
    if Questionnaire.objects.filter(Q(name_de=new_name_de) | Q(name_en=new_name_en)):
        messages.error(request, _("Questionnaire creation aborted. A new version was already created today."))
        return redirect('staff:questionnaire_index')

    if request.method == "POST":
        questionnaire = Questionnaire()
        InlineQuestionFormset = inlineformset_factory(Questionnaire, Question, formset=AtLeastOneFormSet,
                                                      form=QuestionForm, extra=1, exclude=('questionnaire',))

        form = QuestionnaireForm(request.POST, instance=questionnaire)
        formset = InlineQuestionFormset(request.POST.copy(), instance=questionnaire, save_as_new=True)

        try:
            with transaction.atomic():
                # Change old name before checking Form.
                old_questionnaire.name_de = new_name_de
                old_questionnaire.name_en = new_name_en
                old_questionnaire.obsolete = True
                old_questionnaire.save()

                if form.is_valid() and formset.is_valid():
                    form.save()
                    formset.save()
                    messages.success(request, _("Successfully created questionnaire."))
                    return redirect('staff:questionnaire_index')
                else:
                    raise IntegrityError
        except IntegrityError:
            return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset, editable=True))
    else:
        form, formset = get_identical_form_and_formset(old_questionnaire)
        return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset, editable=True))
Exemple #6
0
def questionnaire_create(request):
    questionnaire = Questionnaire()
    InlineQuestionFormset = inlineformset_factory(Questionnaire, Question, formset=AtLeastOneFormSet, form=QuestionForm, extra=1, exclude=('questionnaire',))

    form = QuestionnaireForm(request.POST or None, instance=questionnaire)
    formset = InlineQuestionFormset(request.POST or None, instance=questionnaire)

    if form.is_valid() and formset.is_valid():
        newQuestionnaire = form.save(commit=False)
        # set index according to existing questionnaires
        newQuestionnaire.index = Questionnaire.objects.all().aggregate(Max('index'))['index__max'] + 1
        newQuestionnaire.save()
        form.save_m2m()

        formset.save()

        messages.success(request, _("Successfully created questionnaire."))
        return redirect('staff:questionnaire_index')
    else:
        return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset))
Exemple #7
0
def questionnaire_edit(request, questionnaire_id):
    questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id)
    QuestionFormset = inlineformset_factory(Questionnaire, Question, formset=AtLeastOneFormSet, form=QuestionForm, extra=1, exclude=('questionnaire',))

    form = QuestionnaireForm(request.POST or None, instance=questionnaire)
    formset = QuestionFormset(request.POST or None, instance=questionnaire)

    if questionnaire.obsolete:
        messages.info(request, _("Obsolete questionnaires cannot be edited."))
        return redirect('evap.staff.views.questionnaire_index')

    if form.is_valid() and formset.is_valid():
        form.save()
        formset.save()

        messages.success(request, _("Successfully updated questionnaire."))
        return redirect('evap.staff.views.questionnaire_index')
    else:
        template_data = dict(questionnaire=questionnaire, form=form, formset=formset)
        return render(request, "staff_questionnaire_form.html", template_data)
Exemple #8
0
    def test_force_highest_order(self):
        mommy.make(Questionnaire, order=45, type=Questionnaire.TOP)

        question = mommy.make(Question)

        data = {
            'description_de': 'English description',
            'description_en': 'German description',
            'name_de': 'A name',
            'name_en': 'A german name',
            'public_name_en': 'A display name',
            'public_name_de': 'A german display name',
            'questions-0-id': question.id,
            'order': 0,
            'type': Questionnaire.TOP,
        }

        form = QuestionnaireForm(data=data)
        self.assertTrue(form.is_valid())
        questionnaire = form.save(force_highest_order=True)
        self.assertEqual(questionnaire.order, 46)
Exemple #9
0
    def test_force_highest_order(self):
        mommy.make(Questionnaire, order=45, type=Questionnaire.TOP)

        question = mommy.make(Question)

        data = {
            'description_de': 'English description',
            'description_en': 'German description',
            'name_de': 'A name',
            'name_en': 'A german name',
            'public_name_en': 'A display name',
            'public_name_de': 'A german display name',
            'questions-0-id': question.id,
            'order': 0,
            'type': Questionnaire.TOP,
        }

        form = QuestionnaireForm(data=data)
        self.assertTrue(form.is_valid())
        questionnaire = form.save(force_highest_order=True)
        self.assertEqual(questionnaire.order, 46)
Exemple #10
0
def questionnaire_copy(request, questionnaire_id):
    copied_questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id)

    if request.method == "POST":
        questionnaire = Questionnaire()
        InlineQuestionFormset = inlineformset_factory(Questionnaire, Question, formset=AtLeastOneFormSet, form=QuestionForm, extra=1, exclude=('questionnaire',))

        form = QuestionnaireForm(request.POST, instance=questionnaire)
        formset = InlineQuestionFormset(request.POST.copy(), instance=questionnaire, save_as_new=True)

        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()

            messages.success(request, _("Successfully created questionnaire."))
            return redirect('staff:questionnaire_index')
        else:
            return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset, editable=True))
    else:
        form, formset = get_identical_form_and_formset(copied_questionnaire)
        return render(request, "staff_questionnaire_form.html", dict(form=form, formset=formset, editable=True))
Exemple #11
0
def questionnaire_create(request):
    questionnaire = Questionnaire()
    InlineQuestionFormset = inlineformset_factory(Questionnaire,
                                                  Question,
                                                  formset=AtLeastOneFormSet,
                                                  form=QuestionForm,
                                                  extra=1,
                                                  exclude=('questionnaire', ))

    form = QuestionnaireForm(request.POST or None, instance=questionnaire)
    formset = InlineQuestionFormset(request.POST or None,
                                    instance=questionnaire)

    if form.is_valid() and formset.is_valid():
        newQuestionnaire = form.save(commit=False)
        # set index according to existing questionnaires
        newQuestionnaire.index = Questionnaire.objects.all().aggregate(
            Max('index'))['index__max'] + 1
        newQuestionnaire.save()
        form.save_m2m()

        formset.save()

        messages.success(request, _("Successfully created questionnaire."))
        return redirect('staff:questionnaire_index')
    else:
        return render(request, "staff_questionnaire_form.html",
                      dict(form=form, formset=formset))
Exemple #12
0
def questionnaire_edit(request, questionnaire_id):
    questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id)
    InlineQuestionFormset = inlineformset_factory(
        Questionnaire, Question, formset=AtLeastOneFormSet, form=QuestionForm, extra=1, exclude=("questionnaire",)
    )

    form = QuestionnaireForm(request.POST or None, instance=questionnaire)
    formset = InlineQuestionFormset(request.POST or None, instance=questionnaire)

    if not questionnaire.can_staff_edit:
        messages.info(request, _("Questionnaires that are already used cannot be edited."))
        return redirect("staff:questionnaire_index")

    if form.is_valid() and formset.is_valid():
        form.save()
        formset.save()

        messages.success(request, _("Successfully updated questionnaire."))
        return redirect("staff:questionnaire_index")
    else:
        template_data = dict(questionnaire=questionnaire, form=form, formset=formset)
        return render(request, "staff_questionnaire_form.html", template_data)
Exemple #13
0
    def test_automatic_order_correction_on_type_change(self):
        mommy.make(Questionnaire, order=72, type=Questionnaire.BOTTOM)

        questionnaire = mommy.make(Questionnaire, order=7, type=Questionnaire.TOP)
        question = mommy.make(Question)

        data = {
            'description_de': questionnaire.description_de,
            'description_en': questionnaire.description_en,
            'name_de': questionnaire.name_de,
            'name_en': questionnaire.name_en,
            'public_name_en': questionnaire.public_name_en,
            'public_name_de': questionnaire.public_name_de,
            'questions-0-id': question.id,
            'order': questionnaire.order,
            'type': Questionnaire.BOTTOM,
        }

        form = QuestionnaireForm(instance=questionnaire, data=data)
        self.assertTrue(form.is_valid())
        questionnaire = form.save()
        self.assertEqual(questionnaire.order, 73)
Exemple #14
0
    def test_force_highest_order(self):
        baker.make(Questionnaire, order=45, type=Questionnaire.Type.TOP)

        question = baker.make(Question)

        data = {
            "description_de": "English description",
            "description_en": "German description",
            "name_de": "A name",
            "name_en": "A german name",
            "public_name_en": "A display name",
            "public_name_de": "A german display name",
            "questions-0-id": question.id,
            "order": 0,
            "type": Questionnaire.Type.TOP,
            "visibility": 2,
        }

        form = QuestionnaireForm(data=data)
        self.assertTrue(form.is_valid())
        questionnaire = form.save(force_highest_order=True)
        self.assertEqual(questionnaire.order, 46)
Exemple #15
0
def make_questionnaire_edit_forms(request, questionnaire, editable):
    if editable:
        InlineQuestionFormset = inlineformset_factory(
            Questionnaire,
            Question,
            formset=AtLeastOneFormSet,
            form=QuestionForm,
            extra=1,
            exclude=('questionnaire', ))
    else:
        question_count = questionnaire.question_set.count()
        InlineQuestionFormset = inlineformset_factory(
            Questionnaire,
            Question,
            formset=AtLeastOneFormSet,
            form=QuestionForm,
            extra=0,
            exclude=('questionnaire', ),
            can_delete=False,
            max_num=question_count,
            validate_max=True,
            min_num=question_count,
            validate_min=True)

    form = QuestionnaireForm(request.POST or None, instance=questionnaire)
    formset = InlineQuestionFormset(request.POST or None,
                                    instance=questionnaire)

    if not editable:
        editable_fields = [
            'staff_only', 'obsolete', 'name_de', 'name_en', 'description_de',
            'description_en'
        ]
        for name, field in form.fields.items():
            if name not in editable_fields:
                field.disabled = True
        for question_form in formset.forms:
            for name, field in question_form.fields.items():
                if name is not 'id':
                    field.disabled = True

    return form, formset
Exemple #16
0
def questionnaire_copy(request, questionnaire_id):
    if request.method == "POST":
        questionnaire = Questionnaire()
        InlineQuestionFormset = inlineformset_factory(
            Questionnaire,
            Question,
            formset=AtLeastOneFormSet,
            form=QuestionForm,
            extra=1,
            exclude=('questionnaire', ))

        form = QuestionnaireForm(request.POST, instance=questionnaire)
        formset = InlineQuestionFormset(request.POST.copy(),
                                        instance=questionnaire,
                                        save_as_new=True)

        if form.is_valid() and formset.is_valid():
            form.save()
            formset.save()

            messages.success(request, _("Successfully created questionnaire."))
            return redirect('staff:questionnaire_index')
        else:
            return render(request, "staff_questionnaire_form.html",
                          dict(form=form, formset=formset))
    else:
        questionnaire = get_object_or_404(Questionnaire, id=questionnaire_id)
        InlineQuestionFormset = inlineformset_factory(
            Questionnaire,
            Question,
            formset=AtLeastOneFormSet,
            form=QuestionForm,
            extra=1,
            exclude=('questionnaire', ))

        form = QuestionnaireForm(instance=questionnaire)
        formset = InlineQuestionFormset(
            instance=questionnaire, queryset=questionnaire.question_set.all())

        return render(request, "staff_questionnaire_form.html",
                      dict(form=form, formset=formset))