forked from CGM_Public/pretix_original
Compare commits
15
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
791aa60f6c | ||
|
|
fcff5a522d | ||
|
|
7e93d38a01 | ||
|
|
6469381899 | ||
|
|
761706c60c | ||
|
|
f91315c88e | ||
|
|
bc05afeab9 | ||
|
|
02d495d287 | ||
|
|
894878d9da | ||
|
|
5896ca0197 | ||
|
|
fe6fc8df32 | ||
|
|
9de8f3a775 | ||
|
|
c92bb9cb8b | ||
|
|
76ecec8b98 | ||
|
|
4b8416df8f |
@@ -231,11 +231,10 @@ The following snippet is an example on how to configure a nginx proxy for pretix
|
||||
}
|
||||
}
|
||||
server {
|
||||
listen 443 default_server;
|
||||
listen [::]:443 ipv6only=on default_server;
|
||||
listen 443 ssl default_server;
|
||||
listen [::]:443 ipv6only=on ssl default_server;
|
||||
server_name pretix.mydomain.com;
|
||||
|
||||
ssl on;
|
||||
ssl_certificate /path/to/cert.chain.pem;
|
||||
ssl_certificate_key /path/to/key.pem;
|
||||
|
||||
|
||||
@@ -216,11 +216,10 @@ The following snippet is an example on how to configure a nginx proxy for pretix
|
||||
}
|
||||
}
|
||||
server {
|
||||
listen 443 default_server;
|
||||
listen [::]:443 ipv6only=on default_server;
|
||||
listen 443 ssl default_server;
|
||||
listen [::]:443 ipv6only=on ssl default_server;
|
||||
server_name pretix.mydomain.com;
|
||||
|
||||
ssl on;
|
||||
ssl_certificate /path/to/cert.chain.pem;
|
||||
ssl_certificate_key /path/to/key.pem;
|
||||
|
||||
|
||||
+1
-1
@@ -107,7 +107,7 @@ dependencies = [
|
||||
[project.optional-dependencies]
|
||||
memcached = ["pylibmc"]
|
||||
dev = [
|
||||
"aiohttp==3.10.*",
|
||||
"aiohttp==3.11.*",
|
||||
"coverage",
|
||||
"coveralls",
|
||||
"fakeredis==2.26.*",
|
||||
|
||||
@@ -209,13 +209,24 @@ def get_best_name(position_or_address, parts=False):
|
||||
def base_placeholders(sender, **kwargs):
|
||||
from pretix.multidomain.urlreverse import build_absolute_uri
|
||||
|
||||
def _event_sample(event):
|
||||
if event.has_subevents:
|
||||
se = event.subevents.first()
|
||||
if se:
|
||||
return se.name
|
||||
return event.name
|
||||
|
||||
ph = [
|
||||
SimpleFunctionalTextPlaceholder(
|
||||
'event', ['event'], lambda event: event.name, lambda event: event.name
|
||||
),
|
||||
SimpleFunctionalTextPlaceholder(
|
||||
'event', ['event_or_subevent'], lambda event_or_subevent: event_or_subevent.name,
|
||||
lambda event_or_subevent: event_or_subevent.name
|
||||
_event_sample,
|
||||
),
|
||||
SimpleFunctionalTextPlaceholder(
|
||||
'event_series_name', ['event', 'event_or_subevent'], lambda event, event_or_subevent: event.name,
|
||||
lambda event: event.name
|
||||
),
|
||||
SimpleFunctionalTextPlaceholder(
|
||||
'event_slug', ['event'], lambda event: event.slug, lambda event: event.slug
|
||||
|
||||
@@ -136,6 +136,11 @@ class EventWizardBasicsForm(I18nModelForm):
|
||||
choices=settings.LANGUAGES,
|
||||
label=_("Default language"),
|
||||
)
|
||||
no_taxes = forms.BooleanField(
|
||||
label=_("I don't want to specify taxes now"),
|
||||
help_text=_("You can always configure tax rates later."),
|
||||
required=False,
|
||||
)
|
||||
tax_rate = forms.DecimalField(
|
||||
label=_("Sales tax rate"),
|
||||
help_text=_("Do you need to pay sales tax on your tickets? In this case, please enter the applicable tax rate "
|
||||
@@ -223,6 +228,11 @@ class EventWizardBasicsForm(I18nModelForm):
|
||||
raise ValidationError({
|
||||
'timezone': _('Your default locale must be specified.')
|
||||
})
|
||||
if not data.get("no_taxes") and not data.get("tax_rate"):
|
||||
raise ValidationError({
|
||||
'tax_rate': _('You have not specified a tax rate. If you do not want us to compute sales taxes, please '
|
||||
'check "{field}" above.').format(field=self.fields["no_taxes"].label)
|
||||
})
|
||||
|
||||
# change timezone
|
||||
zone = ZoneInfo(data.get('timezone'))
|
||||
|
||||
@@ -41,7 +41,10 @@
|
||||
{% endif %}
|
||||
{% include "pretixcontrol/event/fragment_geodata.html" %}
|
||||
{% bootstrap_field form.currency layout="control" %}
|
||||
{% bootstrap_field form.tax_rate addon_after="%" layout="control" %}
|
||||
{% bootstrap_field form.no_taxes layout="control" %}
|
||||
<div data-display-dependency="#{{ form.no_taxes.id_for_label }}" data-inverse>
|
||||
{% bootstrap_field form.tax_rate addon_after="%" layout="control" %}
|
||||
</div>
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{% trans "Display settings" %}</legend>
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+290
-274
File diff suppressed because it is too large
Load Diff
@@ -8,7 +8,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2024-11-18 15:30+0000\n"
|
||||
"POT-Creation-Date: 2024-11-19 15:34+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
|
||||
"Language-Team: LANGUAGE <LL@li.org>\n"
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -381,8 +381,8 @@ class RuleForm(FormPlaceholderMixin, I18nModelForm):
|
||||
]
|
||||
)
|
||||
|
||||
self._set_field_placeholders('subject', ['event', 'order'])
|
||||
self._set_field_placeholders('template', ['event', 'order'])
|
||||
self._set_field_placeholders('subject', ['event', 'order', 'event_or_subevent'])
|
||||
self._set_field_placeholders('template', ['event', 'order', 'event_or_subevent'])
|
||||
|
||||
choices = [(e, l) for e, l in Order.STATUS_CHOICE if e != 'n']
|
||||
choices.insert(0, ('n__valid_if_pending', _('payment pending but already confirmed')))
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
# Generated by Django 4.2.16 on 2024-11-13 13:43
|
||||
|
||||
from django.db import migrations
|
||||
from django.db.models import Q
|
||||
from i18nfield.strings import LazyI18nString
|
||||
|
||||
|
||||
def migrate_placeholders(apps, schema_editor):
|
||||
Rule = apps.get_model("sendmail", "Rule")
|
||||
for r in Rule.objects.filter(
|
||||
Q(template__contains="{event}") | Q(subject__contains="{event}"),
|
||||
event__has_subevents=True
|
||||
):
|
||||
r.template = LazyI18nString({
|
||||
k: v.replace("{event}", "{event_series_name}") for k, v in r.template.data.items()
|
||||
})
|
||||
r.subject = LazyI18nString({
|
||||
k: v.replace("{event}", "{event_series_name}") for k, v in r.subject.data.items()
|
||||
})
|
||||
r.save(update_fields=["template", "subject"])
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
dependencies = [
|
||||
("sendmail", "008_remove_scheduled_mails"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.RunPython(
|
||||
migrate_placeholders,
|
||||
migrations.RunPython.noop,
|
||||
)
|
||||
]
|
||||
@@ -174,7 +174,12 @@ class ScheduledMail(models.Model):
|
||||
ia = InvoiceAddress(order=o)
|
||||
|
||||
if send_to_orders and o.email:
|
||||
email_ctx = get_email_context(event=e, order=o, invoice_address=ia)
|
||||
email_ctx = get_email_context(
|
||||
event=e,
|
||||
order=o,
|
||||
invoice_address=ia,
|
||||
event_or_subevent=self.subevent or e,
|
||||
)
|
||||
try:
|
||||
o.send_mail(self.rule.subject, self.rule.template, email_ctx,
|
||||
attach_ical=self.rule.attach_ical,
|
||||
@@ -192,12 +197,23 @@ class ScheduledMail(models.Model):
|
||||
for p in positions:
|
||||
try:
|
||||
if p.attendee_email and (p.attendee_email != o.email or not o_sent):
|
||||
email_ctx = get_email_context(event=e, order=o, invoice_address=ia, position=p)
|
||||
email_ctx = get_email_context(
|
||||
event=e,
|
||||
order=o,
|
||||
invoice_address=ia,
|
||||
position=p,
|
||||
event_or_subevent=self.subevent or e,
|
||||
)
|
||||
p.send_mail(self.rule.subject, self.rule.template, email_ctx,
|
||||
attach_ical=self.rule.attach_ical,
|
||||
log_entry_type='pretix.plugins.sendmail.rule.order.position.email.sent')
|
||||
elif not o_sent and o.email:
|
||||
email_ctx = get_email_context(event=e, order=o, invoice_address=ia)
|
||||
email_ctx = get_email_context(
|
||||
event=e,
|
||||
order=o,
|
||||
invoice_address=ia,
|
||||
event_or_subevent=self.subevent or e,
|
||||
)
|
||||
o.send_mail(self.rule.subject, self.rule.template, email_ctx,
|
||||
attach_ical=self.rule.attach_ical,
|
||||
log_entry_type='pretix.plugins.sendmail.rule.order.email.sent')
|
||||
|
||||
@@ -492,12 +492,18 @@ class StripeSettingsHolder(BasePaymentProvider):
|
||||
# label=_('PayPal'),
|
||||
# disabled=self.event.currency not in [
|
||||
# 'EUR', 'GBP', 'USD', 'CHF', 'CZK', 'DKK', 'NOK', 'PLN', 'SEK', 'AUD', 'CAD', 'HKD', 'NZD', 'SGD'
|
||||
# ]
|
||||
# ],
|
||||
# help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
|
||||
# 'before they work properly.'),
|
||||
# required=False,
|
||||
# )),
|
||||
('method_mobilepay',
|
||||
forms.BooleanField(
|
||||
label=_('MobilePay'),
|
||||
disabled=self.event.currency not in ['DKK', 'EUR', 'NOK', 'SEK'],
|
||||
help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
|
||||
'before they work properly.'),
|
||||
required=False,
|
||||
)),
|
||||
] + extra_fields + list(super().settings_form_fields.items()) + moto_settings
|
||||
)
|
||||
|
||||
@@ -122,29 +122,29 @@ $label-warning-bg-hover: var(--pretix-brand-warning-darken-10);
|
||||
$label-danger-bg: var(--pretix-brand-danger);
|
||||
$label-danger-bg-hover: var(--pretix-brand-danger-darken-10);
|
||||
|
||||
$alert-success-bg: var(--pretix-brand-success-lighten-48);
|
||||
$alert-success-text: var(--pretix-brand-success-darken-10);
|
||||
$alert-success-bg: var(--pretix-brand-success-tint-85);
|
||||
$alert-success-text: var(--pretix-brand-success-shade-42);
|
||||
$alert-success-border: var(--pretix-brand-success);
|
||||
$alert-success-hr: var(--pretix-brand-success-darken-5);
|
||||
$alert-success-link: var(--pretix-brand-success-darken-20);
|
||||
$alert-success-link: var(--pretix-brand-success-shade-42);
|
||||
|
||||
$alert-info-bg: var(--pretix-brand-info-lighten-33);
|
||||
$alert-info-text: var(--pretix-brand-info-darken-20);
|
||||
$alert-info-bg: var(--pretix-brand-info-tint-85);
|
||||
$alert-info-text: var(--pretix-brand-info-shade-42);
|
||||
$alert-info-border: var(--pretix-brand-info);
|
||||
$alert-info-hr: var(--pretix-brand-info-darken-5);
|
||||
$alert-info-link: var(--pretix-brand-info-darken-30);
|
||||
$alert-info-link: var(--pretix-brand-info-shade-42);
|
||||
|
||||
$alert-warning-bg: var(--pretix-brand-warning-lighten-41);
|
||||
$alert-warning-text: var(--pretix-brand-warning-darken-25);
|
||||
$alert-warning-bg: var(--pretix-brand-warning-tint-85);
|
||||
$alert-warning-text: var(--pretix-brand-warning-shade-42);
|
||||
$alert-warning-border: var(--pretix-brand-warning);
|
||||
$alert-warning-hr: var(--pretix-brand-warning-darken-5);
|
||||
$alert-warning-link: var(--pretix-brand-warning-darken-35);
|
||||
$alert-warning-link: var(--pretix-brand-warning-shade-42);
|
||||
|
||||
$alert-danger-bg: var(--pretix-brand-danger-lighten-43);
|
||||
$alert-danger-text: var(--pretix-brand-danger-darken-5);
|
||||
$alert-danger-bg: var(--pretix-brand-danger-tint-85);
|
||||
$alert-danger-text: var(--pretix-brand-danger-shade-42);
|
||||
$alert-danger-border: var(--pretix-brand-danger);
|
||||
$alert-danger-hr: var(--pretix-brand-danger-darken-5);
|
||||
$alert-danger-link: var(--pretix-brand-danger-darken-15);
|
||||
$alert-danger-link: var(--pretix-brand-danger-shade-42);
|
||||
|
||||
$main-box-bg: #FFFFFF;
|
||||
|
||||
@@ -156,4 +156,4 @@ $slider-secondary-bottom: var(--pretix-brand-primary-lighten-23-saturate-2);
|
||||
/* The following vars default to $body-bg in bootstrap, which we don't want */
|
||||
$nav-tabs-active-link-hover-bg: #FFFFFF;
|
||||
$nav-tabs-justified-active-link-border-color: #FFFFFF;
|
||||
$thumbnail-bg: #FFFFFF;
|
||||
$thumbnail-bg: #FFFFFF;
|
||||
|
||||
@@ -73,7 +73,9 @@ $in-border-radius-small: 2px !default;
|
||||
--pretix-brand-success-darken-20: #{darken($in-brand-success, 20%)};
|
||||
--pretix-brand-success-darken-30: #{darken($in-brand-success, 30%)};
|
||||
--pretix-brand-success-tint-50: #{tint($in-brand-success, 50%)};
|
||||
--pretix-brand-success-tint-85: #{tint($in-brand-success, 85%)};
|
||||
--pretix-brand-success-shade-25: #{shade($in-brand-success, 25%)};
|
||||
--pretix-brand-success-shade-42: #{shade($in-brand-success, 42%)};
|
||||
|
||||
--pretix-brand-info-lighten-23: #{lighten($in-brand-info, 23%)};
|
||||
--pretix-brand-info-lighten-25: #{lighten($in-brand-info, 25%)};
|
||||
@@ -84,7 +86,9 @@ $in-border-radius-small: 2px !default;
|
||||
--pretix-brand-info-darken-17: #{darken($in-brand-info, 17%)};
|
||||
--pretix-brand-info-darken-20: #{darken($in-brand-info, 20%)};
|
||||
--pretix-brand-info-darken-30: #{darken($in-brand-info, 30%)};
|
||||
--pretix-brand-info-tint-85: #{tint($in-brand-info, 85%)};
|
||||
--pretix-brand-info-shade-25: #{shade($in-brand-info, 25%)};
|
||||
--pretix-brand-info-shade-42: #{shade($in-brand-info, 42%)};
|
||||
|
||||
--pretix-brand-warning-lighten-12: #{lighten($in-brand-warning, 12%)};
|
||||
--pretix-brand-warning-lighten-31: #{lighten($in-brand-warning, 31%)};
|
||||
@@ -101,7 +105,9 @@ $in-border-radius-small: 2px !default;
|
||||
--pretix-brand-warning-darken-30: #{darken($in-brand-warning, 30%)};
|
||||
--pretix-brand-warning-darken-35: #{darken($in-brand-warning, 35%)};
|
||||
--pretix-brand-warning-tint-50: #{tint($in-brand-warning, 50%)};
|
||||
--pretix-brand-warning-tint-85: #{tint($in-brand-warning, 85%)};
|
||||
--pretix-brand-warning-shade-25: #{shade($in-brand-warning, 25%)};
|
||||
--pretix-brand-warning-shade-42: #{shade($in-brand-warning, 42%)};
|
||||
--pretix-brand-warning-transparent-60: #{transparentize($in-brand-warning, 0.6)};
|
||||
|
||||
--pretix-brand-danger-lighten-5: #{lighten($in-brand-danger, 5%)};
|
||||
@@ -118,7 +124,9 @@ $in-border-radius-small: 2px !default;
|
||||
--pretix-brand-danger-darken-20: #{darken($in-brand-danger, 20%)};
|
||||
--pretix-brand-danger-darken-30: #{darken($in-brand-danger, 30%)};
|
||||
--pretix-brand-danger-tint-50: #{tint($in-brand-danger, 50%)};
|
||||
--pretix-brand-danger-tint-85: #{tint($in-brand-danger, 85%)};
|
||||
--pretix-brand-danger-shade-25: #{shade($in-brand-danger, 25%)};
|
||||
--pretix-brand-danger-shade-42: #{shade($in-brand-danger, 42%)};
|
||||
|
||||
--pretix-border-radius-base: #{$in-border-radius-base};
|
||||
--pretix-border-radius-large: #{$in-border-radius-large};
|
||||
@@ -140,4 +148,4 @@ $in-border-radius-small: 2px !default;
|
||||
--pretix-body-bg-white-0: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -763,6 +763,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_1': 'Hamburg',
|
||||
'basics-currency': 'EUR',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'Europe/Berlin',
|
||||
'basics-presale_start': '2016-11-01 10:00:00',
|
||||
@@ -792,6 +793,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_1': 'Hamburg',
|
||||
'basics-currency': 'EUR',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'Europe/Berlin',
|
||||
'basics-presale_start_0': '2016-11-01',
|
||||
@@ -888,6 +890,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_1': 'Hamburg',
|
||||
'basics-currency': 'EUR',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'Europe/Berlin',
|
||||
'basics-presale_start_0': '2016-11-01',
|
||||
@@ -1073,6 +1076,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_0': 'Hamburg',
|
||||
'basics-currency': 'EUR',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'UTC',
|
||||
'basics-presale_start_0': '',
|
||||
@@ -1121,6 +1125,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_0': 'Hamburg',
|
||||
'basics-currency': 'EUR',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'UTC',
|
||||
'basics-presale_start_0': '',
|
||||
@@ -1171,6 +1176,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_0': 'Hamburg',
|
||||
'basics-currency': 'EUR',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'Europe/Berlin',
|
||||
'basics-presale_start_0': '2016-11-01',
|
||||
@@ -1200,6 +1206,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_0': 'Hamburg',
|
||||
'basics-currency': '$',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'Europe/Berlin',
|
||||
'basics-presale_start_0': '2016-11-01',
|
||||
@@ -1229,6 +1236,7 @@ class EventsTest(SoupTest):
|
||||
'basics-location_0': 'Hamburg',
|
||||
'basics-currency': 'ASD',
|
||||
'basics-tax_rate': '',
|
||||
'basics-no_taxes': 'on',
|
||||
'basics-locale': 'en',
|
||||
'basics-timezone': 'Europe/Berlin',
|
||||
'basics-presale_start_0': '2016-11-01',
|
||||
|
||||
Reference in New Issue
Block a user