Metadata-Version: 2.4
Name: pretix-single-position-expiration
Version: 1.0.20260705.1
Summary: Allows single position to expire rather than the entire order
Author-email: Furizon team <webservice@furizon.net>
Maintainer-email: Furizon team <webservice@furizon.net>
License: Apache
Project-URL: homepage, https://github.com/APSfurizon/pretix-single-position-expiration
Project-URL: repository, https://github.com/APSfurizon/pretix-single-position-expiration
Keywords: pretix
Description-Content-Type: text/x-rst
License-File: LICENSE
Dynamic: license-file

Single position expiration
==========================

This is a plugin for `pretix`_. 

Allows single position to expire rather than the entire order

This plugin was made to solve the following scenario:

- Person $A$ places an order with item $I$, fully pays it. The order is in paid status
- The quota for $I$ becomes full, nobody can buy new $I$
- $A$ changes his order and adds a new item, HOWEVER he doesn't pay the new cost, leaving the order in a pending status
- $A$'s order eventually expires (we have "Automatically expire unpaid orders" checked), so $I$ becomes again available
- Person $B$ arrives and buys $I$, quota is again full
- Now, even if $A$ finally pays for the extra item he recently added, he lost his right on $I$ even if he already paid for it.

Pretix team said (https://github.com/pretix/pretix/discussions/6130) that they're not planning on properly implementing a solution for this usecase inside the main branch, so I made a simple plugin which:

- Every time an order becomes paid, marks each position as paid as well (it also saves the datetime of when this happens)
- When an order becomes expired:
   - If no position was marked as paid, it lets the order properly expire
   - Otherwise, it cancels every position which was NOT marked as paid, letting the order come back in the paid status

Development setup
-----------------

1. Make sure that you have a working `pretix development setup`_.

2. Clone this repository.

3. Activate the virtual environment you use for pretix development.

4. Execute ``python setup.py develop`` within this directory to register this application with pretix's plugin registry.

5. Execute ``make`` within this directory to compile translations.

6. Restart your local pretix server. You can now use the plugin from this repository for your events by enabling it in
   the 'plugins' tab in the settings.

This plugin has CI set up to enforce a few code style rules. To check locally, you need these packages installed::

    pip install flake8 isort black

To check your plugin for rule violations, run::

    black --check .
    isort -c .
    flake8 .

You can auto-fix some of these issues by running::

    isort .
    black .

To automatically check for these issues before you commit, you can run ``.install-hooks``.


License
-------


Copyright 2026 Furizon team

Released under the terms of the Apache License 2.0



.. _pretix: https://github.com/pretix/pretix
.. _pretix development setup: https://docs.pretix.eu/en/latest/development/setup.html
