|
11 | 11 | from django.urls import reverse |
12 | 12 | from django.utils import timezone as tz |
13 | 13 | from django.utils.html import escape |
| 14 | +from django.views import View |
14 | 15 |
|
15 | 16 | from dojo.authorization.authorization import ( |
16 | 17 | user_has_configuration_permission, |
|
36 | 37 | EditChoiceQuestionForm, |
37 | 38 | EditQuestionnaireQuestionsForm, |
38 | 39 | EditTextQuestionForm, |
| 40 | + ExistingEngagementForm, |
39 | 41 | ) |
40 | 42 | from dojo.models import ( |
41 | 43 | Answer, |
@@ -866,3 +868,57 @@ def engagement_empty_survey(request, esid): |
866 | 868 | top_level=False, |
867 | 869 | request=request) |
868 | 870 | return render(request, "defectDojo-engagement-survey/add_engagement.html", {"form": form}) |
| 871 | + |
| 872 | + |
| 873 | +class ExistingEngagementEmptySurveyView(View): |
| 874 | + def get(self, request, esid): |
| 875 | + survey = get_object_or_404(Answered_Survey, id=esid) |
| 876 | + if survey.engagement: |
| 877 | + # If the questionnaire is already linked to a survey, ensure the user has permission to edit it |
| 878 | + user_has_permission_or_403(request.user, survey.engagement, Permissions.Engagement_Edit) |
| 879 | + # Prepopulate the form with the current engagement |
| 880 | + form = self.get_form_class()({"engagement": survey.engagement}) |
| 881 | + else: |
| 882 | + form = self.get_form_class()() |
| 883 | + self.add_breadcrumb(request) |
| 884 | + return render(request, self.get_template(), {"form": form}) |
| 885 | + |
| 886 | + def post(self, request, esid): |
| 887 | + survey = get_object_or_404(Answered_Survey, id=esid) |
| 888 | + form = self.get_form_class()(request.POST) |
| 889 | + if form.is_valid(): |
| 890 | + # Validate perms on the target engagement |
| 891 | + engagement = form.cleaned_data.get("engagement") |
| 892 | + user_has_permission_or_403(request.user, engagement, Permissions.Engagement_Edit) |
| 893 | + # If we're moving a questionnaire, make sure the user can edit the 'source' engagement too |
| 894 | + if survey.engagement: |
| 895 | + user_has_permission_or_403(request.user, survey.engagement, Permissions.Engagement_Edit) |
| 896 | + # Link and save |
| 897 | + survey.engagement = engagement |
| 898 | + survey.save() |
| 899 | + messages.add_message( |
| 900 | + request, |
| 901 | + messages.SUCCESS, |
| 902 | + "Questionnaire successfully linked to Engagement.", |
| 903 | + extra_tags="alert-success") |
| 904 | + return HttpResponseRedirect(reverse("view_engagement", args=(engagement.id,))) |
| 905 | + |
| 906 | + messages.add_message( |
| 907 | + request, |
| 908 | + messages.ERROR, |
| 909 | + "Questionnaire could not be linked to the selected Engagement.", |
| 910 | + extra_tags="alert-danger") |
| 911 | + self.add_breadcrumb(request) |
| 912 | + return render(request, self.get_template(), {"form": form}) |
| 913 | + |
| 914 | + def add_breadcrumb(self, request): |
| 915 | + add_breadcrumb( |
| 916 | + title="Link Questionnaire to existing Engagement", |
| 917 | + top_level=False, |
| 918 | + request=request) |
| 919 | + |
| 920 | + def get_form_class(self): |
| 921 | + return ExistingEngagementForm |
| 922 | + |
| 923 | + def get_template(self): |
| 924 | + return "defectDojo-engagement-survey/existing_engagement.html" |
0 commit comments