Include global settings in event/organizer settings

Also, add tests
This commit is contained in:
Tobias Kunze
2016-10-27 10:48:54 +02:00
committed by Raphael Michel
parent c647aa9f4e
commit c5fdf7c215
8 changed files with 62 additions and 17 deletions

View File

@@ -58,7 +58,8 @@ class Organizer(LoggedModel):
"""
Returns an object representing this organizer's settings
"""
return SettingsProxy(self, type=OrganizerSetting)
from pretix.base.settings import GlobalSettingsObject
return SettingsProxy(self, type=OrganizerSetting, parent=GlobalSettingsObject())
def get_cache(self) -> "pretix.base.cache.ObjectRelatedCache":
"""

View File

@@ -11,6 +11,7 @@ from django.db.models import Model
from django.utils.translation import ugettext_noop
from pretix.base.i18n import LazyI18nString
from pretix.base.models.settings import GlobalSetting
DEFAULTS = {
'max_items_per_order': {
@@ -511,3 +512,10 @@ class SettingsSandbox:
def set(self, key: str, value: Any):
self._event.settings.set(self._convert_key(key), value)
class GlobalSettingsObject:
def __init__(self):
self.settings = SettingsProxy(self, type=GlobalSetting)
self.setting_objects = GlobalSetting.objects
self.slug = 'GLOBALSETTINGS'

View File

@@ -4,18 +4,10 @@ from django.utils.translation import ugettext_lazy as _
from pretix.base.forms import SettingsForm
from pretix.base.i18n import I18nFormField, I18nTextInput
from pretix.base.models.settings import GlobalSetting
from pretix.base.settings import SettingsProxy
from pretix.base.settings import GlobalSettingsObject
from pretix.base.signals import register_global_settings
class GlobalSettingsObject:
def __init__(self):
self.settings = SettingsProxy(self, type=GlobalSetting)
self.setting_objects = GlobalSetting.objects
self.slug = 'GLOBALSETTINGS'
class GlobalSettingsForm(SettingsForm):
def __init__(self, *args, **kwargs):
self.obj = GlobalSettingsObject()

View File

@@ -92,7 +92,7 @@ class OrganizerPermissionRequiredMixin:
return organizer_permission_required(cls.permission)(view)
def administrator_permission_required(permission):
def administrator_permission_required():
"""
This view decorator rejects all requests with a 403 response which are not from
users with the is_superuser flag.
@@ -114,9 +114,7 @@ class AdministratorPermissionRequiredMixin:
This mixin is equivalent to the administrator_permission_required view decorator but
is in a form suitable for class-based views.
"""
permission = ''
@classmethod
def as_view(cls, **initkwargs):
view = super(AdministratorPermissionRequiredMixin, cls).as_view(**initkwargs)
return administrator_permission_required(cls.permission)(view)
return administrator_permission_required()(view)

View File

@@ -8,7 +8,7 @@
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form_errors form %}
{% bootstrap_form form %}
{% bootstrap_form form layout='horizontal' %}
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}

View File

@@ -1,3 +1,4 @@
from django.shortcuts import reverse
from django.views.generic import FormView
from pretix.control.forms.global_settings import GlobalSettingsForm
@@ -13,5 +14,4 @@ class GlobalSettingsView(AdministratorPermissionRequiredMixin, FormView):
return super().form_valid(form)
def get_success_url(self):
from django.shortcuts import reverse
return reverse('control:global-settings')

View File

@@ -11,6 +11,7 @@ from pretix.base import settings
from pretix.base.i18n import LazyI18nString
from pretix.base.models import Event, Organizer, User
from pretix.base.settings import SettingsSandbox
from pretix.control.forms.global_settings import GlobalSettingsObject
class SettingsTestCase(TestCase):
@@ -19,12 +20,21 @@ class SettingsTestCase(TestCase):
'default': 'def',
'type': str
}
self.global_settings = GlobalSettingsObject()
self.organizer = Organizer.objects.create(name='Dummy', slug='dummy')
self.event = Event.objects.create(
organizer=self.organizer, name='Dummy', slug='dummy',
date_from=now(),
)
def test_global_set_explicit(self):
self.global_settings.settings.test = 'foo'
self.assertEqual(self.global_settings.settings.test, 'foo')
# Reload object
self.global_settings = GlobalSettingsObject()
self.assertEqual(self.global_settings.settings.test, 'foo')
def test_organizer_set_explicit(self):
self.organizer.settings.test = 'foo'
self.assertEqual(self.organizer.settings.test, 'foo')
@@ -50,6 +60,26 @@ class SettingsTestCase(TestCase):
self.event = Event.objects.get(id=self.event.id)
self.assertEqual(self.event.settings.test, 'foo')
def test_organizer_set_on_global(self):
self.global_settings.settings.test = 'foo'
self.assertEqual(self.global_settings.settings.test, 'foo')
self.assertEqual(self.organizer.settings.test, 'foo')
# Reload object
self.global_settings = GlobalSettingsObject()
self.assertEqual(self.global_settings.settings.test, 'foo')
self.assertEqual(self.organizer.settings.test, 'foo')
def test_event_set_on_global(self):
self.global_settings.settings.test = 'foo'
self.assertEqual(self.global_settings.settings.test, 'foo')
self.assertEqual(self.event.settings.test, 'foo')
# Reload object
self.global_settings = GlobalSettingsObject()
self.assertEqual(self.global_settings.settings.test, 'foo')
self.assertEqual(self.event.settings.test, 'foo')
def test_event_set_on_organizer(self):
self.organizer.settings.test = 'foo'
self.assertEqual(self.organizer.settings.test, 'foo')
@@ -57,8 +87,10 @@ class SettingsTestCase(TestCase):
# Reload object
self.organizer = Organizer.objects.get(id=self.organizer.id)
self.assertEqual(self.organizer.settings.test, 'foo')
self.assertEqual(self.event.settings.test, 'foo')
def test_override_organizer(self):
def test_event_override_organizer(self):
self.organizer.settings.test = 'foo'
self.event.settings.test = 'bar'
self.assertEqual(self.organizer.settings.test, 'foo')
@@ -70,7 +102,20 @@ class SettingsTestCase(TestCase):
self.assertEqual(self.organizer.settings.test, 'foo')
self.assertEqual(self.event.settings.test, 'bar')
def test_event_override_global(self):
self.global_settings.settings.test = 'foo'
self.event.settings.test = 'bar'
self.assertEqual(self.global_settings.settings.test, 'foo')
self.assertEqual(self.event.settings.test, 'bar')
# Reload object
self.global_settings = GlobalSettingsObject()
self.event = Event.objects.get(id=self.event.id)
self.assertEqual(self.global_settings.settings.test, 'foo')
self.assertEqual(self.event.settings.test, 'bar')
def test_default(self):
self.assertEqual(self.global_settings.settings.test_default, 'def')
self.assertEqual(self.organizer.settings.test_default, 'def')
self.assertEqual(self.event.settings.test_default, 'def')
self.assertEqual(self.event.settings.get('nonexistant', default='abc'), 'abc')

View File

@@ -89,6 +89,7 @@ def perf_patch(monkeypatch):
@pytest.mark.parametrize("url", [
"",
"settings",
"admin/",
"organizers/",
"organizers/add",
"events/",