Skip to content

Commit 595edfd

Browse files
committed
User service layer in team update form view
Use the service layer function in the form responsible for updating team's donation_links. Utilize the service layer function in the form's save function and update the view accordingly. In order to invoke the post-validation errors added to the form in the form tests, call form.save() in the tests as well. Implement tests for the view in a similar manner as they are implemented for the forms to assert functionality. Refs. TS-2314
1 parent 918e781 commit 595edfd

File tree

4 files changed

+79
-5
lines changed

4 files changed

+79
-5
lines changed

django/thunderstore/repository/forms/team.py

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from django.contrib.auth import get_user_model
55
from django.core.exceptions import ObjectDoesNotExist, ValidationError
66

7+
from thunderstore.api.cyberstorm.services.team import update_team
78
from thunderstore.core.exceptions import PermissionValidationError
89
from thunderstore.core.types import UserType
910
from thunderstore.repository.models import (
@@ -183,10 +184,20 @@ def __init__(self, user: UserType, *args, **kwargs):
183184
def clean(self):
184185
if not self.instance.pk:
185186
raise ValidationError("Missing team instance")
186-
self.instance.ensure_user_can_edit_info(self.user)
187187
return super().clean()
188188

189189
@transaction.atomic
190190
def save(self, **kwargs):
191-
self.instance.ensure_user_can_edit_info(self.user)
192-
return super().save(**kwargs)
191+
if self.errors:
192+
raise ValidationError(self.errors)
193+
194+
try:
195+
update_team(
196+
agent=self.user,
197+
team=self.instance,
198+
donation_link=self.cleaned_data["donation_link"],
199+
)
200+
except ValidationError as e:
201+
self.add_error(None, e)
202+
203+
return self.instance

django/thunderstore/repository/tests/test_team_forms.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from typing import Optional
22

33
import pytest
4+
from django.core.exceptions import ValidationError
45

56
from conftest import TestUserTypes
67
from thunderstore.core.factories import UserFactory
@@ -552,8 +553,11 @@ def test_form_donation_link_team_form_permissions(
552553
team.refresh_from_db()
553554
assert team.donation_link == link
554555
else:
556+
form.save()
555557
assert form.is_valid() is False
556558
assert form.errors
559+
team.refresh_from_db()
560+
assert team.donation_link is None
557561

558562

559563
@pytest.mark.django_db

django/thunderstore/repository/tests/test_views.py

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -478,6 +478,62 @@ def test_team_settings_donation_link_view(
478478
assert b"Donation link saved" in response.content
479479

480480

481+
@pytest.mark.django_db
482+
@pytest.mark.parametrize("user_type", TestUserTypes.options())
483+
@pytest.mark.parametrize("role", TeamMemberRole.options() + [None])
484+
def test_team_settings_donation_link_view_permissions(
485+
client: APIClient,
486+
community_site: CommunitySite,
487+
team: Team,
488+
user_type: str,
489+
role: Optional[str],
490+
) -> None:
491+
valid_user_type_map = {
492+
TestUserTypes.no_user: False,
493+
TestUserTypes.unauthenticated: False,
494+
TestUserTypes.regular_user: True,
495+
TestUserTypes.deactivated_user: False,
496+
TestUserTypes.service_account: False,
497+
TestUserTypes.site_admin: True,
498+
TestUserTypes.superuser: True,
499+
}
500+
501+
valid_role_map = {
502+
None: False,
503+
TeamMemberRole.member: False,
504+
TeamMemberRole.owner: True,
505+
}
506+
507+
user = TestUserTypes.get_user_by_type(user_type)
508+
if role is not None and user_type not in TestUserTypes.fake_users():
509+
TeamMember.objects.create(user=user, team=team, role=role)
510+
client.force_login(user)
511+
512+
should_succeed = all(
513+
(
514+
valid_user_type_map[user_type],
515+
valid_role_map[role],
516+
)
517+
)
518+
519+
kwargs = {"name": team.name}
520+
response = client.post(
521+
reverse("settings.teams.detail.donation_link", kwargs=kwargs),
522+
{"donation_link": "https://example.org/"},
523+
HTTP_HOST=community_site.site.domain,
524+
follow=True,
525+
)
526+
527+
if should_succeed:
528+
assert b"Donation link saved" in response.content
529+
team.refresh_from_db()
530+
assert team.donation_link == "https://example.org/"
531+
else:
532+
assert b"Donation link saved" not in response.content
533+
team.refresh_from_db()
534+
assert team.donation_link is None
535+
536+
481537
@pytest.mark.django_db
482538
@pytest.mark.parametrize("user_type", TestUserTypes.options())
483539
def test_view_package_detail_management_option_visibility_without_team(

django/thunderstore/repository/views/team_settings.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
CreateServiceAccountForm,
1717
DeleteServiceAccountForm,
1818
)
19+
from thunderstore.api.cyberstorm.services.team import update_team
1920
from thunderstore.core.mixins import RequireAuthenticationMixin
2021
from thunderstore.core.utils import capture_exception
2122
from thunderstore.frontend.views import SettingsViewMixin
@@ -26,7 +27,6 @@
2627
DonationLinkTeamForm,
2728
EditTeamMemberForm,
2829
RemoveTeamMemberForm,
29-
TeamMemberRole,
3030
)
3131
from thunderstore.repository.models import Team, TeamMember, reverse
3232

@@ -276,5 +276,8 @@ def get_success_url(self):
276276
return self.object.donation_link_url
277277

278278
def form_valid(self, form: DonationLinkTeamForm):
279+
self.object = form.save()
280+
if form.errors: # Check if service layer raised an error
281+
return super().form_invalid(form)
279282
messages.success(self.request, "Donation link saved")
280-
return super().form_valid(form)
283+
return redirect(self.get_success_url())

0 commit comments

Comments
 (0)