Ë
    ¸2Úi;  ã                   óæ  — d dl Z d dlmZmZ d dlmZ d dlmZ d dlm	Z	 d dl
mZmZmZmZ d dlZd dlmZ d dlmZ d d	lmZmZ d d
lmZ d dlmZ d dlmZ ddlmZmZm Z m!Z!m"Z"m#Z#m$Z$ ddl%m&Z&m'Z'm(Z( ddl)m*Z*m+Z+m,Z, ddl-m.Z.m/Z/ d„ Z0d„ Z1 G d„ dejd                  «      Z3e3ji                  e ejj                  ddd¬«      «       e3ji                  e ejl                  dd¬«      «        G d„ de3«      Z7y)é    N)ÚCounterÚdefaultdict)Úreduce)Úchain)Úor_)ÚDictÚOptionalÚTupleÚList)ÚNestedObjects)ÚValidationError)ÚmodelsÚrouter)ÚUniqueConstraint)ÚProtectedError)Útimezoneé   )ÚDELETED_BY_CASCADE_FIELD_NAMEÚ
FIELD_NAMEÚHARD_DELETEÚHARD_DELETE_NOCASCADEÚ	NO_DELETEÚSOFT_DELETEÚSOFT_DELETE_CASCADE)ÚSafeDeleteAllManagerÚSafeDeleteDeletedManagerÚSafeDeleteManager)Úpost_softdeleteÚpost_undeleteÚpre_softdelete)Úcan_hard_deleteÚrelated_objectsc                 óz   — | j                   D ],  }|j                  j                  d«      r yt        |«      sŒ, y y)Nzsafedelete.modelsTF)Ú	__bases__Ú
__module__Ú
startswithÚis_safedelete_cls)ÚclsÚbases     úH/var/www/html/acx/venv/lib/python3.12/site-packages/safedelete/models.pyr'   r'   "   s=   € Ø—‘ò ˆð �?‰?×%Ñ%Ð&9Ô:ÙÜ˜TÕ"Ùðð ó    c                 ó`   — t        j                  dt        «       t        | j                  «      S )Nz9is_safedelete is deprecated in favor of is_safedelete_cls)ÚwarningsÚwarnÚDeprecationWarningr'   Ú	__class__)Úrelateds    r*   Úis_safedeleter2   .   s'   € Ü‡M�MØCÜôô ˜W×.Ñ.Ó/Ð/r+   c            	       óˆ  ‡ — e Zd ZU dZeZeed<    e«       Z	 e
«       Z e«       Z G d„ d«      Zdˆ fd„	Zddee   deeeeef   f   fd„Zdd	„Zddee   deeeeef   f   fd
„Zdeeeeef   f   fd„Zdeeeeef   f   fˆ fd„Zdeeeeef   f   fd„Zdeeeeef   f   fd„Zedefd„«       Zdeeee   f   fd„Z ˆ xZ!S )ÚSafeDeleteModela‚  Abstract safedelete-ready model.

    .. note::
        To create your safedelete-ready models, you have to make them inherit from this model.

    :attribute deleted:
        DateTimeField set to the moment the object was deleted. Is set to
        ``None`` if the object has not been deleted.

    :attribute deleted_by_cascade:
        BooleanField set True whenever the object is deleted due cascade operation called by delete
        method of any parent Model. Default value is False. Later if its parent model calls for
        cascading undelete, it will restore only child classes that were also deleted by a cascading
        operation (deleted_by_cascade equals to True), i.e. all objects that were deleted before their
        parent deletion, should keep deleted if the same parent object is restored by undelete method.

        If this behavior isn't desired, class that inherits from SafeDeleteModel can override this
        attribute by setting it as None: overriding model class won't have its ``deleted_by_cascade``
        field and won't be restored by cascading undelete even if it was deleted by a cascade operation.

        >>> class MyModel(SafeDeleteModel):
        ...     deleted_by_cascade = None
        ...     my_field = models.TextField()

    :attribute _safedelete_policy: define what happens when you delete an object.
        It can be one of ``HARD_DELETE``, ``SOFT_DELETE``, ``SOFT_DELETE_CASCADE``, ``NO_DELETE`` and ``HARD_DELETE_NOCASCADE``.
        Defaults to ``SOFT_DELETE``.

        >>> class MyModel(SafeDeleteModel):
        ...     _safedelete_policy = SOFT_DELETE
        ...     my_field = models.TextField()
        ...
        >>> # Now you have your model (with its ``deleted`` field, and custom manager and delete method)

    :attribute objects:
        The :class:`safedelete.managers.SafeDeleteManager` returns the non-deleted models.

    :attribute all_objects:
        The :class:`safedelete.managers.SafeDeleteAllManager` returns all the models (non-deleted and soft-deleted).

    :attribute deleted_objects:
        The :class:`safedelete.managers.SafeDeleteDeletedManager` returns the soft-deleted models.
    Ú_safedelete_policyc                   ó   — e Zd ZdZy)úSafeDeleteModel.MetaTN©Ú__name__r%   Ú__qualname__Úabstract© r+   r*   ÚMetar7   h   ó   „ Ø‰r+   r=   c                 óf  •— d}|s@t        | t        «      r| j                  rd}t        | t        d«       t        | t        d«       t        t        | �  di |¤Ž |rW|j                  d«      xs! t        j                  | j                  | ¬«      }t        j                  | j                  | |¬«       yy)a  Save an object, un-deleting it if it was deleted.

        Args:
            keep_deleted: Do not undelete the model if soft-deleted. (default: {False})
            kwargs: Passed onto :func:`save`.

        .. note::
            Undeletes soft-deleted models by default.
        FTNÚusing©Úinstance©ÚsenderrB   r@   r<   )Úgetattrr   ÚpkÚsetattrr   Úsuperr4   ÚsaveÚgetr   Údb_for_writer0   r   Úsend)ÚselfÚkeep_deletedÚkwargsÚwas_undeletedr@   r0   s        €r*   rI   zSafeDeleteModel.savek   s�   ø€ ð" ˆÙÜ�tœZÔ(¨T¯WªWØ $�Ü�Dœ* dÔ+Ü�DÔ7¸Ô?äŒo˜tÑ)Ñ3¨FÒ3áà—J‘J˜wÓ'Ò]¬6×+>Ñ+>¸t¿~¹~ÐX\Ô+]ˆEÜ×Ñ d§n¡n¸tÈ5ÖQð r+   Úforce_policyÚreturnc                 óÈ  — |xs | j                   }t        | t        «      sJ ‚ | j                  dddi|¤Ž t	        | j
                  j                  di«      }|t        k(  r_t        | d¬«      D ]O  }t        |j                  «      sŒt        |t        «      sŒ* |j                  di |¤Ž\  }}|j                  |«       ŒQ t        |j                  «       «      t        |«      fS )a  Undelete a soft-deleted model.

        Args:
            force_policy: Force a specific undelete policy. (default: {None})
            kwargs: Passed onto :func:`save`.

        .. note::
            Will raise a :class:`AssertionError` if the model was not soft-deleted.
        rN   Fr   T)Úonly_deleted_by_cascader<   )r5   rE   r   rI   r   Ú_metaÚlabelr   r"   r'   r0   ÚundeleteÚupdateÚsumÚvaluesÚdict)rM   rQ   rO   Úcurrent_policyÚundeleted_counterr1   Ú_Úundelete_responses           r*   rW   zSafeDeleteModel.undeleteŠ   sØ   € ð &Ò@¨×)@Ñ)@ˆä�tœZÔ(Ð(Ð(Øˆ�	‰	Ñ/˜uÐ/¨Ò/Ü# T§Z¡Z×%5Ñ%5°qÐ$9Ó:ÐàÔ0Ò0Ü*¨4ÈÔNò @�Ü$ W×%6Ñ%6Õ7¼GÀGÌZÕ<XØ+;¨7×+;Ñ+;Ñ+E¸fÑ+EÑ(�AÐ(Ø%×,Ñ,Ð->Õ?ð@ô
 Ð$×+Ñ+Ó-Ó.´Ð5FÓ0GÐGÐGr+   c                 ó(   —  | j                   |fi |¤ŽS ©N)Ú_delete)rM   rQ   rO   s      r*   ÚdeletezSafeDeleteModel.delete¢   s   € àˆt�|‰|˜LÑ3¨FÑ3Ð3r+   c                 ó  — |€| j                   n|}|t        k(  rdi fS |t        k(  r | j                  di |¤ŽS |t        k(  r | j
                  di |¤ŽS |t        k(  r | j                  di |¤ŽS |t        k(  r | j                  di |¤ŽS di fS )zéOverrides Django's delete behaviour based on the model's delete policy.

        Args:
            force_policy: Force a specific delete policy. (default: {None})
            kwargs: Passed onto :func:`save` if soft deleted.
        r   r<   )
r5   r   r   Úsoft_delete_policy_actionr   Úhard_delete_policy_actionr   Ú!hard_delete_cascade_policy_actionr   Ú!soft_delete_cascade_policy_action)rM   rQ   rO   r\   s       r*   rb   zSafeDeleteModel._delete¦   s¬   € ð 6BÐ5I˜×0Ò0ÐP\ˆàœYÒ&Ø�r�7ˆNØœ{Ò*Ø1�4×1Ñ1Ñ;°FÑ;Ð;Øœ{Ò*Ø1�4×1Ñ1Ñ;°FÑ;Ð;ØÔ4Ò4Ø9�4×9Ñ9ÑC¸FÑCÐCØÔ2Ò2Ø9�4×9Ñ9ÑC¸FÑCÐCØ�2ˆwˆr+   c                 óÚ  — t        | t        t        j                  «       «       |j	                  dd«      rt        | t
        d«       |j                  d«      xs! t        j                  | j                  | ¬«      }t        j                  | j                  | |¬«        | j                  d	ddi|¤Ž t        j                  | j                  | |¬«       d| j                  j                  difS )
NÚ
is_cascadeFTr@   rA   rC   rN   r   r<   )rG   r   r   ÚnowÚpopr   rJ   r   rK   r0   r    rL   rI   r   rU   rV   )rM   rO   r@   s      r*   re   z)SafeDeleteModel.soft_delete_policy_action»   s²   € ä�”j¤(§,¡,£.Ô1ð �:‰:�l EÔ*Ü�DÔ7¸Ô>à—
‘
˜7Ó#ÒY¤v×':Ñ':¸4¿>¹>ÐTXÔ'Yˆä×Ñ 4§>¡>¸DÈÕNØˆ�	‰	Ñ.˜tÐ. vÒ.ä×Ñ D§N¡N¸TÈÕOà�D—J‘J×$Ñ$ aÐ(Ð)Ð)r+   c                 ó(   •— t         t        | �  «       S ra   )rH   r4   rc   )rM   rO   r0   s     €r*   rf   z)SafeDeleteModel.hard_delete_policy_actionÌ   s   ø€ ä”_ dÑ2Ó4Ð4r+   c                 óx   — t        | «      s | j                  ddt        i|¤ŽS  | j                  ddt        i|¤ŽS )NrQ   r<   )r!   rb   r   r   )rM   rO   s     r*   rg   z1SafeDeleteModel.hard_delete_cascade_policy_actionÐ   s<   € ä˜tÔ$Ø�4—<‘<ÑC¬[ÐC¸FÑCÐCà�4—<‘<ÑC¬[ÐC¸FÑCÐCr+   c           	      ó:  — t        t        j                  t        | «      «      ¬«      }|j	                  | g«       t        t        «      }|j                  D ]<  }t        |t        d «      �Œ||j                  j                     j                  |«       Œ> |r`t        d| j                  j                  ›ddj                  |«      ›d�t        t!        j"                  |j%                  «       «      «      «      ‚t'        «       }t)        | «      D ]V  }t+        |j                  «      sŒt        |t        «      rŒ* |j,                  dt.        ddœ|¤Ž\  }}|j1                  |«       ŒX  | j2                  ddt.        i|¤Ž\  }}|j1                  |«       |j4                  j7                  «       D �]À  \  }	}
t8        j:                  d	   d
kD  s-t8        j:                  d	   d
k(  �rt8        j:                  d   dk\  rü|	\  }}|
}|d	   j                  }	g }g }|D ]?  }t=        |t>        j@                  «      r|j                  |«       Œ/|jC                  |«       ŒA |r.tE        tF        |«      } |j0                  di |jH                  |i¤Ž |sŒÛt>        jJ                  jM                  |	«      }|jO                  t        |D �ch c]  }|jP                  ’Œ c}«      |jH                  |i|jR                  «       �ŒF|
j7                  «       D ]h  \  \  }}}t>        jJ                  jM                  |	«      }|jO                  |D �cg c]  }|jP                  ‘Œ c}|jH                  |i|jR                  «       Œj �ŒÃ tU        |j%                  «       «      tW        |«      fS c c}w c c}w )N)r@   z&Cannot delete some instances of model z= because they are referenced through protected foreign keys: z, ú.T)rQ   rj   rQ   r   é   r   é   r<   ),r   r   rK   ÚtypeÚcollectr   ÚlistÚ	protectedrE   r   r0   r9   Úappendr   ÚjoinÚsetr   Úfrom_iterablerZ   r   r"   r'   rc   r   rX   rb   Úfield_updatesÚitemsÚdjangoÚVERSIONÚ
isinstancer   ÚQuerySetÚextendr   r   ÚnameÚsqlÚUpdateQueryÚupdate_batchrF   r@   rY   r[   )rM   rO   Ú	collectorÚprotected_objectsÚobjÚdeleted_counterr1   r^   Údelete_responseÚmodelÚinstances_for_fieldvaluesÚfieldÚvalueÚinstances_listÚupdatesÚobjsÚ	instancesÚcombined_updatesÚquerys                      r*   rh   z1SafeDeleteModel.soft_delete_cascade_policy_action×   s&  € Ü!¬×(;Ñ(;¼DÀ»JÓ(GÔHˆ	Ø×Ñ˜4˜&Ô!ä'¬Ó-ÐØ×&Ñ&ò 	FˆCÜ�sœJ¨Ó-Ñ5Ø! #§-¡-×"8Ñ"8Ñ9×@Ñ@ÀÕEð	Fñ Ý ð —N‘N×+Ó+Ø—I‘IÐ/Õ0ðô
 ”E×'Ñ'Ð(9×(@Ñ(@Ó(BÓCÓDóð ô $+£9ˆÜ& tÓ,ò 	8ˆGÜ  ×!2Ñ!2Õ3¼GÀGÌZÕ<XØ%3 W§^¡^Ð%hÄÐY]Ñ%hÐagÑ%hÑ"��?Ø×&Ñ& Õ7ð	8ð *˜TŸ\™\ÑM´{ÐMÀfÑMÑˆˆ?Ø×Ñ˜Ô/ð 1:×0GÑ0G×0MÑ0MÓ0Oó 	Ñ,ˆEÐ,Ü�~‰~˜aÑ  1Ò$¬¯©¸Ñ):¸aÓ)?ÄFÇNÁNÐSTÑDUÐYZÒDZà!&‘�˜Ø!:�Ø& qÑ)×3Ñ3�Ø�Ø�Ø!/ò /�IÜ! )¬V¯_©_Ô=ØŸ™ yÕ1àŸ™ IÕ.ð	/ñ
 Ü'-¬c°7Ó';Ð$Ø+Ð$×+Ñ+ÑB¨u¯z©z¸5Ð.AÒBÚÜ"ŸJ™J×2Ñ2°5Ó9�EØ×&Ñ&Ü°Ö?¨˜cŸf›fÒ?Ó@À5Ç:Á:ÈuÐBUÐW`×WfÑWföð 2K×1PÑ1PÓ1Rò Ñ-‘N�U˜E IÜ"ŸJ™J×2Ñ2°5Ó9�EØ×&Ñ&Ø+4Ö5 C˜Ÿ›Ò5ØŸ™ UÐ+Ø!Ÿ™õòð-	ô< �?×)Ñ)Ó+Ó,¬d°?Ó.CÐCÐCùò @ùò 6s   Ê9NÌ8Nc                 óª  — | j                   j                  ryt        j                  d   dkD  s,t        j                  d   dk(  r-t        j                  d   dk\  r| j                   j                  r;y| j                   j
                  D ]!  }t        |t        «      sŒ|j                  �Œ! y | j                   j                  D ]  }|j                  sŒ y y)zúChecks if one of the fields of this model has a unique constraint set (unique=True).

        It also checks if the model has sets of field names that, taken together, must be unique.

        Args:
            model: Model instance to check
        Tr   é   r   F)rU   Úunique_togetherr}   r~   Útotal_unique_constraintsÚconstraintsr   r   Ú	conditionÚfieldsÚ_unique)r(   Ú
constraintr�   s      r*   Úhas_unique_fieldsz!SafeDeleteModel.has_unique_fields  s²   € ð �9‰9×$Ò$Øä�>‰>˜!Ñ˜qÒ ¤V§^¡^°AÑ%6¸!Ò%;ÄÇÁÈqÑ@QÐUVÒ@VØ�y‰y×1Ò1Øà!Ÿi™i×3Ñ3ò  �
Ü˜jÔ*:Õ;À
×@TÑ@TÑ@\Ùð ð —Y‘Y×%Ñ%ò 	ˆEØ�}‹}Ùð	ð r+   c                 ó$  — i }|D �]‡  \  }}i }|D ]g  }| j                   j                  |«      }t        | |j                  «      }|€Œ7|j                  r| j
                  j                  sŒZ||t        |«      <   Œi t        |«      t        |«      k7  rŒ�t        |d«      r |j                  j                  di |¤Ž}	n |j                  j                  di |¤Ž}	| j                  |j                   «      }
| j
                  j                  s|
�|	j                  |
¬«      }	|	j                  «       s�Œ)t        |«      dk(  r|d   }nt         j"                  j$                  }|j'                  |g «      j)                  | j+                  ||«      «       �ŒŠ |S )NÚall_objects)rF   r   r   r<   )rU   Ú	get_fieldrE   ÚattnameÚprimary_keyÚ_stateÚaddingÚstrÚlenÚhasattrr    ÚfilterÚ_default_managerÚ_get_pk_valÚexcludeÚexistsr   r)   ÚNON_FIELD_ERRORSÚ
setdefaultrw   Úunique_error_message)rM   Úunique_checksÚerrorsÚmodel_classÚunique_checkÚlookup_kwargsÚ
field_nameÚfÚlookup_valueÚqsÚmodel_class_pkÚkeys               r*   Ú_perform_unique_checksz&SafeDeleteModel._perform_unique_checks1  sq  € Ø35ˆà)6ó 	Ñ%ˆK˜ØˆMØ*ò >�
Ø—J‘J×(Ñ(¨Ó4�Ü& t¨Q¯Y©YÓ7�ØÐ'ØØ—=’=¨¯©×);Ò);ØØ1=�œc *›oÒ.ð>ô �<Ó ¤C¨Ó$6Ò6Øô �{ MÔ2Ø3�[×,Ñ,×3Ñ3ÑD°mÑD‘à8�[×1Ñ1×8Ñ8ÑI¸=ÑI�à!×-Ñ-¨k×.?Ñ.?Ó@ˆNØ—;‘;×%Ò%¨.Ð*DØ—Z‘Z >�ZÓ2�Ø�y‰yŽ{Ü�|Ó$¨Ò)Ø& q™/‘Cä Ÿ+™+×6Ñ6�CØ×!Ñ! # rÓ*×1Ñ1Ø×-Ñ-¨k¸<ÓHöð7	ð< ˆr+   )Fra   )"r9   r%   r:   Ú__doc__r   r5   ÚintÚ__annotations__r   Úobjectsr   r    r   Údeleted_objectsr=   rI   r	   r
   r   r¦   rW   rc   rb   re   rf   rg   rh   ÚclassmethodÚboolrž   r   r   r¼   Ú__classcell__)r0   s   @r*   r4   r4   5   sW  ø… ñ*ðX *Ð˜Ó)áÓ!€GÙ&Ó(€KÙ.Ó0€O÷ñ õRñ>H X¨c¡]ð HÈÈcÐSWÐX[Ð]`ÐX`ÑSaÐNaÑHbó Hó04ñ H¨S¡Mð ÀuÈSÐRVÐWZÐ\_ÐW_ÑR`ÐM`ÑGaó ð**°U¸3ÀÀSÈ#ÀXÁÐ;NÑ5Oó *ð"5°U¸3ÀÀSÈ#ÀXÁÐ;NÑ5Oõ 5ðD¸UÀ3ÈÈSÐRUÈXÉÐCVÑ=Wó Dð<D¸UÀ3ÈÈSÐRUÈXÉÐCVÑ=Wó <Dð| ð $ò ó ðð6!°t¸CÀÀoÑAVÐ<VÑ7W÷ !r+   r4   FT)ÚeditableÚnullÚdb_index)rÅ   Údefaultc                   ó*   — e Zd ZdZ G d„ d«      Zd„ Zy)ÚSafeDeleteMixinz‹``SafeDeleteModel`` was previously named ``SafeDeleteMixin``.

    .. deprecated:: 0.4.0
        Use :class:`SafeDeleteModel` instead.
    c                   ó   — e Zd ZdZy)úSafeDeleteMixin.MetaTNr8   r<   r+   r*   r=   rÌ   `  r>   r+   r=   c                 ój   — t        j                  dt        «       t        j                  | g|¢­i |¤Ž y )Nz5The SafeDeleteMixin class was renamed SafeDeleteModel)r-   r.   r/   r4   Ú__init__)rM   ÚargsrO   s      r*   rÎ   zSafeDeleteMixin.__init__c  s,   € Ü�‰ÐMÜ(ô	*ä× Ñ  Ð7¨Ò7°Ó7r+   N)r9   r%   r:   r½   r=   rÎ   r<   r+   r*   rÊ   rÊ   Y  s   „ ñ÷ñ ó8r+   rÊ   )8r-   Úcollectionsr   r   Ú	functoolsr   Ú	itertoolsr   Úoperatorr   Útypingr   r	   r
   r   r}   Údjango.contrib.admin.utilsr   Údjango.core.exceptionsr   Ú	django.dbr   r   Údjango.db.modelsr   Údjango.db.models.deletionr   Údjango.utilsr   Úconfigr   r   r   r   r   r   r   Úmanagersr   r   r   Úsignalsr   r   r    Úutilsr!   r"   r'   r2   ÚModelr4   Úadd_to_classÚDateTimeFieldÚBooleanFieldrÊ   r<   r+   r*   ú<module>rã      sÆ   ðÛ ß ,Ý Ý Ý ß .Ó .ã Ý 4Ý 2ß $Ý -Ý 4Ý !÷÷ ñ ÷ñ ÷
 DÑ Cß 3ò	ò0ô]�f—l‘lô ]ð@	 × Ñ ˜ZÐ)=¨×)=Ñ)=ÀuÐSWÐbfÔ)gÔ hØ × Ñ Ð:Ð<O¸F×<OÑ<OÐY^ÐhmÔ<nÔ oô8�oõ 8r+   