mirror of
https://github.com/pretix/pretix.git
synced 2025-12-22 16:52:27 +00:00
95 lines
3.0 KiB
ReStructuredText
95 lines
3.0 KiB
ReStructuredText
.. highlight:: python
|
|
:linenothreshold: 5
|
|
|
|
.. _`shredder`:
|
|
|
|
Writing a data shredder
|
|
=======================
|
|
|
|
If your plugin adds the ability to store personal data within pretix, you should also implement a "data shredder"
|
|
to anonymize or pseudonymize the data later.
|
|
|
|
Shredder registration
|
|
---------------------
|
|
|
|
The data shredder API does not make a lot of usage from signals, however, it
|
|
does use a signal to get a list of all available data shredders. Your plugin
|
|
should listen for this signal and return the subclass of ``pretix.base.shredder.BaseDataShredder``
|
|
that we'll provide in this plugin:
|
|
|
|
.. sourcecode:: python
|
|
|
|
from django.dispatch import receiver
|
|
|
|
from pretix.base.signals import register_data_shredders
|
|
|
|
|
|
@receiver(register_data_shredders, dispatch_uid="custom_data_shredders")
|
|
def register_shredder(sender, **kwargs):
|
|
return [
|
|
PluginDataShredder,
|
|
]
|
|
|
|
The shredder class
|
|
------------------
|
|
|
|
.. class:: pretix.base.shredder.BaseDataShredder
|
|
|
|
The central object of each data shredder is the subclass of ``BaseDataShredder``.
|
|
|
|
.. py:attribute:: BaseDataShredder.event
|
|
|
|
The default constructor sets this property to the event we are currently
|
|
working for.
|
|
|
|
.. autoattribute:: identifier
|
|
|
|
This is an abstract attribute, you **must** override this!
|
|
|
|
.. autoattribute:: verbose_name
|
|
|
|
This is an abstract attribute, you **must** override this!
|
|
|
|
.. autoattribute:: description
|
|
|
|
This is an abstract attribute, you **must** override this!
|
|
|
|
.. automethod:: generate_files
|
|
|
|
.. automethod:: shred_data
|
|
|
|
Example
|
|
-------
|
|
|
|
For example, the core data shredder responsible for removing invoice address information including their history
|
|
looks like this:
|
|
|
|
.. sourcecode:: python
|
|
|
|
class InvoiceAddressShredder(BaseDataShredder):
|
|
verbose_name = _('Invoice addresses')
|
|
identifier = 'invoice_addresses'
|
|
description = _('This will remove all invoice addresses from orders, '
|
|
'as well as logged changes to them.')
|
|
|
|
def generate_files(self) -> List[Tuple[str, str, str]]:
|
|
yield 'invoice-addresses.json', 'application/json', json.dumps({
|
|
ia.order.code: InvoiceAddressSerializer(ia).data
|
|
for ia in InvoiceAddress.objects.filter(order__event=self.event)
|
|
}, indent=4)
|
|
|
|
@transaction.atomic
|
|
def shred_data(self):
|
|
InvoiceAddress.objects.filter(order__event=self.event).delete()
|
|
|
|
for le in self.event.logentry_set.filter(action_type="pretix.event.order.modified"):
|
|
d = le.parsed_data
|
|
if 'invoice_data' in d and not isinstance(d['invoice_data'], bool):
|
|
for field in d['invoice_data']:
|
|
if d['invoice_data'][field]:
|
|
d['invoice_data'][field] = '█'
|
|
le.data = json.dumps(d)
|
|
le.shredded = True
|
|
le.save(update_fields=['data', 'shredded'])
|
|
|