forked from CGM_Public/pretix_original
API: Expose organizer and event URL (Z#23116269) (#3121)
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
})
|
||||
},
|
||||
|
||||
@@ -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/'
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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/"
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user