From 85edbe48376047142ceb7e85c4aba1fe70e1bab7 Mon Sep 17 00:00:00 2001
From: Raphael Michel
Date: Thu, 18 Jul 2019 17:26:34 +0200
Subject: [PATCH 1/2] Improved device validation
---
src/pretix/control/forms/organizer.py | 7 +++++++
1 file changed, 7 insertions(+)
diff --git a/src/pretix/control/forms/organizer.py b/src/pretix/control/forms/organizer.py
index 118af4eefb..a427c6f7de 100644
--- a/src/pretix/control/forms/organizer.py
+++ b/src/pretix/control/forms/organizer.py
@@ -173,6 +173,13 @@ class DeviceForm(forms.ModelForm):
super().__init__(*args, **kwargs)
self.fields['limit_events'].queryset = organizer.events.all()
+ def clean(self):
+ d = super().clean()
+ if not d['all_events'] and not d['limit_events']:
+ raise ValidationError(_('Your device will not have access to anything, please select some events.'))
+
+ return d
+
class Meta:
model = Device
fields = ['name', 'all_events', 'limit_events']
From cb3f3f5084fb15bf71fccf432c113ede84741ab2 Mon Sep 17 00:00:00 2001
From: Raphael Michel
Date: Thu, 18 Jul 2019 17:26:49 +0200
Subject: [PATCH 2/2] Advertise pretixSCAN
---
.../organizers/device_connect.html | 24 ++---
.../pretixcontrol/organizers/devices.html | 15 +--
.../pretixdroid/configuration.html | 36 ++++++-
.../static/pretixbase/img/pretixdroid.png | Bin 0 -> 27993 bytes
.../static/pretixbase/img/pretixscan.svg | 101 ++++++++++++++++++
.../static/pretixcontrol/scss/main.scss | 10 ++
6 files changed, 155 insertions(+), 31 deletions(-)
create mode 100644 src/pretix/static/pretixbase/img/pretixdroid.png
create mode 100644 src/pretix/static/pretixbase/img/pretixscan.svg
diff --git a/src/pretix/control/templates/pretixcontrol/organizers/device_connect.html b/src/pretix/control/templates/pretixcontrol/organizers/device_connect.html
index ee91f73d1d..ebff668b06 100644
--- a/src/pretix/control/templates/pretixcontrol/organizers/device_connect.html
+++ b/src/pretix/control/templates/pretixcontrol/organizers/device_connect.html
@@ -7,7 +7,16 @@
- - {% trans "Open the app that you want to connect and optionally reset it to the original state." %}
+ -
+ {% trans "Download an app that is compatible with pretix. For example, our check-in app pretixSCAN is available on all major platforms." %}
+
+ {% trans "Download pretixSCAN" %}
+
+
+ -
+ {% trans "Open the app that you want to connect and optionally reset it to the original state." %}
+
- {% trans "Scan the following configuration code:" %}
{% trans "If your app/device does not support scanning a QR code, you can also enter the following information:" %}
@@ -17,19 +26,6 @@
-
-
- {% blocktrans trimmed %}
- Please note that this is a new feature that currently only works for beta-stage software, such as
- pretixPOS. pretixdroid 1.x and pretixdesk 0.x are not supported by this feature. Future versions of
- pretixdroid and pretixdesk will be supported through this menu.
- {% endblocktrans %}
-
-
- {% blocktrans trimmed %}
- To set up pretixdroid or pretixdesk, please go to the Check-in devices section of an event.
- {% endblocktrans %}
-
{% trans "Device overview" %}
diff --git a/src/pretix/control/templates/pretixcontrol/organizers/devices.html b/src/pretix/control/templates/pretixcontrol/organizers/devices.html
index 49c98b931c..65f42d1e8c 100644
--- a/src/pretix/control/templates/pretixcontrol/organizers/devices.html
+++ b/src/pretix/control/templates/pretixcontrol/organizers/devices.html
@@ -5,23 +5,12 @@
{% trans "Connected devices" %}
-
+
{% blocktrans trimmed %}
This menu allows you to connect hardware devices such as box office terminals or scanning terminals to
your account.
{% endblocktrans %}
-
- {% blocktrans trimmed %}
- Please note that this is a new feature that currently only works for beta-stage software, such as
- pretixPOS. pretixdroid 1.x and pretixdesk 0.x are not supported by this feature. Future versions of
- pretixdroid and pretixdesk will be supported through this menu.
- {% endblocktrans %}
-
-
- {% blocktrans trimmed %}
- To set up pretixdroid or pretixdesk, please go to the Check-in devices section of an event.
- {% endblocktrans %}
-
+
{% if devices|length == 0 %}
diff --git a/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration.html b/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration.html
index bee4b32939..2dd453042a 100644
--- a/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration.html
+++ b/src/pretix/plugins/pretixdroid/templates/pretixplugins/pretixdroid/configuration.html
@@ -5,10 +5,38 @@
{% block title %}{% trans "Check-in device configuration" %}{% endblock %}
{% block content %}
{% trans "Check-in device configuration" %}
-
{% blocktrans trimmed %}
- pretixdroid is an Android app that you can use to control tickets at the entrance of your event.
- pretixdesk is the corresponding app for desktop computers.
- {% endblocktrans %}
+
+ {% if not configs or "create" in request.GET %}
+
+
{% trans "We've got a new app!" %}
+
+ {% blocktrans trimmed %}
+ We've retired pretixdesk and pretixdroid in favor of our new app pretixSCAN that works on all major
+ platforms, allows convenient switching between events, has better performance when dealing with large
+ events and supports printing badges. We suggest that you switch to pretixSCAN for your events, but you
+ can continue using pretixdesk for at least all of 2019, if you like.
+ {% endblocktrans %}
+
+
+
+
{% trans "Our new app: pretixSCAN" %}
+

+
{% trans "Available on Android, iOS, Windows, and Linux." %}
+
{% trans "Configuration is available in your organizer account's device list." %}
+
+ {% trans "Switch to my device list" %}
+
+
+
+
{% trans "Our old apps: pretixdesk and pretixdroid" %}
+

+
{% trans "Available on Android, Windows, and Linux." %}
+
{% trans "Scroll down to create a configuration" %}
+
+
+
+ {% endif %}
{% if not configs or "create" in request.GET %}
{% trans "Create app configuration" %}
diff --git a/src/pretix/static/pretixbase/img/pretixdroid.png b/src/pretix/static/pretixbase/img/pretixdroid.png
new file mode 100644
index 0000000000000000000000000000000000000000..6eef3b8c4e4370d832029edde3ad57b8739c291c
GIT binary patch
literal 27993
zcmXt9V{~Rcw0>(FZ*AK)r?%Zr+o|oTZQJeCwlVe8wr!iY-@WUubMoWtm1HM-XD4}{
zoP;aNOCrGHzybgO1gRfl$^ZaJ+jnY*hWwT!_i}{*06
{hMYf~a;
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