
    h                         d dl Z d dlmZ d dlmZ d dlmZ ddlmZ ddlmZ ddlm	Z	  G d	 d
      Z
 G d d      Z G d d      Zy)    N)copy)get_user_model)models   )	constants)	PUBLISHED)Versionc                   6     e Zd ZdZdZ fdZ fdZd Z xZS )PublishedContentManagerMixinz@Manager mixin used for overriding the managers of content modelsTc                 h    t         |          }| j                  s|S |j                  t              S )z)Limit query to published content
        )versions__state)superget_querysetversioning_enabledfilterr   )selfqueryset	__class__s     M/home/dcms/DCMS/lib/python3.12/site-packages/djangocms_versioning/managers.pyr   z)PublishedContentManagerMixin.get_queryset   s1     7')&&Oy99    c                 l   t        |   |i |}|j                  dd       }t        |t	                     st        | dd       }|r#t        j                  j                  ||       |S t        j                  d|j                  j                   d|j                  j                   dt        d       |S )	N
created_by_user)contentr   z.No user has been supplied when creating a new zm object. No version could be created. Make sure that the creating code also creates a Version objects or use z$.objects.with_user(user).create(...)   )
stacklevel)r   createget
isinstancer   getattrr	   objectswarningswarnr   __name__UserWarning)r   argskwargsobjr   r   s        r   r   z#PublishedContentManagerMixin.create   s    gnd-f-ZZd3
*n&67 w5JOO""3:"F 
 MM@AWAW@X Y**---*@*@)AAeg 	 
r   c                     t        |t                     sT|Rdd l}|j                         }|j	                  |d      }|d   d   }t        d| dt               j                   d      t        |       }||_        |S )Nr   r   r      zWith versioning enabled, z requires a z- instance to be passed as created_by argument)	r   r   inspectcurrentframegetouterframes
ValueErrorr$   r   r   )r   userr+   curframe	callframecalling_functionnew_managers          r   	with_userz&PublishedContentManagerMixin.with_user(   s    $ 01d6F++-H..x;I(|A/0@/AnN^NgNgMh i: ;  4j r   )	r$   
__module____qualname____doc__r   r   r   r4   __classcell__r   s   @r   r   r      s    J: r   r   c            
           e Zd Z ej                   ej
                   ej                  ej                  ej                  fd       ej                  d                  Z ej                   ej
                   ej                   ej                  ej                  ej                  f       d       ej                  d                  Z fdZd Zd	 Z xZS )
AdminQuerySetMixinversions__pk)versions__state__inthenr   defaultr=   )r>   c                 F    t         |          }| j                  |_        |S )N)r   _chain_group_by_key)r   cloner   s     r   rC   zAdminQuerySetMixin._chainL   s"     "00r   c                     | j                  t        j                  t        j                  f      j                  | j
                   j                  t        j                  d            j	                  d      } | j                   dd|i|S )ad  Returns a queryset current content versions. Current versions are either draft
        versions or published versions (in that order). This optimized query assumes that
        draft versions always have a higher pk than any other version type. This is true as long as
        no other version type can be converted to draft without creating a new version.rA   r<   vers_pkrH   versions__pk__in )	r   r   DRAFTr   valuesrD   annotater   Max)r   r'   	pk_filters      r   current_contentz"AdminQuerySetMixin.current_contentR   st    DKKY__iFYFY4ZK[VT'')Xfjj8X9VI 	 t{{@I@@@r   c                 8    | j                   | j                   j                  | j                  | j                        j                  t        j                  t        j                  dd      d            j                  d      } | j                  d
d	|i|S )aq  Returns the "latest" content object which is in this order
           1. a draft version (should it exist)
           2. a published version (should it exist)
           3. any other version with the highest pk

        This filter assumes that there can only be one draft created and that the draft as
        the highest pk of all versions (should it exist).
        )h1h2r   rR   )h1__gtr>   rS   r?   rG   rH   rI   rJ   )	rL   rD   rM   _DraftOrPublished	_AnyOtherr   CaseWhenr   )r   r'   latests      r   latest_contentz!AdminQuerySetMixin.latest_content^   s}     $++t1128t55$..8I8FKK140PZ^$_8`6)$ 	
 t{{=F=f==r   )r$   r5   r6   r   rN   rW   rX   r   rK   r   ValuerU   QrV   rC   rP   rZ   r8   r9   s   @r   r;   r;   8   s    "

FKKY__i>Q>Q,R+- FLLO	
 

FKKy	@S@S.TUU#% !FLLO		
I
A>r   r;   c                   2     e Zd ZdZg Z fdZd Zd Z xZS )AdminManagerMixinTc                 V   t         |          j                  }| j                  s;ddlm} |j                  | j                        }t        |j                        | _         t        d|j                   t        |fd| j                  i      | j                  | j                        }|S )Nr   )versionablesAdminrD   )using)r   r   r   rD    r`   for_contentmodellistgrouping_fieldstyper$   r;   _db)r   qs_classr`   versionableqsr   s        r   r   zAdminManagerMixin.get_querysett   s    7')33!! '&224::>K!%k&A&A!BD
TH%%&'*d001
 **DHH	&
 	r   c                 B     | j                         j                  di |S )z0Syntactic sugar: admin_manager.current_content()rJ   )r   rP   r   r'   s     r   rP   z!AdminManagerMixin.current_content   s!    2t  "22<V<<r   c                 B     | j                         j                  di |S )z/Syntactic sugar: admin_manager.latest_content()rJ   )r   rZ   rn   s     r   rZ   z AdminManagerMixin.latest_content   s!    1t  "11;F;;r   )	r$   r5   r6   r   rD   r   rP   rZ   r8   r9   s   @r   r^   r^   p   s    M=<r   r^   )r"   r   django.contrib.authr   	django.dbr   rc   r   r   r	   r   r;   r^   rJ   r   r   <module>rr      s:      .     ) )X5> 5>p< <r   