9
9
from django .contrib .auth .mixins import LoginRequiredMixin
10
10
from django .core .exceptions import PermissionDenied
11
11
from django .core .files .uploadhandler import UploadFileException
12
- from django .http import HttpRequest , HttpResponse
12
+ from django .http import HttpRequest , HttpResponse , HttpResponseNotAllowed
13
13
from django .shortcuts import get_object_or_404 , redirect , render
14
14
from django .template .context_processors import csrf
15
15
from django .urls import reverse , reverse_lazy
16
16
from django .views import View
17
- from django .views .generic import DeleteView , FormView , UpdateView
17
+ from django .views .generic import (
18
+ DeleteView ,
19
+ FormView ,
20
+ UpdateView ,
21
+ DetailView ,
22
+ TemplateView ,
23
+ )
18
24
from django .views .generic .edit import CreateView
19
25
20
26
from home .models import Project
29
35
SurveyResponse ,
30
36
)
31
37
from .services .survey import InvalidInviteTokenException
38
+ from .exceptions import SurveyInactiveError
32
39
33
40
logger = logging .getLogger (__name__ )
34
41
@@ -169,6 +176,7 @@ def render_survey_config_view(self, request: HttpRequest, pk: int, is_post: bool
169
176
context = context ,
170
177
)
171
178
179
+
172
180
class SurveyDuplicateConfigView (LoginRequiredMixin , View ):
173
181
def get (self , request : HttpRequest , pk : int ):
174
182
survey = survey_service .get_survey (request .user , pk )
@@ -474,10 +482,12 @@ def render_survey_response_page(
474
482
):
475
483
476
484
try :
477
-
478
485
survey = survey_service .get_survey_from_token (token )
486
+ if not survey .is_active :
487
+ raise SurveyInactiveError ("Survey is not active." )
488
+
479
489
# Context for rendering
480
- context = {}
490
+ context = dict ()
481
491
482
492
if is_post :
483
493
# Only process if it's a post request
@@ -501,6 +511,9 @@ def render_survey_response_page(
501
511
except InvalidInviteTokenException :
502
512
return redirect ("survey_link_invalid" )
503
513
514
+ except SurveyInactiveError :
515
+ return redirect ("survey_response_inactive" )
516
+
504
517
505
518
class SurveyLinkInvalidView (View ):
506
519
"""
@@ -559,3 +572,72 @@ def form_valid(self, form):
559
572
560
573
def get_success_url (self ):
561
574
return reverse_lazy ("invite" , kwargs = dict (pk = self .kwargs ["pk" ]))
575
+
576
+
577
+ class SurveyActivateView (LoginRequiredMixin , DetailView ):
578
+ """
579
+ Activate response collection for this survey.
580
+ """
581
+
582
+ model = Survey
583
+
584
+ def get (self , request , * args , ** kwargs ):
585
+ """
586
+ We don't need to confirm activation, so no detail view template is used.
587
+ """
588
+ return HttpResponseNotAllowed (["POST" ])
589
+
590
+ def activate (self ):
591
+ """
592
+ Activate the survey.
593
+ """
594
+ self .object .is_active = True
595
+ self .object .save ()
596
+
597
+ def post (self , request , * args , ** kwargs ):
598
+ """
599
+ Update the survey.
600
+ """
601
+ self .object = self .get_object ()
602
+ self .activate ()
603
+ messages .success (request , "Survey activated" )
604
+ return redirect (self .object .get_absolute_url ())
605
+
606
+
607
+ class SurveyDeactivateView (LoginRequiredMixin , DetailView ):
608
+ """
609
+ Deactivate response collection for this survey.
610
+
611
+ The user must confirm that they want to pause data collection.
612
+ """
613
+
614
+ model = Survey
615
+ context_object_name = "survey"
616
+ template_name = "survey/deactivate_confirm.html"
617
+
618
+ def deactivate (self ):
619
+ self .object .is_active = False
620
+ self .object .save ()
621
+
622
+ def post (self , request , * args , ** kwargs ):
623
+ self .object = self .get_object ()
624
+ is_confirmed : bool = bool (int (request .POST .get ("confirm" , "0" )))
625
+
626
+ # Confirmed
627
+ if is_confirmed :
628
+ self .deactivate ()
629
+ messages .warning (request , "Survey deactivated" )
630
+ # Unconfirmed
631
+ else :
632
+ messages .error (
633
+ request , "Please confirm that you want to pause this survey."
634
+ )
635
+ return redirect (self .object .get_absolute_url ())
636
+
637
+
638
+ class SurveyResponseInactiveView (TemplateView ):
639
+ """
640
+ Show when a survey is inactive.
641
+ """
642
+
643
+ template_name = "survey/survey_response_inactive.html"
0 commit comments