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))
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)
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)
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))
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))
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))
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)
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)
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))
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))
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)
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)
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)
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
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))