Commit Graph

2806 Commits

Author SHA1 Message Date
Raphael Michel
bf48ae567f NREI export: Fix parsing of stripe data 2024-04-11 09:27:55 +02:00
Raphael Michel
ac02f3b417 API: Fix crash in order creation (PRETIXEU-9XS) 2024-04-10 09:40:35 +02:00
Raphael Michel
0067c3537d Fix invalid orders being created in a complex situation (#4054)
This was a bug that took days to find. The story goes like this: A cart
is created with four positions that each include four bundled positions.
A discount is applied, changing the price of *one* of the four top-level
positions to a reduced value. The list of position IDs gets passed to
`perform_order()`, which later passes it on to `transform_cart_positions()`.
`transform_cart_positions()`, however, receives the positions in an order
that has the first-level product *after* the bundled products that
belong to it. Therefore, it can't properly assign the parent-child
relationship between the positions.

The main reason is that cart positions are processed in "database order"
in a number of places, i.e. we make `SELECT` queries without an explicit
`ORDER BY` statement, leading the database to respond in unspecified
order. This is the case for `get_cart()` and hence for `CartMixin.positions`,
and hence for the list of position IDs that is passed to `perform_order()`
and hence for the order in which discounts are processed.

Therefore, if this "databse order" of the cart positions changes, the
discount compuation in `_check_positions()` might make a different choice
of *which* cart position should receive the discount than the CartManager
originally did. That's not nice, but most customers would not even
notice that a different one of their four (otherwise identical) tickets
is now discounted than the cart originally showed.

This leads to `_check_positions()` changing the price on two of the
cart positions. However, it only changes the price on the copy of
the CartPosition object that is directly part of the positions array,
while the `addon_to` attribute of its bundled positions contain a
*different* representation of the same cart position, that is not
refreshed to have the updated price now in the database.

This causes the `CartPosition.sort_key` of the bundled products to be
significantly different from the one of their parent products, which can
cause `transform_cart_positions()` to try to insert them before their
respective parent product, which is how the bug leads to the nasty end
result.

Now, I'm still not sure why this has happened *now* for the first time,
but I suspect it *might* even have something to do with our operations
team tuning our autovacuum parameters on our production installation,
which might make it *more likely* that newly created cart positions are
arbitrarily  stored on PostgreSQL disk pages in a different order than
they were inserted than before.

This commit now fixes the bug now in two ways, each of which would be
sufficient to fix it for now, but together they make it hopefully more
stable in the future:

- `perform_order` no longer respects the order of the position IDs it
  gets passed in, but instead uses the order last displayed in the cart.
  Additionally, both `CartManager` and `_check_positions()` now sort
  positions by their `pk` value before applying discounts to ensure
  consistent choice of which position is discounted (using  `sort_key`
  here does not make much sense since it includes sorting by price,
  which is about to change).

- `_check_positions()` makes sure that after its completion, only one
  copy of the same `CartPosition` is in use that has the current price.

Additionally, this commit makes sure `sort_key` cache is cleared after
e.g. a price change.

It was hard to write a regression test, since "database order" is, by
definition, unreliable, but I tried my best.
2024-04-08 16:55:54 +02:00
Raphael Michel
ca25c3c81e Add logging for special bug case (Z#23149646) 2024-04-04 18:13:54 +02:00
Raphael Michel
abbe9ec897 Order creation: Fail loudly on invalid addon-to relationship 2024-04-03 17:21:47 +02:00
Raphael Michel
a3139944f6 Send notifications about login with new client or country (#4032)
* Send notifications about login with new client or country

* Rebase migration

* Remove immediately

* Fix isort

* Text update
2024-04-03 11:19:20 +02:00
Raphael Michel
990e9da21d Generalize import process from orders to more models (#4002)
* Generalize import process from orders to more models

* Add voucher import

* Model import: Guess assignments of based on column headers

* Fix lock_seats being pointless

* Update docs

* Update doc/development/api/import.rst

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/base/modelimport_vouchers.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
2024-04-03 10:15:30 +02:00
Raphael Michel
440c97061c Fix duplicate key on SQLite (#4038)
* Fix duplicate key on SQLite

* Update migration
2024-04-02 17:37:37 +02:00
Raphael Michel
a233b92f6f Add disable date of waiting list to event timeline (#4036) 2024-04-02 17:15:41 +02:00
Raphael Michel
4ea4189e6d Allow team admins to require two-factor authentication (#4034)
* Allow team admins to require two-factor authentication

* Add API tests

* Improve logic

* ADd button tooltip
2024-04-02 17:15:16 +02:00
Raphael Michel
f3f42a8a42 Login: Add logging for incorrect JS hostnames 2024-04-02 11:34:43 +02:00
Raphael Michel
cda8144ff0 Enforce uniqueness of order codes and ticket secrets (#3988)
* Enforce uniqueness of order codes and ticket secrets

* Fix test cases which created orders with identical codes

---------

Co-authored-by: Mira Weller <weller@rami.io>
2024-04-02 11:07:40 +02:00
Raphael Michel
fb49046ac1 Log and count user logins (#4020)
* Log and count user logins

* Allow metrics without label

---------

Co-authored-by: Mira Weller <weller@rami.io>
2024-03-28 17:18:51 +01:00
Martin Gross
ce826e50f7 PDF: Check for allowed font name before adding modifiers to the name 2024-03-27 12:54:35 +01:00
Raphael Michel
f532853021 Memberships: Prefer valid_from over event date for .is_valid() (#4003)
* Memberships: Prefer valid_from over event date for .is_valid()

* Fix tests

* Add parameter description

* Use reasonable default for requested_valid_from if membership starts in the future

* Set datetimepicker viewDate to closest allowed date

* Keep current value on going back to QuestionsStep

* Fix min_date/max_date in SplitDateTimePickerWidget

* Remove unused import

* Update src/pretix/base/models/memberships.py

Co-authored-by: Mira <weller@rami.io>

* Respect variations

---------

Co-authored-by: Mira Weller <weller@rami.io>
2024-03-27 12:11:20 +01:00
Martin Gross
d67f5c650c Event-specific fonts and Web-Embedded Fonts (Z#23130701) (#3893) 2024-03-26 09:55:08 +01:00
Raphael Michel
273c1ae0a6 Waiting list: Allow to set auto-disable date (Z#23141338) (#4004)
* Waiting list: Allow to set auto-disable date (Z#23141338)

* ADd warning on non-esries events
2024-03-22 11:17:02 +01:00
Raphael Michel
2d8fba7d7c Treat partially paid expired orders as overpaid orders (Z#23147757) (#3990)
* Treat partially paid expired orders as overpaid orders (Z#23147757)

* Use is_overpaid from annotate_overpayments in OrderFilterForm

* Revert change to pending sum

* Show warning on order page

---------

Co-authored-by: Mira Weller <weller@rami.io>
2024-03-22 10:17:51 +01:00
Raphael Michel
9513b6e8d7 Gift card payment: Fix public_name fallback 2024-03-15 17:09:21 +01:00
Raphael Michel
9f794290dc Memberships: Check valid_from/valid_until for parallel usage (#3975) 2024-03-15 16:40:41 +01:00
Raphael Michel
b6221ab6d9 Improve error messages for test mode checks for memberships 2024-03-15 15:57:11 +01:00
Richard Schreiber
483518bce9 Fix: left align first column header on invoices without tax 2024-03-15 13:34:19 +01:00
Raphael Michel
d9019ae735 Fix splitting free orders that require approval 2024-03-15 11:37:27 +01:00
Mira
304d290f22 Presale: improve clientside handling of max-count for add-on products
* Fix typo in error message

* Use exclusive checkboxes for addon items with max_count == 1 and !multi_allowed

* combine exclusive items + variations

* move exclusive to containing fieldset

* fix add-on-exclusive

* add max_count check

* fix plus/minus-stepper buttons bubbling

* Update src/pretix/static/pretixpresale/js/ui/main.js

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
2024-03-14 09:17:42 +01:00
Raphael Michel
d32bd717b7 Fix meta filter being selectable for export 2024-03-04 15:52:45 +01:00
Richard Schreiber
50b5f760bb Presale: prefer event’s microdata from settings over generated microdata (#3943) 2024-03-01 09:56:55 +01:00
Raphael Michel
6bf23b0fdd Allow to create blocking vouchers for items with unspecified variation (#3932) 2024-02-29 16:45:41 +01:00
Raphael Michel
5deb1a8c69 Fix organizer being integer in mail_send_task 2024-02-29 08:59:15 +01:00
Raphael Michel
04ef097eb1 Fix #65 -- Disallow None value for product default prices (#3847)
* Fix #65 -- Disallow None value for product default prices

* Fix #65 -- Disallow None value for product default prices

* Rebase migration
2024-02-28 16:10:53 +01:00
Raphael Michel
62f0c82d8d Order data export: Add event name 2024-02-28 12:16:49 +01:00
Martin Gross
88ea8ee2ea Invoice Preview: Pass tax.name to InvoiceLine 2024-02-23 10:53:01 +01:00
Raphael Michel
6712baf534 Invoice creation: Fix duplicate new lines 2024-02-15 14:10:49 +01:00
Raphael Michel
4d9243151f Invoice creation: Fix duplicate new lines 2024-02-15 14:10:15 +01:00
Raphael Michel
b89a4f7b32 Update css-inline requirement from ==0.8.* to ==0.13.* 2024-02-15 13:49:03 +01:00
Raphael Michel
63894ca3da Update django-bootstrap3 requirement from ==23.1.* to ==23.6 (#3894)
* Update django-bootstrap3 requirement from ==23.1.* to ==23.6

 Removing our previous workarounds

* Fix import
2024-02-14 14:35:45 +01:00
Raphael Michel
57738f19bf Update webauthn requirement from ==0.4.* to ==2.0.* (#3880)
* Get rid of unmaintained dependency python-u2flib-server

* Update webauthn requirement from ==0.4.* to ==2.0.*

* Fix tests

* Update src/pretix/control/views/auth.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/control/views/auth.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/control/views/user.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/control/views/user.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* Update src/pretix/control/views/user.py

Co-authored-by: Richard Schreiber <schreiber@rami.io>

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
2024-02-14 13:27:24 +01:00
Raphael Michel
86b28b9b53 Get rid of unmaintained dependency python-u2flib-server (#3879) 2024-02-12 13:03:56 +01:00
Raphael Michel
b40a41d742 OrderListExporter: Refactor querysets out of iterate methods 2024-02-09 12:03:26 +01:00
Raphael Michel
70d32ea1aa Voucher form: Add quota in help text 2024-02-07 09:59:32 +01:00
Mira
fa3265b1fb Let plugins prevent the download of individual tickets in an order (#3858)
* Let plugins allow/prevent the download of individual tickets in an order (#3836)

(extends the functionality of the allow_ticket_download signal)

(cherry picked from commit e20edab98f)

* fix bug where in some cases, only the first ticket could be downloaded
2024-02-06 17:35:59 +01:00
Mira
22f91f7aa2 Improve UI to configure unavailable items handling (Z#23131828) (#3739)
* start impl of unavailability modes ui

* add db migration

* use new widget for more fields

* improve contrast

* use new widget for hide_without_voucher field

* improved wording

* rebase migration

* undo changes to require_membership_hidden

* code formatting

* move unavail_reason logic around

* enforce consistent state of hide_without_voucher / require_voucher

* annotate unavailability info in get_grouped_items

* remove MSIE6 compat

* add unavailability reasons to widget

* remove test output

* Apply suggestions from code review

text improvements

Co-authored-by: Richard Schreiber <schreiber@rami.io>

* add css fix for jumping items due to tooltip

* dynamically retrieve unavailability reason message

* widget: simplify logic conditions

* add available_{from,until}_mode to api and api docs

* rebase migration

* rebase migration

* add unavailable_*_mode to ItemVariation

* add available_*_mode to API docs for items

* fix wrong reference

* fix test cases

* add available_*_mode to item variation form

* apply unavailability modes to subevents and variations (presale)

* /o\

* apply unavailability modes to subevents and variations (widget)

* display unavailability mode in subevent product settings

* fix widget test

* fix api item tests

* copy available_*_mode when copying an item

* Apply suggestions from code review

Co-authored-by: Raphael Michel <michel@rami.io>

* Add unavail mode indicator to bulk create and edit forms

---------

Co-authored-by: Richard Schreiber <schreiber@rami.io>
Co-authored-by: Raphael Michel <michel@rami.io>
2024-02-06 12:27:19 +01:00
Mira
bac673f3ab Allow template syntax in event text (Z#23140046) (#3815)
* remove duplicate context generation

* allow text templates in frontpage_text

* refactor: move placeholder functionality to separate file

* fix wrong class name, code style

* update year in license header

* undo license header update

* use new function name

* render only the placeholders that are actually used in the message

* refactoring

* add str(...) call

* Update doc/development/api/placeholder.rst

Co-authored-by: Raphael Michel <michel@rami.io>

* rename register_mail_placeholders to register_template_placeholders
(deprecate old name)

* isort

* add signals to docs

---------

Co-authored-by: Raphael Michel <michel@rami.io>
2024-02-06 11:32:03 +01:00
Martin Gross
45ac391998 BasePaymentProvider: skip country check if ia.country == '' (Z#23143749) (#3859) 2024-02-05 16:51:04 +01:00
Martin Gross
9d115c30d7 Revert "Let plugins allow/prevent the download of individual tickets in an order (#3836)"
This reverts commit e20edab98f.
2024-02-02 16:09:42 +01:00
Martin Gross
a769da62c7 Addresses: Add Federal Territories to state dropdown for MY. 2024-02-02 12:31:06 +01:00
Mira
e20edab98f Let plugins allow/prevent the download of individual tickets in an order (#3836)
(extends the functionality of the allow_ticket_download signal)
2024-02-01 17:45:58 +01:00
Raphael Michel
0ca33eddb1 Cart: More useful error message if some selected products are sold (#3848)
* Cart: More useful error message if some selected products are sold

* Update src/pretix/base/services/cart.py

Co-authored-by: Mira <weller@rami.io>

---------

Co-authored-by: Mira <weller@rami.io>
2024-01-31 14:23:07 +01:00
Raphael Michel
31392e5852 Add simplified invoice renderer (#3846) 2024-01-30 16:14:53 +01:00
Raphael Michel
2b77e59e0a Fix #3838 -- String not in translation 2024-01-30 12:16:09 +01:00
Raphael Michel
70f755599a Add "lead" to slug banlist 2024-01-30 10:10:47 +01:00