upgrade to new pretix, remove download, add page links

This commit is contained in:
_Bastler
2023-12-15 22:09:23 +01:00
parent f106e3ce4f
commit d1bd82080a
25 changed files with 528 additions and 137 deletions
+1 -28
View File
@@ -1,28 +1 @@
from django.utils.translation import gettext_lazy
try:
from pretix.base.plugins import PluginConfig
except ImportError:
raise RuntimeError("Please use pretix 2.7 or above to run this plugin!")
__version__ = '1.0.0'
class PluginApp(PluginConfig):
name = 'pretix_digital_items'
verbose_name = 'Digital Items'
class PretixPluginMeta:
name = gettext_lazy('Digital Items')
author = '_Bastler'
description = gettext_lazy('Sell digital Items by using secrets as tokens. Adds secrets to email placeholders, output secret as simple TXT file.')
visible = True
version = __version__
category = 'FEATURE'
compatibility = "pretix>=2.7.0"
def ready(self):
from . import signals # NOQA
default_app_config = 'pretix_digital_items.PluginApp'
__version__ = "2.0.0"
+27
View File
@@ -0,0 +1,27 @@
from django.utils.translation import gettext_lazy
from . import __version__
try:
from pretix.base.plugins import PluginConfig
except ImportError:
raise RuntimeError("Please use pretix 2.7 or above to run this plugin!")
class PluginApp(PluginConfig):
default = True
name = "pretix_digital_items"
verbose_name = "Digital Items"
class PretixPluginMeta:
name = gettext_lazy("Digital Items")
author = "_Bastler"
description = gettext_lazy("Sell digital Items by using secrets as tokens. Adds secrets to email placeholders, output secret as simple TXT file.")
visible = True
version = __version__
category = "FEATURE"
compatibility = "pretix>=2.7.0"
def ready(self):
from . import signals # NOQA
+26 -12
View File
@@ -1,16 +1,30 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from pretix.base.forms import SettingsForm
class PretixDigitalItemsSettingsForm(SettingsForm):
digitalitems_token_mail_format = forms.CharField(
label=_("Token mail format"),
help_text=_("This text will be included for every token in an email. Available placeholder are {name} for the item name and {secret} for the token code."),
widget=forms.TextInput(attrs={'placeholder': '{name}: {secret}'}),
required=False)
digitalitems_token_export_format = forms.CharField(
label=_("Token export format"),
help_text=_("This text will be included for every token in a TXT export. Available placeholder are {name} for the item name and {secret} for the token code."),
widget=forms.TextInput(attrs={'placeholder': '{name}: {secret}'}),
required=False)
class PretixDigitalItemsSettingsForm(SettingsForm):
digitalitems_token_url_format = forms.CharField(
label=_("Token url format"),
help_text=_(
"This should return an url to link to. Available placeholder are {name} for the item name and {secret} for the token code."
),
widget=forms.TextInput(attrs={"placeholder": "http://localhost?secret={secret}"}),
required=False,
)
digitalitems_token_mail_format = forms.CharField(
label=_("Token mail format"),
help_text=_(
"This text will be included for every token in an email. Available placeholder are {name} for the item name and {secret} for the token code."
),
widget=forms.TextInput(attrs={"placeholder": "{name}: {secret}"}),
required=False,
)
digitalitems_token_export_format = forms.CharField(
label=_("Token export format"),
help_text=_(
"This text will be included for every token in a TXT export. Available placeholder are {name} for the item name and {secret} for the token code."
),
widget=forms.TextInput(attrs={"placeholder": "{name}: {secret}"}),
required=False,
)
-11
View File
@@ -1,11 +0,0 @@
from django import forms
from django.utils.translation import ugettext_lazy as _
from pretix.base.forms import SettingsForm
class PretixDigitalItemsSettingsForm(SettingsForm):
digitalitems_token_mail_format = forms.CharField(lel=_("Token mail format"),
help_text=_("This text will be included for every token in an email. Available placeholder are {name} for the item name and {secret} for the token code.")
widget=forms.TextInput(attrs={'placeholder': '{name}: {secret}'}),
required=False)
digitalitems_token_export_format = forms.CharField(label=_("Token export format"), widget=forms.TextInput(attrs={'placeholder': '{name}: {secret}'}), required=False)
@@ -38,3 +38,14 @@ msgid ""
"This text will be included for every token in a TXT export. Available placeholder are {name} for the item name and {secret} for the token code."
msgstr "Dieser Text wird für jedes Token in einem TXT Export eingefügt. Verfügbare Platzhalter sind {name} für den Item-Namen und {secret} für den Token-Code."
#: pretix_digital_items/templates/tokens.html:1
msgid "Tokens"
msgstr "Tokens"
#: pretix_digital_items/templates/tokens.html:2
msgid "Token already redeemed"
msgstr "Token bereits eingelöst"
#: pretix_digital_items/templates/tokens.html:3
msgid "Redeem token"
msgstr "Token einlösen"
@@ -38,3 +38,14 @@ msgid ""
"This text will be included for every token in a TXT export. Available placeholder are {name} for the item name and {secret} for the token code."
msgstr "Dieser Text wird für jedes Token in einem TXT Export eingefügt. Verfügbare Platzhalter sind {name} für den Item-Namen und {secret} für den Token-Code."
#: pretix_digital_items/templates/tokens.html:1
msgid "Tokens"
msgstr "Tokens"
#: pretix_digital_items/templates/tokens.html:2
msgid "Token already redeemed"
msgstr "Token bereits eingelöst"
#: pretix_digital_items/templates/tokens.html:3
msgid "Redeem token"
msgstr "Token einlösen"
+93 -20
View File
@@ -1,32 +1,105 @@
from django.dispatch import receiver
from django.urls import resolve, reverse
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _
from pretix.base.signals import (register_mail_placeholders, register_ticket_outputs)
from pretix.base.models import Order
from pretix.base.signals import register_mail_placeholders, register_ticket_outputs
from pretix.base.email import SimpleFunctionalMailTextPlaceholder
from pretix.control.signals import nav_event_settings
from pretix.presale.signals import order_info_top
from django.template.loader import get_template
from pretix.base.signals import register_mail_placeholders, register_ticket_outputs
from pretix.base.email import SimpleFunctionalMailTextPlaceholder
from pretix.control.signals import nav_event_settings
@receiver(register_mail_placeholders, dispatch_uid="pretix_digital_items_mail_placeholder")
@receiver(
register_mail_placeholders, dispatch_uid="pretix_digital_items_mail_placeholder"
)
def register_mail_secrets(sender, **kwargs):
token_mail_format = "{name}: {secret}"
if sender.settings.digitalitems_token_mail_format:
token_mail_format = sender.settings.digitalitems_token_mail_format
return SimpleFunctionalMailTextPlaceholder('secrets', ['order'], lambda order: '\n' + '\n\n'.join(token_mail_format.format(secret = position.secret, name = str(position.item.name)) for position in order.positions.all() if position.item.admission), '\nej7f73xs8vfmwvkk2p73yeve4fueq849\n\np8yct9752a897rpsmqzf7beby34a2w25\n\nwwqxtw6guy5s8c5tdarfhyez2ft2juap')
token_mail_format = "{name}: {secret}"
if sender.settings.digitalitems_token_mail_format:
token_mail_format = sender.settings.digitalitems_token_mail_format
return SimpleFunctionalMailTextPlaceholder(
"secrets",
["order"],
lambda order: "\n"
+ "\n\n".join(
token_mail_format.format(
secret=position.secret, name=str(position.item.name)
)
for position in order.positions.all()
if position.item.admission
),
"\nej7f73xs8vfmwvkk2p73yeve4fueq849\n\np8yct9752a897rpsmqzf7beby34a2w25\n\nwwqxtw6guy5s8c5tdarfhyez2ft2juap",
)
@receiver(register_ticket_outputs, dispatch_uid="pretix_digital_items_ticket_output")
def register_ticket_outputs(sender, **kwargs):
from .textticketoutput import TextTicketOutput
return TextTicketOutput
@receiver(nav_event_settings, dispatch_uid='pretix_digital_items_nav_settings')
# @receiver(register_ticket_outputs, dispatch_uid="pretix_digital_items_ticket_output")
# def register_ticket_outputs(sender, **kwargs):
# from .textticketoutput import TextTicketOutput
#
# return TextTicketOutput
@receiver(nav_event_settings, dispatch_uid="pretix_digital_items_nav_settings")
def navbar_settings(sender, request, **kwargs):
url = resolve(request.path_info)
return [{
'label': _('Digital Items'),
'url': reverse('plugins:pretix_digital_items:settings', kwargs={
'event': request.event.slug,
'organizer': request.organizer.slug,
}),
'active': url.namespace == 'plugins:pretix_digital_items' and url.url_name == 'settings',
}]
return [
{
"label": _("Digital Items"),
"url": reverse(
"plugins:pretix_digital_items:settings",
kwargs={
"event": request.event.slug,
"organizer": request.organizer.slug,
},
),
"active": url.namespace == "plugins:pretix_digital_items"
and url.url_name == "settings",
}
]
@receiver(order_info_top, dispatch_uid="pretix_digital_items_order_tokens")
def list_tokens(sender, request, order: Order, **kwargs):
if (order.status != Order.STATUS_PAID) or not order.positions.exists():
return
positions = [
p for p in order.positions.filter(item__admission=True, addon_to__isnull=True)
]
if not positions:
return
token_url_format = "http://localhost?token={secret}"
if sender.settings.digitalitems_token_url_format:
token_url_format = sender.settings.digitalitems_token_url_format
tokenUrls = list(
map(
lambda position: token_url_format.format(
secret=position.secret, name=str(position.item.name)
),
positions,
)
)
checkins = list(
map(
lambda position: position.checkins.count() != 0,
positions,
)
)
data = zip(positions, tokenUrls, checkins)
template = get_template("pretix_digital_items/tokens.html")
ctx = {
"data": data,
}
return template.render(ctx, request=request)
@@ -5,7 +5,7 @@
<h1>{% trans "Digital Items" %}</h1>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form_errors form %}
{% bootstrap_form_errors form %}
{% bootstrap_form form layout="horizontal" %}
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
@@ -13,4 +13,4 @@
</button>
</div>
</form>
{% endblock %}
{% endblock %}
@@ -0,0 +1,19 @@
{% load i18n %}
{% load bootstrap3 %}
{% load rich_text %}
<h3>{% trans "Tokens" %}</h3>
<div class="list-group">
{% for p,url,checkin in data %}
{% if checkin %}
<p>
{{ p.item.name }}: <code><s>{{ p.secret }}</s></code><br>
({% trans "Token already redeemed" %})
</p>
{% else %}
<p>
{{ p.item.name }}: <code>{{ p.secret }}</code><br>
<a class="btn btn-lg btn-primary" href="{{url}}" target="_blank">{% trans "Redeem token" %}</a>
</p>
{% endif %}
{% endfor %}
</div>
+31 -13
View File
@@ -1,18 +1,36 @@
from pretix.base.ticketoutput import BaseTicketOutput
class TextTicketOutput(BaseTicketOutput):
identifier = 'tokens'
verbose_name = 'Download token as in simple textfile'
download_button_text = 'Download Token'
identifier = "tokens"
verbose_name = "Download token as in simple textfile"
download_button_text = "Download Token"
def generate(self, position):
token_export_format = "{name}: {secret}"
if position.event.settings.digitalitems_token_export_format:
token_export_format = position.event.settings.digitalitems_token_export_format
return 'token.txt', 'text/plain', token_export_format.format(secret = position.secret, name = str(position.item.name))
def generate(self, position):
token_export_format = "{name}: {secret}"
if position.event.settings.digitalitems_token_export_format:
token_export_format = (
position.event.settings.digitalitems_token_export_format
)
return (
"token.txt",
"text/plain",
token_export_format.format(
secret=position.secret, name=str(position.item.name)
),
)
def generate_order(self, order):
token_export_format = "{name}: {secret}"
if order.event.settings.digitalitems_token_export_format:
token_export_format = order.event.settings.digitalitems_token_export_format
return 'tokens.txt', 'text/plain', '\n'.join(token_export_format.format(secret = position.secret, name = str(position.item.name)) for position in order.positions.all())
def generate_order(self, order):
token_export_format = "{name}: {secret}"
if order.event.settings.digitalitems_token_export_format:
token_export_format = order.event.settings.digitalitems_token_export_format
return (
"tokens.txt",
"text/plain",
"\n".join(
token_export_format.format(
secret=position.secret, name=str(position.item.name)
)
for position in order.positions.all()
),
)
+2 -2
View File
@@ -1,9 +1,9 @@
from django.conf.urls import url
from django.urls import re_path
from .views import SettingsView
urlpatterns = [
url(
re_path(
r"^control/event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/pretix_digital_items/settings",
SettingsView.as_view(),
name="settings",