mirror of
https://github.com/pretix/pretix.git
synced 2026-09-15 16:34:42 +00:00
Move auto check-in to plugin with more functionality (#4331)
* Move auto check-in to plugin with more functionality * Rename field * Add to MANIFEST.in
This commit is contained in:
@@ -0,0 +1,210 @@
|
||||
#
|
||||
# This file is part of pretix (Community Edition).
|
||||
#
|
||||
# Copyright (C) 2014-2020 Raphael Michel and contributors
|
||||
# Copyright (C) 2020-2021 rami.io GmbH and contributors
|
||||
#
|
||||
# This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General
|
||||
# Public License as published by the Free Software Foundation in version 3 of the License.
|
||||
#
|
||||
# ADDITIONAL TERMS APPLY: Pursuant to Section 7 of the GNU Affero General Public License, additional terms are
|
||||
# applicable granting you additional permissions and placing additional restrictions on your usage of this software.
|
||||
# Please refer to the pretix LICENSE file to obtain the full terms applicable to this work. If you did not receive
|
||||
# this file, see <https://pretix.eu/about/en/license>.
|
||||
#
|
||||
# This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied
|
||||
# warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more
|
||||
# details.
|
||||
#
|
||||
# You should have received a copy of the GNU Affero General Public License along with this program. If not, see
|
||||
# <https://www.gnu.org/licenses/>.
|
||||
#
|
||||
from django.contrib import messages
|
||||
from django.db import transaction
|
||||
from django.shortcuts import get_object_or_404, redirect
|
||||
from django.urls import reverse
|
||||
from django.utils.functional import cached_property
|
||||
from django.utils.translation import gettext_lazy as _
|
||||
from django.views.generic import DeleteView, ListView
|
||||
|
||||
from pretix.control.permissions import EventPermissionRequiredMixin
|
||||
from pretix.control.views import CreateView, UpdateView
|
||||
from pretix.helpers.models import modelcopy
|
||||
from pretix.plugins.autocheckin.forms import AutoCheckinRuleForm
|
||||
from pretix.plugins.autocheckin.models import AutoCheckinRule
|
||||
|
||||
|
||||
class IndexView(EventPermissionRequiredMixin, ListView):
|
||||
permission = "can_change_event_settings"
|
||||
template_name = "pretixplugins/autocheckin/index.html"
|
||||
paginate_by = 50
|
||||
context_object_name = "rules"
|
||||
|
||||
def get_queryset(self):
|
||||
return (
|
||||
self.request.event.autocheckinrule_set.select_related(
|
||||
"list",
|
||||
)
|
||||
.prefetch_related(
|
||||
"limit_sales_channels",
|
||||
"limit_products",
|
||||
"limit_variations",
|
||||
"limit_variations__item",
|
||||
)
|
||||
.order_by(
|
||||
"list__name",
|
||||
"list_id",
|
||||
"pk",
|
||||
)
|
||||
)
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
ctx = super().get_context_data(**kwargs)
|
||||
ctx["sales_channels"] = self.request.organizer.sales_channels.all()
|
||||
|
||||
pprovs = self.request.event.get_payment_providers()
|
||||
for r in ctx["rules"]:
|
||||
r.pprovs = [pprovs[p] for p in r.limit_payment_methods if p in pprovs]
|
||||
return ctx
|
||||
|
||||
|
||||
class RuleAddView(EventPermissionRequiredMixin, CreateView):
|
||||
template_name = "pretixplugins/autocheckin/add.html"
|
||||
permission = "can_change_event_settings"
|
||||
form_class = AutoCheckinRuleForm
|
||||
model = AutoCheckinRule
|
||||
|
||||
@cached_property
|
||||
def copy_from(self):
|
||||
if self.request.GET.get("copy_from") and not getattr(self, "object", None):
|
||||
try:
|
||||
return AutoCheckinRule.objects.get(
|
||||
pk=self.request.GET.get("copy_from"), event=self.request.event
|
||||
)
|
||||
except AutoCheckinRule.DoesNotExist:
|
||||
pass
|
||||
|
||||
def get_form_kwargs(self):
|
||||
kwargs = super().get_form_kwargs()
|
||||
kwargs["event"] = self.request.event
|
||||
|
||||
if self.copy_from:
|
||||
i = modelcopy(self.copy_from)
|
||||
i.pk = None
|
||||
kwargs["instance"] = i
|
||||
kwargs.setdefault("initial", {})
|
||||
kwargs["initial"]["itemvars"] = [
|
||||
str(i.pk) for i in self.copy_from.limit_products.all()
|
||||
] + [
|
||||
"{}-{}".format(v.item_id, v.pk)
|
||||
for v in self.copy_from.limit_variations.all()
|
||||
]
|
||||
kwargs["initial"][
|
||||
"limit_payment_methods"
|
||||
] = self.copy_from.limit_payment_methods
|
||||
kwargs["initial"][
|
||||
"limit_sales_channels"
|
||||
] = self.copy_from.limit_sales_channels.all()
|
||||
return kwargs
|
||||
|
||||
def form_invalid(self, form):
|
||||
messages.error(
|
||||
self.request, _("We could not save your changes. See below for details.")
|
||||
)
|
||||
return super().form_invalid(form)
|
||||
|
||||
def form_valid(self, form):
|
||||
self.output = {}
|
||||
|
||||
messages.success(self.request, _("Your rule has been created."))
|
||||
|
||||
form.instance.event = self.request.event
|
||||
|
||||
with transaction.atomic():
|
||||
self.object = form.save()
|
||||
form.instance.log_action(
|
||||
"pretix.plugins.autocheckin.rule.added",
|
||||
user=self.request.user,
|
||||
data=dict(form.cleaned_data),
|
||||
)
|
||||
|
||||
return redirect(
|
||||
"plugins:autocheckin:edit",
|
||||
event=self.request.event.slug,
|
||||
organizer=self.request.event.organizer.slug,
|
||||
rule=self.object.pk,
|
||||
)
|
||||
|
||||
|
||||
class RuleEditView(EventPermissionRequiredMixin, UpdateView):
|
||||
model = AutoCheckinRule
|
||||
form_class = AutoCheckinRuleForm
|
||||
template_name = "pretixplugins/autocheckin/edit.html"
|
||||
permission = "can_change_event_settings"
|
||||
|
||||
def get_object(self, queryset=None) -> AutoCheckinRule:
|
||||
return get_object_or_404(
|
||||
AutoCheckinRule.objects.all(),
|
||||
event=self.request.event,
|
||||
id=self.kwargs["rule"],
|
||||
)
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse(
|
||||
"plugins:autocheckin:edit",
|
||||
kwargs={
|
||||
"organizer": self.request.event.organizer.slug,
|
||||
"event": self.request.event.slug,
|
||||
"rule": self.object.pk,
|
||||
},
|
||||
)
|
||||
|
||||
@transaction.atomic()
|
||||
def form_valid(self, form):
|
||||
messages.success(self.request, _("Your changes have been saved."))
|
||||
form.instance.log_action(
|
||||
"pretix.plugins.autocheckin.rule.changed",
|
||||
user=self.request.user,
|
||||
data=dict(form.cleaned_data),
|
||||
)
|
||||
return super().form_valid(form)
|
||||
|
||||
def form_invalid(self, form):
|
||||
messages.error(
|
||||
self.request, _("We could not save your changes. See below for details.")
|
||||
)
|
||||
return super().form_invalid(form)
|
||||
|
||||
|
||||
class RuleDeleteView(EventPermissionRequiredMixin, DeleteView):
|
||||
model = AutoCheckinRule
|
||||
permission = "can_change_event_settings"
|
||||
template_name = "pretixplugins/autocheckin/delete.html"
|
||||
context_object_name = "rule"
|
||||
|
||||
def get_success_url(self):
|
||||
return reverse(
|
||||
"plugins:autocheckin:index",
|
||||
kwargs={
|
||||
"organizer": self.request.event.organizer.slug,
|
||||
"event": self.request.event.slug,
|
||||
},
|
||||
)
|
||||
|
||||
def get_object(self, queryset=None) -> AutoCheckinRule:
|
||||
return get_object_or_404(
|
||||
AutoCheckinRule, event=self.request.event, id=self.kwargs["rule"]
|
||||
)
|
||||
|
||||
@transaction.atomic
|
||||
def form_valid(self, request, *args, **kwargs):
|
||||
self.object = self.get_object()
|
||||
success_url = self.get_success_url()
|
||||
|
||||
self.request.event.log_action(
|
||||
"pretix.plugins.autocheckin.rule.deleted", user=self.request.user, data={}
|
||||
)
|
||||
|
||||
self.object.delete()
|
||||
messages.success(self.request, _("The selected rule has been deleted."))
|
||||
return redirect(success_url)
|
||||
Reference in New Issue
Block a user