Input
{
"patchText": "*** Begin Patch\n*** Add File: /opt/pretickets.gulasch.site/build/Dockerfile\n+FROM pretix/standalone:stable\n+\n+USER root\n+\n+COPY pretickets_darkmode /tmp/pretickets_darkmode\n+RUN pip3 install /tmp/pretickets_darkmode \\\n+ && rm -rf /tmp/pretickets_darkmode\n+\n+COPY overrides/pretixcontrol/auth/base.html /pretix/src/pretix/control/templates/pretixcontrol/auth/base.html\n+\n+USER pretixuser\n+RUN cd /pretix/src && make production\n*** Add File: /opt/pretickets.gulasch.site/build/.dockerignore\n+**/__pycache__\n+**/*.pyc\n*** Add File: /opt/pretickets.gulasch.site/build/pretickets_darkmode/pyproject.toml\n+[build-system]\n+requires = [\"setuptools\"]\n+build-backend = \"setuptools.build_meta\"\n+\n+[project]\n+name = \"pretickets-darkmode\"\n+version = \"0.1.0\"\n+description = \"Dark mode customization for pretickets.gulasch.site\"\n+license = \"AGPL-3.0-or-later\"\n+requires-python = \">=3.11\"\n+\n+[project.entry-points.\"pretix.plugin\"]\n+pretickets_darkmode = \"pretickets_darkmode\"\n+\n+[tool.setuptools.packages.find]\n+include = [\"pretickets_darkmode*\"]\n+\n+[tool.setuptools.package-data]\n+pretickets_darkmode = [\"static/pretickets_darkmode/*.css\"]\n*** Add File: /opt/pretickets.gulasch.site/build/pretickets_darkmode/pretickets_darkmode/__init__.py\n+\n*** Add File: /opt/pretickets.gulasch.site/build/pretickets_darkmode/pretickets_darkmode/apps.py\n+try:\n+ from pretix.base.plugins import PluginConfig\n+except ImportError as exc:\n+ raise RuntimeError(\"pretickets_darkmode requires pretix.\") from exc\n+\n+from django.utils.translation import gettext_lazy as _\n+\n+\n+class PreticketsDarkmodeApp(PluginConfig):\n+ name = \"pretickets_darkmode\"\n+ verbose_name = _(\"Pretickets dark mode\")\n+\n+ class PretixPluginMeta:\n+ name = _(\"Pretickets dark mode\")\n+ author = \"gulasch.site\"\n+ version = \"0.1.0\"\n+ category = \"CUSTOMIZATION\"\n+ visible = False\n+ description = _(\"Applies a dark theme to pretickets.gulasch.site.\")\n+\n+ def ready(self):\n+ from . import signals # noqa\n*** Add File: /opt/pretickets.gulasch.site/build/pretickets_darkmode/pretickets_darkmode/signals.py\n+from django.dispatch import receiver\n+from django.templatetags.static import static\n+from django.utils.html import format_html\n+\n+from pretix.control.signals import html_page_start\n+from pretix.presale.signals import global_html_head\n+\n+\n+def _darkmode_link():\n+ return format_html(\n+ '<link rel=\"stylesheet\" href=\"{}\" data-pretickets-darkmode>',\n+ static(\"pretickets_darkmode/darkmode.css\"),\n+ )\n+\n+\n+@receiver(global_html_head, dispatch_uid=\"pretickets_darkmode_presale_head\")\n+def presale_darkmode(sender, request=None, **kwargs):\n+ return _darkmode_link()\n+\n+\n+@receiver(html_page_start, dispatch_uid=\"pretickets_darkmode_control_start\")\n+def control_darkmode(sender, **kwargs):\n+ return _darkmode_link()\n*** Add File: /opt/pretickets.gulasch.site/build/pretickets_darkmode/pretickets_darkmode/static/pretickets_darkmode/darkmode.css\n+:root {\n+ color-scheme: dark;\n+ --pt-bg: #080c14;\n+ --pt-bg-soft: #0f1624;\n+ --pt-bg-raised: #151e2e;\n+ --pt-border: #263246;\n+ --pt-text: #e7edf7;\n+ --pt-muted: #a8b3c7;\n+ --pt-link: #8ab4ff;\n+ --pt-primary: #9d7dff;\n+ --pt-primary-strong: #7c5cff;\n+ --pt-success: #47d18c;\n+ --pt-warning: #f6c768;\n+ --pt-danger: #ff7f8f;\n+}\n+\n+html,\n+body {\n+ background: var(--pt-bg) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+a,\n+.btn-link {\n+ color: var(--pt-link);\n+}\n+\n+a:hover,\n+a:focus,\n+.btn-link:hover,\n+.btn-link:focus {\n+ color: #b5ccff;\n+}\n+\n+.container,\n+.container-fluid,\n+#page-wrapper,\n+.content,\n+.page-body,\n+.event-header,\n+.event-description,\n+.cart-row,\n+.product-row,\n+.panel,\n+.panel-default,\n+.panel-body,\n+.panel-heading,\n+.panel-footer,\n+.well,\n+.modal-content,\n+.dropdown-menu,\n+.popover,\n+.list-group-item,\n+.thumbnail,\n+.card,\n+.box,\n+.form-signin {\n+ background-color: var(--pt-bg-soft) !important;\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+.navbar,\n+.navbar-inverse,\n+.navbar-static-top,\n+#side-menu,\n+.sidebar,\n+.sidebar-nav,\n+.navbar-default {\n+ background: #0b1220 !important;\n+ border-color: var(--pt-border) !important;\n+}\n+\n+.navbar a,\n+.navbar .navbar-brand,\n+.sidebar a,\n+#side-menu a,\n+.dropdown-menu > li > a {\n+ color: var(--pt-text) !important;\n+}\n+\n+.navbar a:hover,\n+.sidebar a:hover,\n+#side-menu a:hover,\n+.dropdown-menu > li > a:hover,\n+.dropdown-menu > li > a:focus,\n+.nav > li > a:hover,\n+.nav > li > a:focus,\n+.nav > li.active > a {\n+ background-color: var(--pt-bg-raised) !important;\n+ color: #ffffff !important;\n+}\n+\n+.table,\n+table,\n+.table > thead > tr > th,\n+.table > tbody > tr > th,\n+.table > tfoot > tr > th,\n+.table > thead > tr > td,\n+.table > tbody > tr > td,\n+.table > tfoot > tr > td {\n+ background-color: var(--pt-bg-soft) !important;\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+.table-striped > tbody > tr:nth-of-type(odd),\n+.table-hover > tbody > tr:hover,\n+.table-hover > tbody > tr:hover > td,\n+.table-hover > tbody > tr:hover > th {\n+ background-color: var(--pt-bg-raised) !important;\n+}\n+\n+.form-control,\n+input,\n+select,\n+textarea,\n+.input-group-addon,\n+.select2-container--bootstrap .select2-selection,\n+.select2-dropdown,\n+.select2-results__option,\n+.bootstrap-datetimepicker-widget,\n+.bootstrap-datetimepicker-widget table td,\n+.bootstrap-datetimepicker-widget table th {\n+ background-color: #101827 !important;\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+.form-control:focus,\n+input:focus,\n+select:focus,\n+textarea:focus,\n+.select2-container--bootstrap.select2-container--focus .select2-selection {\n+ border-color: var(--pt-primary) !important;\n+ box-shadow: 0 0 0 2px rgba(157, 125, 255, 0.25) !important;\n+}\n+\n+input::placeholder,\n+textarea::placeholder,\n+.help-block,\n+.text-muted,\n+.text-muted a,\n+.control-label,\n+legend,\n+small,\n+.small,\n+footer,\n+.footer,\n+.meta,\n+.text-secondary {\n+ color: var(--pt-muted) !important;\n+}\n+\n+.btn-primary,\n+.label-primary,\n+.pagination > .active > a,\n+.pagination > .active > span {\n+ background-color: var(--pt-primary-strong) !important;\n+ border-color: var(--pt-primary-strong) !important;\n+ color: #ffffff !important;\n+}\n+\n+.btn-default,\n+.btn-secondary,\n+.btn-outline-secondary,\n+.pagination > li > a,\n+.pagination > li > span {\n+ background-color: var(--pt-bg-raised) !important;\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+.btn-default:hover,\n+.btn-secondary:hover,\n+.pagination > li > a:hover {\n+ background-color: #1e2a3e !important;\n+}\n+\n+.alert-info,\n+.alert-success,\n+.alert-warning,\n+.alert-danger,\n+.alert-error {\n+ background-color: var(--pt-bg-raised) !important;\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+.alert-success,\n+.text-success {\n+ color: var(--pt-success) !important;\n+}\n+\n+.alert-warning,\n+.text-warning {\n+ color: var(--pt-warning) !important;\n+}\n+\n+.alert-danger,\n+.alert-error,\n+.text-danger,\n+.has-error .help-block,\n+.has-error .control-label {\n+ color: var(--pt-danger) !important;\n+}\n+\n+.progress,\n+.progress-bar,\n+pre,\n+code,\n+.invoice-preview,\n+.timeline-panel,\n+.calendar,\n+.fc-view,\n+.fc-event {\n+ background-color: var(--pt-bg-raised) !important;\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+hr,\n+.page-header,\n+.nav-tabs,\n+.nav-tabs > li > a,\n+.breadcrumb,\n+.breadcrumb > li + li:before {\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-muted) !important;\n+}\n+\n+.nav-tabs > li.active > a,\n+.nav-tabs > li.active > a:hover,\n+.nav-tabs > li.active > a:focus {\n+ background-color: var(--pt-bg-soft) !important;\n+ border-color: var(--pt-border) !important;\n+ color: var(--pt-text) !important;\n+}\n+\n+.logo,\n+.navbar-brand img,\n+img[src*=\"pretix-logo\"] {\n+ filter: brightness(0) invert(1);\n+}\n+\n+::selection {\n+ background: rgba(157, 125, 255, 0.35);\n+}\n*** Add File: /opt/pretickets.gulasch.site/build/overrides/pretixcontrol/auth/base.html\n+{% load compress %}\n+{% load i18n %}\n+{% load static %}\n+<!DOCTYPE html>\n+<html{% if rtl %} dir=\"rtl\" class=\"rtl\"{% endif %}>\n+<head>\n+ <title>{{ django_settings.PRETIX_INSTANCE_NAME }}</title>\n+ {% compress css %}\n+ <link rel=\"stylesheet\" type=\"text/x-scss\" href=\"{% static \"pretixcontrol/scss/auth.scss\" %}\"/>\n+ {% endcompress %}\n+ <link rel=\"stylesheet\" href=\"{% static \"pretickets_darkmode/darkmode.css\" %}\" data-pretickets-darkmode>\n+ <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n+\n+ {% if development_warning or debug_warning %}\n+ <link rel=\"shortcut icon\" href=\"{% static \"pretixbase/img/favicon-debug.ico\" %}\">\n+ {% else %}\n+ <link rel=\"shortcut icon\" href=\"{% static \"pretixbase/img/favicon.ico\" %}\">\n+ <link rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"{% static \"pretixbase/img/icons/favicon-32x32.png\" %}\">\n+ <link rel=\"icon\" type=\"image/png\" sizes=\"194x194\" href=\"{% static \"pretixbase/img/icons/favicon-194x194.png\" %}\">\n+ <link rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"{% static \"pretixbase/img/icons/favicon-16x16.png\" %}\">\n+ {% endif %}\n+ <link rel=\"apple-touch-icon\" sizes=\"180x180\" href=\"{% static \"pretixbase/img/icons/apple-touch-icon.png\" %}\">\n+ <link rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"{% static \"pretixbase/img/icons/android-chrome-192x192.png\" %}\">\n+ <link rel=\"manifest\" href=\"{% url \"site.webmanifest\" %}\">\n+ <link rel=\"mask-icon\" href=\"{% static \"pretixbase/img/icons/safari-pinned-tab.svg\" %}\" color=\"#3b1c4a\">\n+ <meta name=\"theme-color\" content=\"#080c14\">\n+</head>\n+<body>\n+<div class=\"container\">\n+ <a href=\"{% url \"control:auth.login\" %}\">\n+ <img src=\"{% static \"pretixbase/img/pretix-logo.svg\" %}\" class=\"logo\"/>\n+ </a>\n+ {% if messages %}\n+ {% for message in messages %}\n+ <div class=\"alert {{ message.tags }}\">\n+ {{ message }}\n+ </div>\n+ {% endfor %}\n+ {% endif %}\n+ {% if request.user.is_hijacked %}\n+ <div class=\"impersonate-warning\">\n+ <span class=\"fa fa-user-secret\"></span>\n+ {% blocktrans with user=request.user%}You are currently working on behalf of {{ user }}.{% endblocktrans %}\n+\n+ <form action=\"{% url 'control:users.impersonate.stop' %}\" method=\"post\" class=\"helper-display-inline\">\n+ {% csrf_token %}\n+ <button class=\"btn btn-default btn-sm\">\n+ {% trans \"Stop impersonating\" %}\n+ </button>\n+ </form>\n+ </div>\n+ {% endif %}\n+\n+ {% block content %}\n+ {% endblock %}\n+ <footer>\n+ {{ poweredby }} {# removing or hiding this might be in violation of pretix' license #}\n+ </footer>\n+</div>\n+<script type=\"text/javascript\" src=\"{% static \"pretixcontrol/js/auth.js\" %}\"></script>\n+</body>\n+</html>\n*** Add File: /opt/pretickets.gulasch.site/config/pretix.cfg\n+[pretix]\n+instance_name=pretickets.gulasch.site\n+url=https://pretickets.gulasch.site\n+currency=EUR\n+datadir=/data\n+trust_x_forwarded_for=on\n+trust_x_forwarded_proto=on\n+registration=off\n+\n+[locale]\n+default=de\n+timezone=Europe/Berlin\n+\n+[database]\n+backend=postgresql\n+name=pretix\n+user=pretix\n+host=pretickets-postgres\n+port=5432\n+\n+[mail]\n+from=tickets@pretickets.gulasch.site\n+host=172.17.0.1\n+\n+[redis]\n+location=redis://pretickets-redis:6379/0\n+sessions=true\n+\n+[celery]\n+backend=redis://pretickets-redis:6379/1\n+broker=redis://pretickets-redis:6379/2\n+\n+[django]\n+debug=off\n*** End Patch"
}