Skip to content

Commit 9655468

Browse files
committed
changes
1 parent ced5da9 commit 9655468

File tree

4 files changed

+55
-5
lines changed

4 files changed

+55
-5
lines changed

backend/association_membership/handlers/pretix/api.py

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import urllib.parse
12
from typing import Literal
23

34
import requests
@@ -6,7 +7,7 @@
67

78
from conferences.models.conference import Conference
89

9-
METHODS = Literal["get"]
10+
METHODS = Literal["get", "post", "put", "patch", "delete"]
1011

1112

1213
class PretixAPI:
@@ -25,14 +26,19 @@ def for_conference(cls, conference: Conference):
2526
)
2627

2728
def run_request(
28-
self, url: str, *, method: METHODS = "get", qs: dict[str, str] = None
29+
self,
30+
url: str,
31+
*,
32+
method: METHODS = "get",
33+
qs: dict[str, str] = None,
34+
json: dict = None,
2935
):
3036
headers = {"Authorization": f"Token {str(settings.PRETIX_API_TOKEN)}"}
3137

3238
if qs:
3339
url = f"{url}?" + "&".join([f"{key}={value}" for key, value in qs.items()])
3440

35-
return getattr(requests, method)(url, headers=headers)
41+
return getattr(requests, method)(url, headers=headers, json=json)
3642

3743
def _request(self, endpoint: str, **kwargs):
3844
url = f"{self.base_url}/{endpoint}/"
@@ -54,6 +60,30 @@ def get_categories(self) -> dict:
5460

5561
def get_all_attendee_tickets(self, attendee_email: str) -> list[dict]:
5662
response = self._request(
57-
"tickets/attendee-tickets", qs={"attendee_email": attendee_email}
63+
"tickets/attendee-tickets",
64+
qs={"attendee_email": urllib.parse.quote_plus(attendee_email)},
5865
)
5966
return response.json()
67+
68+
def has_attendee_ticket(
69+
self, attendee_email: str, additional_events: list[dict] = None
70+
) -> bool:
71+
additional_events = additional_events or []
72+
events = [
73+
{
74+
"organizer_slug": self.organizer,
75+
"event_slug": self.event,
76+
}
77+
] + additional_events
78+
79+
response = self._request(
80+
"tickets/attendee-has-ticket",
81+
method="post",
82+
json={
83+
"attendee_email": attendee_email,
84+
"events": events,
85+
},
86+
)
87+
88+
data = response.json()
89+
return data["user_has_admission_ticket"]

backend/visa/admin.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from django.utils.safestring import mark_safe
22

33
from django.urls import path
4+
from association_membership.handlers.pretix.api import PretixAPI
45
from ordered_model.admin import (
56
OrderedInlineModelAdminMixin,
67
OrderedModelAdmin,
@@ -81,6 +82,10 @@ def save_form(self, request, form, change):
8182
return obj
8283

8384
def process_now(self, obj):
85+
pretix_api = PretixAPI.for_conference(obj.conference)
86+
if not pretix_api.has_attendee_ticket(obj.email):
87+
return "No attendee ticket found! Can't generate invitation letter."
88+
8489
return mark_safe(
8590
'<input type="submit" name="_process_now" value="Process now" />'
8691
)

backend/visa/models.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,9 @@ def schedule(self):
150150
def get_config(self):
151151
return self.conference.invitation_letter_config
152152

153+
def __str__(self):
154+
return f"{self.full_name} - {self.conference.name}"
155+
153156
class Meta:
154157
constraints = [
155158
UniqueConstraint(

backend/visa/tests/test_admin.py

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,19 +72,31 @@ def test_edit_dynamic_document_button_is_empty_for_static_docs():
7272
assert html == ""
7373

7474

75-
def test_invitation_letter_request_admin():
75+
def test_invitation_letter_request_admin(mock_has_ticket):
7676
admin = InvitationLetterRequestAdmin(
7777
model=InvitationLetterRequest, admin_site=AdminSite()
7878
)
7979

8080
invitation_letter_request = InvitationLetterRequestFactory()
81+
mock_has_ticket(invitation_letter_request.conference, True)
8182

8283
assert 'name="_process_now"' in admin.process_now(invitation_letter_request)
8384
assert "Generate the invitation letter first" == admin.send_via_email(
8485
invitation_letter_request
8586
)
8687

8788

89+
def test_generate_button_doesnt_appear_with_no_ticket(mock_has_ticket):
90+
admin = InvitationLetterRequestAdmin(
91+
model=InvitationLetterRequest, admin_site=AdminSite()
92+
)
93+
94+
invitation_letter_request = InvitationLetterRequestFactory()
95+
mock_has_ticket(invitation_letter_request.conference, False)
96+
97+
assert "No attendee ticket found!" in admin.process_now(invitation_letter_request)
98+
99+
88100
def test_invitation_letter_request_admin_post_processing_redirects_to_changelist(
89101
rf, admin_user
90102
):

0 commit comments

Comments
 (0)