mirror of
https://github.com/pretix/pretix.git
synced 2026-10-19 22:13:44 +00:00
Compare commits
15
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2580dba280 | ||
|
|
f196417005 | ||
|
|
090a73d02a | ||
|
|
e4b29f56a4 | ||
|
|
531758d444 | ||
|
|
b1ec585fc8 | ||
|
|
a076461eae | ||
|
|
8048859fb4 | ||
|
|
2e4e60db34 | ||
|
|
6b7f2ad684 | ||
|
|
54b249acf5 | ||
|
|
0cf2ba763b | ||
|
|
b44c3d707e | ||
|
|
45603c6624 | ||
|
|
ba36d649c6 |
No files matched your search
@@ -1,6 +1,6 @@
|
||||
sphinx==9.1.*
|
||||
sphinx-rtd-theme~=3.1.0
|
||||
sphinxcontrib-httpdomain~=2.0.0
|
||||
sphinxcontrib-httpdomain~=2.1.0
|
||||
sphinxcontrib-images~=1.0.1
|
||||
sphinxcontrib-jquery~=4.1
|
||||
sphinxcontrib-spelling~=8.0.2
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
-e ../
|
||||
sphinx==9.1.*
|
||||
sphinx-rtd-theme~=3.1.0
|
||||
sphinxcontrib-httpdomain~=2.0.0
|
||||
sphinxcontrib-httpdomain~=2.1.0
|
||||
sphinxcontrib-images~=1.0.1
|
||||
sphinxcontrib-jquery~=4.1
|
||||
sphinxcontrib-spelling~=8.0.2
|
||||
|
||||
+3
-3
@@ -34,7 +34,7 @@ dependencies = [
|
||||
"celery==5.6.*",
|
||||
"chardet==5.2.*",
|
||||
"cryptography>=50.0.2",
|
||||
"css-inline==0.21.*",
|
||||
"css-inline==0.22.*",
|
||||
"defusedcsv>=3.0.0",
|
||||
"dnspython==2.*",
|
||||
"Django[argon2]==5.2.*,>=5.2.17",
|
||||
@@ -83,7 +83,7 @@ dependencies = [
|
||||
"psycopg2-binary",
|
||||
"pycountry",
|
||||
"pycparser==3.0",
|
||||
"pycryptodome==3.23.*",
|
||||
"pycryptodome==3.24.*",
|
||||
"pypdf==6.19.*",
|
||||
"python-bidi==0.6.*", # Support for Arabic in reportlab
|
||||
"python-dateutil==2.9.*",
|
||||
@@ -112,7 +112,7 @@ dev = [
|
||||
"aiohttp==3.14.*",
|
||||
"coverage",
|
||||
"coveralls",
|
||||
"fakeredis==2.38.*",
|
||||
"fakeredis==2.39.*",
|
||||
"flake8==7.4.*",
|
||||
"freezegun",
|
||||
"isort==9.0.*",
|
||||
|
||||
@@ -261,7 +261,9 @@ class ItemAddOnSerializer(serializers.ModelSerializer):
|
||||
def validate(self, data):
|
||||
data = super().validate(data)
|
||||
|
||||
ItemAddOn.clean_max_min_count(data.get('max_count'), data.get('min_count'))
|
||||
full_data = self.to_internal_value(self.to_representation(self.instance)) if self.instance else {}
|
||||
full_data.update(data)
|
||||
ItemAddOn.clean_max_min_count(full_data.get('max_count'), full_data.get('min_count'))
|
||||
|
||||
return data
|
||||
|
||||
|
||||
@@ -160,7 +160,11 @@ class CustomerListExporter(OrganizerLevelExportMixin, MultiSheetListExporter):
|
||||
]
|
||||
if name_scheme and len(name_scheme['fields']) > 1:
|
||||
for k, label, w in name_scheme['fields']:
|
||||
row.append(obj.attendee_name_parts.get(k, ''))
|
||||
row.append(
|
||||
obj.attendee_name_parts.get(k, '')
|
||||
if obj.attendee_name_parts
|
||||
else ''
|
||||
)
|
||||
yield row
|
||||
|
||||
def get_filename(self):
|
||||
|
||||
@@ -146,7 +146,7 @@ class PeppolIdValidator:
|
||||
params={"number": prefix})
|
||||
|
||||
if self.validate_online:
|
||||
base_hostnames = ['edelivery.tech.ec.europa.eu', 'acc.edelivery.tech.ec.europa.eu']
|
||||
base_hostnames = ['participant.sml.prod.tech.peppol.org', 'participant.sml.test.tech.peppol.org']
|
||||
smp_id = base64.b32encode(hashlib.sha256(value.lower().encode()).digest()).decode().rstrip("=")
|
||||
for base_hostname in base_hostnames:
|
||||
smp_domain = f'{smp_id}.iso6523-actorid-upis.{base_hostname}'
|
||||
|
||||
@@ -316,6 +316,7 @@ def mail(email: Union[str, Sequence[str]], subject: Union[str, FormattedString],
|
||||
body_html = None
|
||||
|
||||
m = OutgoingMail.objects.create(
|
||||
guid=guid,
|
||||
organizer=organizer,
|
||||
event=event,
|
||||
order=order,
|
||||
|
||||
@@ -359,7 +359,8 @@ def mark_order_refunded(order, user=None, auth=None, api_token=None):
|
||||
|
||||
def mark_order_expired(order, user=None, auth=None):
|
||||
"""
|
||||
Mark this order as expired. This sets the payment status and returns the order object.
|
||||
Mark this order as expired. This sets the order status, generates an invoice cancellation
|
||||
and returns the order object.
|
||||
:param order: The order to change
|
||||
:param user: The user that performed the change
|
||||
"""
|
||||
|
||||
@@ -752,6 +752,11 @@ def base_placeholders(sender, **kwargs):
|
||||
lambda position_or_address: concatenation_for_salutation(get_best_name(position_or_address, parts=True)),
|
||||
lambda event: concatenation_for_salutation(name_scheme['sample']),
|
||||
))
|
||||
ph.append(SimpleFunctionalTextPlaceholder(
|
||||
"attendee_name_for_salutation", ["position"],
|
||||
lambda position: concatenation_for_salutation(position.attendee_name_parts),
|
||||
lambda event: concatenation_for_salutation(name_scheme['sample']),
|
||||
))
|
||||
|
||||
for f, l, w in name_scheme['fields']:
|
||||
if f == 'full_name':
|
||||
|
||||
@@ -342,7 +342,7 @@ def nav_context_list(request):
|
||||
max_to=Max('subevents__date_to'),
|
||||
max_fromto=Greatest(Max('subevents__date_to'), Max('subevents__date_from'))
|
||||
).annotate(
|
||||
order_from=Coalesce('min_from', 'date_from'),
|
||||
order_from=Coalesce('max_from', 'date_from'),
|
||||
).order_by('-order_from', 'slug')
|
||||
|
||||
if request.user.has_active_staff_session(request.session.session_key):
|
||||
|
||||
@@ -97,7 +97,7 @@ var pretixpaypal = {
|
||||
|
||||
let sdk_url = 'https://www.paypal.com/sdk/js'
|
||||
+ '?client-id=' + pretixpaypal.client_id
|
||||
+ '&components=buttons,funding-eligibility'
|
||||
+ '&components=buttons,funding-eligibility,messages'
|
||||
+ '¤cy=' + pretixpaypal.currency
|
||||
|
||||
if (pretixpaypal.locale) {
|
||||
@@ -195,6 +195,12 @@ var pretixpaypal = {
|
||||
label: 'pay',
|
||||
tagline: false
|
||||
},
|
||||
message: {
|
||||
amount: undefined,
|
||||
align: 'center',
|
||||
color: 'black',
|
||||
position: 'bottom'
|
||||
},
|
||||
createOrder: function (data, actions) {
|
||||
if (pretixpaypal.order_id) {
|
||||
return pretixpaypal.order_id
|
||||
@@ -285,6 +291,18 @@ var pretixpaypal = {
|
||||
|
||||
if (button.isEligible()) {
|
||||
eligibles.push(gettext(pretixpaypal.apm_map[fundingSource] || fundingSource))
|
||||
|
||||
if (fundingSource === 'paylater') {
|
||||
pretixpaypal.paypal.Messages({
|
||||
pageType: 'payment',
|
||||
style: {
|
||||
layout: 'text',
|
||||
logo: {
|
||||
type: 'none',
|
||||
}
|
||||
}
|
||||
}).render('.pp-message');
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
@@ -14,6 +14,7 @@
|
||||
After you clicked continue, we will be able to select how you want to pay and to fill in your payment
|
||||
details. You will then be redirected back here to review and confirm your order.
|
||||
{% endblocktrans %}
|
||||
<div class="pp-message"></div>
|
||||
{% endif %}
|
||||
</p>
|
||||
|
||||
|
||||
+3
-1
@@ -19,7 +19,9 @@ def activate_plugin(apps, schema_editor):
|
||||
)
|
||||
|
||||
for event in events:
|
||||
event.enable_plugin('pretix.plugins.sendmail')
|
||||
plugins_active = event.plugins.split(',')
|
||||
plugins_active.append('pretix.plugins.sendmail')
|
||||
event.plugins = ','.join(plugins_active)
|
||||
event.save(update_fields=['plugins'])
|
||||
|
||||
|
||||
|
||||
@@ -138,7 +138,7 @@ logger = logging.getLogger('pretix.plugins.stripe')
|
||||
# - BLIK: ✗
|
||||
# - Pay By Bank: ✓
|
||||
# - TWINT: ✓
|
||||
# - Wero: ✓ (No settings UI yet)
|
||||
# - Wero: ✓
|
||||
# - giropay: ✗ (deprecated)
|
||||
# - Sofort: ✗ (deprecated)
|
||||
#
|
||||
@@ -529,15 +529,14 @@ class StripeSettingsHolder(BasePaymentProvider):
|
||||
'before they work properly.'),
|
||||
required=False,
|
||||
)),
|
||||
# Disabled for now, since still in closed Beta and only available to dedicated boarded accounts.
|
||||
# ('method_wero',
|
||||
# forms.BooleanField(
|
||||
# label=_('Wero'),
|
||||
# disabled=self.event.currency not in 'EUR',
|
||||
# help_text=_('Some payment methods might need to be enabled in the settings of your Stripe account '
|
||||
# 'before they work properly.'),
|
||||
# required=False,
|
||||
# )),
|
||||
('method_wero',
|
||||
forms.BooleanField(
|
||||
label=_('Wero'),
|
||||
disabled=self.event.currency not in 'EUR',
|
||||
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
|
||||
)
|
||||
if not self.settings.connect_client_id or self.settings.secret_key:
|
||||
|
||||
@@ -247,6 +247,10 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
|
||||
context['has_addon_choices'] = any(cp.has_addon_choices for cp in get_cart(self.request))
|
||||
|
||||
templating_context = PlaceholderContext(event_or_subevent=self.subevent or self.request.event, event=self.request.event)
|
||||
|
||||
for field in ('presale_has_ended_text',):
|
||||
context[field] = templating_context.format(str(self.request.event.settings[field]))
|
||||
|
||||
if self.subevent:
|
||||
context['frontpage_text'] = templating_context.format(str(self.subevent.frontpage_text))
|
||||
else:
|
||||
|
||||
@@ -1925,6 +1925,14 @@ def test_addons_create(token_client, organizer, event, item, category, category2
|
||||
|
||||
@pytest.mark.django_db
|
||||
def test_addons_update(token_client, organizer, event, item, addon):
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/items/{}/addons/{}/'.format(organizer.slug, event.slug, item.pk, addon.pk),
|
||||
{
|
||||
},
|
||||
format='json'
|
||||
)
|
||||
assert resp.status_code == 200
|
||||
|
||||
resp = token_client.patch(
|
||||
'/api/v1/organizers/{}/events/{}/items/{}/addons/{}/'.format(organizer.slug, event.slug, item.pk, addon.pk),
|
||||
{
|
||||
|
||||
Reference in new issue
Block a user