Skip to content

Commit 96a6bc9

Browse files
committed
fixup! form to store section properties
1 parent 242e65a commit 96a6bc9

File tree

3 files changed

+270
-1
lines changed

3 files changed

+270
-1
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
[
2+
{
3+
"model": "crowdsourcer.sessionproperties",
4+
"pk": 1,
5+
"fields": {
6+
"marking_session": 1,
7+
"stage": 1,
8+
"property_type": "text",
9+
"name": "first_property",
10+
"label": "First Mark Property"
11+
}
12+
},
13+
{
14+
"model": "crowdsourcer.sessionproperties",
15+
"pk": 2,
16+
"fields": {
17+
"marking_session": 1,
18+
"stage": 2,
19+
"property_type": "text",
20+
"name": "ror_property",
21+
"label": "Right of Reply Property"
22+
}
23+
}
24+
]
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,198 @@
1+
from django.contrib.auth.models import User
2+
from django.test import TestCase
3+
from django.urls import reverse
4+
5+
from crowdsourcer.models import (
6+
Marker,
7+
MarkingSession,
8+
PublicAuthority,
9+
ResponseType,
10+
SessionProperties,
11+
SessionProperty,
12+
)
13+
14+
15+
class BaseTestCase(TestCase):
16+
fixtures = [
17+
"authorities.json",
18+
"basics.json",
19+
"users.json",
20+
"assignments.json",
21+
"session_properties.json",
22+
]
23+
24+
def setUp(self):
25+
u = User.objects.get(username="council")
26+
self.client.force_login(u)
27+
self.user = u
28+
29+
30+
class TestLinkDisplayed(BaseTestCase):
31+
fixtures = [
32+
"authorities.json",
33+
"basics.json",
34+
"users.json",
35+
"assignments.json",
36+
]
37+
38+
def test_ror_link_displayed(self):
39+
url = reverse("authority_ror_sections", args=("Aberdeenshire Council",))
40+
response = self.client.get(url)
41+
42+
context = response.context
43+
self.assertFalse(context["has_properties"])
44+
45+
SessionProperties.objects.create(
46+
marking_session=MarkingSession.objects.get(label="Default"),
47+
stage=ResponseType.objects.get(type="Right of Reply"),
48+
property_type="text",
49+
name="a_property",
50+
label="A Property",
51+
)
52+
53+
response = self.client.get(url)
54+
55+
context = response.context
56+
self.assertTrue(context["has_properties"])
57+
58+
59+
class TestProperyFormPermissions(BaseTestCase):
60+
def test_404(self):
61+
url = reverse(
62+
"authority_properties",
63+
args=(
64+
"Aberdeenshire Council",
65+
"Bad Type",
66+
),
67+
)
68+
69+
response = self.client.get(url)
70+
self.assertEquals(404, response.status_code)
71+
72+
url = reverse(
73+
"authority_properties",
74+
args=(
75+
"Fakeshire Council",
76+
"First Mark",
77+
),
78+
)
79+
80+
def test_stage_permissions(self):
81+
self.client.logout()
82+
83+
url = reverse(
84+
"authority_properties",
85+
args=(
86+
"Aberdeenshire Council",
87+
"First Mark",
88+
),
89+
)
90+
91+
response = self.client.get(url)
92+
self.assertEquals(403, response.status_code)
93+
94+
for username in ["council", "auditor", "other_marker"]:
95+
u = User.objects.get(username=username)
96+
self.client.force_login(u)
97+
response = self.client.get(url)
98+
self.assertEquals(403, response.status_code)
99+
100+
for username in ["admin", "marker"]:
101+
u = User.objects.get(username=username)
102+
self.client.force_login(u)
103+
response = self.client.get(url)
104+
self.assertEquals(200, response.status_code)
105+
106+
def test_right_of_reply_permissions(self):
107+
self.client.logout()
108+
109+
url = reverse(
110+
"authority_properties",
111+
args=(
112+
"Aberdeenshire Council",
113+
"Right of Reply",
114+
),
115+
)
116+
117+
response = self.client.get(url)
118+
self.assertEquals(403, response.status_code)
119+
120+
u = User.objects.get(username="marker")
121+
self.client.force_login(u)
122+
response = self.client.get(url)
123+
self.assertEquals(403, response.status_code)
124+
125+
u = User.objects.get(username="admin")
126+
self.client.force_login(u)
127+
response = self.client.get(url)
128+
self.assertEquals(200, response.status_code)
129+
130+
u = User.objects.create(username="other_council", is_active=True)
131+
m = Marker.objects.create(
132+
user=u,
133+
response_type=ResponseType.objects.get(type="Right of Reply"),
134+
authority=PublicAuthority.objects.get(name="Aberdeen City Council"),
135+
)
136+
m.marking_session.set([MarkingSession.objects.get(label="Default")])
137+
self.client.force_login(u)
138+
response = self.client.get(url)
139+
self.assertEquals(403, response.status_code)
140+
141+
def test_properties_not_found(self):
142+
url = reverse(
143+
"authority_properties",
144+
args=(
145+
"Aberdeenshire Council",
146+
"Audit",
147+
),
148+
)
149+
150+
u = User.objects.get(username="admin")
151+
self.client.force_login(u)
152+
response = self.client.get(url)
153+
self.assertEquals(404, response.status_code)
154+
155+
url = reverse(
156+
"authority_properties",
157+
args=(
158+
"Aberdeenshire Council",
159+
"First Mark",
160+
),
161+
)
162+
url = f"/Second%20Session{url}"
163+
response = self.client.get(url)
164+
self.assertEquals(404, response.status_code)
165+
166+
167+
class TestProperyForm(BaseTestCase):
168+
def test_form(self):
169+
url = reverse(
170+
"authority_properties",
171+
args=(
172+
"Aberdeenshire Council",
173+
"Right of Reply",
174+
),
175+
)
176+
177+
properties = SessionProperty.objects.filter(
178+
marking_session__label="Default",
179+
authority__name="Aberdeenshire Council",
180+
stage__type="Right of Reply",
181+
)
182+
183+
response = self.client.get(url)
184+
self.assertEquals(200, response.status_code)
185+
186+
self.assertEquals(0, properties.count())
187+
188+
response = self.client.post(url, data={"ror_property": "Property Data"})
189+
190+
self.assertEqual(response.status_code, 200)
191+
# msg = response.context.get("message", "")
192+
# self.assertEquals(msg, "Your answers have been saved.")
193+
194+
self.assertEquals(1, properties.count())
195+
196+
p = properties.first()
197+
self.assertEquals(p.name, "ror_property")
198+
self.assertEquals(p.value, "Property Data")

crowdsourcer/views/marking.py

+48-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import logging
22

3-
from django.shortcuts import redirect
3+
from django.core.exceptions import PermissionDenied
4+
from django.http import Http404
5+
from django.shortcuts import get_object_or_404, redirect
46
from django.urls import reverse
57
from django.views.generic import FormView, ListView, TemplateView
68

@@ -304,11 +306,54 @@ class SectionPropertiesView(FormView):
304306
template_name = "crowdsourcer/authority_properties.html"
305307
form = SectionPropertyForm
306308

309+
def check_permissions(self):
310+
denied = True
311+
user = self.request.user
312+
313+
if user.is_superuser:
314+
return True
315+
316+
if user.is_anonymous:
317+
raise PermissionDenied
318+
319+
if not user.marker.marking_session.filter(
320+
pk=self.request.current_session.pk
321+
).exists():
322+
raise PermissionDenied
323+
324+
stage = get_object_or_404(ResponseType, type=self.kwargs["stage"])
325+
authority = get_object_or_404(PublicAuthority, name=self.kwargs["name"])
326+
327+
if (
328+
user.marker.response_type == stage
329+
and Assigned.objects.filter(
330+
user=user,
331+
response_type=stage,
332+
marking_session=self.request.current_session,
333+
authority=authority,
334+
).exists()
335+
):
336+
denied = False
337+
elif (
338+
stage.type == "Right of Reply"
339+
and user.marker.response_type == stage
340+
and user.marker.authority == authority
341+
):
342+
denied = False
343+
344+
if denied:
345+
raise PermissionDenied
346+
307347
def get_initial(self):
308348
kwargs = super().get_initial()
309349
stage = ResponseType.objects.get(type=self.kwargs["stage"])
310350
authority = PublicAuthority.objects.get(name=self.kwargs["name"])
311351

352+
if not SessionProperties.objects.filter(
353+
marking_session=self.request.current_session, stage=stage
354+
).exists():
355+
raise Http404
356+
312357
properties = SessionProperty.objects.filter(
313358
marking_session=self.request.current_session,
314359
authority=authority,
@@ -321,6 +366,8 @@ def get_initial(self):
321366
return kwargs
322367

323368
def get_form(self):
369+
self.check_permissions()
370+
324371
stage = self.kwargs["stage"]
325372
properties = SessionProperties.objects.filter(
326373
marking_session=self.request.current_session, stage__type=stage

0 commit comments

Comments
 (0)