diff --git a/src/pretix/base/logentrytypes.py b/src/pretix/base/logentrytypes.py new file mode 100644 index 0000000000..c4a41eaf5a --- /dev/null +++ b/src/pretix/base/logentrytypes.py @@ -0,0 +1,139 @@ +from collections import defaultdict + +from django.urls import reverse +from django.utils.html import escape +from django.utils.translation import gettext_lazy as _, pgettext_lazy + +from pretix.base.models.log import make_link +from pretix.base.signals import EventPluginRegistry + + +class LogEntryTypeRegistry(EventPluginRegistry): + def new_from_dict(self, data): + def reg(clz): + for action_type, plain in data.items(): + self.register(clz(action_type=action_type, plain=plain)) + return reg + + +log_entry_types = LogEntryTypeRegistry({'action_type': lambda o: getattr(o, 'action_type')}) + + +class LogEntryType: + def __init__(self, action_type=None, plain=None): + assert self.__module__ != LogEntryType.__module__ # must not instantiate base classes, only derived ones + if action_type: self.action_type = action_type + if plain: self.plain = plain + + def display(self, logentry): + if hasattr(self, 'plain'): + plain = str(self.plain) + if '{' in plain: + data = defaultdict(lambda: '?', logentry.parsed_data) + return plain.format_map(data) + else: + return plain + + def get_object_link_info(self, logentry) -> dict: + pass + + def get_object_link(self, logentry): + a_map = self.get_object_link_info(logentry) + return make_link(a_map, self.object_link_wrapper) + + object_link_wrapper = '{val}' + + def shred_pii(self, logentry): + raise NotImplementedError + + +class EventLogEntryType(LogEntryType): + def get_object_link_info(self, logentry) -> dict: + if hasattr(self, 'object_link_viewname') and hasattr(self, 'object_link_argname') and logentry.content_object: + return { + 'href': reverse(self.object_link_viewname, kwargs={ + 'event': logentry.event.slug, + 'organizer': logentry.event.organizer.slug, + self.object_link_argname: self.object_link_argvalue(logentry.content_object), + }), + 'val': escape(self.object_link_display_name(logentry.content_object)), + } + + def object_link_argvalue(self, content_object): + return content_object.id + + def object_link_display_name(self, content_object): + return str(content_object) + + +class OrderLogEntryType(EventLogEntryType): + object_link_wrapper = _('Order {val}') + object_link_viewname = 'control:event.order' + object_link_argname = 'code' + + def object_link_argvalue(self, order): + return order.code + + def object_link_display_name(self, order): + return order.code + + +class VoucherLogEntryType(EventLogEntryType): + object_link_wrapper = _('Voucher {val}…') + object_link_viewname = 'control:event.voucher' + object_link_argname = 'voucher' + + def object_link_display_name(self, order): + return order.code[:6] + + +class ItemLogEntryType(EventLogEntryType): + object_link_wrapper = _('Product {val}') + object_link_viewname = 'control:event.item' + object_link_argname = 'item' + + +class SubEventLogEntryType(EventLogEntryType): + object_link_wrapper = pgettext_lazy('subevent', 'Date {val}') + object_link_viewname = 'control:event.subevent' + object_link_argname = 'subevent' + + +class QuotaLogEntryType(EventLogEntryType): + object_link_wrapper = _('Quota {val}') + object_link_viewname = 'control:event.items.quotas.show' + object_link_argname = 'quota' + + +class DiscountLogEntryType(EventLogEntryType): + object_link_wrapper = _('Discount {val}') + object_link_viewname = 'control:event.items.discounts.edit' + object_link_argname = 'discount' + + +class ItemCategoryLogEntryType(EventLogEntryType): + object_link_wrapper = _('Category {val}') + object_link_viewname = 'control:event.items.categories.edit' + object_link_argname = 'category' + + +class QuestionLogEntryType(EventLogEntryType): + object_link_wrapper = _('Question {val}') + object_link_viewname = 'control:event.items.questions.show' + object_link_argname = 'question' + + +class TaxRuleLogEntryType(EventLogEntryType): + object_link_wrapper = _('Tax rule {val}') + object_link_viewname = 'control:event.settings.tax.edit' + object_link_argname = 'rule' + + +class NoOpShredderMixin: + def shred_pii(self, logentry): + pass + + +class ClearDataShredderMixin: + def shred_pii(self, logentry): + logentry.data = None diff --git a/src/pretix/base/models/log.py b/src/pretix/base/models/log.py index 673b6afadf..101814f75f 100644 --- a/src/pretix/base/models/log.py +++ b/src/pretix/base/models/log.py @@ -34,17 +34,16 @@ import json import logging -from collections import defaultdict from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.db import models from django.urls import reverse from django.utils.functional import cached_property -from django.utils.html import escape -from django.utils.translation import gettext_lazy as _, pgettext_lazy +from django.utils.translation import gettext_lazy as _ -from pretix.base.signals import logentry_object_link, EventPluginRegistry, is_app_active +from pretix.base.logentrytypes import log_entry_types +from pretix.base.signals import logentry_object_link, is_app_active class VisibleOnlyManager(models.Manager): @@ -202,134 +201,3 @@ class LogEntry(models.Model): to_wh = [o.id for o in objects if o.webhook_type] if to_wh: notify_webhooks.apply_async(args=(to_wh,)) - - -class LogEntryTypeRegistry(EventPluginRegistry): - def new_from_dict(self, data): - def reg(clz): - for action_type, plain in data.items(): - self.register(clz(action_type=action_type, plain=plain)) - return reg - - -log_entry_types = LogEntryTypeRegistry({'action_type': lambda o: getattr(o, 'action_type')}) - - -class LogEntryType: - def __init__(self, action_type=None, plain=None): - assert self.__module__ != LogEntryType.__module__ # must not instantiate base classes, only derived ones - if action_type: self.action_type = action_type - if plain: self.plain = plain - - def display(self, logentry): - if hasattr(self, 'plain'): - plain = str(self.plain) - if '{' in plain: - data = defaultdict(lambda: '?', logentry.parsed_data) - return plain.format_map(data) - else: - return plain - - def get_object_link_info(self, logentry) -> dict: - pass - - def get_object_link(self, logentry): - a_map = self.get_object_link_info(logentry) - return make_link(a_map, self.object_link_wrapper) - - object_link_wrapper = '{val}' - - def shred_pii(self, logentry): - raise NotImplementedError - - -class EventLogEntryType(LogEntryType): - def get_object_link_info(self, logentry) -> dict: - if hasattr(self, 'object_link_viewname') and hasattr(self, 'object_link_argname') and logentry.content_object: - return { - 'href': reverse(self.object_link_viewname, kwargs={ - 'event': logentry.event.slug, - 'organizer': logentry.event.organizer.slug, - self.object_link_argname: self.object_link_argvalue(logentry.content_object), - }), - 'val': escape(self.object_link_display_name(logentry.content_object)), - } - - def object_link_argvalue(self, content_object): - return content_object.id - - def object_link_display_name(self, content_object): - return str(content_object) - - -class OrderLogEntryType(EventLogEntryType): - object_link_wrapper = _('Order {val}') - object_link_viewname = 'control:event.order' - object_link_argname = 'code' - - def object_link_argvalue(self, order): - return order.code - - def object_link_display_name(self, order): - return order.code - - -class VoucherLogEntryType(EventLogEntryType): - object_link_wrapper = _('Voucher {val}…') - object_link_viewname = 'control:event.voucher' - object_link_argname = 'voucher' - - def object_link_display_name(self, order): - return order.code[:6] - - -class ItemLogEntryType(EventLogEntryType): - object_link_wrapper = _('Product {val}') - object_link_viewname = 'control:event.item' - object_link_argname = 'item' - - -class SubEventLogEntryType(EventLogEntryType): - object_link_wrapper = pgettext_lazy('subevent', 'Date {val}') - object_link_viewname = 'control:event.subevent' - object_link_argname = 'subevent' - - -class QuotaLogEntryType(EventLogEntryType): - object_link_wrapper = _('Quota {val}') - object_link_viewname = 'control:event.items.quotas.show' - object_link_argname = 'quota' - - -class DiscountLogEntryType(EventLogEntryType): - object_link_wrapper = _('Discount {val}') - object_link_viewname = 'control:event.items.discounts.edit' - object_link_argname = 'discount' - - -class ItemCategoryLogEntryType(EventLogEntryType): - object_link_wrapper = _('Category {val}') - object_link_viewname = 'control:event.items.categories.edit' - object_link_argname = 'category' - - -class QuestionLogEntryType(EventLogEntryType): - object_link_wrapper = _('Question {val}') - object_link_viewname = 'control:event.items.questions.show' - object_link_argname = 'question' - - -class TaxRuleLogEntryType(EventLogEntryType): - object_link_wrapper = _('Tax rule {val}') - object_link_viewname = 'control:event.settings.tax.edit' - object_link_argname = 'rule' - - -class NoOpShredderMixin: - def shred_pii(self, logentry): - pass - - -class ClearDataShredderMixin: - def shred_pii(self, logentry): - logentry.data = None diff --git a/src/pretix/control/logdisplay.py b/src/pretix/control/logdisplay.py index 8332fac6b1..e862d0535d 100644 --- a/src/pretix/control/logdisplay.py +++ b/src/pretix/control/logdisplay.py @@ -51,12 +51,9 @@ from pretix.base.models import ( Checkin, CheckinList, Event, ItemVariation, LogEntry, OrderPosition, TaxRule, ) -from pretix.base.models.log import ( - DiscountLogEntryType, EventLogEntryType, ItemCategoryLogEntryType, - ItemLogEntryType, LogEntryType, OrderLogEntryType, QuestionLogEntryType, - QuotaLogEntryType, TaxRuleLogEntryType, VoucherLogEntryType, - log_entry_types, -) +from pretix.base.logentrytypes import log_entry_types, LogEntryType, EventLogEntryType, OrderLogEntryType, \ + VoucherLogEntryType, ItemLogEntryType, QuotaLogEntryType, DiscountLogEntryType, ItemCategoryLogEntryType, \ + QuestionLogEntryType, TaxRuleLogEntryType from pretix.base.signals import logentry_display, orderposition_blocked_display, app_cache from pretix.base.templatetags.money import money_filter diff --git a/src/pretix/plugins/badges/signals.py b/src/pretix/plugins/badges/signals.py index 58919a08d8..ada784349a 100644 --- a/src/pretix/plugins/badges/signals.py +++ b/src/pretix/plugins/badges/signals.py @@ -29,7 +29,7 @@ from django.urls import resolve, reverse from django.utils.translation import gettext_lazy as _ from pretix.base.models import Event, Order -from pretix.base.models.log import EventLogEntryType, log_entry_types +from pretix.base.logentrytypes import log_entry_types, EventLogEntryType from pretix.base.signals import ( event_copy_data, item_copy_data, register_data_exporters, ) diff --git a/src/pretix/plugins/banktransfer/signals.py b/src/pretix/plugins/banktransfer/signals.py index c058c66f44..ea7336f9b9 100644 --- a/src/pretix/plugins/banktransfer/signals.py +++ b/src/pretix/plugins/banktransfer/signals.py @@ -25,11 +25,10 @@ from django.urls import resolve, reverse from django.utils.translation import gettext_lazy as _, gettext_noop from i18nfield.strings import LazyI18nString -from pretix.base.models.log import OrderLogEntryType, log_entry_types +from ...base.logentrytypes import log_entry_types, OrderLogEntryType, ClearDataShredderMixin from pretix.base.signals import register_payment_providers from pretix.control.signals import html_head, nav_event, nav_organizer -from ...base.models.log import ClearDataShredderMixin from ...base.settings import settings_hierarkey from .payment import BankTransfer diff --git a/src/pretix/plugins/paypal2/signals.py b/src/pretix/plugins/paypal2/signals.py index ac9765e677..51dfbdd44f 100644 --- a/src/pretix/plugins/paypal2/signals.py +++ b/src/pretix/plugins/paypal2/signals.py @@ -32,7 +32,7 @@ from django.utils.translation import gettext_lazy as _, pgettext_lazy from pretix.base.forms import SecretKeySettingsField from pretix.base.middleware import _merge_csp, _parse_csp, _render_csp -from pretix.base.models.log import EventLogEntryType, log_entry_types +from pretix.base.logentrytypes import log_entry_types, EventLogEntryType from pretix.base.settings import settings_hierarkey from pretix.base.signals import ( register_global_settings, register_payment_providers, diff --git a/src/pretix/plugins/sendmail/signals.py b/src/pretix/plugins/sendmail/signals.py index da0b4849fc..d5a7c63667 100644 --- a/src/pretix/plugins/sendmail/signals.py +++ b/src/pretix/plugins/sendmail/signals.py @@ -47,9 +47,7 @@ from django.utils.translation import gettext_lazy as _ from django_scopes import scope, scopes_disabled from pretix.base.models import SubEvent -from pretix.base.models.log import ( - EventLogEntryType, OrderLogEntryType, log_entry_types, -) +from pretix.base.logentrytypes import log_entry_types, EventLogEntryType, OrderLogEntryType from pretix.base.signals import ( EventPluginSignal, event_copy_data, periodic_task, )