mirror of
https://github.com/pretix/pretix.git
synced 2026-10-27 23:29:52 +00:00
Compare commits
3
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6b12e68859 | ||
|
|
3105b7e8fb | ||
|
|
26da8b3aab |
No files matched your search
@@ -35,10 +35,13 @@
|
||||
import logging
|
||||
|
||||
from django.conf import settings
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.core.exceptions import (
|
||||
PermissionDenied, ValidationError as DjangoValidationError,
|
||||
)
|
||||
from django.db import transaction
|
||||
from django.utils.crypto import get_random_string
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.html import strip_tags
|
||||
from django.utils.translation import gettext as _
|
||||
from django_countries.serializers import CountryFieldMixin
|
||||
from pytz import common_timezones
|
||||
@@ -218,8 +221,6 @@ class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
if self.instance is None:
|
||||
raise ValidationError(_('Events cannot be created as \'live\'. Quotas and payment must be added to the '
|
||||
'event before sales can go live.'))
|
||||
else:
|
||||
self.instance.clean_live()
|
||||
return value
|
||||
|
||||
@cached_property
|
||||
@@ -429,6 +430,14 @@ class EventSerializer(SalesChannelMigrationMixin, I18nAwareModelSerializer):
|
||||
event.set_active_plugins(plugins)
|
||||
event.save()
|
||||
|
||||
live = validated_data.get('live') or event.live
|
||||
if live:
|
||||
event.refresh_from_db()
|
||||
try:
|
||||
event.clean_live()
|
||||
except DjangoValidationError as e:
|
||||
raise ValidationError({'live': [strip_tags(m) for m in e.messages]})
|
||||
|
||||
return event
|
||||
|
||||
|
||||
|
||||
@@ -1070,6 +1070,99 @@ def test_event_update_live_free_product(token_client, organizer, event, free_ite
|
||||
assert resp.status_code == 200
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_update_live_required_meta_data_missing(token_client, organizer, event, free_quota):
|
||||
organizer.meta_properties.create(name="required_prop", required=True)
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
|
||||
{
|
||||
"live": True
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert list(resp.data.keys()) == ['live']
|
||||
assert len(resp.data['live']) == 1
|
||||
assert '<a' not in resp.data['live'][0]
|
||||
assert 'required_prop' in resp.data['live'][0]
|
||||
event.refresh_from_db()
|
||||
assert not event.live
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_update_live_required_meta_data_set_in_same_request(token_client, organizer, event, free_quota):
|
||||
organizer.meta_properties.create(name="required_prop", required=True)
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
|
||||
{
|
||||
"live": True,
|
||||
"meta_data": {
|
||||
"type": "Conference",
|
||||
"required_prop": "set",
|
||||
}
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
assert resp.data['live'] is True
|
||||
event.refresh_from_db()
|
||||
assert event.live
|
||||
with scopes_disabled():
|
||||
assert event.meta_values.filter(property__name="required_prop", value="set").exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_live_event_update_removing_required_meta_data(token_client, organizer, event, free_quota):
|
||||
prop = organizer.meta_properties.create(name="required_prop", required=True)
|
||||
with scopes_disabled():
|
||||
event.meta_values.create(property=prop, value="set")
|
||||
event.live = True
|
||||
event.save()
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
|
||||
{
|
||||
"meta_data": {
|
||||
"type": "Conference",
|
||||
}
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 400
|
||||
assert list(resp.data.keys()) == ['live']
|
||||
assert 'required_prop' in resp.data['live'][0]
|
||||
|
||||
event.refresh_from_db()
|
||||
assert event.live
|
||||
with scopes_disabled():
|
||||
assert event.meta_values.filter(property__name="required_prop", value="set").exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_live_event_update_removing_required_meta_data_while_going_offline(token_client, organizer, event, free_quota):
|
||||
prop = organizer.meta_properties.create(name="required_prop", required=True)
|
||||
with scopes_disabled():
|
||||
event.meta_values.create(property=prop, value="set")
|
||||
event.live = True
|
||||
event.save()
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/'.format(organizer.slug, event.slug),
|
||||
{
|
||||
"live": False,
|
||||
"meta_data": {
|
||||
"type": "Conference",
|
||||
}
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
event.refresh_from_db()
|
||||
assert not event.live
|
||||
with scopes_disabled():
|
||||
assert not event.meta_values.filter(property__name="required_prop").exists()
|
||||
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_event_update_plugins(token_client, organizer, event, free_item, free_quota):
|
||||
resp = token_client.patch(
|
||||
|
||||
Reference in new issue
Block a user