• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

DemocracyClub / WhoCanIVoteFor / 78615e59-2602-4373-b4ce-ad20cc5b761e

07 Apr 2025 01:45PM UTC coverage: 58.389% (+0.1%) from 58.293%
78615e59-2602-4373-b4ce-ad20cc5b761e

Pull #2232

circleci

awdem
update PostcodeiCalView to new error handling
Pull Request #2232: handle invalid postcode errors and api 500s differently

31 of 31 new or added lines in 4 files covered. (100.0%)

89 existing lines in 6 files now uncovered.

2812 of 4816 relevant lines covered (58.39%)

0.58 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

85.9
/wcivf/apps/core/views.py
1
import datetime
1✔
2
import os
1✔
3

4
from django import http
1✔
5
from django.conf import settings
1✔
6
from django.urls import reverse
1✔
7
from django.utils import timezone, translation
1✔
8
from django.views.generic import FormView, TemplateView, View
1✔
9

10
from .forms import PostcodeLookupForm
1✔
11

12

13
class TranslatedTemplateView(TemplateView):
1✔
14
    def get_template_names(self):
1✔
15
        templates = super().get_template_names()
1✔
16
        base_template_name, ext = self.template_name.rsplit(".", 1)
1✔
17
        current_language = translation.get_language()
1✔
18
        if current_language != "en":
1✔
19
            templates.insert(
1✔
20
                0, f"{base_template_name}_{current_language}.{ext}"
21
            )
22
        return templates
1✔
23

24

25
class PostcodeFormView(FormView):
1✔
26
    form_class = PostcodeLookupForm
1✔
27

28
    def get(self, request, *args, **kwargs):
1✔
29
        if (
1✔
30
            request.GET.get("postcode")
31
            and "invalid_postcode" not in self.request.GET
32
            and "api_response_error" not in self.request.GET
33
        ):
34
            redirect_url = reverse(
1✔
35
                "postcode_view", kwargs={"postcode": request.GET["postcode"]}
36
            )
37
            return http.HttpResponseRedirect(redirect_url)
1✔
38
        return super(PostcodeFormView, self).get(request, *args, **kwargs)
1✔
39

40
    def get_initial(self):
1✔
41
        initial = self.initial.copy()
1✔
42
        if (
1✔
43
            "invalid_postcode" in self.request.GET
44
            or "api_response_error" in self.request.GET
45
        ):
46
            initial["postcode"] = self.request.GET.get("postcode")
1✔
47
        return initial
1✔
48

49
    def get_form_kwargs(self):
1✔
50
        kwargs = super().get_form_kwargs()
1✔
51
        kwargs.update({"autofocus": True})
1✔
52
        return kwargs
1✔
53

54
    def form_invalid(self, form):
1✔
UNCOV
55
        data = self.request.GET.copy()
×
UNCOV
56
        data.update({"invalid_postcode": 1, "postcode": form.data["postcode"]})
×
57
        self.request.GET = data
×
58
        return super().form_invalid(form)
×
59

60
    def form_valid(self, form):
1✔
61
        postcode = form.cleaned_data["postcode"]
×
UNCOV
62
        self.success_url = reverse(
×
63
            "postcode_view", kwargs={"postcode": postcode}
64
        )
UNCOV
65
        return super().form_valid(form)
×
66

67

68
class HomePageView(PostcodeFormView):
1✔
69
    template_name = "home.html"
1✔
70

71
    def get_context_data(self, **kwargs):
1✔
72
        context = super().get_context_data(**kwargs)
1✔
73

74
        # Comment in this code to hide upcoming elections on the homepage
75
        context["upcoming_elections"] = None
1✔
76

77
        # # Comment in this code to show upcoming elections on the homepage
78
        # today = datetime.datetime.today()
79
        # delta = datetime.timedelta(weeks=4)
80
        # cut_off_date = today + delta
81
        # context["upcoming_elections"] = (
82
        #     PostElection.objects.filter(
83
        #         election__election_date__gte=today,
84
        #         election__election_date__lte=cut_off_date,
85
        #         # Temporarily removed following May elections #
86
        #         election__any_non_by_elections=False,
87
        #     )
88
        #     # .exclude(election__election_date=may_election_day_this_year())
89
        #     .select_related("election", "post")
90
        #     .order_by("election__election_date")
91
        # )
92
        polls_open = timezone.make_aware(
1✔
93
            datetime.datetime.strptime("2019-12-12 7", "%Y-%m-%d %H")
94
        )
95
        polls_close = timezone.make_aware(
1✔
96
            datetime.datetime.strptime("2019-12-12 22", "%Y-%m-%d %H")
97
        )
98
        now = timezone.now()
1✔
99

100
        context["show_polls_open"] = polls_close > now
1✔
101
        context["poll_date"] = "on Thursday 12 December"
1✔
102
        if polls_open < now and polls_close > now:
1✔
UNCOV
103
            context["poll_date"] = "today"
×
104
        context["show_gb_id_messaging"] = getattr(
1✔
105
            settings, "SHOW_GB_ID_MESSAGING", False
106
        )
107

108
        return context
1✔
109

110

111
class OpenSearchView(TemplateView):
1✔
112
    template_name = "opensearch.xml"
1✔
113
    content_type = "text/xml"
1✔
114

115
    def get_context_data(self, **kwargs):
1✔
116
        context = super(OpenSearchView, self).get_context_data(**kwargs)
1✔
117
        context["CANONICAL_URL"] = settings.CANONICAL_URL
1✔
118
        context["SITE_TITLE"] = settings.SITE_TITLE
1✔
119
        return context
1✔
120

121

122
class StatusCheckView(View):
1✔
123
    @property
1✔
124
    def server_is_dirty(self):
1✔
125
        if getattr(settings, "CHECK_HOST_DIRTY", False):
1✔
126
            dirty_file_path = os.path.expanduser(
×
127
                getattr(settings, "DIRTY_FILE_PATH")
128
            )
129

UNCOV
130
            if os.path.exists(dirty_file_path):
×
UNCOV
131
                return True
×
132
        return False
1✔
133

134
    def get(self, request, *args, **kwargs):
1✔
135
        status = 503
1✔
136

137
        data = {"ready_to_serve": False}
1✔
138

139
        if not self.server_is_dirty:
1✔
140
            status = 200
1✔
141
            data["ready_to_serve"] = True
1✔
142

143
        return http.JsonResponse(data, status=status)
1✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc