1- """
2- Provide django-style hooks for model events.
3- """
41from peewee_async import AioModel as _Model
52from typing import Union , Literal , Any
3+ from playhouse .signals import Signal
64
7-
8- class Signal (object ):
9- def __init__ (self ) -> None :
10- self ._flush ()
11-
12- def _flush (self )-> None :
13- self ._receivers = set ()
14- self ._receiver_list = []
15-
16- def connect (self , receiver , name = None , sender = None ) -> None :
17- name = name or receiver .__name__
18- key = (name , sender )
19- if key not in self ._receivers :
20- self ._receivers .add (key )
21- self ._receiver_list .append ((name , receiver , sender ))
22- else :
23- raise ValueError ('receiver named %s (for sender=%s) already '
24- 'connected' % (name , sender or 'any' ))
25-
26- def disconnect (self , receiver = None , name = None , sender = None ) -> None :
27- if receiver :
28- name = name or receiver .__name__
29- if not name :
30- raise ValueError ('a receiver or a name must be provided' )
31-
32- key = (name , sender )
33- if key not in self ._receivers :
34- raise ValueError ('receiver named %s for sender=%s not found.' %
35- (name , sender or 'any' ))
36-
37- self ._receivers .remove (key )
38- self ._receiver_list = [(n , r , s ) for n , r , s in self ._receiver_list
39- if (n , s ) != key ]
40-
41- def __call__ (self , name = None , sender = None ):
42- def decorator (fn ):
43- self .connect (fn , name , sender )
44- return fn
45- return decorator
46-
5+ class AioSignal (Signal ):
476 async def send (self , instance , * args , ** kwargs ):
487 sender = type (instance )
498 responses = []
@@ -53,10 +12,10 @@ async def send(self, instance, *args, **kwargs):
5312 return responses
5413
5514
56- aio_pre_save = Signal ()
57- aio_post_save = Signal ()
58- aio_pre_delete = Signal ()
59- aio_post_delete = Signal ()
15+ aio_pre_save = AioSignal ()
16+ aio_post_save = AioSignal ()
17+ aio_pre_delete = AioSignal ()
18+ aio_post_delete = AioSignal ()
6019pre_init = Signal () # can't be async !
6120
6221
0 commit comments