
    h<                        d dl Z d dlmZ d dlmZ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 d d
lmZmZmZ d dlmZ d dlmZmZ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) ddl*m+Z+ ddl,m-Z- ddl.m/Z/ ddl0m1Z1m2Z2m3Z3 ddl4m5Z5 ddl6m7Z7m8Z8m9Z9m:Z:m;Z;m<Z< ddl=m>Z>m?Z? ddl@m(Z( ddlAmBZB  G d de      ZCd ZDd ZEd ZFd  ZGd! ZHd" ZI G d# d$e-      ZJ G d% d&e      ZKy)'    N)__version__)CMSAppConfigCMSAppExtension)PageContent)get_language_listget_language_tuple)copy_plugins_to_placeholder)admin_reverse)settings)flatten_fieldsets)ImproperlyConfiguredObjectDoesNotExistPermissionDenied)Prefetch)HttpResponseHttpResponseBadRequestHttpResponseForbidden)	force_str)cached_property)now)gettext_lazy)Version   )
indicators)VersioningAdminMixinINDICATOR_DESCRIPTIONS)BaseVersionableItemVersionableItemdefault_copy)ConditionFailed)!get_latest_admin_viewable_content"inject_generic_relation_to_versionis_editableregister_versionadmin_proxyreplace_admin_for_modelsreplace_manager)AdminManagerMixinPublishedContentManagerMixin)CMSToolbarVersioningMixinc                   n    e Zd Zd Zed        Zd Zed        Zd Zd Z	d Z
d Zd	 Zd
 Zd Zd Zd Zy)VersioningCMSExtensionc                 .    g | _         i | _        i | _        y N)versionablesadd_to_contextadd_to_field_extensionselfs    O/home/dcms/DCMS/lib/python3.12/site-packages/djangocms_versioning/cms_config.py__init__zVersioningCMSExtension.__init__/   s     &(#    c                 V    | j                   D ci c]  }|j                  | c}S c c}w )z:Returns a dict of {content_model_cls: VersionableItem obj})r/   content_modelr3   versionables     r4   versionables_by_contentz.VersioningCMSExtension.versionables_by_content4   s4     GKFWFW
7BK%%{2
 	
 
s   &c                     || j                   v S )zCReturns if the content model is registered for versioning.
        )r;   )r3   r8   s     r4   is_content_model_versionedz1VersioningCMSExtension.is_content_model_versioned;   s      < <<<r6   c                 n    | j                   D ci c]  }|j                  r|j                  | c}S c c}w )z:Returns a dict of {grouper_model_cls: VersionableItem obj})r/   concretegrouper_modelr9   s     r4   versionables_by_grouperz.VersioningCMSExtension.versionables_by_grouper@   s>    
  $00
## %%{2
 	
 
s    2c                     || j                   v S )z?Returns if the grouper model has been registered for versioning)rA   )r3   r@   s     r4   is_grouper_model_versionedz1VersioningCMSExtension.is_grouper_model_versionedJ   s     < <<<r6   c                    t        |j                  t        j                  j                        st        d      |j                  D ]  }t        |t              st        |d      | j                  D cg c]  }|j                   }}|j                  |v rt        |j                  d      | j                  j                  |        yc c}w )znCheck the versioning setting has been correctly set
        and add it to the masterlist if all is ok
        z%versioning not defined as an iterablezM is not a subclass of djangocms_versioning.datastructures.BaseVersionableItemz has already been registeredN)

isinstance
versioningcollectionsabcIterabler   r   r/   r8   append)r3   
cms_configr:   vregistered_so_fars        r4   handle_versioning_settingz0VersioningCMSExtension.handle_versioning_settingN   s    
 *//1I1IJ&'NOO%00 	2Kk+>?*"o%rs 
 ;?:K:K LQ L L((,==*"0033OP  $$[1	2 !Ms   5Cc                    |j                   }dg}|j                         D ]d  \  }}||vrt        |d      || j                  vr!t	        j
                         | j                  |<   | j                  |   j                  |       f y)z
        Check versioning_add_to_confirmation_context has been correctly set
        and add it to the master dict if all is ok
        	unpublishzR is not a supported dict key in the versioning_add_to_confirmation_context settingN)&versioning_add_to_confirmation_contextitemsr   r0   rG   OrderedDictupdate)r3   rK   r0   supported_keyskeyvalues         r4   5handle_versioning_add_to_confirmation_context_settingzLVersioningCMSExtension.handle_versioning_add_to_confirmation_context_settingd   s    
 $JJ%(..0 	3JC.(*gop  $---+6+B+B+D##C($++E2	3r6   c                    t        |j                  D cg c]  }|j                  |j                  f c}       t        |j                  D cg c]&  }|j                  |j
                  |j                  f( c}       yc c}w c c}w )zReplaces admin model classes for all registered content types
        with an admin model class that inherits from `versionable.content_admin_mixin`.
        N)r&   rF   r8   content_admin_mixingrouper_admin_mixinr@   r3   rK   r:   s      r4   handle_admin_classesz+VersioningCMSExtension.handle_admin_classest   s     	! $.#8#8 **K,K,KL	
 	! $.#8#8K<[<[<g **K,K,KL	
s   B +Bc                 V    |j                   D ]  }|j                  st        |        y)z
        Registers version admin for all registered content types
        with filtering by content type applied, so only versions for
        that specific content type are shown.
        N)rF   r?   r%   r\   s      r4   handle_version_adminz+VersioningCMSExtension.handle_version_admin   s*     &00 	9K##+K8	9r6   c                 P    |j                   D ]  }t        |j                          y)zVAdds `versions` GenericRelation field to all provided
        content models.
        N)rF   r#   r8   r\   s      r4   %handle_content_model_generic_relationz<VersioningCMSExtension.handle_content_model_generic_relation   s)     &00 	JK.{/H/HI	Jr6   c           	          |j                   D ]M  }t        |j                  dt               t        |j                  dt        t        |j                               O y)z{Replaces default manager in provided content models with
        one inheriting from PublishedContentManagerMixin.
        objectsadmin_manager)_group_by_keyN)rF   r'   r8   r)   r(   listgrouping_fieldsr\   s      r4   handle_content_model_managerz3VersioningCMSExtension.handle_content_model_manager   sR     &00 	MKK55yB^_K55HY*.{/J/J*KM	Mr6   c                     t        |dd      }t        |t              st        d      |D ])  }|j	                         D ]  }||   | j
                  |<    + y)zXAllows for the transformation of a given field in the ExtendedVersionAdminMixin
        extended_admin_field_modifiersNz;extended_admin_field_modifiers must be list of dictionaries)getattrrE   rf   r   keysr1   )r3   rK   rj   modifierrV   s        r4   handle_admin_field_modifiersz3VersioningCMSExtension.handle_admin_field_modifiers   sh     *1=]_c)d&8$?&'dee6 	AH}} A3;C=++C0A	Ar6   c                 b   t        |d      r| j                  |       t        |d      }t        |d      }|s|st        d      |r| j                  |       |rV| j	                  |       | j                  |       | j                  |       | j                  |       | j                  |       y y )Nrj   rQ   rF   zPThe versioning or versioning_add_to_confirmation_context setting must be defined)	hasattrrn   r   rX   rN   r]   r_   ra   rh   )r3   rK   has_extra_contexthas_models_to_registers       r4   configure_appz$VersioningCMSExtension.configure_app   s    :?@--j9 $@
 ")\!B )?&b  FFzR!**:6%%j1%%j166zB--j9 "r6   N)__name__
__module____qualname__r5   r   r;   r=   rA   rC   rN   rX   r]   r_   ra   rh   rn   rs    r6   r4   r,   r,   .   sd    )
 
 
=
 
 
=2,3 
"9JMA:r6   r,   c                 :    t        |       }t               |_        |S )zOCopy the PageContent object and deepcopy its
    placeholders and plugins.
    )r    r   creation_date)original_contentnew_contents     r4   copy_page_contentr|      s     /0K #Kr6   c                     | j                  |      xs t        d      }| j                  |      }|rd| dn
t        d      }| d| dS )z;
    Override the label for each grouper select option
    zNo available title/Unpublishedz ())	get_title_get_path)objlanguagetitlepaths       r4   label_from_instancer      sT     MM(#>q)='>E<<!DQtfA;Am$4DWBtfAr6   c                     | j                   j                  }| j                   j                  }|j                  |       |j                  r|j                          |j                  |       |j                  d       y)zGUrl path and cache operations to do when a PageContent obj is publishedTmenuN)contentpager   _update_url_pathis_home_remove_title_root_path_update_url_path_recursiveclear_cacheversionr   r   s      r4   on_page_content_publishr      s`    ??D''H(#||$$&##H-$r6   c                     | j                   j                  }| j                   j                  }|j                  |       |j	                  d       y)zIUrl path and cache operations to do when a PageContent obj is unpublishedTr   N)r   r   r   r   r   r   s      r4   on_page_content_unpublishr      s?    ??D''H##H-$r6   c                 T    | j                   j                  }|j                  d       y)z4Clear cache when a new PageContent draft is created.Tr   Nr   r   r   r   r   s     r4   on_page_content_draft_creater      "    ??D$r6   c                 T    | j                   j                  }|j                  d       y)z7Clear cache when a new PageContent version is archived.Tr   Nr   r   s     r4   on_page_content_archiver      r   r6   c                   b     e Zd ZdZd fd	Z fdZd Z fdZed        Z	e
 fd       Z xZS )	VersioningCMSPageAdminMixinz0admin/djangocms_versioning/page/change_form.htmlc                    t         |   ||      }|rt        j                  j	                  |      }|j
                  j                  |j                        sf| j                  |      }|j                  rt        |j                        }t        |      }ddhj                  |      D ]  }|j                  |        |S )Nslugoverwrite_url)superget_readonly_fieldsr   rc   get_for_contentcheck_modifyas_booluserget_form_class	fieldsetsr   rf   intersectionremove)r3   requestr   fieldsr   formf_name	__class__s          r4   r   z/VersioningCMSPageAdminMixin.get_readonly_fields   s    ,Wc:oo55c:G''//=**73>>.t~~>Ff%7DDVL *FMM&)*r6   c                 Z    t         |   |      j                  t        dd            }|S )Nversionsprefetched_versions)to_attr)r   get_querysetprefetch_relatedr   )r3   r   querysetr   s      r4   r   z(VersioningCMSPageAdminMixin.get_queryset  s-    7'0hz;PQR 	r6   c                     |j                   j                  d      }t        j                  j                  |      }|| j	                  |      |j
                  }|r"|t        |j                  j                        vrt        t        t        d                  S t        ||      }| j                  ||      st        |j                         D ]  }	 |j                         j                  |j                         }|j%                  |j&                        }	|j)                  |j*                  |	      st-        t        t        d                  c S t/        |	||        t1        d	      S # t"        $ r Y w xY w)
Ntarget_languagepk)site_idz-Language must be set to a supported language!)r   )r   )slotz1You do not have permission to copy these plugins.ok)POSTgetr   _original_manager_get_404_exceptionr   r   noder   r   r   r   r"   has_change_permissionr   get_placeholdersr   r   get_plugins_listr   has_add_plugins_permissionr   r   r	   r   )
r3   r   	object_idr   source_page_contentr   target_page_contentplaceholdertargetpluginss
             r4   copy_languagez)VersioningCMSPageAdminMixin.copy_language  sb   !,,**+<=
 *;;??9?M&)))44"''/9JSWS\S\SdSd9e"e))A6e4f*ghh?_ ))'7J)K"".??A 	SK,==?CCIYIYCZ "223F3O3OPG44W\\7K,Yq9l7m-noo'/R	S D!! & s   *E11	E=<E=c                    | j                  ||      }t        j                  j                  |      }	 |j	                  |j
                         t        | )  ||      S # t        $ r}t        t        |            cY d }~S d }~ww xY w)N)r   )
get_objectr   rc   r   r   r   r!   r   r   r   change_innavigation)r3   r   r   page_contentr   er   s         r4   r   z/VersioningCMSPageAdminMixin.change_innavigation,  su    w)D//11,?	7  . w*7I>>  	7(166	7s   A   	B)B<BBc                     t         S )z-Publish indicator description to CMSPageAdminr   r2   s    r4   indicator_descriptionsz2VersioningCMSPageAdminMixin.indicator_descriptions6  s
     &%r6   c                 H   d}t        |j                  d      rt        |d      ryt        |j                  j                  D cg c]  }|j                  d    c}d       }|j                  j                  D ]  }||j
                  d<    |j                  |      }n|j                         }|r|dk(  rt        	| !  ||      S |j                  }t        d	      d
|j                  j                  d       z   }t        j                  ||||      }|r||fS d|fS c c}w )zjGet the indicator menu for PageContent object taking into account the
        currently available versionsz'admin/cms/page/tree/indicator_menu.htmlfiltered_translationsr   r   c                     | j                    S r.   r   )r   s    r4   <lambda>z@VersioningCMSPageAdminMixin.get_indicator_menu.<locals>.<lambda>D  s    WZZK r6   )rV   r   emptycms_pagecontent_changelistz
?language=r   )back )rp   r   sortedr   r   __dict__content_indicatorr   get_indicator_menu_versionr
   GETr   r   content_indicator_menu)
clsr   r   menu_templater   r   statusr   r   r   s
            r4   r   z.VersioningCMSPageAdminMixin.get_indicator_menu;  s&    B<$$&=>7<YnCo?K?P?P?f?fgG,,Q/g/H (,,BB 6.5  +6!33H=F "335F7*7-g|DD((9:z'++//ZdJeIf=gg00&(QUV $}d22"d22 hs   Dr.   )rt   ru   rv   change_form_templater   r   r   r   propertyr   classmethodr   __classcell__)r   s   @r4   r   r      sF    M
""H? & & 3 3r6   r   c                       e Zd ZdZdZ eedd      Z ee	ddgde
ieeeeeee      gZ ee       ed      k  reZ e	j.                  de        e	j.                  d	ej4                         y
)VersioningCMSConfigz-Implement versioning for core cms models
    TVERSIONING_CMS_MODELS_ENABLEDr   r   )r8   grouper_field_nameextra_grouping_fieldsversion_list_filter_lookupscopy_functiongrouper_selector_option_label
on_publishon_unpublishon_draft_create
on_archiverZ   z4.2r$   r   N)rt   ru   rv   __doc__cms_enabledrk   r   djangocms_versioning_enabledr   r   r   r|   r   r   r   r   r   r   rF   PackageVersioncms_versionr*   cms_toolbar_mixinadd_to_classr$   r   r   rw   r6   r4   r   r   T  s    K#*14$  	%%#-,)35G(H+*=.28. ;	
J k"^E%::5K]K8K0*2N2NOr6   r   )LrG   cmsr   r   cms.app_baser   r   
cms.modelsr   cms.utils.i18nr   r   cms.utils.pluginsr	   cms.utils.urlutilsr
   django.confr   django.contrib.admin.utilsr   django.core.exceptionsr   r   r   django.db.modelsr   django.httpr   r   r   django.utils.encodingr   django.utils.functionalr   django.utils.timezoner   django.utils.translationr   r   packaging.versionr   r   r   r   adminr   	constantsr   datastructuresr   r   r    
exceptionsr!   helpersr"   r#   r$   r%   r&   r'   managersr(   r)   modelsplugin_renderingr*   r,   r|   r   r   r   r   r   r   r   rw   r6   r4   <module>r     s     * 6 " @ 9 ,   8 
 & 
 , 3 % 6 7  ' - N N '  F  7P:_ P:f    ^3"6 ^3BP, Pr6   