forked from CGM_Public/pretix_original
implement registration facility for log entry types
This commit is contained in:
@@ -92,6 +92,10 @@ class LogEntry(models.Model):
|
|||||||
indexes = [models.Index(fields=["datetime", "id"])]
|
indexes = [models.Index(fields=["datetime", "id"])]
|
||||||
|
|
||||||
def display(self):
|
def display(self):
|
||||||
|
log_entry_type = log_entry_types.find(action_type=self.action_type)
|
||||||
|
if log_entry_type:
|
||||||
|
return log_entry_type.display(self)
|
||||||
|
|
||||||
from ..signals import logentry_display
|
from ..signals import logentry_display
|
||||||
|
|
||||||
for receiver, response in logentry_display.send(self.event, logentry=self):
|
for receiver, response in logentry_display.send(self.event, logentry=self):
|
||||||
@@ -237,6 +241,10 @@ class LogEntry(models.Model):
|
|||||||
elif a_text:
|
elif a_text:
|
||||||
return a_text
|
return a_text
|
||||||
else:
|
else:
|
||||||
|
log_entry_type = log_entry_types.find(action_type=self.action_type)
|
||||||
|
if log_entry_type:
|
||||||
|
return log_entry_type.get_object_link(self)
|
||||||
|
|
||||||
for receiver, response in logentry_object_link.send(self.event, logentry=self):
|
for receiver, response in logentry_object_link.send(self.event, logentry=self):
|
||||||
if response:
|
if response:
|
||||||
return response
|
return response
|
||||||
@@ -261,3 +269,77 @@ class LogEntry(models.Model):
|
|||||||
to_wh = [o.id for o in objects if o.webhook_type]
|
to_wh = [o.id for o in objects if o.webhook_type]
|
||||||
if to_wh:
|
if to_wh:
|
||||||
notify_webhooks.apply_async(args=(to_wh,))
|
notify_webhooks.apply_async(args=(to_wh,))
|
||||||
|
|
||||||
|
|
||||||
|
class Registry:
|
||||||
|
def __init__(self, keys):
|
||||||
|
self.registered_items = list()
|
||||||
|
self.keys = keys
|
||||||
|
self.by_key = {key: {} for key in self.keys.keys()}
|
||||||
|
|
||||||
|
def register(self, *objs):
|
||||||
|
for obj in objs:
|
||||||
|
self.registered_items.append(obj)
|
||||||
|
for key, accessor in self.keys.items():
|
||||||
|
self.by_key[key][accessor(obj)] = obj
|
||||||
|
|
||||||
|
def register_instance(self, *args, **kwargs):
|
||||||
|
def reg(clz):
|
||||||
|
obj = clz(*args, **kwargs)
|
||||||
|
self.register(obj)
|
||||||
|
return reg
|
||||||
|
|
||||||
|
def find(self, **kwargs):
|
||||||
|
(key, value), = kwargs.items()
|
||||||
|
return self.by_key.get(key).get(value)
|
||||||
|
|
||||||
|
|
||||||
|
log_entry_types = Registry({'action_type': lambda o: getattr(o, 'action_type')})
|
||||||
|
|
||||||
|
|
||||||
|
class LogEntryType:
|
||||||
|
def display(self, logentry):
|
||||||
|
if hasattr(self, 'plain'):
|
||||||
|
return self.plain
|
||||||
|
|
||||||
|
def get_object_link_info(self, logentry) -> dict:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def get_object_link(self, logentry):
|
||||||
|
a_map = self.get_object_link_info(logentry)
|
||||||
|
if a_map:
|
||||||
|
a_map['val'] = '<a href="{href}">{val}</a>'.format_map(a_map)
|
||||||
|
return self.object_link_wrapper.format_map(a_map)
|
||||||
|
|
||||||
|
object_link_wrapper = '{val}'
|
||||||
|
|
||||||
|
def shred_pii(self, logentry):
|
||||||
|
raise NotImplemented
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def derive_plains(cls, plains):
|
||||||
|
for action_type, plain_display in plains.items():
|
||||||
|
obj = cls()
|
||||||
|
obj.action_type = action_type
|
||||||
|
obj.plain = plain_display
|
||||||
|
yield obj
|
||||||
|
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user