
    Bh2                         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mZ d dlmZ d dlmZ  G d	 d
ej$                        Z G d d      Zy)    )models)timezone)gettext_lazy)	constants)PlaceholderRelationField)ContentAdminManagerPageContentManager)Page)get_cms_settingc                      e Zd Zej                   ed      fej                   ed      fej                   ed      ffZ e	d      rej                  n e	d      r e	d      d   d   ndZej                   ed      fej                   ed	      fej                   ed
      fej                   ed      ffZ e	d      D  cg c]  \  }}|t        |      f c}}}} Zg dZ ej(                   ed      dd      Z ej(                   ed      d ed            Z ej(                   ed      ddd ed            Z ej(                   ed      ddd ed            Z ej2                   ed      dd ed            Z ej(                   ed      ddd ed            Z ej8                  eej<                   ed       d!"      Z ej@                   ed#      d$e!jD                  %      Z# e$       Z% ej(                   ed&      ejL                  d$'      Z' ej(                   ed(      ejL                  d$'      Z( ej@                  d)      Z) ejT                   ed*      dd+      Z+ ejT                   ed,      dd$ ed-      .      Z, ej(                   ed/      d0e ed1      e2      Z- ej\                   ed3      ej                  eddd ed4      5      Z/ ej`                  e e	d6       ed7      8      Z1 e2       Z3 e4       Z5	  G d9 d:      Z6d; Z7d< Z8d= Z9fd>Z:dLd?Z;d@ Z<dA Z=dB Z>dC Z?dD Z@dE ZAdF ZBdG ZCdH ZDdI ZEdJ ZFdLdKZGxZHS c c}}}} w )MPageContentzno limit setzfor logged in users onlyzfor anonymous users onlyTEMPLATE_INHERITANCE	TEMPLATESr    zInherit from parent pageDenyzOnly this websiteAllow)titleredirect
page_title
menu_titlemeta_descriptionlanguage   T)
max_lengthdb_indexr      zThe default title)verbose_namer   	help_textz
Page TitlezGOverwrites what is displayed at the top of your browser or in bookmarks)r   r   blanknullr   z
Menu Titlez'Overwrite what is displayed in the menuzDescription meta tagz1A description of the page used by search engines.)r   r   r    r   r   i   zRedirects to this URL.pagepagecontent_set)	on_deleter   related_namezcreation dateF)r   editabledefaultz
created by)r   r   r%   z
changed by)auto_nowzin navigation)r   r&   r   z	soft rootz5All ancestors will not be displayed in the navigation)r   r   r&   r   templated   z(The template used to render the content.)r   r   choicesr   r&   zmenu visibilityz+limit when this page is visible in the menu)r   r&   r*   r   r   r    r   DEFAULT_X_FRAME_OPTIONSzX Frame Options)r*   r&   r   c                   8    e Zd Z ed      Z ed      Zg ZdZdZy)PageContent.Metazpage contentzpage contents))r   r!   cmsN)	__name__
__module____qualname___r   verbose_name_pluraldefault_permissionsunique_together	app_label     H/home/dcms/DCMS/lib/python3.12/site-packages/cms/models/contentmodels.pyMetar-      s)    (0 1
 	r8   r:   c                 :    | j                    d| j                   dS )Nz ())r   r   selfs    r9   __str__zPageContent.__str__   s    **Ra00r8   c                     d| j                    d| j                  j                   d| j                   dt	        t        |              d	}|S )N<.z id=z object at >)r0   	__class__r/   pkhexid)r>   displays     r9   __repr__zPageContent.__repr__   sJ    doo&a(?(?'@TWWI[Y\]_`d]eYfXgghir8   c                     |j                         D ]  \  }}t        | ||        | j                  |j                                y )N)update_fields)itemssetattrsavekeys)r>   datafieldvalues       r9   updatezPageContent.update   s;     JJL 	(LE5D%'	(					,r8   c                 T    t        | d      rt        | d       t        |   di | y )N_template_cacher7   )hasattrdelattrsuperrN   )r>   kwargsrD   s     r9   rN   zPageContent.save   s(    4*+D+,vr8   c                     t        | j                        }|dv r|}n| }| j                  |       ||k7  r| j                  j	                          |S )zT
        Toggles (or sets) in_navigation and invalidates the cms page cache
        )TF)in_navigation)boolr[   rS   r!   clear_cache)r>   set_tooldnews       r9   toggle_in_navigationz PageContent.toggle_in_navigation   sT     4%%&]"C'C#& #:II!!#
r8   c                 8    | j                   j                  |      S N)r!   has_change_permissionr>   users     r9   !has_placeholder_change_permissionz-PageContent.has_placeholder_change_permission   s    yy..t44r8   c                 8    | j                   j                  |      S rc   )r!   has_publish_permissionre   s     r9   ri   z"PageContent.has_publish_permission   s    yy//55r8   c                     ddl m}  ||       S )zV
        Rescan and if necessary create placeholders in the current template.
        r   )rescan_placeholders_for_obj)cms.utils.placeholderrk   )r>   rk   s     r9   rescan_placeholderszPageContent.rescan_placeholders   s     	F*400r8   c                 p    t        | d      s| j                  j                         | _        | j                  S )N_placeholder_cache)rV   placeholdersallro   r=   s    r9   get_placeholderszPageContent.get_placeholders   s0    t12&*&7&7&;&;&=D#&&&r8   c                     t         j                  j                  | j                  j	                         | j
                        S )N)page__inr   )r   objectsfilterr!   get_ancestor_pagesr   r=   s    r9   get_ancestor_titleszPageContent.get_ancestor_titles   s7    ""))YY113]] * 
 	
r8   c                 f   t        d      sg S t        | d      s| j                  t        j                  k(  rh| j                         j                  t        j                        j                  d      j                  dd      }|r|d   }n1t        d      d   d   }n| j                  xs t        d      d   d   }t        d      D ]  \  }}}||k(  s|d	k(  s|| _	         n t        d      d   d
   | _	        t        | j                  t              r| j                  f| _	        | j                  S )zS
        Returns a list of placeholder slots for this page content object.
        PLACEHOLDERS_placeholder_slot_cacher(   -page__pathr(   Tflatr   r      )r   rV   r(   r   TEMPLATE_INHERITANCE_MAGICrx   excludeorder_byvalues_listr{   
isinstancestr)r>   	templatesplaceholder_setkeyrR   __s         r9   get_placeholder_slotsz!PageContent.get_placeholder_slots   s&    ~.It67}}	 D DD((*Wi&J&JWKXm, [$[7  &/lO&5n&Ea&H&KO"&--"X?>3RST3UVW3X"1."A UUB/)SBY38D0U
 0?~/Nq/QRS/T,d22C8,0,H,H+JD(+++r8   c                 (   t        | d      r| j                  S t        d      sy| j                  t        j
                  k7  r0| j                  xs t        d      d   d   | _        | j                  S | j                         j                  t        j
                        j                  d      j                  dd	      }	 |d   | _        | j                  S # t        $ r1 t        d      rt        d      d   d   nd| _        Y | j                  S w xY w)
z
        get the template of this page if defined or if closer parent if
        defined or DEFAULT_PAGE_TEMPLATE otherwise
        rU   r   r   r   r|   r}   r(   Tr~   )rV   rU   r   r(   r   r   rx   r   r   r   
IndexError)r>   r   s     r9   get_templatezPageContent.get_template   s   
 4*+'''{+==I@@@#'==#VOK4PQR4STU4VD '''   "WiBBWCXm$[$[/ 		n#,Q<D  ###  	nIXYdIe?;#?#B1#EkmD ###	ns   
C ,DDc                 v    | j                         }t        d      D ]  }|d   |k(  s|d   c S  t        d      S )z
        get the textual name (2nd parameter in get_cms_setting('TEMPLATES'))
        of the template of this title. failing to find that, return the
        name of the default template.
        r   r   r   r&   )r   r   r2   )r>   r(   ts      r9   get_template_namezPageContent.get_template_name  sG     $$& - 	Atxt	 |r8   c                      y)zreturns True if page content object itself can be edited. Does not check
        user permissions to do that.

        :rtype: ``bool``
        Tr7   r>   requests     r9   is_editablezPageContent.is_editable#       r8   c                 B    | j                  | j                        rdS dS )zreturns the content indicator status. Without additional packages like
        djangocms-versioning page content always is public.

        :rtype: ``str``
        r   publiczunpublished-parent)get_absolute_urlr   r=   s    r9   content_indicatorzPageContent.content_indicator+  s$      00$--0HxbNbbr8   c                 6   | j                   xs t        j                  }|t        j                  k7  r|S | j                         j	                  d      }|j                  t        j                        }|j                  dd      }	 |d   S # t        $ r Y yw xY w)z- Finds X_FRAME_OPTION from tree if inherited r}   )xframe_optionsr   Tr~   r   N)r   r   X_FRAME_OPTIONS_INHERITrx   r   r   r   r   )r>   r   	ancestorss      r9   get_xframe_optionszPageContent.get_xframe_options3  s    ,,Q	0Q0QY>>>!! ,,.77F	%%Y5V5V%W	 #../?d.K	!!$$ 		s   B 	BBc                 V    | j                   j                  |xs | j                        S )zGet the absolute url for the page content. If language is specified it will return
        the absolute url of the corresponding "sister" content.r   )r!   r   r   )r>   r   s     r9   r   zPageContent.get_absolute_urlF  s%     yy))83Lt}})MMr8   rc   )Ir/   r0   r1   r   VISIBILITY_ALLr2   VISIBILITY_USERSVISIBILITY_ANONYMOUS LIMIT_VISIBILITY_IN_MENU_CHOICESr   r   TEMPLATE_DEFAULTr   X_FRAME_OPTIONS_DENYX_FRAME_OPTIONS_SAMEORIGINX_FRAME_OPTIONS_ALLOWX_FRAME_OPTIONS_CHOICEStemplate_choiceseditable_fieldsr   	CharFieldr   r   r   r   	TextFieldr   r   
ForeignKeyr
   CASCADEr!   DateTimeFieldr   nowcreation_dater   rp   PAGE_USERNAME_MAX_LENGTH
created_by
changed_bychanged_dateBooleanFieldr[   	soft_rootr(   SmallIntegerFieldlimit_visibility_in_menuIntegerFieldr   r	   ru   r   admin_managerr:   r?   rI   rS   rN   ra   rg   ri   rm   rr   rx   r   r   r   r   r   r   r   __classcell__).0xyr2   rD   s   0000@r9   r   r      s   		!	!1^#45		#	#Q'A%BC		'	'+E)FG($
 @O@ y;;L[\gLhok&B1&Ea&Hnp  
	*	*A.H,IJ		'	'63		-	-q1D/EF		(	(!G*5	 />k.JKKdaAaD	KO  v*"tLHFwZ'(E
 "!!|_U
J "!!|_=>J (v''-.GH	  vz],-H 6..vY&	D )F(('M ,-L!!!|_55J
 "!!|_55J
 (6''6L'F'''M
 $##{^KL	I  vz] >? H  8v77()((0AB  )V((' 9:()N !"G')M	 	1-
$561'

,B$:
c&NU	 Ls   M#
r   c                   R    e Zd ZdZdZdZdZdZdZdZ	dZ
dZdZdZd	dZd Zd Zd Zy)
EmptyPageContentz
    Empty title object, can be returned from :meth:`cms.models.pagemodel.Page.get_content_obj` if required
    title object doesn't exist.
    r   NFc                 r    || _         || _        t        d      rt        d      d   d   | _        y d| _        y )Nr   r   r   )r   r!   r   r(   )r>   r   r!   s      r9   __init__zEmptyPageContent.__init__\  s5     	;'+K8;A>DMDMr8   c                      y)NFr7   r=   s    r9   __bool__zEmptyPageContent.__bool__d  s    r8   c                      y)zjreturns the content indicator status. Empty page content always is empty

        :rtype: ``str``
        emptyr7   r=   s    r9   r   z"EmptyPageContent.content_indicatorg  s    
 r8   c                      y)zreturns True if empty page content object itself can be edited. Since editing creates a new
        page content object this should always be True

        :rtype: ``bool``
        Tr7   r   s     r9   r   zEmptyPageContent.is_editablen  r   r8   rc   )r/   r0   r1   __doc__r   r   r   application_urlsr   r   r   r(   r   r[   r   r   r   r   r7   r8   r9   r   r   L  sQ     EHJJNHIMr8   r   N)	django.dbr   django.utilsr   django.utils.translationr   r2   r.   r   cms.models.fieldsr   cms.models.managersr   r	   cms.models.pagemodelr
   cms.utils.confr   Modelr   r   r7   r8   r9   <module>r      s<     ! 6  6 G % *}N&,, }N@
( (r8   