mirror of
https://github.com/pretix/pretix.git
synced 2026-05-06 15:24:02 +00:00
Allow to set multiple confirm texts (#1735)
This commit is contained in:
27
src/pretix/base/migrations/0160_multiple_confirm_texts.py
Normal file
27
src/pretix/base/migrations/0160_multiple_confirm_texts.py
Normal file
@@ -0,0 +1,27 @@
|
||||
# Generated by Django 3.0.8 on 2020-07-31 10:05
|
||||
|
||||
import json
|
||||
|
||||
from django.db import migrations
|
||||
|
||||
|
||||
def migrate_confirm_text(apps, schema_editor):
|
||||
# We now allow creating multiple confirm texts so we migrate the setting for that
|
||||
# from `confirm_text` to `confirm_texts`
|
||||
Event_SettingsStore = apps.get_model('pretixbase', 'Event_SettingsStore')
|
||||
for store in Event_SettingsStore.objects.filter(key="confirm_text"):
|
||||
values = json.dumps([json.loads(store.value)]) # convert single value to one-element list
|
||||
store.key = "confirm_texts"
|
||||
store.value = values
|
||||
store.save()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('pretixbase', '0159_mails_by_sales_channel'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(migrate_confirm_text, migrations.RunPython.noop),
|
||||
]
|
||||
@@ -35,7 +35,7 @@ class RelativeDateWrapper:
|
||||
def __init__(self, data: Union[datetime.datetime, RelativeDate]):
|
||||
self.data = data
|
||||
|
||||
def date(self, event) -> datetime.datetime:
|
||||
def date(self, event) -> datetime.date:
|
||||
from .models import SubEvent
|
||||
|
||||
if isinstance(self.data, datetime.date):
|
||||
@@ -81,8 +81,8 @@ class RelativeDateWrapper:
|
||||
second=self.data.time.second
|
||||
)
|
||||
new_date = new_date.astimezone(tz)
|
||||
newoffset = new_date.utcoffset()
|
||||
new_date += oldoffset - newoffset
|
||||
new_offset = new_date.utcoffset()
|
||||
new_date += oldoffset - new_offset
|
||||
return new_date
|
||||
|
||||
def to_string(self) -> str:
|
||||
|
||||
@@ -27,7 +27,7 @@ from pretix.base.services.locking import LockTimeoutException, NoLockManager
|
||||
from pretix.base.services.pricing import get_price
|
||||
from pretix.base.services.quotas import QuotaAvailability
|
||||
from pretix.base.services.tasks import ProfiledEventTask
|
||||
from pretix.base.settings import PERSON_NAME_SCHEMES
|
||||
from pretix.base.settings import PERSON_NAME_SCHEMES, LazyI18nStringList
|
||||
from pretix.base.signals import validate_cart_addons
|
||||
from pretix.base.templatetags.rich_text import rich_text
|
||||
from pretix.celery_app import app
|
||||
@@ -1240,9 +1240,7 @@ def set_cart_addons(self, event: Event, addons: List[dict], cart_id: str=None, l
|
||||
|
||||
@receiver(checkout_confirm_messages, dispatch_uid="cart_confirm_messages")
|
||||
def confirm_messages(sender, *args, **kwargs):
|
||||
if not sender.settings.confirm_text:
|
||||
if not sender.settings.confirm_texts:
|
||||
return {}
|
||||
|
||||
return {
|
||||
'confirm_text': rich_text(str(sender.settings.confirm_text))
|
||||
}
|
||||
confirm_texts = sender.settings.get("confirm_texts", as_type=LazyI18nStringList)
|
||||
return {'confirm_text_%i' % index: rich_text(str(text)) for index, text in enumerate(confirm_texts)}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
import json
|
||||
from collections import OrderedDict
|
||||
import operator
|
||||
from collections import OrderedDict, UserList
|
||||
from datetime import datetime
|
||||
from decimal import Decimal
|
||||
from typing import Any
|
||||
@@ -37,6 +38,20 @@ def country_choice_kwargs():
|
||||
}
|
||||
|
||||
|
||||
class LazyI18nStringList(UserList):
|
||||
def __init__(self, init_list=None):
|
||||
super().__init__()
|
||||
if init_list is not None:
|
||||
self.data = [v if isinstance(v, LazyI18nString) else LazyI18nString(v) for v in init_list]
|
||||
|
||||
def serialize(self):
|
||||
return json.dumps([s.data for s in self.data])
|
||||
|
||||
@classmethod
|
||||
def unserialize(cls, s):
|
||||
return cls(json.loads(s))
|
||||
|
||||
|
||||
DEFAULTS = {
|
||||
'max_items_per_order': {
|
||||
'default': '10',
|
||||
@@ -1127,18 +1142,11 @@ DEFAULTS = {
|
||||
),
|
||||
'serializer_class': serializers.URLField,
|
||||
},
|
||||
'confirm_text': {
|
||||
'default': None,
|
||||
'type': LazyI18nString,
|
||||
'form_class': I18nFormField,
|
||||
'serializer_class': I18nField,
|
||||
'form_kwargs': dict(
|
||||
label=_('Confirmation text'),
|
||||
help_text=_('This text needs to be confirmed by the user before a purchase is possible. You could for example '
|
||||
'link your terms of service here. If you use the Pages feature to publish your terms of service, '
|
||||
'you don\'t need this setting since you can configure it there.'),
|
||||
widget=I18nTextarea,
|
||||
)
|
||||
'confirm_texts': {
|
||||
'default': LazyI18nStringList(),
|
||||
'type': LazyI18nStringList,
|
||||
'serializer_class': serializers.ListField,
|
||||
'serializer_kwargs': lambda: dict(child=I18nField()),
|
||||
},
|
||||
'mail_html_renderer': {
|
||||
'default': 'classic',
|
||||
@@ -1939,6 +1947,9 @@ def i18n_uns(v):
|
||||
settings_hierarkey.add_type(LazyI18nString,
|
||||
serialize=lambda s: json.dumps(s.data),
|
||||
unserialize=i18n_uns)
|
||||
settings_hierarkey.add_type(LazyI18nStringList,
|
||||
serialize=operator.methodcaller("serialize"),
|
||||
unserialize=LazyI18nStringList.unserialize)
|
||||
settings_hierarkey.add_type(RelativeDateWrapper,
|
||||
serialize=lambda rdw: rdw.to_string(),
|
||||
unserialize=lambda s: RelativeDateWrapper.from_string(s))
|
||||
|
||||
Reference in New Issue
Block a user