API: Expose organizer and event URL (Z#23116269) (#3121)

This commit is contained in:
Martin Gross
2023-02-14 14:47:18 +01:00
committed by GitHub
parent e33fbaf9c0
commit 20581cd31c
7 changed files with 47 additions and 14 deletions

View File

@@ -59,6 +59,7 @@ from pretix.base.settings import (
LazyI18nStringList, validate_event_settings,
)
from pretix.base.signals import api_event_settings_fields
from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__)
@@ -164,6 +165,10 @@ class EventSerializer(I18nAwareModelSerializer):
timezone = TimeZoneField(required=False, choices=[(a, a) for a in common_timezones])
valid_keys = ValidKeysField(source='*', read_only=True)
best_availability_state = serializers.IntegerField(allow_null=True, read_only=True)
public_url = serializers.SerializerMethodField('get_event_url', read_only=True)
def get_event_url(self, event):
return build_absolute_uri(event, 'presale:event.index')
class Meta:
model = Event
@@ -171,7 +176,7 @@ class EventSerializer(I18nAwareModelSerializer):
'date_to', 'date_admission', 'is_public', 'presale_start',
'presale_end', 'location', 'geo_lat', 'geo_lon', 'has_subevents', 'meta_data', 'seating_plan',
'plugins', 'seat_category_mapping', 'timezone', 'item_meta_properties', 'valid_keys',
'sales_channels', 'best_availability_state')
'sales_channels', 'best_availability_state', 'public_url')
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

View File

@@ -41,15 +41,21 @@ from pretix.base.models import (
from pretix.base.models.seating import SeatingPlanLayoutValidator
from pretix.base.services.mail import SendMailException, mail
from pretix.base.settings import validate_organizer_settings
from pretix.helpers.urls import build_absolute_uri
from pretix.helpers.urls import build_absolute_uri as build_global_uri
from pretix.multidomain.urlreverse import build_absolute_uri
logger = logging.getLogger(__name__)
class OrganizerSerializer(I18nAwareModelSerializer):
public_url = serializers.SerializerMethodField('get_organizer_url', read_only=True)
def get_organizer_url(self, organizer):
return build_absolute_uri(organizer, 'presale:organizer.index')
class Meta:
model = Organizer
fields = ('name', 'slug')
fields = ('name', 'slug', 'public_url')
class SeatingPlanSerializer(I18nAwareModelSerializer):
@@ -227,7 +233,7 @@ class TeamInviteSerializer(serializers.ModelSerializer):
'user': self,
'organizer': self.context['organizer'].name,
'team': instance.team.name,
'url': build_absolute_uri('control:auth.invite', kwargs={
'url': build_global_uri('control:auth.invite', kwargs={
'token': instance.token
})
},

View File

@@ -123,7 +123,8 @@ TEST_EVENT_RES = {
'item_meta_properties': {
'day': 'Monday',
},
'sales_channels': ['web', 'bar', 'baz']
'sales_channels': ['web', 'bar', 'baz'],
'public_url': 'http://example.com/dummy/dummy/'
}

View File

@@ -319,7 +319,9 @@ def test_use_token_for_access_one_organizer(client, admin_user, organizer, appli
resp = client.get('/api/v1/organizers/', HTTP_AUTHORIZATION='Bearer %s' % access_token)
assert resp.status_code == 200
data = json.loads(resp.content.decode())
assert data == {'count': 1, 'next': None, 'previous': None, 'results': [{'name': 'Dummy', 'slug': 'dummy'}]}
assert data == {'count': 1, 'next': None, 'previous': None, 'results': [
{'name': 'Dummy', 'slug': 'dummy', 'public_url': 'http://example.com/dummy/'}
]}
resp = client.get('/api/v1/organizers/dummy/events/', HTTP_AUTHORIZATION='Bearer %s' % access_token)
assert resp.status_code == 200
resp = client.get('/api/v1/organizers/a/events/', HTTP_AUTHORIZATION='Bearer %s' % access_token)
@@ -362,8 +364,8 @@ def test_use_token_for_access_two_organizers(client, admin_user, organizer, appl
assert resp.status_code == 200
data = json.loads(resp.content.decode())
assert data == {'count': 2, 'next': None, 'previous': None, 'results': [
{'name': 'A', 'slug': 'a'},
{'name': 'Dummy', 'slug': 'dummy'},
{'name': 'A', 'slug': 'a', 'public_url': 'http://example.com/a/'},
{'name': 'Dummy', 'slug': 'dummy', 'public_url': 'http://example.com/dummy/'},
]}
resp = client.get('/api/v1/organizers/dummy/events/', HTTP_AUTHORIZATION='Bearer %s' % access_token)
assert resp.status_code == 200

View File

@@ -27,7 +27,8 @@ from pretix.testutils.mock import mocker_context
TEST_ORGANIZER_RES = {
"name": "Dummy",
"slug": "dummy"
"slug": "dummy",
"public_url": "http://example.com/dummy/"
}