mirror of
https://github.com/pretix/pretix.git
synced 2026-01-31 01:42:27 +00:00
Compare commits
40 Commits
release/3.
...
gha-migrat
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
90b5d721cb | ||
|
|
1bcf1ec26a | ||
|
|
d224b5387d | ||
|
|
27d6e49c4a | ||
|
|
50bb66a32b | ||
|
|
207149f681 | ||
|
|
e0ed25a1d3 | ||
|
|
c0c177d755 | ||
|
|
f2844ac686 | ||
|
|
d9fd4b33a0 | ||
|
|
d2415f46df | ||
|
|
ad7c745465 | ||
|
|
b260cca412 | ||
|
|
82c84a0fdc | ||
|
|
d703c4de7a | ||
|
|
ff5fbf1c15 | ||
|
|
41ff4bca7f | ||
|
|
37f45de8a5 | ||
|
|
71f01c17bd | ||
|
|
43b1df572f | ||
|
|
ecda905ceb | ||
|
|
4e59b02bb1 | ||
|
|
234bf093ff | ||
|
|
ae9bd1b6ba | ||
|
|
b84b51250f | ||
|
|
d0dd2116ca | ||
|
|
945218035e | ||
|
|
89f8436e9a | ||
|
|
4992b17966 | ||
|
|
f7d057f9fa | ||
|
|
96ba32b1bb | ||
|
|
02792e3ae8 | ||
|
|
a87fe3ef41 | ||
|
|
bb673e0cc9 | ||
|
|
0b02bcea8b | ||
|
|
1d8668aaf1 | ||
|
|
0783add3b9 | ||
|
|
2030aaf12e | ||
|
|
7ce4c30922 | ||
|
|
f1e772c829 |
42
.github/workflows/docs.yml
vendored
Normal file
42
.github/workflows/docs.yml
vendored
Normal file
@@ -0,0 +1,42 @@
|
||||
name: Documentation
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- 'src/pretix/locale/**'
|
||||
- 'src/pretix/static/**'
|
||||
- 'src/tests/**'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- 'src/pretix/locale/**'
|
||||
- 'src/pretix/static/**'
|
||||
- 'src/tests/**'
|
||||
|
||||
jobs:
|
||||
spelling:
|
||||
name: Spellcheck
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Install system packages
|
||||
run: sudo apt install enchant hunspell aspell-en
|
||||
- name: Install Dependencies
|
||||
run: pip3 install --no-use-pep517 -Ur doc/requirements.txt
|
||||
- name: Spellcheck docs
|
||||
run: make spelling
|
||||
working-directory: ./doc
|
||||
- name:
|
||||
run: '[ ! -s _build/spelling/output.txt ]'
|
||||
working-directory: ./doc
|
||||
60
.github/workflows/strings.yml
vendored
Normal file
60
.github/workflows/strings.yml
vendored
Normal file
@@ -0,0 +1,60 @@
|
||||
name: Strings
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
paths:
|
||||
- 'src/pretix/locale/**'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths:
|
||||
- 'src/pretix/locale/**'
|
||||
|
||||
jobs:
|
||||
compile:
|
||||
runs-on: ubuntu-latest
|
||||
name: Check gettext syntax
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Install system packages
|
||||
run: sudo apt install gettext
|
||||
- name: Install Dependencies
|
||||
run: pip3 install --no-use-pep517 -Ur src/requirements.txt
|
||||
- name: Compile messages
|
||||
run: python manage.py compilemessages
|
||||
working-directory: ./src
|
||||
- name: Compile jsi18n
|
||||
run: python manage.py compilejsi18n
|
||||
working-directory: ./src
|
||||
spelling:
|
||||
runs-on: ubuntu-latest
|
||||
name: Spellcheck
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Install system packages
|
||||
run: sudo apt install enchant hunspell hunspell-de-de aspell-en aspell-de
|
||||
- name: Install Dependencies
|
||||
run: pip3 install --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
- name: Spellcheck translations
|
||||
run: potypo
|
||||
working-directory: ./src
|
||||
55
.github/workflows/style.yml
vendored
Normal file
55
.github/workflows/style.yml
vendored
Normal file
@@ -0,0 +1,55 @@
|
||||
name: Code Style
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- 'src/pretix/locale/**'
|
||||
- 'src/pretix/static/**'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- 'src/pretix/locale/**'
|
||||
- 'src/pretix/static/**'
|
||||
|
||||
jobs:
|
||||
isort:
|
||||
name: isort
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Install Dependencies
|
||||
run: pip3 install --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
- name: Run isort
|
||||
run: isort -c -rc -df .
|
||||
working-directory: ./src
|
||||
flake:
|
||||
name: flake8
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Set up Python 3.8
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: 3.8
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Install Dependencies
|
||||
run: pip3 install -r src/requirements.txt --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
- name: Run flake8
|
||||
run: flake8 .
|
||||
working-directory: ./src
|
||||
73
.github/workflows/tests.yml
vendored
Normal file
73
.github/workflows/tests.yml
vendored
Normal file
@@ -0,0 +1,73 @@
|
||||
name: Tests
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- 'doc/**'
|
||||
pull_request:
|
||||
branches: [ master ]
|
||||
paths-ignore:
|
||||
- 'doc/**'
|
||||
|
||||
jobs:
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
name: Tests
|
||||
strategy:
|
||||
matrix:
|
||||
python-version: [3.6, 3.7, 3.8]
|
||||
database: [sqlite, postgres, mysql]
|
||||
exclude:
|
||||
- database: mysql
|
||||
python-version: 3.7
|
||||
- database: sqlite
|
||||
python-version: 3.7
|
||||
- database: mysql
|
||||
python-version: 3.6
|
||||
- database: sqlite
|
||||
python-version: 3.6
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: getong/mariadb-action@v1.1
|
||||
with:
|
||||
mariadb version: '10.4'
|
||||
mysql database: 'pretix'
|
||||
mysql root password: ''
|
||||
if: matrix.database == 'mysql'
|
||||
- uses: harmon758/postgresql-action@v1
|
||||
with:
|
||||
postgresql version: '11'
|
||||
postgresql db: 'pretix'
|
||||
postgresql user: 'postgres'
|
||||
postgresql password: 'postgres'
|
||||
if: matrix.database == 'postgres'
|
||||
- name: Set up Python ${{ matrix.python-version }}
|
||||
uses: actions/setup-python@v1
|
||||
with:
|
||||
python-version: ${{ matrix.python-version }}
|
||||
- uses: actions/cache@v1
|
||||
with:
|
||||
path: ~/.cache/pip
|
||||
key: ${{ runner.os }}-pip-${{ hashFiles('**/requirements.txt') }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-pip-
|
||||
- name: Install system dependencies
|
||||
run: sudo apt install gettext mysql-client
|
||||
- name: Install Python dependencies
|
||||
run: pip3 install -r src/requirements.txt --no-use-pep517 -Ur src/requirements/dev.txt mysqlclient psycopg2-binary
|
||||
- name: Run checks
|
||||
run: python manage.py check
|
||||
working-directory: ./src
|
||||
- name: Compile
|
||||
working-directory: ./src
|
||||
run: make all compress
|
||||
- name: Run tests
|
||||
working-directory: ./src
|
||||
run: PRETIX_CONFIG_FILE=tests/travis_${{ matrix.database }}.cfg py.test -v -n 3 -p no:sugar --cov=./ --cov-report=xml --reruns 3 tests --maxfail=100
|
||||
- name: Upload coverage
|
||||
uses: codecov/codecov-action@v1
|
||||
with:
|
||||
file: src/coverage.xml
|
||||
fail_ci_if_error: true
|
||||
if: matrix.database == 'postgres' && matrix.python-version == '3.8'
|
||||
@@ -5,7 +5,11 @@ tests:
|
||||
- virtualenv env
|
||||
- source env/bin/activate
|
||||
- pip install -U pip wheel setuptools
|
||||
- XDG_CACHE_HOME=/cache bash .travis.sh tests
|
||||
- XDG_CACHE_HOME=/cache pip3 install -r src/requirements.txt --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
- cd src
|
||||
- python manage.py check
|
||||
- make all compress
|
||||
- py.test --reruns 3 -n 3 tests
|
||||
tags:
|
||||
- python3
|
||||
except:
|
||||
|
||||
68
.travis.sh
68
.travis.sh
@@ -1,68 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
set -x
|
||||
|
||||
echo "Executing job $1"
|
||||
|
||||
if [ "$PRETIX_CONFIG_FILE" == "tests/travis_mysql.cfg" ]; then
|
||||
mysql -u root -e 'CREATE DATABASE pretix DEFAULT CHARACTER SET utf8 DEFAULT COLLATE utf8_general_ci;'
|
||||
pip3 install -Ur src/requirements/mysql.txt
|
||||
fi
|
||||
|
||||
if [ "$PRETIX_CONFIG_FILE" == "tests/travis_postgres.cfg" ]; then
|
||||
psql -c 'create database travis_ci_test;' -U postgres
|
||||
fi
|
||||
|
||||
if [ "$1" == "style" ]; then
|
||||
XDG_CACHE_HOME=/cache pip3 install --no-use-pep517 -Ur src/requirements.txt -r src/requirements/dev.txt
|
||||
cd src
|
||||
flake8 .
|
||||
isort -c -rc -df .
|
||||
fi
|
||||
if [ "$1" == "doctests" ]; then
|
||||
XDG_CACHE_HOME=/cache pip3 install --no-use-pep517 -Ur doc/requirements.txt
|
||||
cd doc
|
||||
make doctest
|
||||
fi
|
||||
if [ "$1" == "doc-spelling" ]; then
|
||||
XDG_CACHE_HOME=/cache pip3 install --no-use-pep517 -Ur doc/requirements.txt
|
||||
cd doc
|
||||
make spelling
|
||||
if [ -s _build/spelling/output.txt ]; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
if [ "$1" == "translation-spelling" ]; then
|
||||
XDG_CACHE_HOME=/cache pip3 install --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
cd src
|
||||
potypo
|
||||
fi
|
||||
if [ "$1" == "tests" ]; then
|
||||
pip3 install -r src/requirements.txt --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
cd src
|
||||
python manage.py check
|
||||
make all compress
|
||||
py.test --reruns 5 -n 3 tests
|
||||
fi
|
||||
if [ "$1" == "tests-cov" ]; then
|
||||
pip3 install -r src/requirements.txt --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
cd src
|
||||
python manage.py check
|
||||
make all compress
|
||||
coverage run -m py.test --reruns 5 tests && codecov
|
||||
fi
|
||||
if [ "$1" == "plugins" ]; then
|
||||
pip3 install -r src/requirements.txt --no-use-pep517 -Ur src/requirements/dev.txt
|
||||
cd src
|
||||
python setup.py develop
|
||||
make all compress
|
||||
|
||||
pushd ~
|
||||
git clone --depth 1 https://github.com/pretix/pretix-cartshare.git
|
||||
cd pretix-cartshare
|
||||
python setup.py develop
|
||||
make
|
||||
py.test --reruns 5 tests
|
||||
popd
|
||||
|
||||
fi
|
||||
45
.travis.yml
45
.travis.yml
@@ -1,45 +0,0 @@
|
||||
language: python
|
||||
dist: xenial
|
||||
sudo: false
|
||||
install:
|
||||
- pip install -U pip wheel setuptools
|
||||
script:
|
||||
- bash .travis.sh $JOB
|
||||
cache:
|
||||
directories:
|
||||
- $HOME/.cache/pip
|
||||
services:
|
||||
- mysql
|
||||
- postgresql
|
||||
matrix:
|
||||
include:
|
||||
- python: 3.8
|
||||
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_sqlite.cfg
|
||||
- python: 3.8
|
||||
env: JOB=tests-cov PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
|
||||
- python: 3.8
|
||||
env: JOB=style
|
||||
- python: 3.8
|
||||
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_mysql.cfg
|
||||
- python: 3.8
|
||||
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
|
||||
- python: 3.7
|
||||
env: JOB=tests PRETIX_CONFIG_FILE=tests/travis_postgres.cfg
|
||||
- python: 3.8
|
||||
env: JOB=doc-spelling
|
||||
- python: 3.8
|
||||
env: JOB=translation-spelling
|
||||
addons:
|
||||
postgresql: "10"
|
||||
mariadb: '10.3'
|
||||
apt:
|
||||
packages:
|
||||
- enchant
|
||||
- myspell-de-de
|
||||
- aspell-en
|
||||
- sqlite3
|
||||
sources:
|
||||
- travis-ci/sqlite3
|
||||
branches:
|
||||
except:
|
||||
- /^weblate-.*/
|
||||
@@ -4,11 +4,10 @@ pretix
|
||||
.. image:: https://img.shields.io/pypi/v/pretix.svg
|
||||
:target: https://pypi.python.org/pypi/pretix
|
||||
|
||||
.. image:: https://readthedocs.org/projects/pretix/badge/?version=latest
|
||||
.. image:: https://github.com/pretix/pretix/workflows/Documentation/badge.svg
|
||||
:target: https://docs.pretix.eu/en/latest/
|
||||
|
||||
.. image:: https://travis-ci.org/pretix/pretix.svg?branch=master
|
||||
:target: https://travis-ci.org/pretix/pretix
|
||||
.. image:: https://github.com/pretix/pretix/workflows/Tests/badge.svg
|
||||
|
||||
.. image:: https://codecov.io/gh/pretix/pretix/branch/master/graph/badge.svg
|
||||
:target: https://codecov.io/gh/pretix/pretix
|
||||
|
||||
@@ -18,6 +18,8 @@ secret string Gift card code
|
||||
value money (string) Current gift card value
|
||||
currency string Currency of the value (can not be modified later)
|
||||
testmode boolean Whether this is a test gift card
|
||||
expires datetime Expiry date (or ``null``)
|
||||
conditions string Special terms and conditions for this card (or ``null``)
|
||||
===================================== ========================== =======================================================
|
||||
|
||||
Endpoints
|
||||
@@ -53,6 +55,8 @@ Endpoints
|
||||
"secret": "HLBYVELFRC77NCQY",
|
||||
"currency": "EUR",
|
||||
"testmode": false,
|
||||
"expires": null,
|
||||
"conditions": null,
|
||||
"value": "13.37"
|
||||
}
|
||||
]
|
||||
@@ -92,6 +96,8 @@ Endpoints
|
||||
"secret": "HLBYVELFRC77NCQY",
|
||||
"currency": "EUR",
|
||||
"testmode": false,
|
||||
"expires": null,
|
||||
"conditions": null,
|
||||
"value": "13.37"
|
||||
}
|
||||
|
||||
@@ -134,6 +140,8 @@ Endpoints
|
||||
"secret": "HLBYVELFRC77NCQY",
|
||||
"testmode": false,
|
||||
"currency": "EUR",
|
||||
"expires": null,
|
||||
"conditions": null,
|
||||
"value": "13.37"
|
||||
}
|
||||
|
||||
@@ -180,6 +188,8 @@ Endpoints
|
||||
"secret": "HLBYVELFRC77NCQY",
|
||||
"testmode": false,
|
||||
"currency": "EUR",
|
||||
"expires": null,
|
||||
"conditions": null,
|
||||
"value": "14.00"
|
||||
}
|
||||
|
||||
@@ -222,6 +232,8 @@ Endpoints
|
||||
"secret": "HLBYVELFRC77NCQY",
|
||||
"currency": "EUR",
|
||||
"testmode": false,
|
||||
"expires": null,
|
||||
"conditions": null,
|
||||
"value": "15.37"
|
||||
}
|
||||
|
||||
|
||||
@@ -72,6 +72,10 @@ The output class
|
||||
|
||||
.. autoattribute:: download_button_icon
|
||||
|
||||
.. autoattribute:: multi_download_button_text
|
||||
|
||||
.. autoattribute:: long_download_button_text
|
||||
|
||||
.. autoattribute:: preview_allowed
|
||||
|
||||
.. autoattribute:: javascript_required
|
||||
|
||||
@@ -18,7 +18,7 @@ Coding style and quality
|
||||
* We expect all new code to come with proper tests. When writing new tests, please write them using `pytest-style`_
|
||||
test functions and raw ``assert`` statements. Use `fixtures`_ to prevent repetitive code. Some old parts of pretix'
|
||||
test suite are in the style of Python's unit test module. If you extend those files, you might continue in this style,
|
||||
but please use pytest style for any new test files.
|
||||
but please use ``pytest`` style for any new test files.
|
||||
|
||||
* Please keep the first line of your commit messages short. When referencing an issue, please phrase it like
|
||||
``Fix #123 -- Problems with order creation`` or ``Refs #123 -- Fix this part of that bug``.
|
||||
|
||||
@@ -1 +1 @@
|
||||
__version__ = "3.8.0"
|
||||
__version__ = "3.9.0.dev0"
|
||||
|
||||
@@ -751,7 +751,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
|
||||
sales_channel = get_all_sales_channels()[self.initial_data['sales_channel']]
|
||||
|
||||
if testmode and not sales_channel.testmode_supported:
|
||||
raise ValidationError('This sales channel does not provide support for testmode.')
|
||||
raise ValidationError('This sales channel does not provide support for test mode.')
|
||||
except KeyError:
|
||||
# We do not need to raise a ValidationError here, since there is another check to validate the
|
||||
# sales_channel
|
||||
|
||||
@@ -55,7 +55,7 @@ class GiftCardSerializer(I18nAwareModelSerializer):
|
||||
|
||||
class Meta:
|
||||
model = GiftCard
|
||||
fields = ('id', 'secret', 'issuance', 'value', 'currency', 'testmode')
|
||||
fields = ('id', 'secret', 'issuance', 'value', 'currency', 'testmode', 'expires', 'conditions')
|
||||
|
||||
|
||||
class EventSlugField(serializers.SlugRelatedField):
|
||||
|
||||
@@ -712,7 +712,7 @@ class InvoiceDataExporter(MultiSheetListExporter):
|
||||
|
||||
class GiftcardRedemptionListExporter(ListExporter):
|
||||
identifier = 'giftcardredemptionlist'
|
||||
verbose_name = gettext_lazy('Giftcard Redemptions')
|
||||
verbose_name = gettext_lazy('Gift card redemptions')
|
||||
|
||||
def iterate_list(self, form_data):
|
||||
tz = pytz.timezone(self.event.settings.timezone)
|
||||
|
||||
@@ -0,0 +1,558 @@
|
||||
# Generated by Django 3.0.4 on 2020-04-20 15:06
|
||||
|
||||
from decimal import Decimal
|
||||
|
||||
import django.db.models.deletion
|
||||
import jsonfallback.fields
|
||||
from django.conf import settings
|
||||
from django.core.cache import cache
|
||||
from django.db import migrations, models
|
||||
from django.db.models import Count
|
||||
|
||||
import pretix.base.models.base
|
||||
import pretix.base.models.fields
|
||||
import pretix.base.models.orders
|
||||
|
||||
|
||||
def fwd(app, schema_editor):
|
||||
Team = app.get_model('pretixbase', 'Team')
|
||||
Team.objects.filter(can_change_organizer_settings=True).update(can_manage_gift_cards=True)
|
||||
|
||||
|
||||
def mail_migrator(app, schema_editor):
|
||||
Event_SettingsStore = app.get_model('pretixbase', 'Event_SettingsStore')
|
||||
|
||||
for ss in Event_SettingsStore.objects.filter(
|
||||
key__in=['mail_text_order_approved', 'mail_text_order_placed', 'mail_text_order_placed_require_approval']
|
||||
):
|
||||
chgd = ss.value.replace("{date}", "{expire_date}")
|
||||
if chgd != ss.value:
|
||||
ss.value = chgd
|
||||
ss.save()
|
||||
cache.delete('hierarkey_{}_{}'.format('event', ss.object_id))
|
||||
|
||||
|
||||
def set_show_hidden_items(apps, schema_editor):
|
||||
Voucher = apps.get_model('pretixbase', 'Voucher')
|
||||
Voucher.objects.filter(quota__isnull=False).update(show_hidden_items=False)
|
||||
|
||||
|
||||
def make_checkins_unique(apps, se):
|
||||
Checkin = apps.get_model('pretixbase', 'Checkin')
|
||||
for d in Checkin.objects.order_by().values('list_id', 'position_id').annotate(c=Count('id')).filter(c__gt=1):
|
||||
for c in Checkin.objects.filter(list_id=d['list_id'], position_id=d['position_id'])[:d['c'] - 1]:
|
||||
c.delete()
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
replaces = [('pretixbase', '0108_auto_20190201_1527'), ('pretixbase', '0109_auto_20190208_1432'),
|
||||
('pretixbase', '0110_auto_20190219_1245'), ('pretixbase', '0111_auto_20190219_0949'),
|
||||
('pretixbase', '0112_auto_20190304_1726'), ('pretixbase', '0113_auto_20190312_0942'),
|
||||
('pretixbase', '0114_auto_20190316_1014'), ('pretixbase', '0115_auto_20190323_2238'),
|
||||
('pretixbase', '0116_auto_20190402_0722'), ('pretixbase', '0117_auto_20190418_1149'),
|
||||
('pretixbase', '0118_auto_20190423_0839'), ('pretixbase', '0119_auto_20190509_0654'),
|
||||
('pretixbase', '0120_auto_20190509_0736'), ('pretixbase', '0121_order_email_known_to_work'),
|
||||
('pretixbase', '0122_orderposition_web_secret'), ('pretixbase', '0123_auto_20190530_1035'),
|
||||
('pretixbase', '0124_seat_seat_guid'), ('pretixbase', '0125_voucher_show_hidden_items'),
|
||||
('pretixbase', '0126_item_show_quota_left'), ('pretixbase', '0127_auto_20190711_0705'),
|
||||
('pretixbase', '0128_auto_20190715_1510'), ('pretixbase', '0129_auto_20190724_1548'),
|
||||
('pretixbase', '0130_auto_20190729_1311'), ('pretixbase', '0131_auto_20190729_1422'),
|
||||
('pretixbase', '0132_auto_20190808_1253'), ('pretixbase', '0133_auto_20190830_1513'),
|
||||
('pretixbase', '0134_auto_20190909_1042'), ('pretixbase', '0135_auto_20191007_0803'),
|
||||
('pretixbase', '0136_auto_20190918_1742'), ('pretixbase', '0137_auto_20191015_1141'),
|
||||
('pretixbase', '0138_auto_20191017_1151'), ('pretixbase', '0139_auto_20191019_1317'),
|
||||
('pretixbase', '0140_voucher_seat'), ('pretixbase', '0141_seat_sorting_rank')]
|
||||
|
||||
dependencies = [
|
||||
('pretixbase', '0107_auto_20190129_1337'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='item',
|
||||
name='generate_tickets',
|
||||
field=models.NullBooleanField(verbose_name='Allow ticket download'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='invoiceline',
|
||||
name='event_date_from',
|
||||
field=models.DateTimeField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='invoiceline',
|
||||
name='subevent',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT,
|
||||
to='pretixbase.SubEvent'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='plugins',
|
||||
field=models.TextField(blank=True, default='', verbose_name='Plugins'),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='order',
|
||||
name='testmode',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='testmode',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.RunPython(
|
||||
code=make_checkins_unique,
|
||||
reverse_code=django.db.migrations.operations.special.RunPython.noop,
|
||||
),
|
||||
migrations.AlterUniqueTogether(
|
||||
name='checkin',
|
||||
unique_together={('list', 'position')},
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='question',
|
||||
name='dependency_question',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name='dependent_questions', to='pretixbase.Question'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='question',
|
||||
name='dependency_value',
|
||||
field=models.TextField(blank=True, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='cartposition',
|
||||
name='is_bundled',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cartposition',
|
||||
name='addon_to',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name='addons', to='pretixbase.CartPosition'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='orderposition',
|
||||
name='addon_to',
|
||||
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name='addons', to='pretixbase.OrderPosition'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='item',
|
||||
name='require_bundling',
|
||||
field=models.BooleanField(default=False,
|
||||
help_text='If this option is set, the product will only be sold as part of bundle products.',
|
||||
verbose_name='Only sell this product as part of a bundle'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='ItemBundle',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('count', models.PositiveIntegerField(default=1, verbose_name='Number')),
|
||||
('designated_price', models.DecimalField(blank=True, decimal_places=2, default=Decimal('0.00'),
|
||||
help_text="If set, it will be shown that this bundled item is responsible for the given value of the total gross price. This might be important in cases of mixed taxation, but can be kept blank otherwise. This value will NOT be added to the base item's price.",
|
||||
max_digits=10, verbose_name='Designated price part')),
|
||||
('base_item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bundles',
|
||||
to='pretixbase.Item')),
|
||||
('bundled_item',
|
||||
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='bundled_with',
|
||||
to='pretixbase.Item', verbose_name='Bundled item')),
|
||||
('bundled_variation',
|
||||
models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name='bundled_with', to='pretixbase.ItemVariation',
|
||||
verbose_name='Bundled variation')),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='device',
|
||||
name='revoked',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='itemvariation',
|
||||
name='original_price',
|
||||
field=models.DecimalField(blank=True, decimal_places=2,
|
||||
help_text='If set, this will be displayed next to the current price to show that the current price is a discounted one. This is just a cosmetic setting and will not actually impact pricing.',
|
||||
max_digits=7, null=True, verbose_name='Original price'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='subevent',
|
||||
name='is_public',
|
||||
field=models.BooleanField(default=True,
|
||||
help_text='If selected, this event will show up publicly on the list of dates for your event.',
|
||||
verbose_name='Show in lists'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='question',
|
||||
name='hidden',
|
||||
field=models.BooleanField(default=False, help_text='This question will only show up in the backend.',
|
||||
verbose_name='Hidden question'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cartposition',
|
||||
name='attendee_name_parts',
|
||||
field=jsonfallback.fields.FallbackJSONField(default=dict),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cartposition',
|
||||
name='subevent',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.SubEvent'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='cartposition',
|
||||
name='voucher',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Voucher'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='event',
|
||||
name='is_public',
|
||||
field=models.BooleanField(default=True),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='invoiceaddress',
|
||||
name='name_parts',
|
||||
field=jsonfallback.fields.FallbackJSONField(default=dict),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='item',
|
||||
name='sales_channels',
|
||||
field=pretix.base.models.fields.MultiStringField(default=['web']),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='order',
|
||||
name='sales_channel',
|
||||
field=models.CharField(default='web', max_length=190),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='orderposition',
|
||||
name='attendee_name_parts',
|
||||
field=jsonfallback.fields.FallbackJSONField(default=dict),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='orderposition',
|
||||
name='subevent',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.SubEvent'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='orderposition',
|
||||
name='voucher',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Voucher'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='staffsessionauditlog',
|
||||
name='method',
|
||||
field=models.CharField(max_length=255),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='user',
|
||||
name='email',
|
||||
field=models.EmailField(db_index=True, max_length=190, null=True, unique=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='order',
|
||||
name='email_known_to_work',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='orderposition',
|
||||
name='web_secret',
|
||||
field=models.CharField(db_index=True, default=pretix.base.models.orders.generate_secret, max_length=32),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='SeatingPlan',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=190)),
|
||||
('layout', models.TextField()),
|
||||
('organizer',
|
||||
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seating_plans',
|
||||
to='pretixbase.Organizer')),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
bases=(models.Model, pretix.base.models.base.LoggingMixin),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='SeatCategoryMapping',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('layout_category', models.CharField(max_length=190)),
|
||||
('event',
|
||||
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seat_category_mappings',
|
||||
to='pretixbase.Event')),
|
||||
('product',
|
||||
models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seat_category_mappings',
|
||||
to='pretixbase.Item')),
|
||||
('subevent', models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name='seat_category_mappings', to='pretixbase.SubEvent')),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Seat',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=190)),
|
||||
('blocked', models.BooleanField(default=False)),
|
||||
('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='seats',
|
||||
to='pretixbase.Event')),
|
||||
('product',
|
||||
models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='seats',
|
||||
to='pretixbase.Item')),
|
||||
('subevent',
|
||||
models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, related_name='seats',
|
||||
to='pretixbase.SubEvent')),
|
||||
('seat_guid', models.CharField(db_index=True, default=None, max_length=190)),
|
||||
],
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='cartposition',
|
||||
name='seat',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Seat'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='seating_plan',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='events',
|
||||
to='pretixbase.SeatingPlan'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='orderposition',
|
||||
name='seat',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, to='pretixbase.Seat'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='subevent',
|
||||
name='seating_plan',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='subevents',
|
||||
to='pretixbase.SeatingPlan'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='voucher',
|
||||
name='show_hidden_items',
|
||||
field=models.BooleanField(default=True),
|
||||
),
|
||||
migrations.RunPython(
|
||||
code=set_show_hidden_items,
|
||||
reverse_code=django.db.migrations.operations.special.RunPython.noop,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='item',
|
||||
name='show_quota_left',
|
||||
field=models.NullBooleanField(),
|
||||
),
|
||||
migrations.RenameField(
|
||||
model_name='question',
|
||||
old_name='dependency_value',
|
||||
new_name='dependency_values',
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='question',
|
||||
name='dependency_values',
|
||||
field=pretix.base.models.fields.MultiStringField(default=['']),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='quota',
|
||||
name='close_when_sold_out',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='quota',
|
||||
name='closed',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='item',
|
||||
name='hidden_if_available',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='pretixbase.Quota'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='seat',
|
||||
name='row_name',
|
||||
field=models.CharField(default='', max_length=190),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='seat',
|
||||
name='seat_number',
|
||||
field=models.CharField(default='', max_length=190),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='seat',
|
||||
name='zone_name',
|
||||
field=models.CharField(default='', max_length=190),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='item',
|
||||
name='allow_waitinglist',
|
||||
field=models.BooleanField(default=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='invoice',
|
||||
name='invoice_to_state',
|
||||
field=models.CharField(max_length=190, null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='invoiceaddress',
|
||||
name='state',
|
||||
field=models.CharField(default='', max_length=255),
|
||||
preserve_default=False,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='question',
|
||||
name='print_on_invoice',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='WebAuthnDevice',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('name', models.CharField(max_length=64)),
|
||||
('confirmed', models.BooleanField(default=True)),
|
||||
('credential_id', models.CharField(max_length=255, null=True)),
|
||||
('rp_id', models.CharField(max_length=255, null=True)),
|
||||
('icon_url', models.CharField(max_length=255, null=True)),
|
||||
('ukey', models.TextField(null=True)),
|
||||
('pub_key', models.TextField(null=True)),
|
||||
('sign_count', models.IntegerField(default=0)),
|
||||
('user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to=settings.AUTH_USER_MODEL)),
|
||||
],
|
||||
options={
|
||||
'abstract': False,
|
||||
},
|
||||
),
|
||||
migrations.RunPython(
|
||||
code=mail_migrator,
|
||||
reverse_code=django.db.migrations.operations.special.RunPython.noop,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='checkin',
|
||||
name='auto_checked_in',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='checkinlist',
|
||||
name='auto_checkin_sales_channels',
|
||||
field=pretix.base.models.fields.MultiStringField(default=[]),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='user',
|
||||
name='auth_backend',
|
||||
field=models.CharField(default='native', max_length=255),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='GiftCard',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('issuance', models.DateTimeField(auto_now_add=True)),
|
||||
('secret', models.CharField(db_index=True, default=pretix.base.models.giftcards.gen_giftcard_secret,
|
||||
max_length=190)),
|
||||
('currency', models.CharField(max_length=10)),
|
||||
('issued_in', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name='issued_gift_cards', to='pretixbase.OrderPosition')),
|
||||
('issuer',
|
||||
models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='issued_gift_cards',
|
||||
to='pretixbase.Organizer')),
|
||||
('testmode', models.BooleanField(default=False)),
|
||||
],
|
||||
options={
|
||||
'unique_together': {('secret', 'issuer')},
|
||||
},
|
||||
bases=(models.Model, pretix.base.models.base.LoggingMixin),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='item',
|
||||
name='issue_giftcard',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='team',
|
||||
name='can_manage_gift_cards',
|
||||
field=models.BooleanField(default=False),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='question',
|
||||
name='dependency_values',
|
||||
field=pretix.base.models.fields.MultiStringField(default=[]),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='voucher',
|
||||
name='item',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='vouchers',
|
||||
to='pretixbase.Item'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='voucher',
|
||||
name='quota',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='vouchers',
|
||||
to='pretixbase.Quota'),
|
||||
),
|
||||
migrations.AlterField(
|
||||
model_name='voucher',
|
||||
name='variation',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='vouchers',
|
||||
to='pretixbase.ItemVariation'),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='GiftCardTransaction',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('datetime', models.DateTimeField(auto_now_add=True)),
|
||||
('value', models.DecimalField(decimal_places=2, max_digits=10)),
|
||||
('card', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, related_name='transactions',
|
||||
to='pretixbase.GiftCard')),
|
||||
('order', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name='gift_card_transactions', to='pretixbase.Order')),
|
||||
('payment', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name='gift_card_transactions', to='pretixbase.OrderPayment')),
|
||||
('refund', models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT,
|
||||
related_name='gift_card_transactions', to='pretixbase.OrderRefund')),
|
||||
],
|
||||
options={
|
||||
'ordering': ('datetime',),
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='GiftCardAcceptance',
|
||||
fields=[
|
||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
|
||||
('collector', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name='gift_card_issuer_acceptance', to='pretixbase.Organizer')),
|
||||
('issuer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name='gift_card_collector_acceptance', to='pretixbase.Organizer')),
|
||||
],
|
||||
),
|
||||
migrations.RunPython(
|
||||
code=fwd,
|
||||
reverse_code=django.db.migrations.operations.special.RunPython.noop,
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='geo_lat',
|
||||
field=models.FloatField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='event',
|
||||
name='geo_lon',
|
||||
field=models.FloatField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='subevent',
|
||||
name='geo_lat',
|
||||
field=models.FloatField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='subevent',
|
||||
name='geo_lon',
|
||||
field=models.FloatField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='voucher',
|
||||
name='seat',
|
||||
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.PROTECT, related_name='vouchers',
|
||||
to='pretixbase.Seat'),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='seat',
|
||||
name='sorting_rank',
|
||||
field=models.BigIntegerField(default=0),
|
||||
),
|
||||
]
|
||||
26
src/pretix/base/migrations/0151_auto_20200421_0737.py
Normal file
26
src/pretix/base/migrations/0151_auto_20200421_0737.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# Generated by Django 3.0.5 on 2020-04-21 07:37
|
||||
|
||||
import django_countries.fields
|
||||
from django.db import migrations, models
|
||||
|
||||
import pretix.helpers.countries
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('pretixbase', '0150_auto_20200401_1123'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='giftcard',
|
||||
name='conditions',
|
||||
field=models.TextField(null=True),
|
||||
),
|
||||
migrations.AddField(
|
||||
model_name='giftcard',
|
||||
name='expires',
|
||||
field=models.DateTimeField(blank=True, null=True),
|
||||
),
|
||||
]
|
||||
@@ -5,7 +5,8 @@ from django.core.validators import RegexValidator
|
||||
from django.db import models
|
||||
from django.db.models import Sum
|
||||
from django.utils.crypto import get_random_string
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.utils.timezone import now
|
||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||
|
||||
from pretix.base.banlist import banned
|
||||
from pretix.base.models import LoggedModel
|
||||
@@ -54,7 +55,7 @@ class GiftCard(LoggedModel):
|
||||
validators=[
|
||||
RegexValidator(
|
||||
regex="^[a-zA-Z0-9][a-zA-Z0-9.-]+$",
|
||||
message=_("The giftcard code may only contain letters, numbers, dots and dashes."),
|
||||
message=_("The gift card code may only contain letters, numbers, dots and dashes."),
|
||||
)
|
||||
],
|
||||
)
|
||||
@@ -62,12 +63,22 @@ class GiftCard(LoggedModel):
|
||||
verbose_name=_('Test mode card'),
|
||||
default=False
|
||||
)
|
||||
expires = models.DateTimeField(
|
||||
null=True, blank=True, verbose_name=_('Expiry date')
|
||||
)
|
||||
conditions = models.TextField(
|
||||
null=True, blank=True, verbose_name=pgettext_lazy('giftcard', 'Special terms and conditions')
|
||||
)
|
||||
CURRENCY_CHOICES = [(c.alpha_3, c.alpha_3 + " - " + c.name) for c in settings.CURRENCIES]
|
||||
currency = models.CharField(max_length=10, choices=CURRENCY_CHOICES)
|
||||
|
||||
def __str__(self):
|
||||
return self.secret
|
||||
|
||||
@property
|
||||
def expired(self):
|
||||
return self.expires and now() > self.expires
|
||||
|
||||
@property
|
||||
def value(self):
|
||||
return self.transactions.aggregate(s=Sum('value'))['s'] or Decimal('0.00')
|
||||
|
||||
@@ -1,10 +1,12 @@
|
||||
import string
|
||||
from datetime import date, datetime, time
|
||||
|
||||
from django.core.validators import RegexValidator
|
||||
from django.db import models
|
||||
from django.db.models import Exists, OuterRef, Q
|
||||
from django.utils.crypto import get_random_string
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.timezone import get_current_timezone, make_aware, now
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
|
||||
from pretix.base.models.base import LoggedModel
|
||||
@@ -101,6 +103,15 @@ class Organizer(LoggedModel):
|
||||
Q(issuer=self) | Q(accepted=True)
|
||||
)
|
||||
|
||||
@property
|
||||
def default_gift_card_expiry(self):
|
||||
if self.settings.giftcard_expiry_years is not None:
|
||||
tz = get_current_timezone()
|
||||
return make_aware(datetime.combine(
|
||||
date(now().astimezone(tz).year + self.settings.get('giftcard_expiry_years', as_type=int), 12, 31),
|
||||
time(hour=23, minute=59, second=59)
|
||||
), tz)
|
||||
|
||||
def allow_delete(self):
|
||||
from . import Order, Invoice
|
||||
return (
|
||||
|
||||
@@ -1097,6 +1097,9 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
if not gc.testmode and self.event.testmode:
|
||||
messages.error(request, _("Only test gift cards can be used in test mode."))
|
||||
return
|
||||
if gc.expires and gc.expires < now():
|
||||
messages.error(request, _("This gift card is no longer valid."))
|
||||
return
|
||||
if gc.value <= Decimal("0.00"):
|
||||
messages.error(request, _("All credit on this gift card has been used."))
|
||||
return
|
||||
@@ -1156,6 +1159,9 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
if not gc.testmode and payment.order.testmode:
|
||||
messages.error(request, _("Only test gift cards can be used in test mode."))
|
||||
return
|
||||
if gc.expires and gc.expires < now():
|
||||
messages.error(request, _("This gift card is no longer valid."))
|
||||
return
|
||||
if gc.value <= Decimal("0.00"):
|
||||
messages.error(request, _("All credit on this gift card has been used."))
|
||||
return
|
||||
@@ -1194,6 +1200,9 @@ class GiftCardPayment(BasePaymentProvider):
|
||||
raise PaymentException(_("This gift card is not accepted by this event organizer."))
|
||||
if payment.amount > gc.value: # noqa - just a safeguard
|
||||
raise PaymentException(_("This gift card was used in the meantime. Please try again"))
|
||||
if gc.expires and gc.expires < now(): # noqa - just a safeguard
|
||||
messages.error(request, _("This gift card is no longer valid."))
|
||||
return
|
||||
trans = gc.transactions.create(
|
||||
value=-1 * payment.amount,
|
||||
order=payment.order,
|
||||
|
||||
@@ -212,7 +212,7 @@ DEFAULT_VARIABLES = OrderedDict((
|
||||
}),
|
||||
("addons", {
|
||||
"label": _("List of Add-Ons"),
|
||||
"editor_sample": _("Addon 1\nAddon 2"),
|
||||
"editor_sample": _("Add-on 1\nAdd-on 2"),
|
||||
"evaluate": lambda op, order, ev: "\n".join([
|
||||
'{} - {}'.format(p.item, p.variation) if p.variation else str(p.item)
|
||||
for p in (
|
||||
|
||||
@@ -86,7 +86,7 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, keep_fee_
|
||||
keep_fee_percentage: str, keep_fees: list=None, manual_refund: bool=False,
|
||||
send: bool=False, send_subject: dict=None, send_message: dict=None,
|
||||
send_waitinglist: bool=False, send_waitinglist_subject: dict={}, send_waitinglist_message: dict={},
|
||||
user: int=None, refund_as_giftcard: bool=False):
|
||||
user: int=None, refund_as_giftcard: bool=False, giftcard_expires=None, giftcard_conditions=None):
|
||||
send_subject = LazyI18nString(send_subject)
|
||||
send_message = LazyI18nString(send_message)
|
||||
send_waitinglist_subject = LazyI18nString(send_waitinglist_subject)
|
||||
@@ -169,7 +169,8 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, keep_fee_
|
||||
try:
|
||||
if auto_refund:
|
||||
_try_auto_refund(o.pk, manual_refund=manual_refund, allow_partial=True,
|
||||
source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard)
|
||||
source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard,
|
||||
giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions)
|
||||
finally:
|
||||
if send:
|
||||
_send_mail(o, send_subject, send_message, subevent, refund_amount, user, o.positions.all())
|
||||
@@ -213,7 +214,9 @@ def cancel_event(self, event: Event, subevent: int, auto_refund: bool, keep_fee_
|
||||
refund_amount = o.payment_refund_sum - o.total
|
||||
|
||||
if auto_refund:
|
||||
_try_auto_refund(o.pk, manual_refund=manual_refund, allow_partial=True, source=OrderRefund.REFUND_SOURCE_ADMIN)
|
||||
_try_auto_refund(o.pk, manual_refund=manual_refund, allow_partial=True,
|
||||
source=OrderRefund.REFUND_SOURCE_ADMIN, refund_as_giftcard=refund_as_giftcard,
|
||||
giftcard_expires=giftcard_expires, giftcard_conditions=giftcard_conditions)
|
||||
|
||||
if send:
|
||||
_send_mail(o, send_subject, send_message, subevent, refund_amount, user, positions)
|
||||
|
||||
@@ -1108,7 +1108,7 @@ def add_items_to_cart(self, event: int, items: List[dict], cart_id: str=None, lo
|
||||
:param event: The event ID in question
|
||||
:param items: A list of dicts with the keys item, variation, count, custom_price, voucher, seat ID
|
||||
:param cart_id: Session ID of a guest
|
||||
:raises CartError: On any error that occured
|
||||
:raises CartError: On any error that occurred
|
||||
"""
|
||||
with language(locale):
|
||||
ia = False
|
||||
|
||||
@@ -1913,8 +1913,11 @@ def perform_order(self, event: Event, payment_provider: str, positions: List[str
|
||||
raise OrderError(str(error_messages['busy']))
|
||||
|
||||
|
||||
_unset = object()
|
||||
|
||||
|
||||
def _try_auto_refund(order, manual_refund=False, allow_partial=False, source=OrderRefund.REFUND_SOURCE_BUYER,
|
||||
refund_as_giftcard=False):
|
||||
refund_as_giftcard=False, giftcard_expires=_unset, giftcard_conditions=None):
|
||||
notify_admin = False
|
||||
error = False
|
||||
if isinstance(order, int):
|
||||
@@ -1929,6 +1932,8 @@ def _try_auto_refund(order, manual_refund=False, allow_partial=False, source=Ord
|
||||
can_auto_refund_sum = refund_amount
|
||||
with transaction.atomic():
|
||||
giftcard = order.event.organizer.issued_gift_cards.create(
|
||||
expires=order.event.organizer.default_gift_card_expiry if giftcard_expires is _unset else giftcard_expires,
|
||||
conditions=giftcard_conditions,
|
||||
currency=order.event.currency,
|
||||
testmode=order.testmode
|
||||
)
|
||||
@@ -2144,7 +2149,8 @@ def signal_listener_issue_giftcards(sender: Event, order: Order, **kwargs):
|
||||
issued += gc.transactions.first().value
|
||||
if p.price - issued > 0:
|
||||
gc = sender.organizer.issued_gift_cards.create(
|
||||
currency=sender.currency, issued_in=p, testmode=order.testmode
|
||||
currency=sender.currency, issued_in=p, testmode=order.testmode,
|
||||
expires=sender.organizer.default_gift_card_expiry,
|
||||
)
|
||||
gc.transactions.create(value=p.price - issued, order=order)
|
||||
any_giftcards = True
|
||||
|
||||
@@ -857,7 +857,7 @@ DEFAULTS = {
|
||||
'form_kwargs': dict(
|
||||
label=_("Generate tickets for all products"),
|
||||
help_text=_('If turned off, tickets are only issued for products that are marked as an "admission ticket"'
|
||||
'in the product settings. You can also turn off tickt issuing in every product separately.'),
|
||||
'in the product settings. You can also turn off ticket issuing in every product separately.'),
|
||||
widget=forms.CheckboxInput(attrs={'data-checkbox-dependency': '#id_ticket_download',
|
||||
'data-checkbox-dependency-visual': 'on'}),
|
||||
)
|
||||
@@ -980,7 +980,7 @@ DEFAULTS = {
|
||||
widget_kwargs={'attrs': {'rows': '2'}},
|
||||
help_text=_("This text will be shown in between the explanation of how the refunds work and the slider "
|
||||
"which your customers can use to choose the amount they would like to receive. You can use it "
|
||||
"e.g. to explain choosing a lower refund will help your organisation.")
|
||||
"e.g. to explain choosing a lower refund will help your organization.")
|
||||
)
|
||||
},
|
||||
'cancel_allow_user_paid_require_approval': {
|
||||
|
||||
@@ -3,12 +3,14 @@ import urllib.parse
|
||||
import bleach
|
||||
import markdown
|
||||
from bleach import DEFAULT_CALLBACKS
|
||||
from bleach.linkifier import build_email_re, build_url_re
|
||||
from django import template
|
||||
from django.conf import settings
|
||||
from django.core import signing
|
||||
from django.urls import reverse
|
||||
from django.utils.http import url_has_allowed_host_and_scheme
|
||||
from django.utils.safestring import mark_safe
|
||||
from tlds import tld_set
|
||||
|
||||
register = template.Library()
|
||||
|
||||
@@ -63,6 +65,10 @@ ALLOWED_ATTRIBUTES = {
|
||||
|
||||
ALLOWED_PROTOCOLS = ['http', 'https', 'mailto', 'tel']
|
||||
|
||||
URL_RE = build_url_re(tlds=tld_set)
|
||||
|
||||
EMAIL_RE = build_email_re(tlds=tld_set)
|
||||
|
||||
|
||||
def safelink_callback(attrs, new=False):
|
||||
url = attrs.get((None, 'href'), '/')
|
||||
@@ -84,7 +90,12 @@ def abslink_callback(attrs, new=False):
|
||||
|
||||
|
||||
def markdown_compile_email(source):
|
||||
return bleach.linkify(bleach.clean(
|
||||
linker = bleach.Linker(
|
||||
url_re=URL_RE,
|
||||
email_re=EMAIL_RE,
|
||||
parse_email=True
|
||||
)
|
||||
return linker.linkify(bleach.clean(
|
||||
markdown.markdown(
|
||||
source,
|
||||
extensions=[
|
||||
@@ -95,7 +106,7 @@ def markdown_compile_email(source):
|
||||
tags=ALLOWED_TAGS,
|
||||
attributes=ALLOWED_ATTRIBUTES,
|
||||
protocols=ALLOWED_PROTOCOLS,
|
||||
), parse_email=True)
|
||||
))
|
||||
|
||||
|
||||
def markdown_compile(source, snippet=False):
|
||||
@@ -121,11 +132,13 @@ def rich_text(text: str, **kwargs):
|
||||
Processes markdown and cleans HTML in a text input.
|
||||
"""
|
||||
text = str(text)
|
||||
body_md = bleach.linkify(
|
||||
markdown_compile(text),
|
||||
linker = bleach.Linker(
|
||||
url_re=URL_RE,
|
||||
email_re=EMAIL_RE,
|
||||
callbacks=DEFAULT_CALLBACKS + ([safelink_callback] if kwargs.get('safelinks', True) else [abslink_callback]),
|
||||
parse_email=True
|
||||
)
|
||||
body_md = linker.linkify(markdown_compile(text))
|
||||
return mark_safe(body_md)
|
||||
|
||||
|
||||
@@ -135,9 +148,11 @@ def rich_text_snippet(text: str, **kwargs):
|
||||
Processes markdown and cleans HTML in a text input.
|
||||
"""
|
||||
text = str(text)
|
||||
body_md = bleach.linkify(
|
||||
markdown_compile(text, snippet=True),
|
||||
linker = bleach.Linker(
|
||||
url_re=URL_RE,
|
||||
email_re=EMAIL_RE,
|
||||
callbacks=DEFAULT_CALLBACKS + ([safelink_callback] if kwargs.get('safelinks', True) else [abslink_callback]),
|
||||
parse_email=True
|
||||
)
|
||||
body_md = linker.linkify(markdown_compile(text, snippet=True))
|
||||
return mark_safe(body_md)
|
||||
|
||||
9
src/pretix/base/templatetags/unidecode.py
Normal file
9
src/pretix/base/templatetags/unidecode.py
Normal file
@@ -0,0 +1,9 @@
|
||||
import text_unidecode
|
||||
from django import template
|
||||
|
||||
register = template.Library()
|
||||
|
||||
|
||||
@register.filter
|
||||
def unidecode(value):
|
||||
return text_unidecode.unidecode(str(value))
|
||||
@@ -162,6 +162,20 @@ class BaseTicketOutput:
|
||||
"""
|
||||
return _('Download ticket')
|
||||
|
||||
@property
|
||||
def long_download_button_text(self) -> str:
|
||||
"""
|
||||
The text on the large download button in the frontend.
|
||||
"""
|
||||
return self.download_button_text
|
||||
|
||||
@property
|
||||
def multi_download_button_text(self) -> str:
|
||||
"""
|
||||
The text on the multi download button in the frontend.
|
||||
"""
|
||||
return self.download_button_text
|
||||
|
||||
@property
|
||||
def download_button_icon(self) -> str:
|
||||
"""
|
||||
|
||||
@@ -10,7 +10,7 @@ from django.urls import reverse
|
||||
from django.utils.html import escape
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.utils.timezone import get_current_timezone_name
|
||||
from django.utils.translation import gettext_lazy as _, pgettext_lazy
|
||||
from django.utils.translation import gettext, gettext_lazy as _, pgettext_lazy
|
||||
from django_countries import Countries
|
||||
from django_countries.fields import LazyTypedChoiceField
|
||||
from i18nfield.forms import (
|
||||
@@ -206,7 +206,7 @@ class EventWizardBasicsForm(I18nModelForm):
|
||||
return user.teams.filter(
|
||||
organizer=organizer, all_events=True, can_change_event_settings=True, can_change_items=True,
|
||||
can_change_orders=True, can_change_vouchers=True
|
||||
).exists()
|
||||
).exists() or user.is_staff
|
||||
|
||||
|
||||
class EventChoiceMixin:
|
||||
@@ -396,7 +396,7 @@ class EventSettingsForm(SettingsForm):
|
||||
name_scheme = forms.ChoiceField(
|
||||
label=_("Name format"),
|
||||
help_text=_("This defines how pretix will ask for human names. Changing this after you already received "
|
||||
"orders might lead to unexpected behaviour when sorting or changing names."),
|
||||
"orders might lead to unexpected behavior when sorting or changing names."),
|
||||
required=True,
|
||||
)
|
||||
name_scheme_titles = forms.ChoiceField(
|
||||
@@ -577,6 +577,13 @@ class CancelSettingsForm(SettingsForm):
|
||||
'cancel_allow_user_paid_require_approval',
|
||||
]
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
if self.obj.settings.giftcard_expiry_years is not None:
|
||||
self.fields['cancel_allow_user_paid_refund_as_giftcard'].help_text = gettext(
|
||||
'You have configured gift cards to be valid {} years plus the year the gift card is issued in.'
|
||||
).format(self.obj.settings.giftcard_expiry_years)
|
||||
|
||||
|
||||
class PaymentSettingsForm(SettingsForm):
|
||||
auto_fields = [
|
||||
|
||||
@@ -78,7 +78,7 @@ class FilterForm(forms.Form):
|
||||
|
||||
def get_order_by(self):
|
||||
o = self.cleaned_data.get('ordering')
|
||||
if o.startswith('-'):
|
||||
if o.startswith('-') and o not in self.orders:
|
||||
return '-' + self.orders[o[1:]]
|
||||
else:
|
||||
return self.orders[o]
|
||||
@@ -530,6 +530,33 @@ class OrganizerFilterForm(FilterForm):
|
||||
|
||||
|
||||
class GiftCardFilterForm(FilterForm):
|
||||
orders = {
|
||||
'issuance': 'issuance',
|
||||
'expires': F('expires').asc(nulls_last=True),
|
||||
'-expires': F('expires').desc(nulls_first=True),
|
||||
'secret': 'secret',
|
||||
'value': 'cached_value',
|
||||
}
|
||||
testmode = forms.ChoiceField(
|
||||
label=_('Test mode'),
|
||||
choices=(
|
||||
('', _('All')),
|
||||
('yes', _('Test mode')),
|
||||
('no', _('Live')),
|
||||
),
|
||||
required=False
|
||||
)
|
||||
state = forms.ChoiceField(
|
||||
label=_('Empty'),
|
||||
choices=(
|
||||
('', _('All')),
|
||||
('empty', _('Empty')),
|
||||
('valid_value', _('Valid and with value')),
|
||||
('expired_value', _('Expired and with value')),
|
||||
('expired', _('Expired')),
|
||||
),
|
||||
required=False
|
||||
)
|
||||
query = forms.CharField(
|
||||
label=_('Search query'),
|
||||
widget=forms.TextInput(attrs={
|
||||
@@ -548,8 +575,30 @@ class GiftCardFilterForm(FilterForm):
|
||||
|
||||
if fdata.get('query'):
|
||||
query = fdata.get('query')
|
||||
qs = qs.filter(secret__icontains=query)
|
||||
return qs
|
||||
qs = qs.filter(
|
||||
Q(secret__icontains=query)
|
||||
| Q(transactions__text__icontains=query)
|
||||
| Q(transactions__order__code__icontains=query)
|
||||
)
|
||||
if fdata.get('testmode') == 'yes':
|
||||
qs = qs.filter(testmode=True)
|
||||
elif fdata.get('testmode') == 'no':
|
||||
qs = qs.filter(testmode=False)
|
||||
if fdata.get('state') == 'empty':
|
||||
qs = qs.filter(cached_value=0)
|
||||
elif fdata.get('state') == 'valid_value':
|
||||
qs = qs.exclude(cached_value=0).filter(Q(expires__isnull=True) | Q(expires__gte=now()))
|
||||
elif fdata.get('state') == 'expired_value':
|
||||
qs = qs.exclude(cached_value=0).filter(expires__lt=now())
|
||||
elif fdata.get('state') == 'expired':
|
||||
qs = qs.filter(expires__lt=now())
|
||||
|
||||
if fdata.get('ordering'):
|
||||
qs = qs.order_by(self.get_order_by())
|
||||
else:
|
||||
qs = qs.order_by('-issuance')
|
||||
|
||||
return qs.distinct()
|
||||
|
||||
|
||||
class EventFilterForm(FilterForm):
|
||||
|
||||
@@ -15,12 +15,15 @@ from i18nfield.strings import LazyI18nString
|
||||
|
||||
from pretix.base.email import get_available_placeholders
|
||||
from pretix.base.forms import I18nModelForm, PlaceholderValidator
|
||||
from pretix.base.forms.widgets import DatePickerWidget
|
||||
from pretix.base.forms.widgets import (
|
||||
DatePickerWidget, SplitDateTimePickerWidget,
|
||||
)
|
||||
from pretix.base.models import (
|
||||
InvoiceAddress, ItemAddOn, Order, OrderFee, OrderPosition,
|
||||
)
|
||||
from pretix.base.models.event import SubEvent
|
||||
from pretix.base.services.pricing import get_price
|
||||
from pretix.control.forms import SplitDateTimeField
|
||||
from pretix.control.forms.widgets import Select2
|
||||
from pretix.helpers.money import change_decimal_field
|
||||
|
||||
@@ -191,7 +194,7 @@ class OtherOperationsForm(forms.Form):
|
||||
initial=True,
|
||||
help_text=_(
|
||||
'If an invoice exists for this order and this operation would change its contents, the old invoice will '
|
||||
'be cancelled and a new invoice will be issued.'
|
||||
'be canceled and a new invoice will be issued.'
|
||||
)
|
||||
)
|
||||
notify = forms.BooleanField(
|
||||
@@ -540,6 +543,11 @@ class EventCancelForm(forms.Form):
|
||||
required=False,
|
||||
empty_label=pgettext_lazy('subevent', 'All dates')
|
||||
)
|
||||
all_subevents = forms.BooleanField(
|
||||
label=_('Cancel all dates'),
|
||||
initial=False,
|
||||
required=False
|
||||
)
|
||||
auto_refund = forms.BooleanField(
|
||||
label=_('Automatically refund money if possible'),
|
||||
initial=True,
|
||||
@@ -560,6 +568,20 @@ class EventCancelForm(forms.Form):
|
||||
initial=False,
|
||||
required=False,
|
||||
)
|
||||
gift_card_expires = SplitDateTimeField(
|
||||
label=_('Gift card validity'),
|
||||
required=False,
|
||||
widget=SplitDateTimePickerWidget(
|
||||
attrs={'data-display-dependency': '#id_refund_as_giftcard'},
|
||||
)
|
||||
)
|
||||
gift_card_conditions = forms.CharField(
|
||||
label=_('Special terms and conditions'),
|
||||
required=False,
|
||||
widget=forms.Textarea(
|
||||
attrs={'rows': 2, 'data-display-dependency': '#id_refund_as_giftcard'},
|
||||
)
|
||||
)
|
||||
keep_fee_fixed = forms.DecimalField(
|
||||
label=_("Keep a fixed cancellation fee"),
|
||||
max_digits=10, decimal_places=2,
|
||||
@@ -610,6 +632,8 @@ class EventCancelForm(forms.Form):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.event = kwargs.pop('event')
|
||||
kwargs.setdefault('initial', {})
|
||||
kwargs['initial']['gift_card_expires'] = self.event.organizer.default_gift_card_expiry
|
||||
super().__init__(*args, **kwargs)
|
||||
self.fields['send_subject'] = I18nFormField(
|
||||
label=_("Subject"),
|
||||
@@ -678,4 +702,11 @@ class EventCancelForm(forms.Form):
|
||||
self.fields['subevent'].widget.choices = self.fields['subevent'].choices
|
||||
else:
|
||||
del self.fields['subevent']
|
||||
del self.fields['all_subevents']
|
||||
change_decimal_field(self.fields['keep_fee_fixed'], self.event.currency)
|
||||
|
||||
def clean(self):
|
||||
d = super().clean()
|
||||
if self.event.has_subevents and not d['subevent'] and not d['all_subevents']:
|
||||
raise ValidationError(_('Please confirm that you want to cancel ALL dates in this event series.'))
|
||||
return d
|
||||
|
||||
@@ -14,9 +14,10 @@ from i18nfield.forms import I18nFormField, I18nTextarea
|
||||
from pretix.api.models import WebHook
|
||||
from pretix.api.webhooks import get_all_webhook_events
|
||||
from pretix.base.forms import I18nModelForm, SettingsForm
|
||||
from pretix.base.forms.widgets import SplitDateTimePickerWidget
|
||||
from pretix.base.models import Device, GiftCard, Organizer, Team
|
||||
from pretix.control.forms import (
|
||||
ExtFileField, FontSelect, MultipleLanguagesWidget,
|
||||
ExtFileField, FontSelect, MultipleLanguagesWidget, SplitDateTimeField,
|
||||
)
|
||||
from pretix.control.forms.event import SafeEventMultipleChoiceField
|
||||
from pretix.multidomain.models import KnownDomain
|
||||
@@ -322,7 +323,7 @@ class OrganizerSettingsForm(SettingsForm):
|
||||
ext_whitelist=(".ico", ".png", ".jpg", ".gif", ".jpeg"),
|
||||
required=False,
|
||||
help_text=_('If you provide a favicon, we will show it instead of the default pretix icon. '
|
||||
'We recommend a size of at least 200x200px to accomodate most devices.')
|
||||
'We recommend a size of at least 200x200px to accommodate most devices.')
|
||||
)
|
||||
giftcard_length = forms.IntegerField(
|
||||
label=_('Length of gift card codes'),
|
||||
@@ -330,6 +331,12 @@ class OrganizerSettingsForm(SettingsForm):
|
||||
'is required, it can be set here.'.format(settings.ENTROPY['giftcard_secret'])),
|
||||
required=False
|
||||
)
|
||||
giftcard_expiry_years = forms.IntegerField(
|
||||
label=_('Validity of gift card codes in years'),
|
||||
help_text=_('If you set a number here, gift cards will by default expire at the end of the year after this '
|
||||
'many years. If you keep it empty, gift cards do not have an explicit expiry date.'),
|
||||
required=False
|
||||
)
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
@@ -378,12 +385,15 @@ class GiftCardCreateForm(forms.ModelForm):
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
self.organizer = kwargs.pop('organizer')
|
||||
initial = kwargs.pop('initial', {})
|
||||
initial['expires'] = self.organizer.default_gift_card_expiry
|
||||
kwargs['initial'] = initial
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
def clean_secret(self):
|
||||
s = self.cleaned_data['secret']
|
||||
if GiftCard.objects.filter(
|
||||
secret__iexact=s
|
||||
secret__iexact=s
|
||||
).filter(
|
||||
Q(issuer=self.organizer) | Q(issuer__gift_card_collector_acceptance__collector=self.organizer)
|
||||
).exists():
|
||||
@@ -394,4 +404,24 @@ class GiftCardCreateForm(forms.ModelForm):
|
||||
|
||||
class Meta:
|
||||
model = GiftCard
|
||||
fields = ['secret', 'currency', 'testmode']
|
||||
fields = ['secret', 'currency', 'testmode', 'expires', 'conditions']
|
||||
field_classes = {
|
||||
'expires': SplitDateTimeField
|
||||
}
|
||||
widgets = {
|
||||
'expires': SplitDateTimePickerWidget,
|
||||
'conditions': forms.Textarea(attrs={"rows": 2})
|
||||
}
|
||||
|
||||
|
||||
class GiftCardUpdateForm(forms.ModelForm):
|
||||
class Meta:
|
||||
model = GiftCard
|
||||
fields = ['expires', 'conditions']
|
||||
field_classes = {
|
||||
'expires': SplitDateTimeField
|
||||
}
|
||||
widgets = {
|
||||
'expires': SplitDateTimePickerWidget,
|
||||
'conditions': forms.Textarea(attrs={"rows": 2})
|
||||
}
|
||||
|
||||
@@ -254,7 +254,7 @@ class RRuleForm(forms.Form):
|
||||
widget=forms.RadioSelect
|
||||
)
|
||||
count = forms.IntegerField(
|
||||
label=_('Number of repititions'),
|
||||
label=_('Number of repetitions'),
|
||||
initial=10
|
||||
)
|
||||
until = forms.DateField(
|
||||
|
||||
@@ -233,7 +233,7 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
|
||||
'pretix.event.order.email.resend': _('An email with a link to the order detail page has been resent to the user.'),
|
||||
'pretix.event.order.payment.confirmed': _('Payment {local_id} has been confirmed.'),
|
||||
'pretix.event.order.payment.canceled': _('Payment {local_id} has been canceled.'),
|
||||
'pretix.event.order.payment.canceled.failed': _('Cancelling payment {local_id} has failed.'),
|
||||
'pretix.event.order.payment.canceled.failed': _('Canceling payment {local_id} has failed.'),
|
||||
'pretix.event.order.payment.started': _('Payment {local_id} has been started.'),
|
||||
'pretix.event.order.payment.failed': _('Payment {local_id} has failed.'),
|
||||
'pretix.event.order.quotaexceeded': _('The order could not be marked as paid: {message}'),
|
||||
@@ -334,6 +334,7 @@ def pretixcontrol_logentry_display(sender: Event, logentry: LogEntry, **kwargs):
|
||||
'pretix.device.keyroll': _('The access token of the device has been regenerated.'),
|
||||
'pretix.device.updated': _('The device has notified the server of an hardware or software update.'),
|
||||
'pretix.giftcards.created': _('The gift card has been created.'),
|
||||
'pretix.giftcards.modified': _('The gift card has been changed.'),
|
||||
'pretix.giftcards.transaction.manual': _('A manual transaction has been performed.'),
|
||||
}
|
||||
|
||||
|
||||
@@ -58,7 +58,7 @@
|
||||
<div class="col-sm-12 col-md-9 nomargin-bottom">
|
||||
{% blocktrans trimmed %}
|
||||
You can remove personal data such as names and email addresses from your event and only retain the
|
||||
finanical information such as the number and type of ticekts sold.
|
||||
financial information such as the number and type of tickets sold.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
<div class="col-sm-12 col-md-3">
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
{% csrf_token %}
|
||||
<input type="hidden" name="testmode" value="false">
|
||||
<p>
|
||||
{% trans "Your shop is currently in test mode. All orders are not persistant and can be deleted at any point." %}
|
||||
{% trans "Your shop is currently in test mode. All orders are not persistent and can be deleted at any point." %}
|
||||
</p>
|
||||
<div class="form-inline">
|
||||
<label class="checkbox">
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
To make your products actually available, you also need quotas. Quotas define, how many instances of
|
||||
your product pretix will sell. This way, you can configure whether your event can take an unlimited
|
||||
number of attendees or the number of attendees is limited. You can assign a product to multiple quotas
|
||||
to fulfil more complex requirements, e.g. if you want to limit the total number of tickets sold and the
|
||||
to fulfill more complex requirements, e.g. if you want to limit the total number of tickets sold and the
|
||||
number of a specific ticket type at the same time.
|
||||
{% endblocktrans %}
|
||||
</p>
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
{% csrf_token %}
|
||||
<p>
|
||||
{% blocktrans trimmed with amount=refund.amount|money:request.event.currency method=refund.payment_provider.verbose_name pending=pending_sum|money:request.event.currency total=order.total|money:request.event.currency %}
|
||||
We recevied notice that <strong>{{ amount }}</strong> have been refunded via
|
||||
We received notice that <strong>{{ amount }}</strong> have been refunded via
|
||||
<strong>{{ method }}</strong>. If this refund is processed, the order will be underpaid by
|
||||
<strong>{{ pending }}</strong>. The order total is <strong>{{ total }}</strong>.
|
||||
{% endblocktrans %}
|
||||
|
||||
@@ -28,6 +28,7 @@
|
||||
<fieldset>
|
||||
<legend>{% trans "Select date" context "subevents" %}</legend>
|
||||
{% bootstrap_field form.subevent layout="control" %}
|
||||
{% bootstrap_field form.all_subevents layout="control" %}
|
||||
</fieldset>
|
||||
{% endif %}
|
||||
<fieldset>
|
||||
@@ -35,6 +36,8 @@
|
||||
{% bootstrap_field form.auto_refund layout="control" %}
|
||||
{% bootstrap_field form.manual_refund layout="control" %}
|
||||
{% bootstrap_field form.refund_as_giftcard layout="control" %}
|
||||
{% bootstrap_field form.gift_card_expires layout="control" %}
|
||||
{% bootstrap_field form.gift_card_conditions layout="control" %}
|
||||
{% bootstrap_field form.keep_fee_fixed layout="control" %}
|
||||
{% bootstrap_field form.keep_fee_percentage layout="control" %}
|
||||
{% bootstrap_field form.keep_fees layout="control" %}
|
||||
@@ -47,7 +50,7 @@
|
||||
<div class="alert alert-info" data-display-dependency="#id_refund_as_giftcard">
|
||||
{% blocktrans trimmed %}
|
||||
Since you are refunding your customers orders to gift cards, you should explain to them how to
|
||||
access their giftcards. The easiest way to do this, is to include an explanation and a link to
|
||||
access their gift cards. The easiest way to do this, is to include an explanation and a link to
|
||||
their order using the here provided email functionality.
|
||||
{% endblocktrans %}
|
||||
</div>
|
||||
|
||||
@@ -32,7 +32,6 @@
|
||||
{% endif %}
|
||||
{% bootstrap_field sform.organizer_info_text layout="control" %}
|
||||
{% bootstrap_field sform.event_team_provisioning layout="control" %}
|
||||
{% bootstrap_field sform.giftcard_length layout="control" %}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{% trans "Organizer page" %}</legend>
|
||||
@@ -63,6 +62,11 @@
|
||||
{% bootstrap_field sform.primary_font layout="control" %}
|
||||
{% bootstrap_field sform.favicon layout="control" %}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{% trans "Gift cards" %}</legend>
|
||||
{% bootstrap_field sform.giftcard_expiry_years layout="control" %}
|
||||
{% bootstrap_field sform.giftcard_length layout="control" %}
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend>{% trans "Event metadata" %}</legend>
|
||||
<p>
|
||||
|
||||
@@ -10,6 +10,10 @@
|
||||
{% if card.testmode %}
|
||||
<span class="label label-warning">{% trans "TEST MODE" %}</span>
|
||||
{% endif %}
|
||||
<a href="{% url "control:organizer.giftcard.edit" organizer=request.organizer.slug giftcard=card.id %}"
|
||||
class="btn btn-default">
|
||||
<i class="fa fa-edit"></i> {% trans "Edit" %}
|
||||
</a>
|
||||
</h1>
|
||||
<div class="row">
|
||||
<div class="col-md-10 col-xs-12">
|
||||
@@ -29,6 +33,12 @@
|
||||
<dd>{{ card.value|money:card.currency }}</dd>
|
||||
<dt>{% trans "Currency" %}</dt>
|
||||
<dd>{{ card.currency }}</dd>
|
||||
<dt>{% trans "Expire date" %}</dt>
|
||||
<dd>{% if card.expires %}{{ card.expires|date:"SHORT_DATETIME_FORMAT" }}{% else %}–{% endif %}</dd>
|
||||
{% if card.conditions %}
|
||||
<dt>{% trans "Special terms and conditions" context "giftcard" %}</dt>
|
||||
<dd>{{ card.conditions }}</dd>
|
||||
{% endif %}
|
||||
{% if card.issued_in %}
|
||||
<dt>{% trans "Issued through sale" %}</dt>
|
||||
<dd>
|
||||
@@ -64,6 +74,14 @@
|
||||
<a href="{% url "control:event.order" event=t.order.event.slug organizer=t.order.event.organizer.slug code=t.order.code %}">
|
||||
{{ t.order.full_code }}
|
||||
</a>
|
||||
{% if t.refund and t.value > 0 and t.value <= card.value %}
|
||||
<button type="submit" name="revert" value="{{ t.pk }}"
|
||||
class="btn btn-default btn-xs" data-toggle="tooltip"
|
||||
title="{% trans "Create a payment on the respective order that cancels out with this transaction. The order will then likely be overpaid." %}">
|
||||
<span class="fa fa-repeat"></span>
|
||||
{% trans "Revert" %}
|
||||
</button>
|
||||
{% endif %}
|
||||
{% else %}
|
||||
<em>{% trans "Manual transaction" %}{% if t.text %}: {{ t.text }}{% endif %}</em>
|
||||
{% endif %}
|
||||
|
||||
@@ -10,6 +10,8 @@
|
||||
{% bootstrap_field form.value layout="control" %}
|
||||
{% bootstrap_field form.currency layout="control" %}
|
||||
{% bootstrap_field form.testmode layout="control" %}
|
||||
{% bootstrap_field form.expires layout="control" %}
|
||||
{% bootstrap_field form.conditions layout="control" %}
|
||||
<div class="form-group submit-group">
|
||||
<button type="submit" class="btn btn-primary btn-save">
|
||||
{% trans "Save" %}
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
{% extends "pretixcontrol/organizers/base.html" %}
|
||||
{% load i18n %}
|
||||
{% load bootstrap3 %}
|
||||
{% block inner %}
|
||||
<h1>
|
||||
{% blocktrans trimmed with card=card.secret %}
|
||||
Gift card: {{ card }}
|
||||
{% endblocktrans %}
|
||||
{% if card.testmode %}
|
||||
<span class="label label-warning">{% trans "TEST MODE" %}</span>
|
||||
{% endif %}
|
||||
</h1>
|
||||
<form class="form-horizontal" action="" method="post">
|
||||
{% csrf_token %}
|
||||
{% bootstrap_form_errors form %}
|
||||
{% bootstrap_field form.expires layout="control" %}
|
||||
{% bootstrap_field form.conditions layout="control" %}
|
||||
<div class="form-group submit-group">
|
||||
<button type="submit" class="btn btn-primary btn-save">
|
||||
{% trans "Save" %}
|
||||
</button>
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
@@ -1,5 +1,6 @@
|
||||
{% extends "pretixcontrol/organizers/base.html" %}
|
||||
{% load i18n %}
|
||||
{% load urlreplace %}
|
||||
{% load bootstrap3 %}
|
||||
{% load money %}
|
||||
{% block inner %}
|
||||
@@ -21,9 +22,15 @@
|
||||
</div>
|
||||
{% else %}
|
||||
<form class="row filter-form" action="" method="get">
|
||||
<div class="col-md-10 col-sm-6 col-xs-12">
|
||||
<div class="col-md-4 col-sm-6 col-xs-12">
|
||||
{% bootstrap_field filter_form.query layout='inline' %}
|
||||
</div>
|
||||
<div class="col-md-3 col-sm-6 col-xs-6">
|
||||
{% bootstrap_field filter_form.testmode layout='inline' %}
|
||||
</div>
|
||||
<div class="col-md-3 col-sm-6 col-xs-6">
|
||||
{% bootstrap_field filter_form.state layout='inline' %}
|
||||
</div>
|
||||
<div class="col-md-2 col-sm-6 col-xs-12">
|
||||
<button class="btn btn-primary btn-block" type="submit">
|
||||
<span class="fa fa-filter"></span>
|
||||
@@ -41,9 +48,18 @@
|
||||
<table class="table table-condensed table-hover">
|
||||
<thead>
|
||||
<tr>
|
||||
<th>{% trans "Gift card code" %}</th>
|
||||
<th>{% trans "Creation date" %}</th>
|
||||
<th class="text-right">{% trans "Current value" %}</th>
|
||||
<th>{% trans "Gift card code" %}
|
||||
<a href="?{% url_replace request 'ordering' '-code' %}"><i class="fa fa-caret-down"></i></a>
|
||||
<a href="?{% url_replace request 'ordering' 'code' %}"><i class="fa fa-caret-up"></i></a></th>
|
||||
<th>{% trans "Creation date" %}
|
||||
<a href="?{% url_replace request 'ordering' '-issuance' %}"><i class="fa fa-caret-down"></i></a>
|
||||
<a href="?{% url_replace request 'ordering' 'issuance' %}"><i class="fa fa-caret-up"></i></a></th>
|
||||
<th>{% trans "Expiry date" %}
|
||||
<a href="?{% url_replace request 'ordering' '-expires' %}"><i class="fa fa-caret-down"></i></a>
|
||||
<a href="?{% url_replace request 'ordering' 'expires' %}"><i class="fa fa-caret-up"></i></a></th>
|
||||
<th class="text-right">{% trans "Current value" %}
|
||||
<a href="?{% url_replace request 'ordering' '-value' %}"><i class="fa fa-caret-down"></i></a>
|
||||
<a href="?{% url_replace request 'ordering' 'value' %}"><i class="fa fa-caret-up"></i></a></th>
|
||||
<th></th>
|
||||
</tr>
|
||||
</thead>
|
||||
@@ -56,8 +72,12 @@
|
||||
{% if g.testmode %}
|
||||
<span class="label label-warning">{% trans "TEST MODE" %}</span>
|
||||
{% endif %}
|
||||
{% if g.expired %}
|
||||
<span class="label label-danger">{% trans "Expired" %}</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td>{{ g.issuance|date:"SHORT_DATETIME_FORMAT" }}</td>
|
||||
<td>{% if g.expires %}{{ g.expires|date:"SHORT_DATETIME_FORMAT" }}{% endif %}</td>
|
||||
<td class="text-right">
|
||||
{{ g.cached_value|money:g.currency }}
|
||||
</td>
|
||||
|
||||
@@ -207,7 +207,7 @@
|
||||
</div>
|
||||
<div class="row control-group pdf-info">
|
||||
<div class="col-sm-12">
|
||||
<label>{% trans "Prefered language" %}</label><br>
|
||||
<label>{% trans "Preferred language" %}</label><br>
|
||||
<select class="form-control" id="pdf-info-locale">
|
||||
<option value="">{% trans "Order locale" %}</option>
|
||||
{% for l in locales %}
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<legend>{% trans "Step 1: Download data" %}</legend>
|
||||
<p>
|
||||
{% blocktrans trimmed %}
|
||||
You are about to permamanently delete data from the server, even though you might be required to
|
||||
You are about to permanently delete data from the server, even though you might be required to
|
||||
keep
|
||||
some of this data on file. You should therefore download the following file and store it in a safe
|
||||
place:
|
||||
|
||||
@@ -79,6 +79,8 @@ urlpatterns = [
|
||||
url(r'^organizer/(?P<organizer>[^/]+)/giftcards$', organizer.GiftCardListView.as_view(), name='organizer.giftcards'),
|
||||
url(r'^organizer/(?P<organizer>[^/]+)/giftcard/add$', organizer.GiftCardCreateView.as_view(), name='organizer.giftcard.add'),
|
||||
url(r'^organizer/(?P<organizer>[^/]+)/giftcard/(?P<giftcard>[^/]+)/$', organizer.GiftCardDetailView.as_view(), name='organizer.giftcard'),
|
||||
url(r'^organizer/(?P<organizer>[^/]+)/giftcard/(?P<giftcard>[^/]+)/edit$', organizer.GiftCardUpdateView.as_view(),
|
||||
name='organizer.giftcard.edit'),
|
||||
url(r'^organizer/(?P<organizer>[^/]+)/webhooks$', organizer.WebHookListView.as_view(), name='organizer.webhooks'),
|
||||
url(r'^organizer/(?P<organizer>[^/]+)/webhook/add$', organizer.WebHookCreateView.as_view(),
|
||||
name='organizer.webhook.add'),
|
||||
|
||||
@@ -254,10 +254,10 @@ class Forgot(TemplateView):
|
||||
|
||||
finally:
|
||||
if has_redis:
|
||||
messages.info(request, _('If the adress is registred to valid account, then we have sent you an e-mail containing further instructions. '
|
||||
messages.info(request, _('If the address is registered to valid account, then we have sent you an e-mail containing further instructions. '
|
||||
'Please note that we will send at most one email every 24 hours.'))
|
||||
else:
|
||||
messages.info(request, _('If the adress is registred to valid account, then we have sent you an e-mail containing further instructions.'))
|
||||
messages.info(request, _('If the address is registered to valid account, then we have sent you an e-mail containing further instructions.'))
|
||||
|
||||
return redirect('control:auth.forgot')
|
||||
else:
|
||||
|
||||
@@ -770,6 +770,7 @@ class OrderRefundView(OrderView):
|
||||
if giftcard_value:
|
||||
refund_selected += giftcard_value
|
||||
giftcard = self.request.organizer.issued_gift_cards.create(
|
||||
expires=self.request.organizer.default_gift_card_expiry,
|
||||
currency=self.request.event.currency,
|
||||
testmode=self.order.testmode
|
||||
)
|
||||
@@ -2019,6 +2020,8 @@ class EventCancel(EventPermissionRequiredMixin, AsyncAction, FormView):
|
||||
auto_refund=form.cleaned_data.get('auto_refund'),
|
||||
manual_refund=form.cleaned_data.get('manual_refund'),
|
||||
refund_as_giftcard=form.cleaned_data.get('refund_as_giftcard'),
|
||||
giftcard_expires=form.cleaned_data.get('gift_card_expires'),
|
||||
giftcard_conditions=form.cleaned_data.get('gift_card_conditions'),
|
||||
keep_fee_fixed=form.cleaned_data.get('keep_fee_fixed'),
|
||||
keep_fee_percentage=form.cleaned_data.get('keep_fee_percentage'),
|
||||
keep_fees=form.cleaned_data.get('keep_fees'),
|
||||
@@ -2035,7 +2038,7 @@ class EventCancel(EventPermissionRequiredMixin, AsyncAction, FormView):
|
||||
if value == 0:
|
||||
return _('All orders have been canceled.')
|
||||
else:
|
||||
return _('The orders have been canceled. An error occured with {count} orders, please '
|
||||
return _('The orders have been canceled. An error occurred with {count} orders, please '
|
||||
'check all uncanceled orders.').format(count=value)
|
||||
|
||||
def get_success_url(self, value):
|
||||
|
||||
@@ -7,11 +7,9 @@ from django.contrib import messages
|
||||
from django.core.exceptions import PermissionDenied, ValidationError
|
||||
from django.core.files import File
|
||||
from django.db import transaction
|
||||
from django.db.models import (
|
||||
Count, DecimalField, Max, Min, Prefetch, ProtectedError, Sum,
|
||||
)
|
||||
from django.db.models import Count, Max, Min, Prefetch, ProtectedError, Sum
|
||||
from django.db.models.functions import Coalesce, Greatest
|
||||
from django.forms import inlineformset_factory
|
||||
from django.forms import DecimalField, inlineformset_factory
|
||||
from django.http import JsonResponse
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.urls import reverse
|
||||
@@ -25,19 +23,20 @@ from django.views.generic import (
|
||||
from pretix.api.models import WebHook
|
||||
from pretix.base.auth import get_auth_backends
|
||||
from pretix.base.models import (
|
||||
Device, GiftCard, Organizer, Team, TeamInvite, User,
|
||||
Device, GiftCard, OrderPayment, Organizer, Team, TeamInvite, User,
|
||||
)
|
||||
from pretix.base.models.event import Event, EventMetaProperty, EventMetaValue
|
||||
from pretix.base.models.giftcards import gen_giftcard_secret
|
||||
from pretix.base.models.organizer import TeamAPIToken
|
||||
from pretix.base.payment import PaymentException
|
||||
from pretix.base.services.mail import SendMailException, mail
|
||||
from pretix.control.forms.filter import (
|
||||
EventFilterForm, GiftCardFilterForm, OrganizerFilterForm,
|
||||
)
|
||||
from pretix.control.forms.organizer import (
|
||||
DeviceForm, EventMetaPropertyForm, GiftCardCreateForm, OrganizerDeleteForm,
|
||||
OrganizerForm, OrganizerSettingsForm, OrganizerUpdateForm, TeamForm,
|
||||
WebHookForm,
|
||||
DeviceForm, EventMetaPropertyForm, GiftCardCreateForm, GiftCardUpdateForm,
|
||||
OrganizerDeleteForm, OrganizerForm, OrganizerSettingsForm,
|
||||
OrganizerUpdateForm, TeamForm, WebHookForm,
|
||||
)
|
||||
from pretix.control.permissions import (
|
||||
AdministratorPermissionRequiredMixin, OrganizerPermissionRequiredMixin,
|
||||
@@ -1000,9 +999,38 @@ class GiftCardDetailView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
|
||||
@transaction.atomic()
|
||||
def post(self, request, *args, **kwargs):
|
||||
self.object = GiftCard.objects.select_for_update().get(pk=self.get_object().pk)
|
||||
if 'value' in request.POST:
|
||||
if 'revert' in request.POST:
|
||||
t = get_object_or_404(self.object.transactions.all(), pk=request.POST.get('revert'), order__isnull=False)
|
||||
if self.object.value - t.value < Decimal('0.00'):
|
||||
messages.error(request, _('Gift cards are not allowed to have negative values.'))
|
||||
elif t.value > 0:
|
||||
r = t.order.payments.create(
|
||||
order=t.order,
|
||||
state=OrderPayment.PAYMENT_STATE_CREATED,
|
||||
amount=t.value,
|
||||
provider='giftcard',
|
||||
info=json.dumps({
|
||||
'gift_card': self.object.pk,
|
||||
'retry': True,
|
||||
})
|
||||
)
|
||||
try:
|
||||
r.payment_provider.execute_payment(None, r)
|
||||
except PaymentException as e:
|
||||
with transaction.atomic():
|
||||
r.state = OrderPayment.PAYMENT_STATE_FAILED
|
||||
r.save()
|
||||
t.order.log_action('pretix.event.order.payment.failed', {
|
||||
'local_id': r.local_id,
|
||||
'provider': r.provider,
|
||||
'error': str(e)
|
||||
})
|
||||
messages.error(request, _('The transaction could not be reversed.'))
|
||||
else:
|
||||
messages.success(request, _('The transaction has been reversed.'))
|
||||
elif 'value' in request.POST:
|
||||
try:
|
||||
value = DecimalField().to_python(request.POST.get('value'))
|
||||
value = DecimalField(localize=True).to_python(request.POST.get('value'))
|
||||
except ValidationError:
|
||||
messages.error(request, _('Your input was invalid, please try again.'))
|
||||
else:
|
||||
@@ -1071,3 +1099,31 @@ class GiftCardCreateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMi
|
||||
'giftcard': self.object.pk
|
||||
}
|
||||
))
|
||||
|
||||
|
||||
class GiftCardUpdateView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixin, UpdateView):
|
||||
template_name = 'pretixcontrol/organizers/giftcard_edit.html'
|
||||
permission = 'can_manage_gift_cards'
|
||||
form_class = GiftCardUpdateForm
|
||||
success_url = 'invalid'
|
||||
context_object_name = 'card'
|
||||
model = GiftCard
|
||||
|
||||
def get_object(self, queryset=None) -> Organizer:
|
||||
return get_object_or_404(
|
||||
self.request.organizer.issued_gift_cards,
|
||||
pk=self.kwargs.get('giftcard')
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def form_valid(self, form):
|
||||
messages.success(self.request, _('The gift card has been changed.'))
|
||||
super().form_valid(form)
|
||||
form.instance.log_action('pretix.giftcards.modified', user=self.request.user, data=dict(form.cleaned_data))
|
||||
return redirect(reverse(
|
||||
'control:organizer.giftcard',
|
||||
kwargs={
|
||||
'organizer': self.request.organizer.slug,
|
||||
'giftcard': self.object.pk
|
||||
}
|
||||
))
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-12-25 01:00+0000\n"
|
||||
"Last-Translator: Abdullah <abdullah.gumaijan@gmail.com>\n"
|
||||
"Language-Team: Arabic <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -278,21 +278,21 @@ msgstr[5] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "الرجاء إدخال كمية لأحد أنواع التذاكر."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "من٪ (العملة) ق٪ (سعر) ق"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "من٪ (العملة) ق٪ (سعر) ق"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -260,15 +260,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -262,15 +262,15 @@ msgstr[2] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-11-20 14:41+0000\n"
|
||||
"Last-Translator: Mie Frydensbjerg <mif@aarhus.dk>\n"
|
||||
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -278,21 +278,21 @@ msgstr[1] "Varerne i din kurv er reserveret for dig i {num} minutter."
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "fra %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "fra %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2020-04-08 13:48+0000\n"
|
||||
"Last-Translator: Martin Gross <martin@pc-coholic.de>\n"
|
||||
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -282,15 +282,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Bitte tragen Sie eine Menge für eines der Produkte ein."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "Der Veranstalter behält %(currency)s %(amount)s ein"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "Sie erhalten %(currency)s %(amount)s zurück"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr "Bitte geben Sie den Betrag ein, den der Veranstalter einbehalten darf."
|
||||
|
||||
@@ -606,8 +606,8 @@ msgstr "Dezember"
|
||||
#~ msgstr "Information zum Veranstalter"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Addon 1\n"
|
||||
#~ "Addon 2"
|
||||
#~ "Add-on 1\n"
|
||||
#~ "Add-on 2"
|
||||
#~ msgstr ""
|
||||
#~ "Workshop 1\n"
|
||||
#~ "Workshop 2"
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
2FA
|
||||
ABN
|
||||
Absenderadresse
|
||||
Absendername
|
||||
Admin
|
||||
Adminbereich
|
||||
Alipay
|
||||
@@ -6,36 +10,65 @@ App
|
||||
Apps
|
||||
ausgeklappt
|
||||
auswahl
|
||||
Authentication
|
||||
Authenticator
|
||||
Authentifizierungsmechanismus
|
||||
Backend
|
||||
Badge
|
||||
Badges
|
||||
Bancontact
|
||||
Banking
|
||||
Bcc
|
||||
BCC
|
||||
Beispielevent
|
||||
Benachrichtigungs
|
||||
Benachrichtigungsart
|
||||
Benachrichtigungsarten
|
||||
Benachrichtigungseinstellungen
|
||||
Berechtigungs
|
||||
Bestellbestätigungs
|
||||
Bestellungsstatus
|
||||
Bestätigungs
|
||||
Bestellbestätigungs
|
||||
Bestellungsänderungen
|
||||
Bestellungsstatus
|
||||
bez
|
||||
BezahlCode
|
||||
Bezahlmethode
|
||||
Blackberry
|
||||
Browsereinstellungen
|
||||
bspw
|
||||
Bundles
|
||||
bzw
|
||||
chardet
|
||||
charge
|
||||
Checkout
|
||||
Chrome
|
||||
CONFIRM
|
||||
Connect
|
||||
Cronjob
|
||||
csv
|
||||
Customer
|
||||
Debug
|
||||
Di
|
||||
Do
|
||||
Doe
|
||||
Downloadformat
|
||||
Downloadseite
|
||||
Dr
|
||||
Drag
|
||||
Droid
|
||||
Drop
|
||||
DSS
|
||||
Edge
|
||||
Einlassdatum
|
||||
Einlassuhrzeit
|
||||
email
|
||||
EPS
|
||||
Erstattungsbetrag
|
||||
Erstattungsliste
|
||||
Erstattungsmethode
|
||||
Erstattungsoptionen
|
||||
Erstattungsstatus
|
||||
Erstattungsweg
|
||||
Erweiterungs
|
||||
etc
|
||||
Event
|
||||
@@ -43,96 +76,182 @@ Eventeingang
|
||||
Eventfirma
|
||||
evtl
|
||||
Explorer
|
||||
FA
|
||||
Favicon
|
||||
Footer
|
||||
gehostete
|
||||
geht's
|
||||
GENEXAMPLE
|
||||
Geo
|
||||
geocoding
|
||||
gescannt
|
||||
ggf
|
||||
giropay
|
||||
Guide
|
||||
Gutscheineinlöser
|
||||
herunterscrollen
|
||||
hochlädst
|
||||
HTTPS
|
||||
iCal
|
||||
ics
|
||||
ID
|
||||
iDEAL
|
||||
IDs
|
||||
Inc
|
||||
inkl
|
||||
innenname
|
||||
innennamen
|
||||
Installations
|
||||
integrationen
|
||||
invalidiert
|
||||
iOS
|
||||
iTunes
|
||||
JavaScript
|
||||
JSON
|
||||
Kategoriebeschreibung
|
||||
Key
|
||||
Kompatibilitätsmodus
|
||||
Konfigurations
|
||||
landesspezifische
|
||||
Lead
|
||||
Leaflet
|
||||
loszulegen
|
||||
Ltd
|
||||
max
|
||||
Meta
|
||||
Metadaten
|
||||
Mi
|
||||
min
|
||||
Mo
|
||||
MOTO
|
||||
Multibanco
|
||||
MwSt
|
||||
name
|
||||
Nr
|
||||
number
|
||||
Open
|
||||
OpenCage
|
||||
OpenStreetMap
|
||||
Opera
|
||||
Output
|
||||
parsen
|
||||
Pay
|
||||
PayPal
|
||||
PayPals
|
||||
PCI
|
||||
Play
|
||||
Plugin
|
||||
Plugins
|
||||
POS
|
||||
prefix
|
||||
pretix
|
||||
pretixdesk
|
||||
pretixdroid
|
||||
pretixPOS
|
||||
pretixSCAN
|
||||
Professional
|
||||
Przelewy
|
||||
pt
|
||||
px
|
||||
QR
|
||||
Rabattierung
|
||||
Rechnungs
|
||||
Rechungsdatei
|
||||
Reddit
|
||||
Referer
|
||||
Registrierungsdatum
|
||||
Registrierungsnummer
|
||||
Renderer
|
||||
Request
|
||||
Requests
|
||||
Reservierungszeitraum
|
||||
reverse
|
||||
Revisionssicherheit
|
||||
rückabgewickelt
|
||||
Rundungsdifferenzen
|
||||
Sa
|
||||
Saalplan
|
||||
SAQ
|
||||
SCA
|
||||
Scan
|
||||
Scanergebnis
|
||||
Scanning
|
||||
schiefgeht
|
||||
sechsstelligen
|
||||
Secret
|
||||
Security
|
||||
SEPA
|
||||
Shirts
|
||||
Social
|
||||
Sofort
|
||||
SOFORT
|
||||
Sorry
|
||||
Source
|
||||
SSL
|
||||
STARTTLS
|
||||
Steuerschuldnerschaft
|
||||
Store
|
||||
Stornierungsanfrage
|
||||
Stornobedingungen
|
||||
Stornobeleg
|
||||
Stornodatum
|
||||
Stornogebühr
|
||||
Stornos
|
||||
Strg
|
||||
Stripe
|
||||
Stripes
|
||||
Strong
|
||||
systemweiten
|
||||
Tab
|
||||
tag
|
||||
Teammitglied
|
||||
Teamname
|
||||
Telephone
|
||||
Ticketing
|
||||
Tokengenerator
|
||||
Toolbar
|
||||
TOTP
|
||||
txt
|
||||
überbuchen
|
||||
überbucht
|
||||
überbuchten
|
||||
überzahlt
|
||||
ÜBERZAHLT
|
||||
überzahlte
|
||||
uhrzeit
|
||||
ungespeicherte
|
||||
unkategorisiert
|
||||
unlöschbar
|
||||
unlöschbaren
|
||||
untenstehende
|
||||
untenstehenden
|
||||
unterzahlt
|
||||
UNTERZAHLT
|
||||
unzugeordnete
|
||||
unzugeordneten
|
||||
URIs
|
||||
Ursprüngl
|
||||
USt
|
||||
Veranstaltereinstellungen
|
||||
Veranstalterkonten
|
||||
Veranstalterkonto
|
||||
Veranstalterkontos
|
||||
Veranstaltername
|
||||
Veranstalterseite
|
||||
Veranstalterübersicht
|
||||
Veranstaltungs
|
||||
veranstaltungsweiten
|
||||
Verfügbarkeitsberechnung
|
||||
Verfügbarkeitsstatus
|
||||
Veröffentlichbarer
|
||||
VIP
|
||||
WebAuthn
|
||||
Webhook
|
||||
Webhooks
|
||||
WeChat
|
||||
WhatsApp
|
||||
Widget
|
||||
xlsx
|
||||
Yubikey
|
||||
Zahlungs
|
||||
Zahlungsbestätigungs
|
||||
@@ -143,6 +262,3 @@ zubuchbaren
|
||||
zurückbuchen
|
||||
zurückgeleitet
|
||||
zzgl
|
||||
überbuchen
|
||||
überbucht
|
||||
überbuchten
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: \n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2020-04-08 13:48+0000\n"
|
||||
"Last-Translator: Martin Gross <martin@pc-coholic.de>\n"
|
||||
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"
|
||||
@@ -281,15 +281,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Bitte trage eine Menge für eines der Produkte ein."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "Der Veranstalter behält %(currency)s %(amount)s ein"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "Du erhältst %(currency)s %(amount)s zurück"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr "Bitte gib den Betrag ein, den der Veranstalter einbehalten darf."
|
||||
|
||||
@@ -556,9 +556,6 @@ msgstr "Dezember"
|
||||
#~ msgid "QR Code"
|
||||
#~ msgstr "QR-Code"
|
||||
|
||||
#~ msgid "An error of type {code} occured."
|
||||
#~ msgstr "Ein Fehler ist aufgetreten. Fehlercode: {code}"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "We currenctly cannot reach the server. Please try again. Error code: "
|
||||
#~ "{code}"
|
||||
@@ -615,8 +612,8 @@ msgstr "Dezember"
|
||||
#~ msgstr "Information zum Veranstalter"
|
||||
|
||||
#~ msgid ""
|
||||
#~ "Addon 1\n"
|
||||
#~ "Addon 2"
|
||||
#~ "Add-on 1\n"
|
||||
#~ "Add-on 2"
|
||||
#~ msgstr ""
|
||||
#~ "Workshop 1\n"
|
||||
#~ "Workshop 2"
|
||||
|
||||
@@ -1,3 +1,7 @@
|
||||
2FA
|
||||
ABN
|
||||
Absenderadresse
|
||||
Absendername
|
||||
Admin
|
||||
Adminbereich
|
||||
Alipay
|
||||
@@ -6,36 +10,65 @@ App
|
||||
Apps
|
||||
ausgeklappt
|
||||
auswahl
|
||||
Authentication
|
||||
Authenticator
|
||||
Authentifizierungsmechanismus
|
||||
Backend
|
||||
Badge
|
||||
Badges
|
||||
Bancontact
|
||||
Banking
|
||||
Bcc
|
||||
BCC
|
||||
Beispielevent
|
||||
Benachrichtigungs
|
||||
Benachrichtigungsart
|
||||
Benachrichtigungsarten
|
||||
Benachrichtigungseinstellungen
|
||||
Berechtigungs
|
||||
Bestellbestätigungs
|
||||
Bestellungsstatus
|
||||
Bestätigungs
|
||||
Bestellbestätigungs
|
||||
Bestellungsänderungen
|
||||
Bestellungsstatus
|
||||
bez
|
||||
BezahlCode
|
||||
Bezahlmethode
|
||||
Blackberry
|
||||
Browsereinstellungen
|
||||
bspw
|
||||
Bundles
|
||||
bzw
|
||||
chardet
|
||||
charge
|
||||
Checkout
|
||||
Chrome
|
||||
CONFIRM
|
||||
Connect
|
||||
Cronjob
|
||||
csv
|
||||
Customer
|
||||
Debug
|
||||
Di
|
||||
Do
|
||||
Doe
|
||||
Downloadformat
|
||||
Downloadseite
|
||||
Dr
|
||||
Drag
|
||||
Droid
|
||||
Drop
|
||||
DSS
|
||||
Edge
|
||||
Einlassdatum
|
||||
Einlassuhrzeit
|
||||
email
|
||||
EPS
|
||||
Erstattungsbetrag
|
||||
Erstattungsliste
|
||||
Erstattungsmethode
|
||||
Erstattungsoptionen
|
||||
Erstattungsstatus
|
||||
Erstattungsweg
|
||||
Erweiterungs
|
||||
etc
|
||||
Event
|
||||
@@ -43,96 +76,182 @@ Eventeingang
|
||||
Eventfirma
|
||||
evtl
|
||||
Explorer
|
||||
FA
|
||||
Favicon
|
||||
Footer
|
||||
gehostete
|
||||
geht's
|
||||
GENEXAMPLE
|
||||
Geo
|
||||
geocoding
|
||||
gescannt
|
||||
ggf
|
||||
giropay
|
||||
Guide
|
||||
Gutscheineinlöser
|
||||
herunterscrollen
|
||||
hochlädst
|
||||
HTTPS
|
||||
iCal
|
||||
ics
|
||||
ID
|
||||
iDEAL
|
||||
IDs
|
||||
Inc
|
||||
inkl
|
||||
innenname
|
||||
innennamen
|
||||
Installations
|
||||
integrationen
|
||||
invalidiert
|
||||
iOS
|
||||
iTunes
|
||||
JavaScript
|
||||
JSON
|
||||
Kategoriebeschreibung
|
||||
Key
|
||||
Kompatibilitätsmodus
|
||||
Konfigurations
|
||||
landesspezifische
|
||||
Lead
|
||||
Leaflet
|
||||
loszulegen
|
||||
Ltd
|
||||
max
|
||||
Meta
|
||||
Metadaten
|
||||
Mi
|
||||
min
|
||||
Mo
|
||||
MOTO
|
||||
Multibanco
|
||||
MwSt
|
||||
name
|
||||
Nr
|
||||
number
|
||||
Open
|
||||
OpenCage
|
||||
OpenStreetMap
|
||||
Opera
|
||||
Output
|
||||
parsen
|
||||
Pay
|
||||
PayPal
|
||||
PayPals
|
||||
PCI
|
||||
Play
|
||||
Plugin
|
||||
Plugins
|
||||
POS
|
||||
prefix
|
||||
pretix
|
||||
pretixdesk
|
||||
pretixdroid
|
||||
pretixPOS
|
||||
pretixSCAN
|
||||
Professional
|
||||
Przelewy
|
||||
pt
|
||||
px
|
||||
QR
|
||||
Rabattierung
|
||||
Rechnungs
|
||||
Rechungsdatei
|
||||
Reddit
|
||||
Referer
|
||||
Registrierungsdatum
|
||||
Registrierungsnummer
|
||||
Renderer
|
||||
Request
|
||||
Requests
|
||||
Reservierungszeitraum
|
||||
reverse
|
||||
Revisionssicherheit
|
||||
rückabgewickelt
|
||||
Rundungsdifferenzen
|
||||
Sa
|
||||
Saalplan
|
||||
SAQ
|
||||
SCA
|
||||
Scan
|
||||
Scanergebnis
|
||||
Scanning
|
||||
schiefgeht
|
||||
sechsstelligen
|
||||
Secret
|
||||
Security
|
||||
SEPA
|
||||
Shirts
|
||||
Social
|
||||
Sofort
|
||||
SOFORT
|
||||
Sorry
|
||||
Source
|
||||
SSL
|
||||
STARTTLS
|
||||
Steuerschuldnerschaft
|
||||
Store
|
||||
Stornierungsanfrage
|
||||
Stornobedingungen
|
||||
Stornobeleg
|
||||
Stornodatum
|
||||
Stornogebühr
|
||||
Stornos
|
||||
Strg
|
||||
Stripe
|
||||
Stripes
|
||||
Strong
|
||||
systemweiten
|
||||
Tab
|
||||
tag
|
||||
Teammitglied
|
||||
Teamname
|
||||
Telephone
|
||||
Ticketing
|
||||
Tokengenerator
|
||||
Toolbar
|
||||
TOTP
|
||||
txt
|
||||
überbuchen
|
||||
überbucht
|
||||
überbuchten
|
||||
überzahlt
|
||||
ÜBERZAHLT
|
||||
überzahlte
|
||||
uhrzeit
|
||||
ungespeicherte
|
||||
unkategorisiert
|
||||
unlöschbar
|
||||
unlöschbaren
|
||||
untenstehende
|
||||
untenstehenden
|
||||
unterzahlt
|
||||
UNTERZAHLT
|
||||
unzugeordnete
|
||||
unzugeordneten
|
||||
URIs
|
||||
Ursprüngl
|
||||
USt
|
||||
Veranstaltereinstellungen
|
||||
Veranstalterkonten
|
||||
Veranstalterkonto
|
||||
Veranstalterkontos
|
||||
Veranstaltername
|
||||
Veranstalterseite
|
||||
Veranstalterübersicht
|
||||
Veranstaltungs
|
||||
veranstaltungsweiten
|
||||
Verfügbarkeitsberechnung
|
||||
Verfügbarkeitsstatus
|
||||
Veröffentlichbarer
|
||||
VIP
|
||||
WebAuthn
|
||||
Webhook
|
||||
Webhooks
|
||||
WeChat
|
||||
WhatsApp
|
||||
Widget
|
||||
xlsx
|
||||
Yubikey
|
||||
Zahlungs
|
||||
Zahlungsbestätigungs
|
||||
@@ -143,6 +262,3 @@ zubuchbaren
|
||||
zurückbuchen
|
||||
zurückgeleitet
|
||||
zzgl
|
||||
überbuchen
|
||||
überbucht
|
||||
überbuchten
|
||||
|
||||
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: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+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"
|
||||
@@ -261,15 +261,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-10-03 19:00+0000\n"
|
||||
"Last-Translator: Chris Spy <chrispiropoulou@hotmail.com>\n"
|
||||
"Language-Team: Greek <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -287,21 +287,21 @@ msgstr[1] "Τα είδη στο καλάθι θα παραμείνουν δεσ
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Εισαγάγετε μια ποσότητα για έναν από τους τύπους εισιτηρίων."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "απο %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "απο %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-11-22 10:01+0000\n"
|
||||
"Last-Translator: Carolina Fernández <cfermart@gmail.com>\n"
|
||||
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -285,21 +285,21 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Por favor, introduce un valor para cada tipo de entrada."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "a partir de %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "a partir de %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: French\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2020-02-26 03:00+0000\n"
|
||||
"Last-Translator: David100mark <david.hundertmark@gmx.net>\n"
|
||||
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -281,21 +281,21 @@ msgstr[1] "Les articles de votre panier vous sont réservés pour {num} minutes.
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "SVP entrez une quantité pour un de vos types de billets."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "de %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "de %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2020-01-24 08:00+0000\n"
|
||||
"Last-Translator: Prokaj Miklós <mixolid0@gmail.com>\n"
|
||||
"Language-Team: Hungarian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -276,21 +276,21 @@ msgstr[1] "A kosár tartalma {num} percig foglalva van számodra."
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Adjon meg egy mennyiséget az egyik jegytípusból."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "%(currency) %(price)-tól"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "%(currency) %(price)-tól"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-12-20 19:00+0000\n"
|
||||
"Last-Translator: Patrick Arminio <patrick.arminio@gmail.com>\n"
|
||||
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -279,15 +279,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-11-13 06:00+0000\n"
|
||||
"Last-Translator: Zane Smite <z.smite@riga-jurmala.com>\n"
|
||||
"Language-Team: Latvian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -286,21 +286,21 @@ msgstr[2] "Preces jūsu grozā ir rezervētas uz {num} minūtēm."
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Lūdzu, ievadiet nepieciešamo daudzumu izvēlētajam biļešu veidam."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "no %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "no %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
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: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+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"
|
||||
@@ -261,15 +261,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -6,7 +6,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: 1\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2020-04-02 05:00+0000\n"
|
||||
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
|
||||
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -276,15 +276,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Voer een hoeveelheid voor een van de producten in."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "De organisator houdt %(currency)s %(amount)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "U krijgt %(currency)s %(amount)s terug"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr "Voer het bedrag in dat de organisator mag houden."
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -260,15 +260,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2020-04-08 13:48+0000\n"
|
||||
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
|
||||
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
|
||||
@@ -279,15 +279,15 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Voer een hoeveelheid voor een van de producten in."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "De organisator houdt %(currency)s %(amount)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "Jij krijgt %(currency)s %(amount)s terug"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr "Voer het bedrag in dat de organisator mag houden."
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-09-24 19:00+0000\n"
|
||||
"Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n"
|
||||
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"
|
||||
@@ -282,21 +282,21 @@ msgstr[2] "Przedmioty w koszyku są zarezerwowane na {num} minut."
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Proszę wybrać liczbę dla jednego z typów biletów."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "od %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "od %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -263,15 +263,15 @@ msgstr[2] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-03-19 09:00+0000\n"
|
||||
"Last-Translator: Vitor Reis <vitor.reis7@gmail.com>\n"
|
||||
"Language-Team: Portuguese (Brazil) <https://translate.pretix.eu/projects/"
|
||||
@@ -292,21 +292,21 @@ msgstr[1] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "A partir de %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "A partir de %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||
"Last-Translator: Automatically generated\n"
|
||||
"Language-Team: none\n"
|
||||
@@ -263,15 +263,15 @@ msgstr[2] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr ""
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-11-07 09:31+0000\n"
|
||||
"Last-Translator: Raphael Michel <michel@rami.io>\n"
|
||||
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -282,21 +282,21 @@ msgstr[2] ""
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Пожалуйста, введите количество для одного из типов билетов."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "от %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "от %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-08-27 08:00+0000\n"
|
||||
"Last-Translator: Bostjan Marusic <bostjan@brokenbones.si>\n"
|
||||
"Language-Team: Slovenian <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -281,21 +281,21 @@ msgstr[3] "Izdelki v vaši košarici bodo rezervirani še več minut."
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Prosimo vnesite količino za eno od vrst vstopnic."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "od %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "od %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -7,7 +7,7 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: PACKAGE VERSION\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2020-04-17 14:26+0000\n"
|
||||
"POT-Creation-Date: 2020-04-21 13:57+0000\n"
|
||||
"PO-Revision-Date: 2019-08-11 00:00+0000\n"
|
||||
"Last-Translator: Tobias Sundgren <syrgas@gmail.com>\n"
|
||||
"Language-Team: Swedish <https://translate.pretix.eu/projects/pretix/pretix-"
|
||||
@@ -276,21 +276,21 @@ msgstr[1] "Artiklarna i din varukorg är reserverade i {num} minuter."
|
||||
msgid "Please enter a quantity for one of the ticket types."
|
||||
msgstr "Vänligen ange en kvantitet för en av biljettyperna."
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:330
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:340
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "The organizer keeps %(currency)s %(amount)s"
|
||||
msgstr "från %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:338
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:348
|
||||
#, fuzzy
|
||||
#| msgctxt "widget"
|
||||
#| msgid "from %(currency)s %(price)s"
|
||||
msgid "You get %(currency)s %(amount)s back"
|
||||
msgstr "från %(currency)s %(price)s"
|
||||
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:354
|
||||
#: pretix/static/pretixpresale/js/ui/main.js:364
|
||||
msgid "Please enter the amount the organizer can keep."
|
||||
msgstr ""
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user