Ë
    ¸2Úi;  ã                   ó²   — d dl mZmZ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 ddlmZ  G d„ dej"                  «      Z G d	„ d
e«      Z G d„ de«      Zy)é    )ÚOptionalÚTupleÚType)Úsettings)Úmodelsé   )ÚDELETED_INVISIBLEÚDELETED_ONLY_VISIBLEÚDELETED_VISIBLEÚ
FIELD_NAMEÚSOFT_DELETEÚSOFT_DELETE_CASCADE)ÚSafeDeleteQuerysetc                   óþ   ‡ — e Zd ZU dZeZeed<   dZe	ed<   e
Zddeee
      fˆ fd„Zd„ Zdej"                  fd	„Zdej"                  fd
„Zdej"                  fd„Zddeej,                  ef   fˆ fd„Zed„ «       Zˆ xZS )ÚSafeDeleteManagera‚  Default manager for the SafeDeleteModel.

    If _safedelete_visibility == DELETED_VISIBLE_BY_PK, the manager can returns deleted
    objects if they are accessed by primary key.

    :attribute _safedelete_visibility: define what happens when you query masked objects.
        It can be one of ``DELETED_INVISIBLE`` and ``DELETED_VISIBLE_BY_PK``.
        Defaults to ``DELETED_INVISIBLE``.

        >>> from safedelete.models import SafeDeleteModel
        >>> from safedelete.managers import SafeDeleteManager
        >>> class MyModelManager(SafeDeleteManager):
        ...     _safedelete_visibility = DELETED_VISIBLE_BY_PK
        ...
        >>> class MyModel(SafeDeleteModel):
        ...     _safedelete_policy = SOFT_DELETE
        ...     my_field = models.TextField()
        ...     objects = MyModelManager()
        ...
        >>>

    :attribute _queryset_class: define which class for queryset should be used
        This attribute allows to add custom filters for both deleted and not
        deleted objects. It is ``SafeDeleteQueryset`` by default.
        Custom queryset classes should be inherited from ``SafeDeleteQueryset``.
    Ú_safedelete_visibilityÚpkÚ_safedelete_visibility_fieldÚqueryset_classc                 ó>   •— t         t        | �  «        |r|| _        yy)a%  Hook for setting custom ``_queryset_class``.

        Example:

            class CustomQueryset(models.QuerySet):
                pass

            class MyModel(models.Model):
                my_field = models.TextField()

                objects = SafeDeleteManager(CustomQuerySet)
        N)Úsuperr   Ú__init__Ú_queryset_class)Úselfr   Ú	__class__s     €úJ/var/www/html/acx/venv/lib/python3.12/site-packages/safedelete/managers.pyr   zSafeDeleteManager.__init__1   s#   ø€ ô 	Ô Ñ/Ô1ÙØ#1ˆDÕ ð ó    c                 óÀ   — | j                  | j                  | j                  ¬«      }| j                  |j                  _        | j
                  |j                  _        |S )N)Úusing)r   ÚmodelÚ_dbr   Úqueryr   )r   Úquerysets     r   Úget_querysetzSafeDeleteManager.get_querysetB   sH   € à×'Ñ'¨¯
©
¸$¿(¹(Ð'ÓCˆØ04×0KÑ0Kˆ�‰Ô-Ø6:×6WÑ6Wˆ�‰Ô3Øˆr   Úreturnc                 ó.   — | j                  t        ¬«      S )z¹Show all models including the soft deleted models.

        .. note::
            This is useful for related managers as those don't have access to
            ``all_objects``.
        ©Úforce_visibility)Úallr   ©r   s    r   Úall_with_deletedz"SafeDeleteManager.all_with_deletedI   s   € ð �x‰xÜ,ð ó 
ð 	
r   c                 ó.   — | j                  t        ¬«      S )z­Only show the soft deleted models.

        .. note::
            This is useful for related managers as those don't have access to
            ``deleted_objects``.
        r'   )r)   r
   r*   s    r   Údeleted_onlyzSafeDeleteManager.deleted_onlyT   s   € ð �x‰xÜ1ð ó 
ð 	
r   c                 óp   — |j                  dd«      }| j                  «       }|�||j                  _        |S )aF  Pass kwargs to ``SafeDeleteQuerySet.all()``.

        Args:
            force_visibility: Show deleted models. (default: {None})

        .. note::
            The ``force_visibility`` argument is meant for related managers when no
            other managers like ``all_objects`` or ``deleted_objects`` are available.
        r(   N)Úpopr$   r"   Ú_safedelete_force_visibility)r   Úkwargsr(   Úqss       r   r)   zSafeDeleteManager.all_   s=   € ð "Ÿ:™:Ð&8¸$Ó?Ðð ×ÑÓ ˆØÐ'Ø4DˆB�H‰HÔ1Øˆ	r   c                 ó  •— d}| j                   j                  «       s0d|v s,| j                   j                  j                  j                  |v r…  | j                  «       j                  di |¤Žj                  di t        di¤Žj                  «       }|r?|j                  | j                  «       v r#t        |t        d«       |j                  «        d}t        t        | �B  |fi |¤Ž\  }}|rt#        t$        dd«      rd}||fS )a:  See :func:`~django.db.models.Query.update_or_create.`.

        Change to regular djangoesk function:
        Regular update_or_create() fails on soft-deleted, existing record with unique constraint on non-id field
        If object is soft-deleted we don't update-or-create it but reset the deleted field to None.
        So the object is visible again like a create in any other case.

        Attention: If the object is "revived" from a soft-deleted state the created return value will
        still be false because the object is technically not created unless you set
        SAFE_DELETE_INTERPRET_UNDELETED_OBJECTS_AS_CREATED = True in the django settings.

        Args:
            defaults: Dict with defaults to update/create model instance with
            kwargs: Attributes to lookup model instance with
        Fr   NTÚ2SAFE_DELETE_INTERPRET_UNDELETED_OBJECTS_AS_CREATED© )r    Úhas_unique_fieldsÚ_metar   Únamer+   ÚfilterÚexcluder   ÚfirstÚ_safedelete_policyÚget_soft_delete_policiesÚsetattrÚsaver   r   Úupdate_or_createÚgetattrr   )r   Údefaultsr1   Úrevived_soft_deleted_objectÚdeleted_objectÚobjÚcreatedr   s          €r   r@   z"SafeDeleteManager.update_or_createq   s÷   ø€ ð$ ',Ð#Ø�:‰:×'Ñ'Ô)¨T°V©^¸t¿z¹z×?OÑ?O×?RÑ?R×?WÑ?WÐ[aÑ?aàMÐ;˜T×2Ñ2Ó4×;Ñ;ÑE¸fÑE×MÑMÑcÔQ[Ð]aÐPbÑc×iÑiÓkˆNñ  .×"CÑ"CÀt×GdÑGdÓGfÑ"fÜ˜¬
°DÔ9Ø×#Ñ#Ô%Ø.2Ð+ô Ô.°ÑFÀxÑZÐSYÑZ‰ˆˆWñ 'ÜœÐ"VÐX]Ô^ØˆGà�Gˆ|Ðr   c                  ó   — t         t        gS )z;Returns all states which stand for some kind of soft-delete)r   r   r5   r   r   r=   z*SafeDeleteManager.get_soft_delete_policies˜   s   € ô Ô0Ð1Ð1r   )N)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r	   r   ÚintÚ__annotations__r   Ústrr   r   r   r   r   r$   r   ÚQuerySetr+   r-   r)   r   ÚModelÚboolr@   Ústaticmethodr=   Ú__classcell__)r   s   @r   r   r      s    ø… ñð6 #4Ð˜CÓ3Ø(,Ð  #Ó,Ø(€Oñ2 x°Ð5GÑ0HÑ'Iõ 2ò"ð	
 &§/¡/ó 	
ð	
˜fŸo™oó 	
ð˜vŸ™ó ñ$%¸5ÀÇÁÈtÐASÑ;Tõ %ðN ñ2ó ô2r   r   c                   ó   — e Zd ZdZeZy)ÚSafeDeleteAllManagerz³SafeDeleteManager with ``_safedelete_visibility`` set to ``DELETED_VISIBLE``.

    .. note::
        This is used in :py:attr:`safedelete.models.SafeDeleteModel.all_objects`.
    N)rH   rI   rJ   rK   r   r   r5   r   r   rU   rU   ž   s   „ ñð -Ñr   rU   c                   ó   — e Zd ZdZeZy)ÚSafeDeleteDeletedManagerz¼SafeDeleteManager with ``_safedelete_visibility`` set to ``DELETED_ONLY_VISIBLE``.

    .. note::
        This is used in :py:attr:`safedelete.models.SafeDeleteModel.deleted_objects`.
    N)rH   rI   rJ   rK   r
   r   r5   r   r   rW   rW   ¨   s   „ ñð 2Ñr   rW   N)Útypingr   r   r   Údjango.confr   Ú	django.dbr   Úconfigr	   r
   r   r   r   r   r#   r   ÚManagerr   rU   rW   r5   r   r   ú<module>r]      sM   ðß (Ñ (å  Ý ÷÷ õ )ôJ2˜Ÿ™ô J2ôZ-Ð,ô -ô2Ð0õ 2r   