initial commit

This commit is contained in:
_Bastler 2020-11-19 09:40:03 +01:00
commit d4c40a927a
20 changed files with 412 additions and 0 deletions

62
.gitignore vendored Normal file
View File

@ -0,0 +1,62 @@
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
*$py.class
# C extensions
*.so
# Distribution / packaging
.Python
env/
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
.ropeproject/
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.coverage.*
.cache
nosetests.xml
coverage.xml
*,cover
.hypothesis/
# Translations
*.mo
# Django stuff:
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/
#Ipython Notebook
.ipynb_checkpoints

15
LICENSE Normal file
View File

@ -0,0 +1,15 @@
Copyright 2020 _Bastler
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

3
MANIFEST.in Normal file
View File

@ -0,0 +1,3 @@
recursive-include pretix_digital_items/static *
recursive-include pretix_digital_items/templates *
recursive-include pretix_digital_items/locale *

10
Makefile Normal file
View File

@ -0,0 +1,10 @@
all: localecompile
LNGS:=`find pretix_digital_items/locale/ -mindepth 1 -maxdepth 1 -type d -printf "-l %f "`
localecompile:
django-admin compilemessages
localegen:
django-admin makemessages --keep-pot -i build -i dist -i "*egg*" $(LNGS)
.PHONY: all localecompile localegen

36
README.rst Normal file
View File

@ -0,0 +1,36 @@
Digital Items
==========================
This is a plugin for `pretix`_.
Sell digital Items by using secrets as tokens. Adds secrets to email placeholders, output secret as simple TXT file.
Development setup
-----------------
1. Make sure that you have a working `pretix development setup`_.
2. Clone this repository, eg to ``local/pretix-digital-items``.
3. Activate the virtual environment you use for pretix development.
4. Execute ``python setup.py develop`` within this directory to register this application with pretix's plugin registry.
5. Execute ``make`` within this directory to compile translations.
6. Restart your local pretix server. You can now use the plugin from this repository for your events by enabling it in
the 'plugins' tab in the settings.
License
-------
Copyright 2020 _Bastler
Released under the terms of the Apache License 2.0
.. _pretix: https://github.com/pretix/pretix
.. _pretix development setup: https://docs.pretix.eu/en/latest/development/setup.html

View File

@ -0,0 +1,28 @@
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'

View File

@ -0,0 +1,16 @@
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(
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)

View File

@ -0,0 +1,40 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-03-07 19:01+0100\n"
"PO-Revision-Date: \n"
"Last-Translator: _Bastler\n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
# title
msgid "Digital Items"
msgstr "Digitale Items"
# description
msgid ""
"Sell digital Items by using secrets as tokens. Adds secrets to email placeholders, output secret as simple TXT file."
msgstr "Verkauf digitaler Items indem die Token-Codes der Tickets als einzulösendes Token verwendet werden. Token-Codes sind als E-Mail Platzhalter verfügbar, Exportfunktion als einfache TXT-Datei."
#: pretix_digital_items/forms.py:8
msgid "Token mail format"
msgstr "Token E-Mail Format"
#: pretix_digital_items/forms.py:9
msgid ""
"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."
msgstr "Dieser Text wird für jedes Token in einer E-Mail eingefügt. Verfügbare Platzhalter sind {name} für den Item-Namen und {secret} für den Token-Code."
#: pretix_digital_items/forms.py:
msgid "Token export format"
msgstr "Token Export Format"
#: pretix_digital_items/forms.py:
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."

View File

@ -0,0 +1,40 @@
msgid ""
msgstr ""
"Project-Id-Version: \n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2017-03-07 19:01+0100\n"
"PO-Revision-Date: \n"
"Last-Translator: _Bastler\n"
"Language-Team: \n"
"Language: de\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
# title
msgid "Digital Items"
msgstr "Digitale Items"
# description
msgid ""
"Sell digital Items by using secrets as tokens. Adds secrets to email placeholders, output secret as simple TXT file."
msgstr "Verkauf digitaler Items indem die Token-Codes der Tickets als einzulösendes Token verwendet werden. Token-Codes sind als E-Mail Platzhalter verfügbar, Exportfunktion als einfache TXT-Datei."
#: pretix_digital_items/forms.py:8
msgid "Token mail format"
msgstr "Token E-Mail Format"
#: pretix_digital_items/forms.py:9
msgid ""
"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."
msgstr "Dieser Text wird für jedes Token in einer E-Mail eingefügt. Verfügbare Platzhalter sind {name} für den Item-Namen und {secret} für den Token-Code."
#: pretix_digital_items/forms.py:
msgid "Token export format"
msgstr "Token Export Format"
#: pretix_digital_items/forms.py:
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."

View File

@ -0,0 +1,32 @@
from django.dispatch import receiver
from django.urls import resolve, reverse
from django.utils.translation import ugettext_lazy as _
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")
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()), '\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')
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',
}]

View File

@ -0,0 +1,16 @@
{% extends "pretixcontrol/event/settings_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% block inside %}
<h1>{% trans "Digital Items" %}</h1>
<form action="" method="post" class="form-horizontal">
{% csrf_token %}
{% bootstrap_form_errors form %}
{% bootstrap_form form layout="horizontal" %}
<div class="form-group submit-group">
<button type="submit" class="btn btn-primary btn-save">
{% trans "Save" %}
</button>
</div>
</form>
{% endblock %}

View File

@ -0,0 +1,18 @@
from pretix.base.ticketoutput import BaseTicketOutput
class TextTicketOutput(BaseTicketOutput):
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_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())

View File

@ -0,0 +1,11 @@
from django.conf.urls import url
from .views import SettingsView
urlpatterns = [
url(
r"^control/event/(?P<organizer>[^/]+)/(?P<event>[^/]+)/pretix_digital_items/settings",
SettingsView.as_view(),
name="settings",
),
]

View File

@ -0,0 +1,23 @@
from django.urls import reverse
from pretix.control.views.event import EventSettingsFormView, EventSettingsViewMixin
from pretix.base.models.event import Event
from .forms import PretixDigitalItemsSettingsForm
from pretix.presale.style import regenerate_css
from django.contrib import messages
class SettingsView(EventSettingsViewMixin, EventSettingsFormView):
model = Event
permission = "can_change_settings"
form_class = PretixDigitalItemsSettingsForm
template_name = "pretix_digital_items/settings.html"
def get_success_url(self, **kwargs):
return reverse(
"plugins:pretix_digital_items:settings",
kwargs={
"organizer": self.request.event.organizer.slug,
"event": self.request.event.slug,
},
)

2
pytest.ini Normal file
View File

@ -0,0 +1,2 @@
[pytest]
DJANGO_SETTINGS_MODULE=pretix.testutils.settings

14
setup.cfg Normal file
View File

@ -0,0 +1,14 @@
[flake8]
ignore = N802,W503,E402
max-line-length = 160
exclude = migrations,.ropeproject,static,_static,build
[isort]
combine_as_imports = true
default_section = THIRDPARTY
include_trailing_comma = true
known_third_party = pretix
known_standard_library = typing
multi_line_output = 5
not_skip = __init__.py
skip = setup.py

46
setup.py Normal file
View File

@ -0,0 +1,46 @@
import os
from distutils.command.build import build
from django.core import management
from setuptools import find_packages, setup
from pretix_digital_items import __version__
try:
with open(os.path.join(os.path.dirname(__file__), 'README.rst'), encoding='utf-8') as f:
long_description = f.read()
except:
long_description = ''
class CustomBuild(build):
def run(self):
management.call_command('compilemessages', verbosity=1)
build.run(self)
cmdclass = {
'build': CustomBuild
}
setup(
name='pretix-digital-items',
version=__version__,
description='Sell digital Items by using secrets as tokens. Adds secrets to email placeholders, output secret as simple TXT file.',
long_description=long_description,
url='https://git.lh8.de/_Bastler/pretix-digital-items',
author='_Bastler',
author_email='pretix-digital-items@bstly.de',
license='Apache',
install_requires=[],
packages=find_packages(exclude=['tests', 'tests.*']),
include_package_data=True,
cmdclass=cmdclass,
entry_points="""
[pretix.plugin]
pretix_digital_items=pretix_digital_items:PretixPluginMeta
""",
)