byceps.announce.connections   A
last analyzed

Complexity

Total Complexity 6

Size/Duplication

Total Lines 503
Duplicated Lines 0 %

Test Coverage

Coverage 100%

Importance

Changes 0
Metric Value
eloc 405
dl 0
loc 503
ccs 41
cts 41
cp 1
rs 10
c 0
b 0
f 0
wmc 6

1 Function

Rating   Name   Duplication   Size   Complexity  
A get_signals() 0 2 1

5 Methods

Rating   Name   Duplication   Size   Complexity  
A AnnouncementEventRegistry.get_event_names() 0 2 1
A AnnouncementEventRegistry.register_event() 0 8 1
A AnnouncementEventRegistry.get_event_name() 0 3 1
A AnnouncementEventRegistry.__init__() 0 5 1
A AnnouncementEventRegistry.get_handler_for_event_type() 0 4 1
1
"""
2
byceps.announce.connections
3
~~~~~~~~~~~~~~~~~~~~~~~~~~~
4
5
Connect event signals to announcement handlers.
6
7
:Copyright: 2014-2024 Jochen Kupperschmidt
8
:License: Revised BSD (see `LICENSE` file for details)
9
"""
10
11 1
from collections.abc import Callable
12
13 1
from blinker import NamedSignal
14
15 1
from byceps.events.authn import PasswordUpdatedEvent, UserLoggedInEvent
16
from byceps.events.authz import (
17 1
    RoleAssignedToUserEvent,
18 1
    RoleDeassignedFromUserEvent,
19
)
20
from byceps.events.base import _BaseEvent
21
from byceps.events.board import (
22 1
    BoardPostingCreatedEvent,
23 1
    BoardPostingHiddenEvent,
24
    BoardPostingUnhiddenEvent,
25
    BoardTopicCreatedEvent,
26
    BoardTopicHiddenEvent,
27
    BoardTopicLockedEvent,
28
    BoardTopicMovedEvent,
29
    BoardTopicPinnedEvent,
30
    BoardTopicUnhiddenEvent,
31
    BoardTopicUnlockedEvent,
32
    BoardTopicUnpinnedEvent,
33
)
34
from byceps.events.guest_server import (
35
    GuestServerApprovedEvent,
36 1
    GuestServerCheckedInEvent,
37
    GuestServerCheckedOutEvent,
38
    GuestServerRegisteredEvent,
39
)
40
from byceps.events.news import NewsItemPublishedEvent
41
from byceps.events.newsletter import (
42 1
    SubscribedToNewsletterEvent,
43 1
    UnsubscribedFromNewsletterEvent,
44
)
45
from byceps.events.orga import OrgaStatusGrantedEvent, OrgaStatusRevokedEvent
46
from byceps.events.page import (
47 1
    PageCreatedEvent,
48 1
    PageDeletedEvent,
49
    PageUpdatedEvent,
50
)
51
from byceps.events.shop import (
52
    ShopOrderCanceledEvent,
53 1
    ShopOrderPaidEvent,
54
    ShopOrderPlacedEvent,
55
)
56
from byceps.events.snippet import (
57
    SnippetCreatedEvent,
58 1
    SnippetDeletedEvent,
59
    SnippetUpdatedEvent,
60
)
61
from byceps.events.ticketing import TicketCheckedInEvent, TicketsSoldEvent
62
from byceps.events.tourney import (
63 1
    TourneyCanceledEvent,
64 1
    TourneyFinishedEvent,
65
    TourneyMatchReadyEvent,
66
    TourneyMatchResetEvent,
67
    TourneyMatchScoreConfirmedEvent,
68
    TourneyMatchScoreRandomizedEvent,
69
    TourneyMatchScoreSubmittedEvent,
70
    TourneyParticipantDisqualifiedEvent,
71
    TourneyParticipantEliminatedEvent,
72
    TourneyParticipantReadyEvent,
73
    TourneyParticipantWarnedEvent,
74
    TourneyPausedEvent,
75
    TourneyStartedEvent,
76
)
77
from byceps.events.user import (
78
    UserAccountCreatedEvent,
79 1
    UserAccountDeletedEvent,
80
    UserAccountSuspendedEvent,
81
    UserAccountUnsuspendedEvent,
82
    UserDetailsUpdatedEvent,
83
    UserEmailAddressChangedEvent,
84
    UserEmailAddressInvalidatedEvent,
85
    UserScreenNameChangedEvent,
86
)
87
from byceps.events.user_badge import UserBadgeAwardedEvent
88
from byceps.services.webhooks.models import Announcement, OutgoingWebhook
89 1
from byceps.signals import (
90 1
    authn as authn_signals,
91 1
    authz as authz_signals,
92
    board as board_signals,
93
    guest_server as guest_server_signals,
94
    news as news_signals,
95
    newsletter as newsletter_signals,
96
    orga as orga_signals,
97
    page as page_signals,
98
    shop as shop_signals,
99
    snippet as snippet_signals,
100
    ticketing as ticketing_signals,
101
    tourney as tourney_signals,
102
    user as user_signals,
103
    user_badge as user_badge_signals,
104
)
105
106
from .handlers import (
107
    authn as authn_handlers,
108 1
    authz as authz_handlers,
109
    board as board_handlers,
110
    guest_server as guest_server_handlers,
111
    news as news_handlers,
112
    newsletter as newsletter_handler,
113
    orga as orga_handlers,
114
    page as page_handlers,
115
    shop_order as shop_order_handlers,
116
    snippet as snippet_handlers,
117
    ticketing as ticketing_handlers,
118
    tourney as tourney_handlers,
119
    user as user_handlers,
120
    user_badge as user_badge_handlers,
121
)
122
123
124
AnnouncementEvent = type[_BaseEvent]
125
AnnouncementEventHandler = Callable[
126 1
    [str, _BaseEvent, OutgoingWebhook], Announcement | None
127 1
]
128
129
130
class AnnouncementEventRegistry:
131
    def __init__(self) -> None:
132 1
        self._event_types_to_names: dict[AnnouncementEvent, str] = {}
133 1
        self._event_types_to_handlers: dict[
134 1
            AnnouncementEvent, AnnouncementEventHandler
135 1
        ] = {}
136
137
    def register_event(
138
        self,
139 1
        event: AnnouncementEvent,
140
        name: str,
141
        handler: AnnouncementEventHandler,
142
    ) -> None:
143
        self._event_types_to_names[event] = name
144
        self._event_types_to_handlers[event] = handler
145 1
146 1
    def get_event_name(self, event: _BaseEvent) -> str:
147
        event_type = type(event)
148 1
        return self._event_types_to_names[event_type]
149 1
150 1
    def get_event_names(self) -> set[str]:
151
        return set(self._event_types_to_names.values())
152 1
153 1
    def get_handler_for_event_type(
154
        self, event_type: AnnouncementEvent
155 1
    ) -> AnnouncementEventHandler | None:
156
        return self._event_types_to_handlers.get(event_type)
157
158 1
159
registry = AnnouncementEventRegistry()
160
161 1
162
for event, name, handler in [
163
    (
164 1
        PasswordUpdatedEvent,
165
        'password-updated',
166
        authn_handlers.announce_password_updated,
167
    ),
168
    (
169
        UserLoggedInEvent,
170
        'user-logged-in',
171
        authn_handlers.announce_user_logged_in,
172
    ),
173
    (
174
        RoleAssignedToUserEvent,
175
        'role-assigned-to-user',
176
        authz_handlers.announce_role_assigned_to_user,
177
    ),
178
    (
179
        RoleDeassignedFromUserEvent,
180
        'role-deassigned-from-user',
181
        authz_handlers.announce_role_deassigned_from_user,
182
    ),
183
    (
184
        BoardPostingCreatedEvent,
185
        'board-posting-created',
186
        board_handlers.announce_board_posting_created,
187
    ),
188
    (
189
        BoardPostingHiddenEvent,
190
        'board-posting-hidden',
191
        board_handlers.announce_board_posting_hidden,
192
    ),
193
    (
194
        BoardPostingUnhiddenEvent,
195
        'board-posting-unhidden',
196
        board_handlers.announce_board_posting_unhidden,
197
    ),
198
    (
199
        BoardTopicCreatedEvent,
200
        'board-topic-created',
201
        board_handlers.announce_board_topic_created,
202
    ),
203
    (
204
        BoardTopicHiddenEvent,
205
        'board-topic-hidden',
206
        board_handlers.announce_board_topic_hidden,
207
    ),
208
    (
209
        BoardTopicLockedEvent,
210
        'board-topic-locked',
211
        board_handlers.announce_board_topic_locked,
212
    ),
213
    (
214
        BoardTopicMovedEvent,
215
        'board-topic-moved',
216
        board_handlers.announce_board_topic_moved,
217
    ),
218
    (
219
        BoardTopicPinnedEvent,
220
        'board-topic-pinned',
221
        board_handlers.announce_board_topic_pinned,
222
    ),
223
    (
224
        BoardTopicUnhiddenEvent,
225
        'board-topic-unhidden',
226
        board_handlers.announce_board_topic_unhidden,
227
    ),
228
    (
229
        BoardTopicUnlockedEvent,
230
        'board-topic-unlocked',
231
        board_handlers.announce_board_topic_unlocked,
232
    ),
233
    (
234
        BoardTopicUnpinnedEvent,
235
        'board-topic-unpinned',
236
        board_handlers.announce_board_topic_unpinned,
237
    ),
238
    (
239
        GuestServerApprovedEvent,
240
        'guest-server-approved',
241
        guest_server_handlers.announce_guest_server_approved,
242
    ),
243
    (
244
        GuestServerCheckedInEvent,
245
        'guest-server-checked-in',
246
        guest_server_handlers.announce_guest_server_checked_in,
247
    ),
248
    (
249
        GuestServerCheckedOutEvent,
250
        'guest-server-checked-out',
251
        guest_server_handlers.announce_guest_server_checked_out,
252
    ),
253
    (
254
        GuestServerRegisteredEvent,
255
        'guest-server-registered',
256
        guest_server_handlers.announce_guest_server_registered,
257
    ),
258
    (
259
        NewsItemPublishedEvent,
260
        'news-item-published',
261
        news_handlers.announce_news_item_published,
262
    ),
263
    (
264
        SubscribedToNewsletterEvent,
265
        'newsletter-subscribed',
266
        newsletter_handler.announce_subscribed_to_newsletter,
267
    ),
268
    (
269
        UnsubscribedFromNewsletterEvent,
270
        'newsletter-unsubscribed',
271
        newsletter_handler.announce_unsubscribed_from_newsletter,
272
    ),
273
    (
274
        OrgaStatusGrantedEvent,
275
        'orga-status-granted',
276
        orga_handlers.announce_orga_status_granted,
277
    ),
278
    (
279
        OrgaStatusRevokedEvent,
280
        'orga-status-revoked',
281
        orga_handlers.announce_orga_status_revoked,
282
    ),
283
    (PageCreatedEvent, 'page-created', page_handlers.announce_page_created),
284
    (PageDeletedEvent, 'page-deleted', page_handlers.announce_page_deleted),
285
    (PageUpdatedEvent, 'page-updated', page_handlers.announce_page_updated),
286
    (
287
        ShopOrderCanceledEvent,
288
        'shop-order-canceled',
289
        shop_order_handlers.announce_order_canceled,
290
    ),
291
    (
292
        ShopOrderPaidEvent,
293
        'shop-order-paid',
294
        shop_order_handlers.announce_order_paid,
295
    ),
296
    (
297
        ShopOrderPlacedEvent,
298
        'shop-order-placed',
299
        shop_order_handlers.announce_order_placed,
300
    ),
301
    (
302
        SnippetCreatedEvent,
303
        'snippet-created',
304
        snippet_handlers.announce_snippet_created,
305
    ),
306
    (
307
        SnippetDeletedEvent,
308
        'snippet-deleted',
309
        snippet_handlers.announce_snippet_deleted,
310
    ),
311
    (
312
        SnippetUpdatedEvent,
313
        'snippet-updated',
314
        snippet_handlers.announce_snippet_updated,
315
    ),
316
    (
317
        TicketCheckedInEvent,
318
        'ticket-checked-in',
319
        ticketing_handlers.announce_ticket_checked_in,
320
    ),
321
    (
322
        TicketsSoldEvent,
323
        'tickets-sold',
324
        ticketing_handlers.announce_tickets_sold,
325
    ),
326
    (
327
        TourneyCanceledEvent,
328
        'tourney-canceled',
329
        tourney_handlers.announce_tourney_canceled,
330
    ),
331
    (
332
        TourneyFinishedEvent,
333
        'tourney-finished',
334
        tourney_handlers.announce_tourney_finished,
335
    ),
336
    (
337
        TourneyPausedEvent,
338
        'tourney-paused',
339
        tourney_handlers.announce_tourney_paused,
340
    ),
341
    (
342
        TourneyStartedEvent,
343
        'tourney-started',
344
        tourney_handlers.announce_tourney_started,
345
    ),
346
    (
347
        TourneyMatchReadyEvent,
348
        'tourney-match-ready',
349
        tourney_handlers.announce_match_ready,
350
    ),
351
    (
352
        TourneyMatchResetEvent,
353
        'tourney-match-reset',
354
        tourney_handlers.announce_match_reset,
355
    ),
356
    (
357
        TourneyMatchScoreConfirmedEvent,
358
        'tourney-match-score-confirmed',
359
        tourney_handlers.announce_match_score_confirmed,
360
    ),
361
    (
362
        TourneyMatchScoreRandomizedEvent,
363
        'tourney-match-score-randomized',
364
        tourney_handlers.announce_match_score_randomized,
365
    ),
366
    (
367
        TourneyMatchScoreSubmittedEvent,
368
        'tourney-match-score-submitted',
369
        tourney_handlers.announce_match_score_submitted,
370
    ),
371
    (
372
        TourneyParticipantDisqualifiedEvent,
373
        'tourney-participant-disqualified',
374
        tourney_handlers.announce_participant_disqualified,
375
    ),
376
    (
377
        TourneyParticipantEliminatedEvent,
378
        'tourney-participant-eliminated',
379
        tourney_handlers.announce_participant_eliminated,
380
    ),
381
    (
382
        TourneyParticipantReadyEvent,
383
        'tourney-participant-ready',
384
        tourney_handlers.announce_participant_ready,
385
    ),
386
    (
387
        TourneyParticipantWarnedEvent,
388
        'tourney-participant-warned',
389
        tourney_handlers.announce_participant_warned,
390
    ),
391
    (
392
        UserAccountCreatedEvent,
393
        'user-account-created',
394
        user_handlers.announce_user_account_created,
395
    ),
396
    (
397
        UserAccountDeletedEvent,
398
        'user-account-deleted',
399
        user_handlers.announce_user_account_deleted,
400
    ),
401
    (
402
        UserAccountSuspendedEvent,
403
        'user-account-suspended',
404
        user_handlers.announce_user_account_suspended,
405
    ),
406
    (
407
        UserAccountUnsuspendedEvent,
408
        'user-account-unsuspended',
409
        user_handlers.announce_user_account_unsuspended,
410
    ),
411
    (
412
        UserBadgeAwardedEvent,
413
        'user-badge-awarded',
414
        user_badge_handlers.announce_user_badge_awarded,
415
    ),
416
    (
417
        UserDetailsUpdatedEvent,
418
        'user-details-updated',
419
        user_handlers.announce_user_details_updated,
420
    ),
421
    (
422
        UserEmailAddressChangedEvent,
423
        'user-email-address-changed',
424
        user_handlers.announce_user_email_address_changed,
425
    ),
426
    (
427
        UserEmailAddressInvalidatedEvent,
428
        'user-email-address-invalidated',
429
        user_handlers.announce_user_email_address_invalidated,
430
    ),
431
    (
432
        UserScreenNameChangedEvent,
433
        'user-screen-name-changed',
434
        user_handlers.announce_user_screen_name_changed,
435
    ),
436
]:
437
    registry.register_event(event, name, handler)
438
439 1
440
_SIGNALS: list[NamedSignal] = [
441
    authn_signals.password_updated,
442 1
    authn_signals.user_logged_in,
443
    authz_signals.role_assigned_to_user,
444
    authz_signals.role_deassigned_from_user,
445
    board_signals.posting_created,
446
    board_signals.posting_hidden,
447
    board_signals.posting_unhidden,
448
    board_signals.topic_created,
449
    board_signals.topic_hidden,
450
    board_signals.topic_locked,
451
    board_signals.topic_moved,
452
    board_signals.topic_pinned,
453
    board_signals.topic_unhidden,
454
    board_signals.topic_unlocked,
455
    board_signals.topic_unpinned,
456
    guest_server_signals.guest_server_approved,
457
    guest_server_signals.guest_server_checked_in,
458
    guest_server_signals.guest_server_checked_out,
459
    guest_server_signals.guest_server_registered,
460
    news_signals.item_published,
461
    newsletter_signals.newsletter_subscribed,
462
    newsletter_signals.newsletter_unsubscribed,
463
    orga_signals.orga_status_granted,
464
    orga_signals.orga_status_revoked,
465
    page_signals.page_created,
466
    page_signals.page_deleted,
467
    page_signals.page_updated,
468
    shop_signals.order_canceled,
469
    shop_signals.order_paid,
470
    shop_signals.order_placed,
471
    snippet_signals.snippet_created,
472
    snippet_signals.snippet_deleted,
473
    snippet_signals.snippet_updated,
474
    ticketing_signals.ticket_checked_in,
475
    ticketing_signals.tickets_sold,
476
    tourney_signals.tourney_canceled,
477
    tourney_signals.tourney_finished,
478
    tourney_signals.tourney_paused,
479
    tourney_signals.tourney_started,
480
    tourney_signals.match_ready,
481
    tourney_signals.match_reset,
482
    tourney_signals.match_score_confirmed,
483
    tourney_signals.match_score_randomized,
484
    tourney_signals.match_score_submitted,
485
    tourney_signals.participant_disqualified,
486
    tourney_signals.participant_eliminated,
487
    tourney_signals.participant_ready,
488
    tourney_signals.participant_warned,
489
    user_signals.account_created,
490
    user_signals.account_deleted,
491
    user_signals.account_suspended,
492
    user_signals.account_unsuspended,
493
    user_signals.details_updated,
494
    user_signals.email_address_changed,
495
    user_signals.email_address_invalidated,
496
    user_signals.screen_name_changed,
497
    user_badge_signals.user_badge_awarded,
498
]
499
500
501
def get_signals():
502
    return _SIGNALS
503