U SW@sXdZddlmZGdddeZeZeZeZeZ eZ eZ GdddeZdS)z. Provide django-style hooks for model events. )Modelc@sBeZdZddZdddZdddZddd Zd d Zd d ZdS)SignalcCs |dSN)_flushselfr /signals.py__init__szSignal.__init__NcCs@|p|j}||jkr0||f|j|<|j|n td|dS)Nz#receiver named %s already connected)__name__ _receivers_receiver_listappend ValueError)rreceivernamesenderrrr connect s   zSignal.connectcCs0|r |j}|r$|j|=|j|ntddS)Nz%a receiver or a name must be provided)r r r remover)rrrrrr disconnects zSignal.disconnectcsfdd}|S)Ncs||Sr)r)fnrrrrr decoratorsz"Signal.__call__..decoratorr)rrrrrrr __call__szSignal.__call__c OsXt|}g}|jD]@}|j|\}}|dks6t||r|||||f||fq|Sr)typer r isinstancer) rinstanceargskwargsrZ responsesrrsrrr send"s z Signal.sendcCsi|_g|_dSr)r r rrrr r+sz Signal._flush)NN)NN)NN) r __module__ __qualname__r rrrr!rrrrr rs    rcs@eZdZfddZfddZfddZfddZZS) rcs tt|j||t|dSr)superrr pre_initr!)rrr __class__rr r 9szModel.__init__cstt|t|dSr)r$rprepared post_initr!rr&rr r(=szModel.preparedcsP|}|ddpt| }tj||dtt|j||}tj||d|S)NZ force_insertF)created) Z _get_pk_valuegetboolpre_saver!r$rsave post_save)rrrZpk_valuer*retr&rr r.As z Model.savecs*t|tt|j||}t||Sr) pre_deleter!r$rdelete_instance post_delete)rrrr0r&rr r2Is  zModel.delete_instance)r r"r#r r(r.r2 __classcell__rrr&r r8s   rN) __doc__ZpeeweerZ_Modelobjectrr-r/r1r3r%r)rrrr s )