Compare commits

...

40 Commits

Author SHA1 Message Date
Raphael Michel
90b5d721cb Run pytest with -v 2020-04-22 12:24:56 +02:00
Raphael Michel
1bcf1ec26a Actually run isort instead of flake8 2020-04-22 12:16:29 +02:00
Raphael Michel
d224b5387d Replace Travis with GitHub actions and fix many typos (#1657)
* Create django.yml

* Fix working directory

* ..

* .

* ..

* a.

* ..

* .

* Fix typo

* Install hunspell

* maxfail

* Fix install

* .

* Reduce number of typos

* Even less typos

* Postgres debug

* Spelling fixes, yet again

* Postgres with PW

* Fix failing test

* New workflows

* Fix syntax error

* Install gettext

* Test aginst python 3.6 as well

* Clean up strategies

* Add badge, do not ignore migrations

* Use pip cache
2020-04-22 12:07:58 +02:00
Raphael Michel
27d6e49c4a GiftcarD Only allow reversal for refunds 2020-04-22 09:34:15 +02:00
Raphael Michel
50bb66a32b Merge pull request #1658 from pretix-translations/weblate-pretix-pretix
Translations update from Weblate
2020-04-21 18:45:16 +02:00
Raphael Michel
207149f681 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (3639 of 3639 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2020-04-21 18:44:51 +02:00
Raphael Michel
e0ed25a1d3 Translated on translate.pretix.eu (German)
Currently translated at 99.9% (3638 of 3639 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2020-04-21 18:44:49 +02:00
Raphael Michel
c0c177d755 Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2020-04-21 15:57:55 +02:00
Raphael Michel
f2844ac686 Add expiry dates and individual conditions to gift cards (#1656)
* Add expiry dates and individual conditions to gift cards

* Display refund gift cards with more details and prettier interface

* Allow to set gift card expiry and conditions when cancelling event

* Extend gift card search

* Fix #1565 -- Some gift card filters

* Improve list of gift cards

* Allow to edit gift cards

* Note on validity
2020-04-21 15:57:02 +02:00
Raphael Michel
d9fd4b33a0 Enforce language in timeline test 2020-04-21 11:14:29 +02:00
Raphael Michel
d2415f46df Hide some header elements when printing 2020-04-21 11:14:09 +02:00
Raphael Michel
ad7c745465 Fix bug introduced in last commit 2020-04-21 10:44:40 +02:00
Raphael Michel
b260cca412 Event setup: Do not create additional teams for staff 2020-04-21 09:33:50 +02:00
Raphael Michel
82c84a0fdc Merge pull request #1655 from pretix-translations/weblate-pretix-pretix 2020-04-20 19:18:03 +02:00
Raphael Michel
d703c4de7a Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (3622 of 3622 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2020-04-20 19:17:24 +02:00
Raphael Michel
ff5fbf1c15 Translated on translate.pretix.eu (German)
Currently translated at 100.0% (3622 of 3622 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2020-04-20 19:17:23 +02:00
Raphael Michel
41ff4bca7f Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2020-04-20 19:14:38 +02:00
Raphael Michel
37f45de8a5 Translated on translate.pretix.eu (German (informal))
Currently translated at 100.0% (3621 of 3621 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de_Informal/

powered by weblate
2020-04-20 19:14:30 +02:00
Raphael Michel
71f01c17bd Translated on translate.pretix.eu (German)
Currently translated at 100.0% (3621 of 3621 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/de/

powered by weblate
2020-04-20 19:14:29 +02:00
Raphael Michel
43b1df572f Add translation context 2020-04-20 19:14:02 +02:00
Raphael Michel
ecda905ceb Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2020-04-20 19:06:28 +02:00
Raphael Michel
4e59b02bb1 Re-label cart button if cart is not visible or all products are free 2020-04-20 19:05:21 +02:00
Raphael Michel
234bf093ff Fix isort issues 2020-04-20 17:46:27 +02:00
Raphael Michel
ae9bd1b6ba Update po files
[CI skip]

Signed-off-by: Raphael Michel <mail@raphaelmichel.de>
2020-04-20 17:46:02 +02:00
Raphael Michel
b84b51250f More visible download buttons for single tickets 2020-04-20 17:45:20 +02:00
Raphael Michel
d0dd2116ca Enlarge download button for multi downloads 2020-04-20 17:45:19 +02:00
Raphael Michel
945218035e Re-design number of products in cart overview 2020-04-20 17:45:19 +02:00
Raphael Michel
89f8436e9a Merge pull request #1649 from pretix-translations/weblate-pretix-pretix 2020-04-20 17:44:52 +02:00
Raphael Michel
4992b17966 Squash some migrations 2020-04-20 17:16:02 +02:00
Raphael Michel
f7d057f9fa Translated on translate.pretix.eu (French)
Currently translated at 64.1% (2315 of 3609 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/fr/

powered by weblate
2020-04-20 17:15:54 +02:00
Maarten van den Berg
96ba32b1bb Translated on translate.pretix.eu (Dutch (informal))
Currently translated at 100.0% (3609 of 3609 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/nl_Informal/

powered by weblate
2020-04-20 17:15:54 +02:00
Maarten van den Berg
02792e3ae8 Translated on translate.pretix.eu (Dutch)
Currently translated at 100.0% (3609 of 3609 strings)

Translation: pretix/pretix
Translate-URL: https://translate.pretix.eu/projects/pretix/pretix/nl/

powered by weblate
2020-04-20 17:15:54 +02:00
Raphael Michel
a87fe3ef41 Allow to revert a gift card refund 2020-04-20 13:19:32 +02:00
Raphael Michel
bb673e0cc9 Fix localized decimal validation when creating manual gift card transactions 2020-04-20 12:57:03 +02:00
Raphael Michel
0b02bcea8b Prevent cancelling all subevents by accident 2020-04-19 14:17:41 +02:00
Martin Gross
1d8668aaf1 Exclude all kinds of Umlauts from GiroCodes (Fix: #1314) 2020-04-17 19:14:54 +02:00
Martin Gross
0783add3b9 Restrict PayPal plugin to supported PayPal currencies (Fix: #1160) 2020-04-17 18:56:00 +02:00
Martin Gross
2030aaf12e Fix #1488 some more: compile the regex' less often for better performance 2020-04-17 17:53:57 +02:00
Martin Gross
7ce4c30922 Parse more nTLDs and gTLDs (Fix #1488) 2020-04-17 17:44:08 +02:00
Raphael Michel
f1e772c829 Bump to 3.9.0.dev0 2020-04-17 17:19:40 +02:00
136 changed files with 23688 additions and 17483 deletions

42
.github/workflows/docs.yml vendored Normal file
View 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
View 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
View 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
View 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'

View File

@@ -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:

View File

@@ -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

View File

@@ -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-.*/

View File

@@ -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

View File

@@ -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"
}

View File

@@ -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

View File

@@ -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``.

View File

@@ -1 +1 @@
__version__ = "3.8.0"
__version__ = "3.9.0.dev0"

View File

@@ -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

View File

@@ -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):

View File

@@ -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)

View File

@@ -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),
),
]

View 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),
),
]

View File

@@ -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')

View File

@@ -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 (

View File

@@ -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,

View File

@@ -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 (

View File

@@ -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)

View File

@@ -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

View File

@@ -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

View File

@@ -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': {

View File

@@ -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)

View 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))

View File

@@ -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:
"""

View File

@@ -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 = [

View File

@@ -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):

View File

@@ -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

View File

@@ -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})
}

View File

@@ -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(

View File

@@ -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.'),
}

View File

@@ -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">

View File

@@ -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">

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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" %}

View File

@@ -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 %}

View File

@@ -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>

View File

@@ -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 %}

View File

@@ -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:

View File

@@ -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'),

View File

@@ -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:

View File

@@ -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):

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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"

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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