Compare commits

..

1 Commits

Author SHA1 Message Date
Raphael Michel
9a252d109c First steps 2019-03-23 14:22:32 +01:00
96 changed files with 6352 additions and 23899 deletions

View File

@@ -58,29 +58,16 @@ Database
--------
Next, we need a database and a database user. We can create these with any kind of database managing tool or directly on
our database's shell. For PostgreSQL, we would do::
our database's shell, e.g. for MySQL::
# sudo -u postgres createuser -P pretix
# sudo -u postgres createdb -O pretix pretix
$ mysql -u root -p
mysql> CREATE DATABASE pretix DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
mysql> GRANT ALL PRIVILEGES ON pretix.* TO pretix@'localhost' IDENTIFIED BY '*********';
mysql> FLUSH PRIVILEGES;
Make sure that your database listens on the network. If PostgreSQL on the same same host as docker, but not inside a docker container, we recommend that you just listen on the Docker interface by changing the following line in ``/etc/postgresql/<version>/main/postgresql.conf``::
listen_addresses = 'localhost,172.17.0.1'
You also need to add a new line to ``/etc/postgresql/<version>/main/pg_hba.conf`` to allow network connections to this user and database::
host pretix pretix 172.17.0.1/16 md5
Restart PostgreSQL after you changed these files::
# systemctl restart postgresql
If you have a firewall running, you should also make sure that port 5432 is reachable from the ``172.17.0.1/16`` subnet.
For MySQL, you can either also use network-based connections or mount the ``/var/run/mysqld/mysqld.sock`` socket into the docker container.
When using MySQL, make sure you set the character set of the database to ``utf8mb4``, e.g. like this::
mysql > CREATE DATABASE pretix DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
Replace the asterisks with a password of your own. For MySQL, we will use a unix domain socket to connect to the
database. For PostgreSQL, be sure to configure the interface binding and your firewall so that the docker container
can reach PostgreSQL.
Redis
-----
@@ -127,16 +114,13 @@ Fill the configuration file ``/etc/pretix/pretix.cfg`` with the following conten
datadir=/data
[database]
; Replace postgresql with mysql for MySQL
backend=postgresql
; Replace mysql with postgresql_psycopg2 for PostgreSQL
backend=mysql
name=pretix
user=pretix
; Replace with the password you chose above
password=*********
; In most docker setups, 172.17.0.1 is the address of the docker host. Adjuts
; this to wherever your database is running, e.g. the name of a linked container
; or of a mounted MySQL socket.
host=172.17.0.1
; Replace with host IP address for PostgreSQL
host=/var/run/mysqld/mysqld.sock
[mail]
; See config file documentation for more options
@@ -180,15 +164,14 @@ named ``/etc/systemd/system/pretix.service`` with the following content::
-v /var/pretix-data:/data \
-v /etc/pretix:/etc/pretix \
-v /var/run/redis:/var/run/redis \
-v /var/run/mysqld:/var/run/mysqld \
pretix/standalone:stable all
ExecStop=/usr/bin/docker stop %n
[Install]
WantedBy=multi-user.target
When using MySQL and socket mounting, you'll need the additional flag ``-v /var/run/mysqld:/var/run/mysqld`` in the command.
You can now run the following commands
You can leave the MySQL socket volume out if you're using PostgreSQL. You can now run the following commands
to enable and start the service::
# systemctl daemon-reload

View File

@@ -50,27 +50,21 @@ Database
--------
Having the database server installed, we still need a database and a database user. We can create these with any kind
of database managing tool or directly on our database's shell. For PostgreSQL, we would do::
of database managing tool or directly on our database's shell, e.g. for MySQL::
# sudo -u postgres createuser pretix
# sudo -u postgres createdb -O pretix pretix
When using MySQL, make sure you set the character set of the database to ``utf8mb4``, e.g. like this::
mysql > CREATE DATABASE pretix DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
$ mysql -u root -p
mysql> CREATE DATABASE pretix DEFAULT CHARACTER SET utf8mb4 DEFAULT COLLATE utf8mb4_unicode_ci;
mysql> GRANT ALL PRIVILEGES ON pretix.* TO pretix@'localhost' IDENTIFIED BY '*********';
mysql> FLUSH PRIVILEGES;
Package dependencies
--------------------
To build and run pretix, you will need the following debian packages::
# apt-get install git build-essential python-dev python3-venv python3 python3-pip \
# apt-get install git build-essential python-dev python-virtualenv python3 python3-pip \
python3-dev libxml2-dev libxslt1-dev libffi-dev zlib1g-dev libssl-dev \
gettext libpq-dev libmariadbclient-dev libjpeg-dev libopenjp2-7-dev
.. note:: Python 3.7 is not yet supported, so if you run a very recent OS, make sure to get
Python 3.6 from somewhere. You can check the current state of things in our
`Python 3.7 issue`_.
gettext libpq-dev libmysqlclient-dev libjpeg-dev libopenjp2-7-dev
Config file
-----------
@@ -91,18 +85,13 @@ Fill the configuration file ``/etc/pretix/pretix.cfg`` with the following conten
datadir=/var/pretix/data
[database]
; For MySQL, replace with "mysql"
backend=postgresql
; Replace mysql with postgresql_psycopg2 for PostgreSQL
backend=mysql
name=pretix
user=pretix
; For MySQL, enter the user password. For PostgreSQL on the same host,
; we don't need one because we can use peer authentification if our
; PostgreSQL user matches our unix user.
password=
; For MySQL, use local socket, e.g. /var/run/mysqld/mysqld.sock
; For a remote host, supply an IP address
; For local postgres authentication, you can leave it empty
host=
password=*********
; Replace with host IP address for PostgreSQL
host=/var/run/mysqld/mysqld.sock
[mail]
; See config file documentation for more options
@@ -126,14 +115,14 @@ Now we will install pretix itself. The following steps are to be executed as the
actually install pretix, we will create a virtual environment to isolate the python packages from your global
python installation::
$ python3 -m venv /var/pretix/venv
$ virtualenv -p python3 /var/pretix/venv
$ source /var/pretix/venv/bin/activate
(venv)$ pip3 install -U pip setuptools wheel
We now install pretix, its direct dependencies and gunicorn. Replace ``postgres`` with ``mysql`` in the following
command if you're running MySQL::
We now install pretix, its direct dependencies and gunicorn. Replace ``mysql`` with ``postgres`` in the following
command if you're running PostgreSQL::
(venv)$ pip3 install "pretix[postgres]" gunicorn
(venv)$ pip3 install "pretix[mysql]" gunicorn
Note that you need Python 3.5 or newer. You can find out your Python version using ``python -V``.
@@ -279,10 +268,10 @@ Updates
.. warning:: While we try hard not to break things, **please perform a backup before every upgrade**.
To upgrade to a new pretix release, pull the latest code changes and run the following commands (again, replace
``postgres`` with ``mysql`` if necessary)::
``mysql`` with ``postgres`` if necessary)::
$ source /var/pretix/venv/bin/activate
(venv)$ pip3 install -U pretix[postgres] gunicorn
(venv)$ pip3 install -U pretix[mysql] gunicorn
(venv)$ python -m pretix migrate
(venv)$ python -m pretix rebuild
(venv)$ python -m pretix updatestyles
@@ -314,4 +303,3 @@ example::
.. _redis: https://blog.programster.org/debian-8-install-redis-server/
.. _ufw: https://en.wikipedia.org/wiki/Uncomplicated_Firewall
.. _strong encryption settings: https://mozilla.github.io/server-side-tls/ssl-config-generator/
.. _Python 3.7 issue: https://github.com/pretix/pretix/issues/1025

View File

@@ -20,7 +20,7 @@ internal_name string An optional nam
description multi-lingual string A public description (might include markdown, can
be ``null``)
position integer An integer, used for sorting the categories
is_addon boolean If ``true``, items within this category are not on sale
is_addon boolean If ``True``, items within this category are not on sale
on their own but the category provides a source for
defining add-ons for other products.
===================================== ========================== =======================================================

View File

@@ -156,14 +156,14 @@ Endpoints
"checkin_count": 17,
"position_count": 42,
"event": {
"name": "Demo Conference"
"name": "Demo Converence",
},
"items": [
{
"name": "T-Shirt",
"id": 1,
"checkin_count": 1,
"admission": false,
"admission": False,
"position_count": 1,
"variations": [
{
@@ -184,7 +184,7 @@ Endpoints
"name": "Ticket",
"id": 2,
"checkin_count": 15,
"admission": true,
"admission": True,
"position_count": 22,
"variations": []
}

View File

@@ -25,7 +25,7 @@ is_public boolean If ``true``, th
presale_start datetime The date at which the ticket shop opens (or ``null``)
presale_end datetime The date at which the ticket shop closes (or ``null``)
location multi-lingual string The event location (or ``null``)
has_subevents boolean ``true`` if the event series feature is active for this
has_subevents boolean ``True`` if the event series feature is active for this
event. Cannot change after event is created.
meta_data dict Values set for organizer-specific meta data parameters.
plugins list A list of package names of the enabled plugins for this

View File

@@ -13,7 +13,7 @@ Field Type Description
===================================== ========================== =======================================================
number string Invoice number (with prefix)
order string Order code of the order this invoice belongs to
is_cancellation boolean ``true``, if this invoice is the cancellation of a
is_cancellation boolean ``True``, if this invoice is the cancellation of a
different invoice.
invoice_from string Sender address
invoice_to string Receiver address

View File

@@ -18,7 +18,7 @@ default_price money (string) The price set d
price money (string) The price used for this variation. This is either the
same as ``default_price`` if that value is set or equal
to the item's ``default_price`` (read-only).
active boolean If ``false``, this variation will not be sold or shown.
active boolean If ``False``, this variation will not be sold or shown.
description multi-lingual string A public description of the variation. May contain
Markdown syntax or can be ``null``.
position integer An integer, used for sorting

View File

@@ -21,18 +21,18 @@ default_price money (string) The item price
overwritten by variations or other options.
category integer The ID of the category this item belongs to
(or ``null``).
active boolean If ``false``, the item is hidden from all public lists
active boolean If ``False``, the item is hidden from all public lists
and will not be sold.
description multi-lingual string A public description of the item. May contain Markdown
syntax or can be ``null``.
free_price boolean If ``true``, customers can change the price at which
free_price boolean If ``True``, customers can change the price at which
they buy the product (however, the price can't be set
lower than the price defined by ``default_price`` or
otherwise).
tax_rate decimal (string) The VAT rate to be applied for this item.
tax_rule integer The internal ID of the applied tax rule (or ``null``).
admission boolean ``true`` for items that grant admission to the event
(such as primary tickets) and ``false`` for others
admission boolean ``True`` for items that grant admission to the event
(such as primary tickets) and ``False`` for others
(such as add-ons or merchandise).
position integer An integer, used for sorting
picture string A product picture to be displayed in the shop
@@ -43,12 +43,12 @@ available_from datetime The first date
(or ``null``).
available_until datetime The last date time at which this item can be bought
(or ``null``).
require_voucher boolean If ``true``, this item can only be bought using a
require_voucher boolean If ``True``, this item can only be bought using a
voucher that is specifically assigned to this item.
hide_without_voucher boolean If ``true``, this item is only shown during the voucher
hide_without_voucher boolean If ``True``, this item is only shown during the voucher
redemption process, but not in the normal shop
frontend.
allow_cancel boolean If ``false``, customers cannot cancel orders containing
allow_cancel boolean If ``False``, customers cannot cancel orders containing
this item.
min_per_order integer This product can only be bought if it is included at
least this many times in the order (or ``null`` for no
@@ -56,17 +56,17 @@ min_per_order integer This product ca
max_per_order integer This product can only be bought if it is included at
most this many times in the order (or ``null`` for no
limitation).
checkin_attention boolean If ``true``, the check-in app should show a warning
checkin_attention boolean If ``True``, the check-in app should show a warning
that this ticket requires special attention if such
a product is being scanned.
original_price money (string) An original price, shown for comparison, not used
for price calculations (or ``null``).
require_approval boolean If ``true``, orders with this product will need to be
require_approval boolean If ``True``, orders with this product will need to be
approved by the event organizer before they can be
paid.
require_bundling boolean If ``true``, this item is only available as part of bundles.
generate_tickets boolean If ``false``, tickets are never generated for this
product, regardless of other settings. If ``true``,
require_bundling boolean If ``True``, this item is only available as part of bundles.
generate_tickets boolean If ``False``, tickets are never generated for this
product, regardless of other settings. If ``True``,
tickets are generated even if this is a
non-admission or add-on product, regardless of event
settings. If this is ``null``, regular ticketing
@@ -81,7 +81,7 @@ variations list of objects A list with one
├ price money (string) The price used for this variation. This is either the
same as ``default_price`` if that value is set or equal
to the item's ``default_price``.
├ active boolean If ``false``, this variation will not be sold or shown.
├ active boolean If ``False``, this variation will not be sold or shown.
├ description multi-lingual string A public description of the variation. May contain
Markdown syntax or can be ``null``.
└ position integer An integer, used for sorting

View File

@@ -26,7 +26,7 @@ status string Order status, o
* ``p`` paid
* ``e`` expired
* ``c`` canceled
testmode boolean If ``true``, this order was created when the event was in
testmode boolean If ``True``, this order was created when the event was in
test mode. Only orders in test mode can be deleted.
secret string The secret contained in the link sent to the customer
email string The customer email address
@@ -39,13 +39,13 @@ payment_date date **DEPRECATED AN
payment_provider string **DEPRECATED AND INACCURATE** Payment provider used for this order
total money (string) Total value of this order
comment string Internal comment on this order
checkin_attention boolean If ``true``, the check-in app should show a warning
checkin_attention boolean If ``True``, the check-in app should show a warning
that this ticket requires special attention if a ticket
of this order is scanned.
invoice_address object Invoice address information (can be ``null``)
├ last_modified datetime Last modification date of the address
├ company string Customer company name
├ is_business boolean Business or individual customers (always ``false``
├ is_business boolean Business or individual customers (always ``False``
for orders created before pretix 1.7, do not rely on
it).
├ name string Customer name
@@ -56,7 +56,7 @@ invoice_address object Invoice address
├ country string Customer country
├ internal_reference string Customer's internal reference to be printed on the invoice
├ vat_id string Customer VAT ID
└ vat_id_validated string ``true``, if the VAT ID has been validated against the
└ vat_id_validated string ``True``, if the VAT ID has been validated against the
EU VAT service and validation was successful. This only
happens in rare cases.
positions list of objects List of non-canceled order positions (see below)
@@ -78,9 +78,9 @@ downloads list of objects List of ticket
download options.
├ output string Ticket output provider (e.g. ``pdf``, ``passbook``)
└ url string Download URL
require_approval boolean If ``true`` and the order is pending, this order
require_approval boolean If ``True`` and the order is pending, this order
needs approval by an organizer before it can
continue. If ``true`` and the order is canceled,
continue. If ``True`` and the order is canceled,
this order has been denied by the event organizer.
payments list of objects List of payment processes (see below)
refunds list of objects List of refund processes (see below)
@@ -295,7 +295,7 @@ List of all orders
"require_approval": false,
"invoice_address": {
"last_modified": "2017-12-01T10:00:00Z",
"is_business": true,
"is_business": True,
"company": "Sample company",
"name": "John Doe",
"name_parts": {"full_name": "John Doe"},
@@ -305,7 +305,7 @@ List of all orders
"country": "Testikistan",
"internal_reference": "",
"vat_id": "EU123456789",
"vat_id_validated": false
"vat_id_validated": False
},
"positions": [
{
@@ -373,8 +373,8 @@ List of all orders
}
:query integer page: The page number in case of a multi-page result set, default is 1
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``datetime``, ``code``,
``last_modified``, and ``status``. Default: ``datetime``
:query string ordering: Manually set the ordering of results. Valid fields to be used are ``datetime``, ``code`` and
``status``. Default: ``datetime``
:query string code: Only return orders that match the given order code
:query string status: Only return orders in the given order status (see above)
:query boolean testmode: Only return orders with ``testmode`` set to ``true`` or ``false``
@@ -385,7 +385,6 @@ List of all orders
:query datetime modified_since: Only return orders that have changed since the given date. Be careful: We only
recommend using this in combination with ``testmode=false``, since test mode orders can vanish at any time and
you will not notice it using this method.
:query datetime created_since: Only return orders that have been created since the given date.
:param organizer: The ``slug`` field of the organizer to fetch
:param event: The ``slug`` field of the event to fetch
:resheader X-Page-Generated: The server time at the beginning of the operation. If you're using this API to fetch
@@ -438,7 +437,7 @@ Fetching individual orders
"invoice_address": {
"last_modified": "2017-12-01T10:00:00Z",
"company": "Sample company",
"is_business": true,
"is_business": True,
"name": "John Doe",
"name_parts": {"full_name": "John Doe"},
"street": "Test street 12",
@@ -447,7 +446,7 @@ Fetching individual orders
"country": "Testikistan",
"internal_reference": "",
"vat_id": "EU123456789",
"vat_id_validated": false
"vat_id_validated": False
},
"positions": [
{
@@ -594,7 +593,7 @@ Updating order fields
"email": "other@example.org",
"locale": "de",
"comment": "Foo",
"checkin_attention": true
"checkin_attention": True
}
**Example response**:
@@ -789,8 +788,6 @@ Creating orders
* ``internal_type``
* ``tax_rule``
* ``force`` (optional). If set to ``true``, quotas will be ignored.
If you want to use add-on products, you need to set the ``positionid`` fields of all positions manually
to incrementing integers starting with ``1``. Then, you can reference one of these
IDs in the ``addon_to`` field of another position. Note that all add_ons for a specific position need to come
@@ -820,7 +817,7 @@ Creating orders
],
"payment_provider": "banktransfer",
"invoice_address": {
"is_business": false,
"is_business": False,
"company": "Sample company",
"name_parts": {"full_name": "John Doe"},
"street": "Sesam Street 12",

View File

@@ -30,12 +30,12 @@ type string The expected ty
* ``D`` date
* ``H`` time
* ``W`` date and time
required boolean If ``true``, the question needs to be filled out.
required boolean If ``True``, the question needs to be filled out.
position integer An integer, used for sorting
items list of integers List of item IDs this question is assigned to.
identifier string An arbitrary string that can be used for matching with
other sources.
ask_during_checkin boolean If ``true``, this question will not be asked while
ask_during_checkin boolean If ``True``, this question will not be asked while
buying the ticket, but will show up when redeeming
the ticket instead.
options list of objects In case of question type ``C`` or ``M``, this lists the
@@ -53,7 +53,7 @@ dependency_question integer Internal ID of
``ask_during_checkin``.
dependency_value string The value ``dependency_question`` needs to be set to.
If ``dependency_question`` is set to a boolean
question, this should be ``"true"`` or ``"false"``.
question, this should be ``"True"`` or ``"False"``.
Otherwise, it should be the ``identifier`` of a
question option.
===================================== ========================== =======================================================

View File

@@ -18,8 +18,8 @@ max_usages integer The maximum num
redeemed integer The number of times this voucher already has been
redeemed.
valid_until datetime The voucher expiration date (or ``null``).
block_quota boolean If ``true``, quota is blocked for this voucher.
allow_ignore_quota boolean If ``true``, this voucher can be redeemed even if a
block_quota boolean If ``True``, quota is blocked for this voucher.
allow_ignore_quota boolean If ``True``, this voucher can be redeemed even if a
product is sold out and even if quota is not blocked
for this voucher.
price_mode string Determines how this voucher affects product prices.

View File

@@ -17,11 +17,11 @@ The webhook resource contains the following public fields:
Field Type Description
===================================== ========================== =======================================================
id integer Internal ID of the webhook
enabled boolean If ``false``, this webhook will not receive any notifications
enabled boolean If ``False``, this webhook will not receive any notifications
target_url string The URL to call
all_events boolean If ``true``, this webhook will receive notifications
all_events boolean If ``True``, this webhook will receive notifications
on all events of this organizer
limit_events list of strings If ``all_events`` is ``false``, this is a list of
limit_events list of strings If ``all_events`` is ``False``, this is a list of
event slugs this webhook is active for
action_types list of strings A list of action type filters that limit the
notifications sent to this webhook. See below for

View File

@@ -26,7 +26,7 @@ Frontend
--------
.. automodule:: pretix.presale.signals
:members: html_head, html_footer, footer_link, front_page_top, front_page_bottom, fee_calculation_for_cart, contact_form_fields, question_form_fields, checkout_confirm_messages, checkout_confirm_page_content, checkout_all_optional, html_page_header, sass_preamble, sass_postamble
:members: html_head, html_footer, footer_link, front_page_top, front_page_bottom, fee_calculation_for_cart, contact_form_fields, question_form_fields, checkout_confirm_messages, checkout_confirm_page_content, checkout_all_optional
.. automodule:: pretix.presale.signals

View File

@@ -316,7 +316,7 @@ uses to communicate with the pretix server.
"total": 42,
"version": 3,
"event": {
"name": "Demo Conference",
"name": "Demo Converence",
"slug": "democon",
"date_from": "2016-12-27T17:00:00Z",
"date_to": "2016-12-30T18:00:00Z",

View File

@@ -95,7 +95,6 @@ renderers
reportlab
SaaS
screenshot
scss
searchable
selectable
serializers
@@ -111,7 +110,6 @@ subdomains
subevent
subevents
submodule
subnet
subpath
Symfony
systemd

View File

@@ -1 +1 @@
__version__ = "2.6.0"
__version__ = "2.6.0.dev0"

View File

@@ -19,7 +19,7 @@ class DeviceTokenAuthentication(TokenAuthentication):
if not device.initialized:
raise exceptions.AuthenticationFailed('Device has not been initialized.')
if device.revoked:
if not device.api_token:
raise exceptions.AuthenticationFailed('Device access has been revoked.')
return AnonymousUser(), device

View File

@@ -457,12 +457,11 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
payment_provider = serializers.CharField(required=True)
payment_info = CompatibleJSONField(required=False)
consume_carts = serializers.ListField(child=serializers.CharField(), required=False)
force = serializers.BooleanField(default=False, required=False)
class Meta:
model = Order
fields = ('code', 'status', 'testmode', 'email', 'locale', 'payment_provider', 'fees', 'comment', 'sales_channel',
'invoice_address', 'positions', 'checkin_attention', 'payment_info', 'consume_carts', 'force')
'invoice_address', 'positions', 'checkin_attention', 'payment_info', 'consume_carts')
def validate_payment_provider(self, pp):
if pp not in self.context['event'].get_payment_providers():
@@ -533,7 +532,6 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
positions_data = validated_data.pop('positions') if 'positions' in validated_data else []
payment_provider = validated_data.pop('payment_provider')
payment_info = validated_data.pop('payment_info', '{}')
force = validated_data.pop('force', False)
if 'invoice_address' in validated_data:
iadata = validated_data.pop('invoice_address')
@@ -567,30 +565,29 @@ class OrderCreateSerializer(I18nAwareModelSerializer):
errs = [{} for p in positions_data]
if not force:
for i, pos_data in enumerate(positions_data):
new_quotas = (pos_data.get('variation').quotas.filter(subevent=pos_data.get('subevent'))
if pos_data.get('variation')
else pos_data.get('item').quotas.filter(subevent=pos_data.get('subevent')))
if len(new_quotas) == 0:
errs[i]['item'] = [ugettext_lazy('The product "{}" is not assigned to a quota.').format(
str(pos_data.get('item'))
)]
else:
for quota in new_quotas:
if quota not in quota_avail_cache:
quota_avail_cache[quota] = list(quota.availability())
for i, pos_data in enumerate(positions_data):
new_quotas = (pos_data.get('variation').quotas.filter(subevent=pos_data.get('subevent'))
if pos_data.get('variation')
else pos_data.get('item').quotas.filter(subevent=pos_data.get('subevent')))
if len(new_quotas) == 0:
errs[i]['item'] = [ugettext_lazy('The product "{}" is not assigned to a quota.').format(
str(pos_data.get('item'))
)]
else:
for quota in new_quotas:
if quota not in quota_avail_cache:
quota_avail_cache[quota] = list(quota.availability())
if quota_avail_cache[quota][1] is not None:
quota_avail_cache[quota][1] -= 1
if quota_avail_cache[quota][1] < 0:
errs[i]['item'] = [
ugettext_lazy('There is not enough quota available on quota "{}" to perform the operation.').format(
quota.name
)
]
if quota_avail_cache[quota][1] is not None:
quota_avail_cache[quota][1] -= 1
if quota_avail_cache[quota][1] < 0:
errs[i]['item'] = [
ugettext_lazy('There is not enough quota available on quota "{}" to perform the operation.').format(
quota.name
)
]
quotadiff.update(new_quotas)
quotadiff.update(new_quotas)
if any(errs):
raise ValidationError({'positions': errs})

View File

@@ -105,7 +105,7 @@ class RevokeKeyView(APIView):
def post(self, request, format=None):
device = request.auth
device.revoked = True
device.api_token = None
device.save()
device.log_action('pretix.device.revoked', auth=device)

View File

@@ -50,7 +50,6 @@ class OrderFilter(FilterSet):
code = django_filters.CharFilter(field_name='code', lookup_expr='iexact')
status = django_filters.CharFilter(field_name='status', lookup_expr='iexact')
modified_since = django_filters.IsoDateTimeFilter(field_name='last_modified', lookup_expr='gte')
created_since = django_filters.IsoDateTimeFilter(field_name='datetime', lookup_expr='gte')
class Meta:
model = Order

View File

@@ -1,4 +1,5 @@
from .answers import * # noqa
from .dekodi import * # noqa
from .invoices import * # noqa
from .json import * # noqa
from .mail import * # noqa

View File

@@ -0,0 +1,224 @@
import json
from django.core.serializers.json import DjangoJSONEncoder
from django.dispatch import receiver
from pretix.base.models import Invoice, OrderPayment
from ..exporter import BaseExporter
from ..signals import register_data_exporters
class DekodiNREIExporter(BaseExporter):
identifier = 'dekodi_nrei'
verbose_name = 'dekodi NREI (JSON)'
# Specification: http://manuals.dekodi.de/nexuspub/schnittstellenbuch/
def _encode_invoice(self, invoice: Invoice):
hdr = {
'APmtA': None,
'APmtAEUR': None,
'C': str(invoice.invoice_to_country),
'CA': None,
'CAEUR': None,
'CC': self.event.currency,
'CGrp': None,
'CID': None,
'City': invoice.invoice_to_city,
'CN': invoice.invoice_to_company,
'CNo': None,
'CoDA': None,
'CoDAEUR': None,
'DL': None,
'DIC': None, # Event-land?
'DICt': None,
'DIDt': invoice.order.datetime.isoformat().replace('Z', '+00:00'),
'DIZ': None,
'DN': None,
'DT': '30' if invoice.is_cancellation else '10',
'EbNm': None,
'EbPmtID': Nine,
'EM': invoice.order.email,
'FamN': invoice.invoice_to_name, # todo: split? should be last name
'FCExR': None,
'FN': invoice.invoice_to_name, # todo: split? should be first name
'FS': None,
'GwA': None,
'GwAEUR': None,
'IDt': invoice.date.isoformat() + 'T08:00:00+01:00',
'INo': invoice.full_invoice_no,
'IsNet': invoice.reverse_charge,
'IsPf': False,
'IT': None,
'KlnId': None,
'ODt': invoice.order.datetime.isoformat().replace('Z', '+00:00'),
'OID': invoice.order.code,
'Pb': None,
'PL': None,
'PmDt': None, # todo: payment date?
'PPEm': None, # todo: fill,
'PvrINo': invoice.refers.full_invoice_no if invoice.refers else None,
'PrvOID': None,
'Rmrks': None,
'ShA': None,
'ShAEUR': None,
'ShDt': None,
'ShGrp': None,
'SID': self.event.slug,
'SN': str(self.event),
'SSID': None,
'SSINo': None,
'SSN': None,
'SSOID': None,
'Str': invoice.invoice_to_street,
'TGrossA': gross_total, # TODO,
'TGrossAEUR': None,
'TNetA': net_total, # TODO,
'TNetAEUR': None,
'TNo': None,
'TT': None,
'TVatA': vat_total, # todo
'VatDp': False,
'VatID': invoice.invoice_to_vat_id or None,
'Zip': invoice.invoice_to_zipcode
}
positions = []
for l in invoice.lines.all():
positions.append({
'ABcd': None,
'ADes': l.description,
'ANetA': round(float(l.net_value), 2),
'ANetAEUR': None,
'ANo': None, # TODO: needs to be there!
'ANo1': None,
'ANo2': None,
'ANoEx': None,
'ANoM': None,
'AQ': -1 if invoice.is_cancellation else 1,
'ASku': None,
'AST': 0,
'ATm': None,
'ATT': None,
'AU': None,
'AVatP': round(float(l.tax_rate), 2),
'AWgt': None,
'DiC': None,
'DiCeID': None,
'DICeN': None,
'DiZ': None,
'DIDt': (l.subevent or invoice.order.event).date_from.isoformat().replace('Z', '+00:00'),
'OC': None,
'PosGrossA': round(float((-1 if invoice.is_cancellation else 1) * l.gross_value), 2),
'PosGrossAEUR': None,
'PosNetA': round(float((-1 if invoice.is_cancellation else 1) * l.net_value), 2),
'PosNetAEUR': None,
})
payments = []
for p in invoice.order.payments.filter(
state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_PENDING,
OrderPayment.PAYMENT_STATE_STARTED, OrderPayment.PAYMENT_STATE_REFUNDED)
):
if p.provider == 'paypal':
payments.append({
'PTID': '1',
'PTN': 'PayPal',
'PTNo1': None, # TODO: transaktionsid
'PTNo2': None,
'PTNo3': None,
'PTNo4': None,
'PTNo5': None,
'PTNo6': None,
'PTNo7': None,
'PTNo8': None,
'PTNo9': None,
'PTNo10': None,
'PTNo11': None,
'PTNo12': None,
'PTNo13': None,
'PTNo14': None,
'PTNo15': None,
})
elif p.provider == 'banktransfer':
payments.append({
'PTID': '4',
'PTN': 'Vorkasse',
'PTNo1': None, # TODO: transaktionsid
'PTNo2': None,
'PTNo3': None,
'PTNo4': None,
'PTNo5': None,
'PTNo6': None,
'PTNo7': None,
'PTNo8': None,
'PTNo9': None,
'PTNo10': None,
'PTNo11': None,
'PTNo12': None,
'PTNo13': None,
'PTNo14': None,
'PTNo15': None,
})
elif p.provider == 'sepadebit':
payments.append({
'PTID': '5',
'PTN': 'Lastschrift',
'PTNo1': None, # TODO: transaktionsid
'PTNo2': None,
'PTNo3': None,
'PTNo4': None,
'PTNo5': None,
'PTNo6': None,
'PTNo7': None,
'PTNo8': None,
'PTNo9': None,
'PTNo10': None,
'PTNo11': None,
'PTNo12': None,
'PTNo13': None,
'PTNo14': None,
'PTNo15': None,
})
elif p.provider.startswith('stripe'):
payments.append({
'PTID': '81',
'PTN': 'Stripe',
'PTNo1': None, # TODO: transaktionsid
'PTNo2': None,
'PTNo3': None,
'PTNo4': None,
'PTNo5': None,
'PTNo6': None,
'PTNo7': None,
'PTNo8': None,
'PTNo9': None,
'PTNo10': None,
'PTNo11': None,
'PTNo12': None,
'PTNo13': None,
'PTNo14': None,
'PTNo15': None,
})
return {
'IsValid': True,
'Hdr': hdr,
'InvcPstns': positions,
'PmIs': payments,
'ValidationMessage': ''
}
def render(self, form_data):
jo = {
'Format': 'NREI',
'Version': '18.10.2',
'SourceSystem': 'pretix',
'Data': [
self._encode_invoice(i) for i in self.event.invoices.select_related('order').prefetch_related('lines', 'lines__subevent')
]
}
return '{}_nrei.json'.format(self.event.slug), 'application/json', json.dumps(jo, cls=DjangoJSONEncoder)
@receiver(register_data_exporters, dispatch_uid="exporter_dekodi_nrei")
def register_dekodi_export(sender, **kwargs):
return DekodiNREIExporter

View File

@@ -1,24 +0,0 @@
# Generated by Django 2.1.7 on 2019-03-23 22:38
from decimal import Decimal
import django.db.models.deletion
import jsonfallback.fields
from django.db import migrations, models
import pretix.base.models.fields
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0114_auto_20190316_1014'),
]
operations = [
migrations.AlterField(
model_name='itembundle',
name='designated_price',
field=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'),
),
]

View File

@@ -1,22 +0,0 @@
# Generated by Django 2.1.5 on 2019-04-02 07:22
import django.db.models.deletion
import jsonfallback.fields
from django.db import migrations, models
import pretix.base.models.fields
class Migration(migrations.Migration):
dependencies = [
('pretixbase', '0115_auto_20190323_2238'),
]
operations = [
migrations.AddField(
model_name='device',
name='revoked',
field=models.BooleanField(default=False),
),
]

View File

@@ -41,7 +41,6 @@ class Device(LoggedModel):
api_token = models.CharField(max_length=190, unique=True, null=True)
all_events = models.BooleanField(default=False, verbose_name=_("All events (including newly created ones)"))
limit_events = models.ManyToManyField('Event', verbose_name=_("Limit to events"), blank=True)
revoked = models.BooleanField(default=False)
name = models.CharField(
max_length=190,
verbose_name=_('Name')

View File

@@ -818,7 +818,7 @@ class ItemBundle(models.Model):
verbose_name=_('Number')
)
designated_price = models.DecimalField(
default=Decimal('0.00'), blank=True,
null=True, blank=True,
decimal_places=2, max_digits=10,
verbose_name=_('Designated price part'),
help_text=_('If set, it will be shown that this bundled item is responsible for the given value of the total '

View File

@@ -1470,7 +1470,7 @@ def cancel_order(self, order: int, user: int=None, send_mail: bool=True, api_tok
raise OrderError(error_messages['busy'])
def change_payment_provider(order: Order, payment_provider, amount=None, new_payment=None):
def change_payment_provider(order: Order, payment_provider, amount=None):
e = OrderPayment.objects.filter(fee=OuterRef('pk'), state__in=(OrderPayment.PAYMENT_STATE_CONFIRMED,
OrderPayment.PAYMENT_STATE_REFUNDED))
open_fees = list(
@@ -1502,10 +1502,7 @@ def change_payment_provider(order: Order, payment_provider, amount=None, new_pay
fee = None
open_payment = None
if new_payment:
lp = order.payments.exclude(pk=new_payment.pk).last()
else:
lp = order.payments.last()
lp = order.payments.exclude(provider=payment_provider.identifier).last()
if lp and lp.state not in (OrderPayment.PAYMENT_STATE_CONFIRMED, OrderPayment.PAYMENT_STATE_REFUNDED):
open_payment = lp

View File

@@ -31,6 +31,6 @@ def refresh_quota_caches():
Q(cached_availability_time__isnull=True) |
Q(cached_availability_time__lt=F('last_activity')) |
Q(cached_availability_time__lt=now() - timedelta(hours=2), last_activity__gt=now() - timedelta(days=7))
).select_related('subevent')
)
for q in quotas:
q.availability()

View File

@@ -97,14 +97,6 @@ DEFAULTS = {
'default': '30',
'type': int
},
'redirect_to_checkout_directly': {
'default': 'False',
'type': bool
},
'presale_has_ended_text': {
'default': '',
'type': LazyI18nString
},
'payment_explanation': {
'default': '',
'type': LazyI18nString

View File

@@ -1049,14 +1049,6 @@ class DisplaySettingsForm(SettingsForm):
required=False,
widget=I18nTextarea
)
presale_has_ended_text = I18nFormField(
label=_("End of presale text"),
required=False,
widget=I18nTextarea,
widget_kwargs={'attrs': {'rows': '2'}},
help_text=_("This text will be shown above the ticket shop once the designated sales timeframe for this event "
"is over. You can use it to describe other options to get a ticket, such as a box office.")
)
voucher_explanation_text = I18nFormField(
label=_("Voucher explanation"),
required=False,
@@ -1082,10 +1074,6 @@ class DisplaySettingsForm(SettingsForm):
label=_('Ask search engines not to index the ticket shop'),
required=False
)
redirect_to_checkout_directly = forms.BooleanField(
label=_('Directly redirect to check-out after a product has been added to the cart.'),
required=False
)
def __init__(self, *args, **kwargs):
event = kwargs['obj']

View File

@@ -11,14 +11,12 @@
<legend>{% trans "Event page" %}</legend>
{% bootstrap_field form.logo_image layout="control" %}
{% bootstrap_field form.frontpage_text layout="control" %}
{% bootstrap_field form.presale_has_ended_text layout="control" %}
{% bootstrap_field form.voucher_explanation_text layout="control" %}
{% bootstrap_field form.show_variations_expanded layout="control" %}
{% bootstrap_field form.meta_noindex layout="control" %}
{% if form.frontpage_subevent_ordering %}
{% bootstrap_field form.frontpage_subevent_ordering layout="control" %}
{% endif %}
{% bootstrap_field form.redirect_to_checkout_directly layout="control" %}
</fieldset>
<fieldset>
<legend>{% trans "Shop design" %}</legend>

View File

@@ -9,13 +9,6 @@
<strong>{% blocktrans %}Are you sure you want remove access for this device?{% endblocktrans %}</strong>
{% trans "All data of this device will stay available, but you can't use the device any more." %}
</p>
<div class="alert alert-warning">
<ul>
<li>{% trans "All data uploaded by this device will stay available online." %}</li>
<li>{% trans "If data (e.g. POS transactions or check-ins) has been created on this device and has not been uploaded, you will no longer be able to upload it." %}</li>
<li>{% trans "If the device software supports it, personal data such as orders will be deleted from the device on the next synchronization attempt. Non-personal data such as event metadata and POS transactions will persist until you uninstall or reset the software manually." %}</li>
</ul>
</div>
<div class="form-group submit-group">
<a href="{% url "control:organizer.devices" organizer=request.organizer.slug %}" class="btn btn-default btn-cancel">
{% trans "Cancel" %}

View File

@@ -756,7 +756,7 @@ class DeviceRevokeView(OrganizerDetailViewMixin, OrganizerPermissionRequiredMixi
def post(self, request, *args, **kwargs):
self.object = self.get_object()
self.object.revoked = True
self.object.api_token = None
self.object.save()
self.object.log_action('pretix.device.revoked', user=self.request.user)
messages.success(request, _('Access for this device has been revoked.'))

View File

@@ -82,10 +82,7 @@ class OrderSearch(PaginationMixin, ListView):
page = self.kwargs.get(self.page_kwarg) or self.request.GET.get(self.page_kwarg) or 1
limit = self.get_paginate_by(None)
try:
offset = (int(page) - 1) * limit
except ValueError:
offset = 0
offset = (page - 1) * limit
resultids = list(qs.order_by().values_list('id', flat=True)[:201])
if len(resultids) <= 200 and len(resultids) <= offset + limit:
qs = Order.objects.using(settings.DATABASE_REPLICA).filter(

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -1,465 +0,0 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"
"Language: ca\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:68
msgid "Marked as paid"
msgstr ""
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:76
msgid "Comment:"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Placed orders"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:15
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:39
msgid "Paid orders"
msgstr ""
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:12
msgid "Contacting Stripe …"
msgstr ""
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:56
msgid "Total"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:39
#: pretix/static/pretixbase/js/asynctask.js:95
msgid ""
"Your request has been queued on the server and will now be processed. "
"Depending on the size of your event, this might take up to a few minutes."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:45
#: pretix/static/pretixbase/js/asynctask.js:101
msgid ""
"Your request arrived on the server but we still wait for it to be processed. "
"If this takes longer than two minutes, please contact us or go back in your "
"browser and try again."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:66
#: pretix/static/pretixbase/js/asynctask.js:124
#: pretix/static/pretixcontrol/js/ui/mail.js:23
msgid "An error of type {code} occurred."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:69
msgid ""
"We currently cannot reach the server, but we keep trying. Last error code: "
"{code}"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:115
#: pretix/static/pretixcontrol/js/ui/mail.js:20
msgid "The request took to long. Please try again."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:127
#: pretix/static/pretixcontrol/js/ui/mail.js:25
msgid ""
"We currently cannot reach the server. Please try again. Error code: {code}"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:148
msgid "We are processing your request …"
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:156
msgid ""
"We are currently sending your request to the server. If this takes longer "
"than one minute, please check your internet connection and then reload this "
"page and try again."
msgstr ""
#: pretix/static/pretixbase/js/asynctask.js:193
#: pretix/static/pretixcontrol/js/ui/main.js:20
msgid "Close message"
msgstr ""
#: pretix/static/pretixcontrol/js/clipboard.js:23
msgid "Copied!"
msgstr ""
#: pretix/static/pretixcontrol/js/clipboard.js:29
msgid "Press Ctrl-C to copy!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:43
msgid "Lead Scan QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:45
msgid "Check-in QR"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:249
msgid "The PDF background file could not be loaded for the following reason:"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:418
msgid "Group of objects"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:424
msgid "Text object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:426
msgid "Barcode area"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:428
msgid "Powered by pretix"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:430
msgid "Object"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:434
msgid "Ticket design"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:687
msgid "Saving failed."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:735
msgid "Do you really want to leave the editor without saving your changes?"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/editor.js:749
msgid "Error while uploading your PDF file, please try again."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/mail.js:18
msgid "An error has occurred."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/mail.js:52
msgid "Generating messages …"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:55
msgid "Unknown error."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:217
msgid "Your color has great contrast and is very easy to read!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:221
msgid "Your color has decent contrast and is probably good-enough to read!"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:225
msgid ""
"Your color has bad contrast for text on white background, please choose a "
"darker shade."
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:306
msgid "All"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:307
msgid "None"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:595
msgid "Use a different name internally"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/main.js:646
msgid "Click to close"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:42
msgid "Others"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:71
msgid "Count"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:121
msgid "No"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
msgid_plural "({num} more dates)"
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/ui/cart.js:39
msgid "The items in your cart are no longer reserved for you."
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:41
msgid "Cart expired"
msgstr ""
#: pretix/static/pretixpresale/js/ui/cart.js:46
msgid "The items in your cart are reserved for you for one minute."
msgid_plural "The items in your cart are reserved for you for {num} minutes."
msgstr[0] ""
msgstr[1] ""
#: pretix/static/pretixpresale/js/widget/widget.js:14
msgctxt "widget"
msgid "Sold out"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:15
msgctxt "widget"
msgid "Buy"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:16
msgctxt "widget"
msgid "Reserved"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:17
msgctxt "widget"
msgid "FREE"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:18
msgctxt "widget"
msgid "from %(currency)s %(price)s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:19
msgctxt "widget"
msgid "incl. %(rate)s% %(taxname)s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:20
msgctxt "widget"
msgid "plus %(rate)s% %(taxname)s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
msgctxt "widget"
msgid "currently available: %s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:24
msgctxt "widget"
msgid "Only available with a voucher"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:25
#, javascript-format
msgctxt "widget"
msgid "minimum amount to order: %s"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:26
msgctxt "widget"
msgid "Close ticket shop"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:27
msgctxt "widget"
msgid "The ticket shop could not be loaded."
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:28
msgctxt "widget"
msgid "The cart could not be created. Please try again later"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:29
msgctxt "widget"
msgid "Waiting list"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:30
msgctxt "widget"
msgid ""
"You currently have an active cart for this event. If you select more "
"products, they will be added to your existing cart."
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:32
msgctxt "widget"
msgid "Resume checkout"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:33
msgctxt "widget"
msgid ""
"<a href=\"https://pretix.eu\" target=\"_blank\" rel=\"noopener\">event "
"ticketing powered by pretix</a>"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:35
msgctxt "widget"
msgid "Redeem a voucher"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:36
msgctxt "widget"
msgid "Redeem"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:37
msgctxt "widget"
msgid "Voucher code"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:38
msgctxt "widget"
msgid "Close"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:39
msgctxt "widget"
msgid "Continue"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:40
msgctxt "widget"
msgid "See variations"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:41
msgctxt "widget"
msgid "Choose a different event"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2018-04-24 14:22+0000\n"
"Last-Translator: Pernille Thorsen <perth@aarhus.dk>\n"
"Language-Team: Danish <https://translate.pretix.eu/projects/pretix/pretix-js/"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-22 15:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German <https://translate.pretix.eu/projects/pretix/pretix-js/"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-22 15:00+0000\n"
"Last-Translator: Raphael Michel <michel@rami.io>\n"
"Language-Team: German (informal) <https://translate.pretix.eu/projects/"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+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"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-31 08:00+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-02-20 03:00+0000\n"
"Last-Translator: oocf <oswaldocerna@gmail.com>\n"
"Language-Team: Spanish <https://translate.pretix.eu/projects/pretix/pretix-"
"js/es/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.5.1\n"
"X-Generator: Weblate 3.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -220,7 +220,7 @@ msgstr "Usar un nombre diferente internamente"
#: pretix/static/pretixcontrol/js/ui/main.js:646
msgid "Click to close"
msgstr "Click para cerrar"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:42
msgid "Others"
@@ -232,11 +232,13 @@ msgstr "Cantidad"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr "Si"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr "No"
msgstr "Ninguno"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -298,12 +300,12 @@ msgstr "más %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr "incl. impuestos"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr "más impuestos"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -398,100 +400,102 @@ msgid "See variations"
msgstr "Ver variaciones"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "Elige un evento diferente"
msgstr "Usar un nombre diferente internamente"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr "Atrás"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr "Siguiente mes"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr "Mes anterior"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr "Me"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr "Ma"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr "Mie"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr "Ju"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr "Vi"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr ""
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr "Do"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr "Enero"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr "Febrero"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr "Marzo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr "Abril"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr "Mayo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr "Junio"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr "Julio"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr "Agosto"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr "Septiembre"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr "Octubre"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr "Noviembre"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr "Diciembre"
msgstr ""
#~ msgid ""
#~ "Your request has been queued on the server and will now be processed. If "

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2018-10-28 10:23+0000\n"
"Last-Translator: Arnaud Vergnet <keplyx@gmail.com>\n"
"Language-Team: French <https://translate.pretix.eu/projects/pretix/pretix-js/"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-01-02 08:20+0000\n"
"Last-Translator: amefad <fame@libero.it>\n"
"Language-Team: Italian <https://translate.pretix.eu/projects/pretix/pretix-"

File diff suppressed because it is too large Load Diff

View File

@@ -6,8 +6,8 @@ msgid ""
msgstr ""
"Project-Id-Version: 1\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-24 05:00+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-13 15:49+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch <https://translate.pretix.eu/projects/pretix/pretix-js/"
"nl/>\n"
@@ -16,7 +16,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.5.1\n"
"X-Generator: Weblate 3.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -40,7 +40,7 @@ msgstr "Betaalde bestellingen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr "Totaalomzet"
msgstr "Volledige omzet"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:12
msgid "Contacting Stripe …"
@@ -226,11 +226,13 @@ msgstr "Aantal"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr "Ja"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr "Nee"
msgstr "Geen"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -292,12 +294,12 @@ msgstr "plus %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr "incl. belasting"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr "excl. belasting"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -392,100 +394,102 @@ msgid "See variations"
msgstr "Zie variaties"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "Ander evenement kiezen"
msgstr "Gebruik intern een andere naam"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr "Terug"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr "Volgende maand"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr "Vorige maand"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr "Ma"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr "Di"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr "Wo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr "Do"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr "Vr"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr "Za"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr "Zo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr "Januari"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr "Februari"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr "Maart"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr "April"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr "Mei"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr "Juni"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr "Juli"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr "Augustus"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr "September"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr "Oktober"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr "November"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr "December"
msgstr ""
#~ msgid ""
#~ "Your request has been queued on the server and will now be processed. If "

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-27 01:00+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-13 15:49+0000\n"
"Last-Translator: Maarten van den Berg <maartenberg1@gmail.com>\n"
"Language-Team: Dutch (informal) <https://translate.pretix.eu/projects/pretix/"
"pretix-js/nl_Informal/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 3.5.1\n"
"X-Generator: Weblate 3.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -41,7 +41,7 @@ msgstr "Betaalde bestellingen"
#: pretix/plugins/statistics/static/pretixplugins/statistics/statistics.js:27
msgid "Total revenue"
msgstr "Totaalomzet"
msgstr "Volledige omzet"
#: pretix/plugins/stripe/static/pretixplugins/stripe/pretix-stripe.js:12
msgid "Contacting Stripe …"
@@ -228,11 +228,13 @@ msgstr "Aantal"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr "Ja"
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr "Nee"
msgstr "Geen"
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -294,12 +296,12 @@ msgstr "plus %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr "incl. belasting"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr "excl. belasting"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -394,97 +396,99 @@ msgid "See variations"
msgstr "Zie variaties"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "Ander evenement kiezen"
msgstr "Gebruik intern een andere naam"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr "Terug"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr "Volgende maand"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr "Vorige maand"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr "Ma"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr "Di"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr "Wo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr "Do"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr "Vr"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr "Za"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr "Zo"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr "Januari"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr "Februari"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr "Maart"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr "April"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr "Mei"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr "Juni"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr "Juli"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr "Augustus"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr "September"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr "Oktober"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr "November"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr "December"
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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-15 11:19+0000\n"
"Last-Translator: Serge Bazanski <q3k@hackerspace.pl>\n"
"Language-Team: Polish <https://translate.pretix.eu/projects/pretix/pretix-js/"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: Automatically generated\n"
"Language-Team: none\n"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+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/"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-01-02 08:21+0000\n"
"Last-Translator: Alexey Zh <write2aracon@gmail.com>\n"
"Language-Team: Russian <https://translate.pretix.eu/projects/pretix/pretix-"

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: 2019-04-03 13:19+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2018-09-03 06:36+0000\n"
"Last-Translator: Yunus Fırat Pişkin <firat.piskin@idvlabs.com>\n"
"Language-Team: Turkish <https://translate.pretix.eu/projects/pretix/pretix-"

File diff suppressed because it is too large Load Diff

View File

@@ -7,8 +7,8 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2019-04-03 13:19+0000\n"
"PO-Revision-Date: 2019-03-28 14:00+0000\n"
"POT-Creation-Date: 2019-03-22 14:50+0000\n"
"PO-Revision-Date: 2019-03-19 09:00+0000\n"
"Last-Translator: yichengsd <sunzl@jxepub.com>\n"
"Language-Team: Chinese (Simplified) <https://translate.pretix.eu/projects/"
"pretix/pretix-js/zh_Hans/>\n"
@@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
"X-Generator: Weblate 3.5.1\n"
"X-Generator: Weblate 3.4\n"
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:56
#: pretix/plugins/banktransfer/static/pretixplugins/banktransfer/ui.js:62
@@ -219,11 +219,13 @@ msgstr "数量"
#: pretix/static/pretixcontrol/js/ui/question.js:120
msgid "Yes"
msgstr ""
msgstr ""
#: pretix/static/pretixcontrol/js/ui/question.js:121
#, fuzzy
#| msgid "None"
msgid "No"
msgstr ""
msgstr ""
#: pretix/static/pretixcontrol/js/ui/subevent.js:108
msgid "(one more date)"
@@ -281,12 +283,12 @@ msgstr "另加 %(rate)s% %(taxname)s"
#: pretix/static/pretixpresale/js/widget/widget.js:21
msgctxt "widget"
msgid "incl. taxes"
msgstr "包含税"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:22
msgctxt "widget"
msgid "plus taxes"
msgstr ""
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:23
#, javascript-format
@@ -379,100 +381,102 @@ msgid "See variations"
msgstr "查看变化"
#: pretix/static/pretixpresale/js/widget/widget.js:41
#, fuzzy
#| msgid "Use a different name internally"
msgctxt "widget"
msgid "Choose a different event"
msgstr "选择一个不同的活动"
msgstr "在内部使用一个不同的名称"
#: pretix/static/pretixpresale/js/widget/widget.js:42
msgctxt "widget"
msgid "Back"
msgstr "后退"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:43
msgctxt "widget"
msgid "Next month"
msgstr "下个月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:44
msgctxt "widget"
msgid "Previous month"
msgstr "上个月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:46
msgid "Mo"
msgstr "周一"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:47
msgid "Tu"
msgstr "周二"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:48
msgid "We"
msgstr "周三"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:49
msgid "Th"
msgstr "周四"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:50
msgid "Fr"
msgstr "周五"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:51
msgid "Sa"
msgstr "周六"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:52
msgid "Su"
msgstr "周天"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:55
msgid "January"
msgstr "一月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:56
msgid "February"
msgstr "二月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:57
msgid "March"
msgstr "三月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:58
msgid "April"
msgstr "四月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:59
msgid "May"
msgstr "五月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:60
msgid "June"
msgstr "六月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:61
msgid "July"
msgstr "七月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:62
msgid "August"
msgstr "八月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:63
msgid "September"
msgstr "九月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:64
msgid "October"
msgstr "十月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:65
msgid "November"
msgstr "十一月"
msgstr ""
#: pretix/static/pretixpresale/js/widget/widget.js:66
msgid "December"
msgstr "十二月"
msgstr ""
#~ msgid "Ja"
#~ msgstr "是"

View File

@@ -92,23 +92,14 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or
trans.state = BankTransaction.STATE_ERROR
trans.message = ugettext_noop('The order has already been canceled.')
else:
try:
p, created = trans.order.payments.get_or_create(
amount=trans.amount,
provider='banktransfer',
state__in=(OrderPayment.PAYMENT_STATE_CREATED, OrderPayment.PAYMENT_STATE_PENDING),
defaults={
'state': OrderPayment.PAYMENT_STATE_CREATED,
}
)
except OrderPayment.MultipleObjectsReturned:
created = False
p = trans.order.payments.filter(
amount=trans.amount,
provider='banktransfer',
state__in=(OrderPayment.PAYMENT_STATE_CREATED, OrderPayment.PAYMENT_STATE_PENDING),
).last()
p, created = trans.order.payments.get_or_create(
amount=trans.amount,
provider='banktransfer',
state__in=(OrderPayment.PAYMENT_STATE_CREATED, OrderPayment.PAYMENT_STATE_PENDING),
defaults={
'state': OrderPayment.PAYMENT_STATE_CREATED,
}
)
p.info_data = {
'reference': trans.reference,
'date': trans.date,
@@ -118,7 +109,7 @@ def _handle_transaction(trans: BankTransaction, code: str, event: Event=None, or
if created:
# We're perform a payment method switchign on-demand here
old_fee, new_fee, fee = change_payment_provider(trans.order, p.payment_provider, p.amount, new_payment=p) # noqa
old_fee, new_fee, fee = change_payment_provider(trans.order, p.payment_provider, p.amount) # noqa
if fee:
p.fee = fee
p.save(update_fields=['fee'])

View File

@@ -16,7 +16,6 @@
{% if job.state == "error" %}
<div class="alert alert-danger">
{% trans "An internal error occurred during processing your data." %}
{% trans "Some transactions might be missing, please try ot re-import the file." %}
</div>
{% elif transactions_ignored == 0 and transactions_invalid == 0 and transactions_valid == 0 %}
<div class="alert alert-info">

View File

@@ -8,7 +8,7 @@ from pretix.helpers.i18n import (
get_javascript_format_without_seconds, get_moment_locale,
)
from .signals import footer_link, html_footer, html_head, html_page_header
from .signals import footer_link, html_footer, html_head
def contextprocessor(request):
@@ -23,7 +23,6 @@ def contextprocessor(request):
'DEBUG': settings.DEBUG,
}
_html_head = []
_html_page_header = []
_html_foot = []
_footer = []
@@ -46,8 +45,6 @@ def contextprocessor(request):
if hasattr(request, 'event'):
for receiver, response in html_head.send(request.event, request=request):
_html_head.append(response)
for receiver, response in html_page_header.send(request.event, request=request):
_html_page_header.append(response)
for receiver, response in html_footer.send(request.event, request=request):
_html_foot.append(response)
for receiver, response in footer_link.send(request.event, request=request):
@@ -74,7 +71,6 @@ def contextprocessor(request):
ctx['html_head'] = "".join(_html_head)
ctx['html_foot'] = "".join(_html_foot)
ctx['html_page_header'] = "".join(_html_page_header)
ctx['footer'] = _footer
ctx['site_url'] = settings.SITE_URL

View File

@@ -11,17 +11,6 @@ of every page in the frontend. You will get the request as the keyword argument
As with all plugin signals, the ``sender`` keyword argument will contain the event.
"""
html_page_header = EventPluginSignal(
providing_args=["request"]
)
"""
This signal allows you to put code right in the beginning of the HTML ``<body>`` tag
of every page in the frontend. You will get the request as the keyword argument
``request`` and are expected to return plain HTML.
As with all plugin signals, the ``sender`` keyword argument will contain the event.
"""
html_footer = EventPluginSignal(
providing_args=["request"]
)
@@ -33,33 +22,6 @@ of every page in the frontend. You will get the request as the keyword argument
As with all plugin signals, the ``sender`` keyword argument will contain the event.
"""
sass_preamble = EventPluginSignal(
providing_args=["filename"]
)
"""
This signal allows you to put SASS code at the beginning of the event-specific
stylesheet. Keep in mind that this will only be called/rebuilt when the user changes
display settings or pretix gets updated. You will get the filename that is being
generated (usually "main.scss" or "widget.scss"). This SASS code will be loaded *after*
setting of user-defined variables like colors and fonts but *before* pretix' SASS
code.
As with all plugin signals, the ``sender`` keyword argument will contain the event.
"""
sass_postamble = EventPluginSignal(
providing_args=["filename"]
)
"""
This signal allows you to put SASS code at the end of the event-specific
stylesheet. Keep in mind that this will only be called/rebuilt when the user changes
display settings or pretix gets updated. You will get the filename that is being
generated (usually "main.scss" or "widget.scss"). This SASS code will be loaded *after*
all of pretix' SASS code.
As with all plugin signals, the ``sender`` keyword argument will contain the event.
"""
footer_link = EventPluginSignal(
providing_args=["request"]
)

View File

@@ -16,7 +16,6 @@ from pretix.base.models import Event, Event_SettingsStore, Organizer
from pretix.base.services.tasks import ProfiledTask
from pretix.celery_app import app
from pretix.multidomain.urlreverse import get_domain
from pretix.presale.signals import sass_postamble, sass_preamble
logger = logging.getLogger('pretix.presale.style')
affected_keys = ['primary_font', 'primary_color']
@@ -55,16 +54,8 @@ def compile_scss(object, file="main.scss", fonts=True):
font
))
if isinstance(object, Event):
for recv, resp in sass_preamble.send(object, filename=file):
sassrules.append(resp)
sassrules.append('@import "{}";'.format(file))
if isinstance(object, Event):
for recv, resp in sass_postamble.send(object, filename=file):
sassrules.append(resp)
cf = dict(django_libsass.CUSTOM_FUNCTIONS)
cf['static'] = static
css = sass.compile(

View File

@@ -59,7 +59,6 @@
<meta name="theme-color" content="{{ settings.primary_color|default:"#3b1c4a" }}">
</head>
<body class="nojs" data-locale="{{ request.LANGUAGE_CODE }}" data-now="{% now "U.u" %}" data-datetimeformat="{{ js_datetime_format }}" data-timeformat="{{ js_time_format }}" data-dateformat="{{ js_date_format }}" data-datetimelocale="{{ js_locale }}">
{{ html_page_header|safe }}
{% block above %}
{% endblock %}
<div class="container">

View File

@@ -32,8 +32,8 @@
</div>
<div class="col-sm-4 hidden-xs text-right">
<a href="?{% url_replace request "year" after.year "month" after.month %}" class="btn btn-default">
{{ after|date:"F Y" }}
<span class="fa fa-arrow-right"></span>
{{ after|date:"F Y" }}
</a>
</div>
</div>

View File

@@ -110,13 +110,9 @@
{% if not ev.presale_is_running %}
<div class="alert alert-info">
{% if ev.presale_has_ended %}
{% if event.settings.presale_has_ended_text %}
{{ event.settings.presale_has_ended_text|rich_text }}
{% else %}
{% blocktrans trimmed %}
The presale period for this event is over.
{% endblocktrans %}
{% endif %}
{% blocktrans trimmed %}
The presale period for this event is over.
{% endblocktrans %}
{% elif event.settings.presale_start_show_date %}
{% blocktrans trimmed with date=ev.presale_start|date:"SHORT_DATE_FORMAT" time=ev.presale_start|time:"TIME_FORMAT" %}
The presale for this event will start on {{ date }} at {{ time }}.
@@ -186,7 +182,7 @@
<form method="post" data-asynctask
data-asynctask-headline="{% trans "We're now trying to reserve this for you!" %}"
data-asynctask-text="{% blocktrans with time=event.settings.reservation_time %}Once the items are in your cart, you will have {{ time }} minutes to complete your purchase.{% endblocktrans %}"
action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={{ cart_redirect|urlencode }}">
action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={{ request.path|urlencode }}">
{% csrf_token %}
<input type="hidden" name="subevent" value="{{ subevent.id|default_if_none:"" }}" />
{% for tup in items_by_category %}

View File

@@ -20,7 +20,8 @@
</p>
{% if event.presale_is_running or event.settings.show_items_outside_presale_period %}
<form method="post"
action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={{ cart_redirect|urlencode }}{% if "iframe" in request.GET and not new_tab %}&iframe={{ request.GET.iframe }}{% endif %}{% if "take_cart_id" in request.GET and new_tab %}&take_cart_id={{ request.GET.take_cart_id }}{% endif %}" {% if new_tab %}target="_blank"{% else %}
action="{% eventurl request.event "presale:event.cart.add" cart_namespace=cart_namespace %}?next={% eventurl request.event "presale:event.index" cart_namespace=cart_namespace %}{% if "iframe" in request.GET and not new_tab %}&iframe={{ request.GET.iframe }}{% endif %}{% if "take_cart_id" in request.GET and new_tab %}&take_cart_id={{ request.GET.take_cart_id }}{% endif %}"
{% if new_tab %}target="_blank"{% else %}
data-asynctask
data-asynctask-headline="{% trans "We're now trying to reserve this for you!" %}"
data-asynctask-text="{% blocktrans with time=event.settings.reservation_time %}Once the items are in your cart, you will have {{ time }} minutes to complete your purchase.{% endblocktrans %}"

View File

@@ -425,15 +425,6 @@ class RedeemView(NoSearchIndexViewMixin, EventViewMixin, TemplateView):
# Cookies are not supported! Lets just make the form open in a new tab
)
if self.request.event.settings.redirect_to_checkout_directly:
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.checkout.start',
kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''})
else:
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.index',
kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''})
if context['cart_redirect'].startswith('https:'):
context['cart_redirect'] = '/' + context['cart_redirect'].split('/', 3)[3]
return context
def dispatch(self, request, *args, **kwargs):

View File

@@ -23,8 +23,7 @@ from pretix.base.models.items import ItemBundle
from pretix.multidomain.urlreverse import eventreverse
from pretix.presale.ical import get_ical
from pretix.presale.views.organizer import (
EventListMixin, add_subevents_for_days, filter_qs_by_attr,
weeks_for_template,
EventListMixin, add_subevents_for_days, weeks_for_template,
)
from . import (
@@ -267,7 +266,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
ebd = defaultdict(list)
add_subevents_for_days(
filter_qs_by_attr(self.request.event.subevents_annotated(self.request.sales_channel), self.request),
self.request.event.subevents_annotated(self.request.sales_channel),
before, after, ebd, set(), self.request.event,
kwargs.get('cart_namespace')
)
@@ -277,7 +276,7 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
context['years'] = range(now().year - 2, now().year + 3)
else:
context['subevent_list'] = self.request.event.subevents_sorted(
filter_qs_by_attr(self.request.event.subevents_annotated(self.request.sales_channel), self.request)
self.request.event.subevents_annotated(self.request.sales_channel)
)
context['show_cart'] = (
@@ -291,13 +290,6 @@ class EventIndex(EventViewMixin, EventListMixin, CartMixin, TemplateView):
or not self.subevent
)
)
if self.request.event.settings.redirect_to_checkout_directly:
context['cart_redirect'] = eventreverse(self.request.event, 'presale:event.checkout.start',
kwargs={'cart_namespace': kwargs.get('cart_namespace') or ''})
if context['cart_redirect'].startswith('https:'):
context['cart_redirect'] = '/' + context['cart_redirect'].split('/', 3)[3]
else:
context['cart_redirect'] = self.request.path
return context

View File

@@ -35,12 +35,6 @@ def filter_qs_by_attr(qs, request):
if k.startswith("attr[") and k.endswith("]"):
attrs[k[5:-1]] = v
skey = 'filter_qs_by_attr_{}_{}'.format(request.organizer.pk, request.event.pk if hasattr(request, 'event') else '')
if request.GET.get('attr_persist'):
request.session[skey] = attrs
elif skey in request.session:
attrs = request.session[skey]
props = {
p.name: p for p in request.organizer.meta_properties.filter(
name__in=attrs.keys()

View File

@@ -437,10 +437,7 @@ class WidgetAPIProductList(EventListMixin, View):
if not ev.presale_is_running:
if ev.presale_has_ended:
if request.event.settings.presale_has_ended_text:
data['error'] = str(request.event.settings.presale_has_ended_text)
else:
data['error'] = ugettext('The presale period for this event is over.')
data['error'] = ugettext('The presale period for this event is over.')
elif request.event.settings.presale_start_show_date:
data['error'] = ugettext('The presale for this event will start on %(date)s at %(time)s.') % {
'date': date_format(ev.presale_start.astimezone(request.event.timezone), "SHORT_DATE_FORMAT"),

View File

@@ -395,15 +395,12 @@ ALL_LANGUAGES = [
('pt-br', _('Portuguese (Brazil)')),
('es', _('Spanish')),
('tr', _('Turkish')),
('pl', _('Polish')),
('it', _('Italian')),
('zh-hans', _('Chinese (simplified)')),
]
LANGUAGES_OFFICIAL = {
'en', 'de', 'de-informal'
}
LANGUAGES_INCUBATING = {
'pt-br', 'da', 'pl', 'it'
'pt-br', 'da'
}
if DEBUG:

View File

@@ -14,8 +14,8 @@ $gray-lighter: lighten(#000, 93.5%);
$gray-lightest: lighten(#000, 97.25%);
$font-family-sans-serif: "Open Sans", "OpenSans", "Helvetica Neue", Helvetica, Arial, sans-serif !default;
$text-color: #222222 !default;
$text-muted: #999999 !default;
$text-color: #222222;
$text-muted: #999999;
$brand-primary: #7f5a91 !default;
$brand-success: #50a167 !default;
@@ -40,13 +40,13 @@ $navbar-inverse-link-hover-color: $gray-lighter;
$navbar-inverse-brand-hover-color: $gray-lighter;
$navbar-inverse-color: white;
$state-success-bg: white !default;
$state-success-bg: white;
$state-success-border: $brand-success;
$state-info-bg: white !default;
$state-info-bg: white;
$state-info-border: $brand-info;
$state-warning-bg: white !default;
$state-warning-bg: white;
$state-warning-border: $brand-warning;
$state-danger-bg: white !default;
$state-danger-bg: white;
$state-danger-border: $brand-danger;
$panel-success-border: tint($brand-success, 50%);
$panel-success-heading-bg: tint($brand-success, 50%);
@@ -54,5 +54,5 @@ $panel-danger-border: tint($brand-danger, 50%);
$panel-danger-heading-bg: tint($brand-danger, 50%);
$panel-warning-border: tint($brand-warning, 50%);
$panel-warning-heading-bg: tint($brand-warning, 50%);
$panel-default-border: #e5e5e5 !default;
$panel-default-heading-bg: #e5e5e5 !default;
$panel-default-border: #e5e5e5;
$panel-default-heading-bg: #e5e5e5;

View File

@@ -10,7 +10,7 @@ django-hierarkey==1.0.*,>=1.0.3
django-filter==2.0.*
reportlab==3.5.*
PyPDF2==1.26.*
Pillow==5.*
Pillow
django-libsass
libsass
django-otp==0.4.*

View File

@@ -97,7 +97,7 @@ setup(
'django-hierarkey==1.0.*,>=1.0.2',
'django-filter==2.0.*',
'reportlab==3.5.*',
'Pillow==5.*',
'Pillow',
'PyPDF2==1.26.*',
'django-libsass',
'libsass',

View File

@@ -72,8 +72,7 @@ def test_device_auth_valid(client, device):
@pytest.mark.django_db
def test_device_auth_revoked(client, device):
client.credentials(HTTP_AUTHORIZATION='Device ' + device.api_token)
device.revoked = True
device.api_token = None
device.save()
resp = client.get('/api/v1/organizers/')
assert resp.status_code == 401
assert str(resp.data['detail']) == "Device access has been revoked."

View File

@@ -145,4 +145,4 @@ def test_revoke_valid(device_client, device: Device):
resp = device_client.post('/api/v1/device/revoke')
assert resp.status_code == 200
device.refresh_from_db()
assert device.revoked
assert not device.api_token

View File

@@ -764,7 +764,7 @@ TEST_INVOICE_RES = {
"number": "DUMMY-00001",
"is_cancellation": False,
"invoice_from": "",
"invoice_to": "Sample company\n\n\n \nNew Zealand\nVAT-ID: DE123",
"invoice_to": "Sample company\n\n\n \nNew Zealand",
"date": "2017-12-10",
"refers": None,
"locale": "en",
@@ -2295,14 +2295,6 @@ def test_order_create_quota_validation(token_client, organizer, event, item, quo
]
}
res['force'] = True
resp = token_client.post(
'/api/v1/organizers/{}/events/{}/orders/'.format(
organizer.slug, event.slug
), format='json', data=res
)
assert resp.status_code == 201
@pytest.mark.django_db
def test_order_create_quota_consume_cart(token_client, organizer, event, item, quota, question):
@@ -2710,8 +2702,8 @@ def test_order_create_invoice(token_client, organizer, event, order):
'number': 'DUMMY-00001',
'is_cancellation': False,
'invoice_from': '',
'invoice_to': 'Sample company\n\n\n \nNew Zealand\nVAT-ID: DE123',
'date': now().date().isoformat(),
'invoice_to': 'Sample company\n\n\n \nNew Zealand',
'date': '2019-03-23',
'refers': None,
'locale': 'en',
'introductory_text': '',

View File

@@ -80,4 +80,4 @@ def test_revoke_device(event, admin_user, admin_team, device, client):
client.get('/control/organizer/dummy/device/{}/revoke'.format(device.pk))
client.post('/control/organizer/dummy/device/{}/revoke'.format(device.pk), {}, follow=True)
device.refresh_from_db()
assert device.revoked
assert device.api_token is None

View File

@@ -681,47 +681,6 @@ class OrdersTest(TestCase):
p.refresh_from_db()
assert p.state == OrderPayment.PAYMENT_STATE_CREATED
def test_change_paymentmethod_to_same(self):
p_old = self.order.payments.create(
provider='banktransfer',
state=OrderPayment.PAYMENT_STATE_CREATED,
amount=Decimal('10.00'),
)
self.client.post(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'banktransfer'
}
)
self.order.refresh_from_db()
p_new = self.order.payments.last()
assert p_new.provider == 'banktransfer'
assert p_new.id != p_old.id
assert p_new.state == OrderPayment.PAYMENT_STATE_CREATED
p_old.refresh_from_db()
assert p_old.state == OrderPayment.PAYMENT_STATE_CANCELED
def test_change_paymentmethod_cancel_old(self):
self.event.settings.set('payment_banktransfer__enabled', True)
p_old = self.order.payments.create(
provider='testdummy',
state=OrderPayment.PAYMENT_STATE_CREATED,
amount=Decimal('10.00'),
)
self.client.post(
'/%s/%s/order/%s/%s/pay/change' % (self.orga.slug, self.event.slug, self.order.code, self.order.secret),
{
'payment': 'banktransfer'
}
)
self.order.refresh_from_db()
p_new = self.order.payments.last()
assert p_new.provider == 'banktransfer'
assert p_new.id != p_old.id
assert p_new.state == OrderPayment.PAYMENT_STATE_CREATED
p_old.refresh_from_db()
assert p_old.state == OrderPayment.PAYMENT_STATE_CANCELED
def test_change_paymentmethod_delete_fee(self):
self.event.settings.set('payment_banktransfer__enabled', True)
self.event.settings.set('payment_testdummy__enabled', True)