We are currently solving the following issue within our repository. Here is the issue text:
--- BEGIN ISSUE ---
Documentation of order_paid-signal unclear
This might be just me not being able to english, but I think that the documentation  at https://github.com/pretix/pretix/blob/a08cb3b8e4adaa300868e3f730e045bc8e6d0203/src/pretix/base/signals.py#L152-L154 is missing something.

--- END ISSUE ---

Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
--- BEGIN FILES ---
Path: `src/pretix/base/signals.py`
Content:
```
1 import warnings
2 from typing import Any, Callable, List, Tuple
3 
4 import django.dispatch
5 from django.apps import apps
6 from django.conf import settings
7 from django.dispatch.dispatcher import NO_RECEIVERS
8 
9 from .models import Event
10 
11 app_cache = {}
12 
13 
14 def _populate_app_cache():
15     global app_cache
16     apps.check_apps_ready()
17     for ac in apps.app_configs.values():
18         app_cache[ac.name] = ac
19 
20 
21 class EventPluginSignal(django.dispatch.Signal):
22     """
23     This is an extension to Django's built-in signals which differs in a way that it sends
24     out it's events only to receivers which belong to plugins that are enabled for the given
25     Event.
26     """
27 
28     def send(self, sender: Event, **named) -> List[Tuple[Callable, Any]]:
29         """
30         Send signal from sender to all connected receivers that belong to
31         plugins enabled for the given Event.
32 
33         sender is required to be an instance of ``pretix.base.models.Event``.
34         """
35         if sender and not isinstance(sender, Event):
36             raise ValueError("Sender needs to be an event.")
37 
38         responses = []
39         if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:
40             return responses
41 
42         if not app_cache:
43             _populate_app_cache()
44 
45         for receiver in self._live_receivers(sender):
46             # Find the Django application this belongs to
47             searchpath = receiver.__module__
48             core_module = any([searchpath.startswith(cm) for cm in settings.CORE_MODULES])
49             app = None
50             if not core_module:
51                 while True:
52                     app = app_cache.get(searchpath)
53                     if "." not in searchpath or app:
54                         break
55                     searchpath, _ = searchpath.rsplit(".", 1)
56 
57             # Only fire receivers from active plugins and core modules
58             if core_module or (sender and app and app.name in sender.get_plugins()):
59                 if not hasattr(app, 'compatibility_errors') or not app.compatibility_errors:
60                     response = receiver(signal=self, sender=sender, **named)
61                     responses.append((receiver, response))
62         return sorted(responses, key=lambda r: (receiver.__module__, receiver.__name__))
63 
64 
65 class DeprecatedSignal(django.dispatch.Signal):
66 
67     def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):
68         warnings.warn('This signal is deprecated and will soon be removed', stacklevel=3)
69         super().connect(receiver, sender=None, weak=True, dispatch_uid=None)
70 
71 
72 event_live_issues = EventPluginSignal(
73     providing_args=[]
74 )
75 """
76 This signal is sent out to determine whether an event can be taken live. If you want to
77 prevent the event from going live, return a string that will be displayed to the user
78 as the error message. If you don't, your receiver should return ``None``.
79 
80 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
81 """
82 
83 
84 register_payment_providers = EventPluginSignal(
85     providing_args=[]
86 )
87 """
88 This signal is sent out to get all known payment providers. Receivers should return a
89 subclass of pretix.base.payment.BasePaymentProvider
90 
91 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
92 """
93 
94 register_invoice_renderers = EventPluginSignal(
95     providing_args=[]
96 )
97 """
98 This signal is sent out to get all known invoice renderers. Receivers should return a
99 subclass of pretix.base.invoice.BaseInvoiceRenderer
100 
101 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
102 """
103 
104 register_ticket_outputs = EventPluginSignal(
105     providing_args=[]
106 )
107 """
108 This signal is sent out to get all known ticket outputs. Receivers should return a
109 subclass of pretix.base.ticketoutput.BaseTicketOutput
110 
111 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
112 """
113 
114 register_data_exporters = EventPluginSignal(
115     providing_args=[]
116 )
117 """
118 This signal is sent out to get all known data exporters. Receivers should return a
119 subclass of pretix.base.exporter.BaseExporter
120 
121 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
122 """
123 
124 validate_cart = EventPluginSignal(
125     providing_args=["positions"]
126 )
127 """
128 This signal is sent out before the user starts checkout. It includes an iterable
129 with the current CartPosition objects.
130 The response of receivers will be ignored, but you can raise a CartError with an
131 appropriate exception message.
132 
133 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
134 """
135 
136 order_placed = EventPluginSignal(
137     providing_args=["order"]
138 )
139 """
140 This signal is sent out every time an order is placed. The order object is given
141 as the first argument. This signal is *not* sent out if an order is created through
142 splitting an existing order, so you can not expect to see all orders by listening
143 to this signal.
144 
145 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
146 """
147 
148 order_paid = EventPluginSignal(
149     providing_args=["order"]
150 )
151 """
152 This signal is sent out every time an order is paid. The order object is given
153 as the first argument. This signal is *not* sent out if an order is marked as paid
154 because it an already-paid order has been splitted.
155 
156 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
157 """
158 
159 logentry_display = EventPluginSignal(
160     providing_args=["logentry"]
161 )
162 """
163 To display an instance of the ``LogEntry`` model to a human user,
164 ``pretix.base.signals.logentry_display`` will be sent out with a ``logentry`` argument.
165 
166 The first received response that is not ``None`` will be used to display the log entry
167 to the user. The receivers are expected to return plain text.
168 
169 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
170 """
171 
172 logentry_object_link = EventPluginSignal(
173     providing_args=["logentry"]
174 )
175 """
176 To display the relationship of an instance of the ``LogEntry`` model to another model
177 to a human user, ``pretix.base.signals.logentry_object_link`` will be sent out with a
178 ``logentry`` argument.
179 
180 The first received response that is not ``None`` will be used to display the related object
181 to the user. The receivers are expected to return a HTML link. The internal implementation
182 builds the links like this::
183 
184     a_text = _('Tax rule {val}')
185     a_map = {
186         'href': reverse('control:event.settings.tax.edit', kwargs={
187             'event': sender.slug,
188             'organizer': sender.organizer.slug,
189             'rule': logentry.content_object.id
190         }),
191         'val': escape(logentry.content_object.name),
192     }
193     a_map['val'] = '<a href="{href}">{val}</a>'.format_map(a_map)
194     return a_text.format_map(a_map)
195 
196 Make sure that any user content in the HTML code you return is properly escaped!
197 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
198 """
199 
200 requiredaction_display = EventPluginSignal(
201     providing_args=["action", "request"]
202 )
203 """
204 To display an instance of the ``RequiredAction`` model to a human user,
205 ``pretix.base.signals.requiredaction_display`` will be sent out with a ``action`` argument.
206 You will also get the current ``request`` in a different argument.
207 
208 The first received response that is not ``None`` will be used to display the log entry
209 to the user. The receivers are expected to return HTML code.
210 
211 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
212 """
213 
214 event_copy_data = EventPluginSignal(
215     providing_args=["other"]
216 )
217 """
218 This signal is sent out when a new event is created as a clone of an existing event, i.e.
219 the settings from the older event are copied to the newer one. You can listen to this
220 signal to copy data or configuration stored within your plugin's models as well.
221 
222 You don't need to copy data inside the general settings storage which is cloned automatically,
223 but you might need to modify that data.
224 
225 The ``sender`` keyword argument will contain the event of the **new** event. The ``other``
226 keyword argument will contain the event to **copy from**.
227 """
228 
229 periodic_task = django.dispatch.Signal()
230 """
231 This is a regular django signal (no pretix event signal) that we send out every
232 time the periodic task cronjob runs. This interval is not sharply defined, it can
233 be everything between a minute and a day. The actions you perform should be
234 idempotent, i.e. it should not make a difference if this is sent out more often
235 than expected.
236 """
237 
238 register_global_settings = django.dispatch.Signal()
239 """
240 All plugins that are installed may send fields for the global settings form, as
241 an OrderedDict of (setting name, form field).
242 """
243 
244 order_fee_calculation = EventPluginSignal(
245     providing_args=['request']
246 )
247 """
248 This signals allows you to add fees to an order while it is being created. You are expected to
249 return a list of ``OrderFee`` objects that are not yet saved to the database
250 (because there is no order yet).
251 
252 As with all plugin signals, the ``sender`` keyword argument will contain the event. A ``positions``
253 argument will contain the cart positions and ``invoice_address`` the invoice address (useful for
254 tax calculation). The argument ``meta_info`` contains the order's meta dictionary.
255 """
256 
257 order_fee_type_name = EventPluginSignal(
258     providing_args=['request', 'fee']
259 )
260 """
261 This signals allows you to return a human-readable description for a fee type based on the ``fee_type``
262 and ``internal_type`` attributes of the ``OrderFee`` model that you get as keyword arguments. You are
263 expected to return a string or None, if you don't know about this fee.
264 
265 As with all plugin signals, the ``sender`` keyword argument will contain the event.
266 """
267 
268 allow_ticket_download = EventPluginSignal(
269     providing_args=['order']
270 )
271 """
272 This signal is sent out to check if tickets for an order can be downloaded. If any receiver returns false,
273 a download will not be offered.
274 
275 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
276 """
277
```
--- END FILES ---

Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.

Here is an example:

```diff
diff --git a/examples/server_async.py b/examples/server_async.py
--- a/examples/server_async.py
+++ b/examples/server_async.py
@@ -313,4 +313,4 @@
 
 
 if __name__ == "__main__":
-    asyncio.run(run_async_server("."), debug=True)
+    asyncio.run(run_async_server(), debug=True)
diff --git a/examples/server_sync.py b/examples/server_sync.py
--- a/examples/server_sync.py
+++ b/examples/server_sync.py
@@ -313,5 +313,5 @@
 
 
 if __name__ == "__main__":
-    server = run_sync_server(".")
+    server = run_sync_server()
     server.shutdown()

```

diff --git a/src/pretix/base/signals.py b/src/pretix/base/signals.py
--- a/src/pretix/base/signals.py
+++ b/src/pretix/base/signals.py
@@ -151,7 +151,7 @@
 """
 This signal is sent out every time an order is paid. The order object is given
 as the first argument. This signal is *not* sent out if an order is marked as paid
-because it an already-paid order has been splitted.
+because an already-paid order has been split.
 
 As with all event-plugin signals, the ``sender`` keyword argument will contain the event.
 """

{"golden_diff": "diff --git a/src/pretix/base/signals.py b/src/pretix/base/signals.py\n--- a/src/pretix/base/signals.py\n+++ b/src/pretix/base/signals.py\n@@ -151,7 +151,7 @@\n \"\"\"\n This signal is sent out every time an order is paid. The order object is given\n as the first argument. This signal is *not* sent out if an order is marked as paid\n-because it an already-paid order has been splitted.\n+because an already-paid order has been split.\n \n As with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n \"\"\"\n", "issue": "Documentation of order_paid-signal unclear\nThis might be just me not being able to english, but I think that the documentation  at https://github.com/pretix/pretix/blob/a08cb3b8e4adaa300868e3f730e045bc8e6d0203/src/pretix/base/signals.py#L152-L154 is missing something.\n", "before_files": [{"content": "import warnings\nfrom typing import Any, Callable, List, Tuple\n\nimport django.dispatch\nfrom django.apps import apps\nfrom django.conf import settings\nfrom django.dispatch.dispatcher import NO_RECEIVERS\n\nfrom .models import Event\n\napp_cache = {}\n\n\ndef _populate_app_cache():\n    global app_cache\n    apps.check_apps_ready()\n    for ac in apps.app_configs.values():\n        app_cache[ac.name] = ac\n\n\nclass EventPluginSignal(django.dispatch.Signal):\n    \"\"\"\n    This is an extension to Django's built-in signals which differs in a way that it sends\n    out it's events only to receivers which belong to plugins that are enabled for the given\n    Event.\n    \"\"\"\n\n    def send(self, sender: Event, **named) -> List[Tuple[Callable, Any]]:\n        \"\"\"\n        Send signal from sender to all connected receivers that belong to\n        plugins enabled for the given Event.\n\n        sender is required to be an instance of ``pretix.base.models.Event``.\n        \"\"\"\n        if sender and not isinstance(sender, Event):\n            raise ValueError(\"Sender needs to be an event.\")\n\n        responses = []\n        if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:\n            return responses\n\n        if not app_cache:\n            _populate_app_cache()\n\n        for receiver in self._live_receivers(sender):\n            # Find the Django application this belongs to\n            searchpath = receiver.__module__\n            core_module = any([searchpath.startswith(cm) for cm in settings.CORE_MODULES])\n            app = None\n            if not core_module:\n                while True:\n                    app = app_cache.get(searchpath)\n                    if \".\" not in searchpath or app:\n                        break\n                    searchpath, _ = searchpath.rsplit(\".\", 1)\n\n            # Only fire receivers from active plugins and core modules\n            if core_module or (sender and app and app.name in sender.get_plugins()):\n                if not hasattr(app, 'compatibility_errors') or not app.compatibility_errors:\n                    response = receiver(signal=self, sender=sender, **named)\n                    responses.append((receiver, response))\n        return sorted(responses, key=lambda r: (receiver.__module__, receiver.__name__))\n\n\nclass DeprecatedSignal(django.dispatch.Signal):\n\n    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):\n        warnings.warn('This signal is deprecated and will soon be removed', stacklevel=3)\n        super().connect(receiver, sender=None, weak=True, dispatch_uid=None)\n\n\nevent_live_issues = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to determine whether an event can be taken live. If you want to\nprevent the event from going live, return a string that will be displayed to the user\nas the error message. If you don't, your receiver should return ``None``.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\n\nregister_payment_providers = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known payment providers. Receivers should return a\nsubclass of pretix.base.payment.BasePaymentProvider\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nregister_invoice_renderers = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known invoice renderers. Receivers should return a\nsubclass of pretix.base.invoice.BaseInvoiceRenderer\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nregister_ticket_outputs = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known ticket outputs. Receivers should return a\nsubclass of pretix.base.ticketoutput.BaseTicketOutput\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nregister_data_exporters = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known data exporters. Receivers should return a\nsubclass of pretix.base.exporter.BaseExporter\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nvalidate_cart = EventPluginSignal(\n    providing_args=[\"positions\"]\n)\n\"\"\"\nThis signal is sent out before the user starts checkout. It includes an iterable\nwith the current CartPosition objects.\nThe response of receivers will be ignored, but you can raise a CartError with an\nappropriate exception message.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\norder_placed = EventPluginSignal(\n    providing_args=[\"order\"]\n)\n\"\"\"\nThis signal is sent out every time an order is placed. The order object is given\nas the first argument. This signal is *not* sent out if an order is created through\nsplitting an existing order, so you can not expect to see all orders by listening\nto this signal.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\norder_paid = EventPluginSignal(\n    providing_args=[\"order\"]\n)\n\"\"\"\nThis signal is sent out every time an order is paid. The order object is given\nas the first argument. This signal is *not* sent out if an order is marked as paid\nbecause it an already-paid order has been splitted.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nlogentry_display = EventPluginSignal(\n    providing_args=[\"logentry\"]\n)\n\"\"\"\nTo display an instance of the ``LogEntry`` model to a human user,\n``pretix.base.signals.logentry_display`` will be sent out with a ``logentry`` argument.\n\nThe first received response that is not ``None`` will be used to display the log entry\nto the user. The receivers are expected to return plain text.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nlogentry_object_link = EventPluginSignal(\n    providing_args=[\"logentry\"]\n)\n\"\"\"\nTo display the relationship of an instance of the ``LogEntry`` model to another model\nto a human user, ``pretix.base.signals.logentry_object_link`` will be sent out with a\n``logentry`` argument.\n\nThe first received response that is not ``None`` will be used to display the related object\nto the user. The receivers are expected to return a HTML link. The internal implementation\nbuilds the links like this::\n\n    a_text = _('Tax rule {val}')\n    a_map = {\n        'href': reverse('control:event.settings.tax.edit', kwargs={\n            'event': sender.slug,\n            'organizer': sender.organizer.slug,\n            'rule': logentry.content_object.id\n        }),\n        'val': escape(logentry.content_object.name),\n    }\n    a_map['val'] = '<a href=\"{href}\">{val}</a>'.format_map(a_map)\n    return a_text.format_map(a_map)\n\nMake sure that any user content in the HTML code you return is properly escaped!\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nrequiredaction_display = EventPluginSignal(\n    providing_args=[\"action\", \"request\"]\n)\n\"\"\"\nTo display an instance of the ``RequiredAction`` model to a human user,\n``pretix.base.signals.requiredaction_display`` will be sent out with a ``action`` argument.\nYou will also get the current ``request`` in a different argument.\n\nThe first received response that is not ``None`` will be used to display the log entry\nto the user. The receivers are expected to return HTML code.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nevent_copy_data = EventPluginSignal(\n    providing_args=[\"other\"]\n)\n\"\"\"\nThis signal is sent out when a new event is created as a clone of an existing event, i.e.\nthe settings from the older event are copied to the newer one. You can listen to this\nsignal to copy data or configuration stored within your plugin's models as well.\n\nYou don't need to copy data inside the general settings storage which is cloned automatically,\nbut you might need to modify that data.\n\nThe ``sender`` keyword argument will contain the event of the **new** event. The ``other``\nkeyword argument will contain the event to **copy from**.\n\"\"\"\n\nperiodic_task = django.dispatch.Signal()\n\"\"\"\nThis is a regular django signal (no pretix event signal) that we send out every\ntime the periodic task cronjob runs. This interval is not sharply defined, it can\nbe everything between a minute and a day. The actions you perform should be\nidempotent, i.e. it should not make a difference if this is sent out more often\nthan expected.\n\"\"\"\n\nregister_global_settings = django.dispatch.Signal()\n\"\"\"\nAll plugins that are installed may send fields for the global settings form, as\nan OrderedDict of (setting name, form field).\n\"\"\"\n\norder_fee_calculation = EventPluginSignal(\n    providing_args=['request']\n)\n\"\"\"\nThis signals allows you to add fees to an order while it is being created. You are expected to\nreturn a list of ``OrderFee`` objects that are not yet saved to the database\n(because there is no order yet).\n\nAs with all plugin signals, the ``sender`` keyword argument will contain the event. A ``positions``\nargument will contain the cart positions and ``invoice_address`` the invoice address (useful for\ntax calculation). The argument ``meta_info`` contains the order's meta dictionary.\n\"\"\"\n\norder_fee_type_name = EventPluginSignal(\n    providing_args=['request', 'fee']\n)\n\"\"\"\nThis signals allows you to return a human-readable description for a fee type based on the ``fee_type``\nand ``internal_type`` attributes of the ``OrderFee`` model that you get as keyword arguments. You are\nexpected to return a string or None, if you don't know about this fee.\n\nAs with all plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nallow_ticket_download = EventPluginSignal(\n    providing_args=['order']\n)\n\"\"\"\nThis signal is sent out to check if tickets for an order can be downloaded. If any receiver returns false,\na download will not be offered.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n", "path": "src/pretix/base/signals.py"}], "after_files": [{"content": "import warnings\nfrom typing import Any, Callable, List, Tuple\n\nimport django.dispatch\nfrom django.apps import apps\nfrom django.conf import settings\nfrom django.dispatch.dispatcher import NO_RECEIVERS\n\nfrom .models import Event\n\napp_cache = {}\n\n\ndef _populate_app_cache():\n    global app_cache\n    apps.check_apps_ready()\n    for ac in apps.app_configs.values():\n        app_cache[ac.name] = ac\n\n\nclass EventPluginSignal(django.dispatch.Signal):\n    \"\"\"\n    This is an extension to Django's built-in signals which differs in a way that it sends\n    out it's events only to receivers which belong to plugins that are enabled for the given\n    Event.\n    \"\"\"\n\n    def send(self, sender: Event, **named) -> List[Tuple[Callable, Any]]:\n        \"\"\"\n        Send signal from sender to all connected receivers that belong to\n        plugins enabled for the given Event.\n\n        sender is required to be an instance of ``pretix.base.models.Event``.\n        \"\"\"\n        if sender and not isinstance(sender, Event):\n            raise ValueError(\"Sender needs to be an event.\")\n\n        responses = []\n        if not self.receivers or self.sender_receivers_cache.get(sender) is NO_RECEIVERS:\n            return responses\n\n        if not app_cache:\n            _populate_app_cache()\n\n        for receiver in self._live_receivers(sender):\n            # Find the Django application this belongs to\n            searchpath = receiver.__module__\n            core_module = any([searchpath.startswith(cm) for cm in settings.CORE_MODULES])\n            app = None\n            if not core_module:\n                while True:\n                    app = app_cache.get(searchpath)\n                    if \".\" not in searchpath or app:\n                        break\n                    searchpath, _ = searchpath.rsplit(\".\", 1)\n\n            # Only fire receivers from active plugins and core modules\n            if core_module or (sender and app and app.name in sender.get_plugins()):\n                if not hasattr(app, 'compatibility_errors') or not app.compatibility_errors:\n                    response = receiver(signal=self, sender=sender, **named)\n                    responses.append((receiver, response))\n        return sorted(responses, key=lambda r: (receiver.__module__, receiver.__name__))\n\n\nclass DeprecatedSignal(django.dispatch.Signal):\n\n    def connect(self, receiver, sender=None, weak=True, dispatch_uid=None):\n        warnings.warn('This signal is deprecated and will soon be removed', stacklevel=3)\n        super().connect(receiver, sender=None, weak=True, dispatch_uid=None)\n\n\nevent_live_issues = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to determine whether an event can be taken live. If you want to\nprevent the event from going live, return a string that will be displayed to the user\nas the error message. If you don't, your receiver should return ``None``.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\n\nregister_payment_providers = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known payment providers. Receivers should return a\nsubclass of pretix.base.payment.BasePaymentProvider\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nregister_invoice_renderers = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known invoice renderers. Receivers should return a\nsubclass of pretix.base.invoice.BaseInvoiceRenderer\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nregister_ticket_outputs = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known ticket outputs. Receivers should return a\nsubclass of pretix.base.ticketoutput.BaseTicketOutput\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nregister_data_exporters = EventPluginSignal(\n    providing_args=[]\n)\n\"\"\"\nThis signal is sent out to get all known data exporters. Receivers should return a\nsubclass of pretix.base.exporter.BaseExporter\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nvalidate_cart = EventPluginSignal(\n    providing_args=[\"positions\"]\n)\n\"\"\"\nThis signal is sent out before the user starts checkout. It includes an iterable\nwith the current CartPosition objects.\nThe response of receivers will be ignored, but you can raise a CartError with an\nappropriate exception message.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\norder_placed = EventPluginSignal(\n    providing_args=[\"order\"]\n)\n\"\"\"\nThis signal is sent out every time an order is placed. The order object is given\nas the first argument. This signal is *not* sent out if an order is created through\nsplitting an existing order, so you can not expect to see all orders by listening\nto this signal.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\norder_paid = EventPluginSignal(\n    providing_args=[\"order\"]\n)\n\"\"\"\nThis signal is sent out every time an order is paid. The order object is given\nas the first argument. This signal is *not* sent out if an order is marked as paid\nbecause an already-paid order has been split.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nlogentry_display = EventPluginSignal(\n    providing_args=[\"logentry\"]\n)\n\"\"\"\nTo display an instance of the ``LogEntry`` model to a human user,\n``pretix.base.signals.logentry_display`` will be sent out with a ``logentry`` argument.\n\nThe first received response that is not ``None`` will be used to display the log entry\nto the user. The receivers are expected to return plain text.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nlogentry_object_link = EventPluginSignal(\n    providing_args=[\"logentry\"]\n)\n\"\"\"\nTo display the relationship of an instance of the ``LogEntry`` model to another model\nto a human user, ``pretix.base.signals.logentry_object_link`` will be sent out with a\n``logentry`` argument.\n\nThe first received response that is not ``None`` will be used to display the related object\nto the user. The receivers are expected to return a HTML link. The internal implementation\nbuilds the links like this::\n\n    a_text = _('Tax rule {val}')\n    a_map = {\n        'href': reverse('control:event.settings.tax.edit', kwargs={\n            'event': sender.slug,\n            'organizer': sender.organizer.slug,\n            'rule': logentry.content_object.id\n        }),\n        'val': escape(logentry.content_object.name),\n    }\n    a_map['val'] = '<a href=\"{href}\">{val}</a>'.format_map(a_map)\n    return a_text.format_map(a_map)\n\nMake sure that any user content in the HTML code you return is properly escaped!\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nrequiredaction_display = EventPluginSignal(\n    providing_args=[\"action\", \"request\"]\n)\n\"\"\"\nTo display an instance of the ``RequiredAction`` model to a human user,\n``pretix.base.signals.requiredaction_display`` will be sent out with a ``action`` argument.\nYou will also get the current ``request`` in a different argument.\n\nThe first received response that is not ``None`` will be used to display the log entry\nto the user. The receivers are expected to return HTML code.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nevent_copy_data = EventPluginSignal(\n    providing_args=[\"other\"]\n)\n\"\"\"\nThis signal is sent out when a new event is created as a clone of an existing event, i.e.\nthe settings from the older event are copied to the newer one. You can listen to this\nsignal to copy data or configuration stored within your plugin's models as well.\n\nYou don't need to copy data inside the general settings storage which is cloned automatically,\nbut you might need to modify that data.\n\nThe ``sender`` keyword argument will contain the event of the **new** event. The ``other``\nkeyword argument will contain the event to **copy from**.\n\"\"\"\n\nperiodic_task = django.dispatch.Signal()\n\"\"\"\nThis is a regular django signal (no pretix event signal) that we send out every\ntime the periodic task cronjob runs. This interval is not sharply defined, it can\nbe everything between a minute and a day. The actions you perform should be\nidempotent, i.e. it should not make a difference if this is sent out more often\nthan expected.\n\"\"\"\n\nregister_global_settings = django.dispatch.Signal()\n\"\"\"\nAll plugins that are installed may send fields for the global settings form, as\nan OrderedDict of (setting name, form field).\n\"\"\"\n\norder_fee_calculation = EventPluginSignal(\n    providing_args=['request']\n)\n\"\"\"\nThis signals allows you to add fees to an order while it is being created. You are expected to\nreturn a list of ``OrderFee`` objects that are not yet saved to the database\n(because there is no order yet).\n\nAs with all plugin signals, the ``sender`` keyword argument will contain the event. A ``positions``\nargument will contain the cart positions and ``invoice_address`` the invoice address (useful for\ntax calculation). The argument ``meta_info`` contains the order's meta dictionary.\n\"\"\"\n\norder_fee_type_name = EventPluginSignal(\n    providing_args=['request', 'fee']\n)\n\"\"\"\nThis signals allows you to return a human-readable description for a fee type based on the ``fee_type``\nand ``internal_type`` attributes of the ``OrderFee`` model that you get as keyword arguments. You are\nexpected to return a string or None, if you don't know about this fee.\n\nAs with all plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n\nallow_ticket_download = EventPluginSignal(\n    providing_args=['order']\n)\n\"\"\"\nThis signal is sent out to check if tickets for an order can be downloaded. If any receiver returns false,\na download will not be offered.\n\nAs with all event-plugin signals, the ``sender`` keyword argument will contain the event.\n\"\"\"\n", "path": "src/pretix/base/signals.py"}]}