Skip to content

Commit 70ab76b

Browse files
committed
Require perms for all units for mass reject/restore options
1 parent 7416eb4 commit 70ab76b

6 files changed

Lines changed: 146 additions & 6 deletions

File tree

api/graphql/types/application/permissions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,4 +52,4 @@ def has_update_permission(cls, instance: Application, user: AnyUser, input_data:
5252
)
5353
for unit_id in section.reservation_unit_options.all().values_list("reservation_unit__unit__id", flat=True)
5454
]
55-
return has_unit_permission(user, "can_handle_applications", units)
55+
return all(has_unit_permission(user, "can_handle_applications", [unit]) for unit in units)

api/graphql/types/application_section/permissions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,4 +53,4 @@ def has_update_permission(cls, instance: ApplicationSection, user: AnyUser, inpu
5353
return True
5454

5555
units = list(instance.reservation_unit_options.all().values_list("reservation_unit__unit__id", flat=True))
56-
return has_unit_permission(user, "can_handle_applications", units)
56+
return all(has_unit_permission(user, "can_handle_applications", [unit]) for unit in units)

tests/test_graphql_api/test_application/test_reject_all_options.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22

33
from applications.choices import Weekday
4-
from tests.factories import ApplicationFactory, UserFactory
4+
from tests.factories import ApplicationFactory, ReservationUnitOptionFactory, UserFactory, add_unit_permissions
55

66
from .helpers import REJECT_MUTATION
77

@@ -67,3 +67,39 @@ def test_application__reject_all_options__unit_admin(graphql):
6767
response = graphql(REJECT_MUTATION, input_data={"pk": application.pk})
6868

6969
assert response.has_errors is False
70+
71+
72+
def test_application__reject_all_options__unit_admin__no_permission_for_all_units(graphql):
73+
application = ApplicationFactory.create_in_status_in_allocation()
74+
section = application.application_sections.first()
75+
76+
ReservationUnitOptionFactory.create(application_section=section)
77+
78+
unit = section.reservation_unit_options.first().reservation_unit.unit
79+
admin = UserFactory.create_with_unit_permissions(unit=unit, perms=["can_handle_applications"])
80+
graphql.force_login(admin)
81+
82+
response = graphql(REJECT_MUTATION, input_data={"pk": application.pk})
83+
84+
assert response.error_message() == "No permission to update."
85+
86+
87+
def test_application__reject_all_options__unit_admin__has_permission_for_all_units(graphql):
88+
application = ApplicationFactory.create_in_status_in_allocation()
89+
section = application.application_sections.first()
90+
91+
option_1 = section.reservation_unit_options.first()
92+
option_2 = ReservationUnitOptionFactory.create(application_section=section)
93+
94+
unit_1 = option_1.reservation_unit.unit
95+
unit_2 = option_2.reservation_unit.unit
96+
97+
admin = UserFactory.create()
98+
add_unit_permissions(admin, unit=unit_1, perms=["can_handle_applications"])
99+
add_unit_permissions(admin, unit=unit_2, perms=["can_handle_applications"])
100+
101+
graphql.force_login(admin)
102+
103+
response = graphql(REJECT_MUTATION, input_data={"pk": application.pk})
104+
105+
assert response.has_errors is False, response.errors

tests/test_graphql_api/test_application/test_restore_all_options.py

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from tests.factories import ApplicationFactory, UserFactory
3+
from tests.factories import ApplicationFactory, ReservationUnitOptionFactory, UserFactory, add_unit_permissions
44

55
from .helpers import RESTORE_MUTATION
66

@@ -49,3 +49,39 @@ def test_application__restore_all_options__unit_admin(graphql):
4949
response = graphql(RESTORE_MUTATION, input_data={"pk": application.pk})
5050

5151
assert response.has_errors is False
52+
53+
54+
def test_application__restore_all_options__unit_admin__no_permission_for_all_units(graphql):
55+
application = ApplicationFactory.create_in_status_in_allocation()
56+
section = application.application_sections.first()
57+
58+
ReservationUnitOptionFactory.create(application_section=section)
59+
60+
unit = section.reservation_unit_options.first().reservation_unit.unit
61+
admin = UserFactory.create_with_unit_permissions(unit=unit, perms=["can_handle_applications"])
62+
graphql.force_login(admin)
63+
64+
response = graphql(RESTORE_MUTATION, input_data={"pk": application.pk})
65+
66+
assert response.error_message() == "No permission to update."
67+
68+
69+
def test_application__restore_all_options__unit_admin__has_permission_for_all_units(graphql):
70+
application = ApplicationFactory.create_in_status_in_allocation()
71+
section = application.application_sections.first()
72+
73+
option_1 = section.reservation_unit_options.first()
74+
option_2 = ReservationUnitOptionFactory.create(application_section=section)
75+
76+
unit_1 = option_1.reservation_unit.unit
77+
unit_2 = option_2.reservation_unit.unit
78+
79+
admin = UserFactory.create()
80+
add_unit_permissions(admin, unit=unit_1, perms=["can_handle_applications"])
81+
add_unit_permissions(admin, unit=unit_2, perms=["can_handle_applications"])
82+
83+
graphql.force_login(admin)
84+
85+
response = graphql(RESTORE_MUTATION, input_data={"pk": application.pk})
86+
87+
assert response.has_errors is False, response.errors

tests/test_graphql_api/test_application_section/test_reject_all_options.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pytest
22

33
from applications.choices import Weekday
4-
from tests.factories import ApplicationSectionFactory, UserFactory
4+
from tests.factories import ApplicationSectionFactory, ReservationUnitOptionFactory, UserFactory, add_unit_permissions
55

66
from .helpers import REJECT_MUTATION
77

@@ -64,3 +64,37 @@ def test_application_section__reject_all_options__unit_admin(graphql):
6464
response = graphql(REJECT_MUTATION, input_data={"pk": application_section.pk})
6565

6666
assert response.has_errors is False
67+
68+
69+
def test_application_section__reject_all_options__unit_admin__no_permission_for_all_units(graphql):
70+
section = ApplicationSectionFactory.create_in_status_in_allocation()
71+
72+
ReservationUnitOptionFactory.create(application_section=section)
73+
74+
unit = section.reservation_unit_options.first().reservation_unit.unit
75+
admin = UserFactory.create_with_unit_permissions(unit=unit, perms=["can_handle_applications"])
76+
graphql.force_login(admin)
77+
78+
response = graphql(REJECT_MUTATION, input_data={"pk": section.pk})
79+
80+
assert response.error_message() == "No permission to update."
81+
82+
83+
def test_application_section__reject_all_options__unit_admin__has_permission_for_all_units(graphql):
84+
section = ApplicationSectionFactory.create_in_status_in_allocation()
85+
86+
option_1 = section.reservation_unit_options.first()
87+
option_2 = ReservationUnitOptionFactory.create(application_section=section)
88+
89+
unit_1 = option_1.reservation_unit.unit
90+
unit_2 = option_2.reservation_unit.unit
91+
92+
admin = UserFactory.create()
93+
add_unit_permissions(admin, unit=unit_1, perms=["can_handle_applications"])
94+
add_unit_permissions(admin, unit=unit_2, perms=["can_handle_applications"])
95+
96+
graphql.force_login(admin)
97+
98+
response = graphql(REJECT_MUTATION, input_data={"pk": section.pk})
99+
100+
assert response.has_errors is False, response.errors

tests/test_graphql_api/test_application_section/test_restore_all_options.py

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import pytest
22

3-
from tests.factories import ApplicationSectionFactory, UserFactory
3+
from tests.factories import ApplicationSectionFactory, ReservationUnitOptionFactory, UserFactory, add_unit_permissions
44

55
from .helpers import RESTORE_MUTATION
66

@@ -47,3 +47,37 @@ def test_application_section__restore_all_options__unit_admin(graphql):
4747
response = graphql(RESTORE_MUTATION, input_data={"pk": application_section.pk})
4848

4949
assert response.has_errors is False
50+
51+
52+
def test_application_section__restore_all_options__unit_admin__no_permission_for_all_units(graphql):
53+
section = ApplicationSectionFactory.create_in_status_in_allocation()
54+
55+
ReservationUnitOptionFactory.create(application_section=section)
56+
57+
unit = section.reservation_unit_options.first().reservation_unit.unit
58+
admin = UserFactory.create_with_unit_permissions(unit=unit, perms=["can_handle_applications"])
59+
graphql.force_login(admin)
60+
61+
response = graphql(RESTORE_MUTATION, input_data={"pk": section.pk})
62+
63+
assert response.error_message() == "No permission to update."
64+
65+
66+
def test_application_section__restore_all_options__unit_admin__has_permission_for_all_units(graphql):
67+
section = ApplicationSectionFactory.create_in_status_in_allocation()
68+
69+
option_1 = section.reservation_unit_options.first()
70+
option_2 = ReservationUnitOptionFactory.create(application_section=section)
71+
72+
unit_1 = option_1.reservation_unit.unit
73+
unit_2 = option_2.reservation_unit.unit
74+
75+
admin = UserFactory.create()
76+
add_unit_permissions(admin, unit=unit_1, perms=["can_handle_applications"])
77+
add_unit_permissions(admin, unit=unit_2, perms=["can_handle_applications"])
78+
79+
graphql.force_login(admin)
80+
81+
response = graphql(RESTORE_MUTATION, input_data={"pk": section.pk})
82+
83+
assert response.has_errors is False, response.errors

0 commit comments

Comments
 (0)