
    Bh                    b   d dl mZ d dlZd dlZd dlmZ 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 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 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)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z> d dl?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZFmGZGmHZHmIZImJZJmKZK d dlLmMZM d dlNmOZO d dlPmQZQ d d lRmSZSmTZTmUZUmVZVmWZWmXZXmYZY d d!lZm[Z[m\Z\ d d"l]m^Z^ d d#l_m`Z` d d$lambZb d d%lcmdZdmeZemfZf d d&lgmhZh d d'limjZj d d(lkmlZlmmZmmnZnmoZo d d)lpmqZq d d*lrmsZs d d+ltmuZu  e5e@      Z@d, Zv G d- d.      Zw e
j                  eU       G d/ d0ewe
j                               Zz e
j                  eV       G d1 d2ewe
j                               Z{y)3    )annotationsN)
namedtuple)settings)adminmessages)	AdminForm)IS_POPUP_VAR)ContentType)Site)ObjectDoesNotExistPermissionDeniedValidationError)transaction)PrefetchQ)QuerySet)IntegerField)Http404HttpResponseHttpResponseBadRequestHttpResponseForbiddenHttpResponseRedirect	QueryDict)get_object_or_404render)escape)get_template)SimpleTemplateResponseTemplateResponse)re_path)method_decorator)	force_str)	mark_safe)capfirst)gettext)require_POST)
operations)AddPageFormAdvancedSettingsFormChangeListFormChangePageFormCopyPageFormCopyPermissionFormDuplicatePageFormMovePageForm)PERMISSION_ADMIN_INLINES)clear_permission_cache)MODAL_HTML_REDIRECT)	CMSPluginGlobalPagePermissionPagePageContentPagePermissionPageUrlPlaceholder)send_post_page_operationsend_pre_page_operation)plugin_pool)set_restart_trigger)get_object_edit_url)get_current_sitepage_permissionspermissions)jsonify_request)get_cms_setting)get_language_listget_language_objectget_language_tupleget_site_language_from_request)clear_permission_lru_caches)copy_plugins_to_placeholder)admin_reversec                    | j                   j                  d      }|s
t               S 	 t        j                  j                  |      }|S # t        j                  $ r t               }Y |S w xY w)Ncms_admin_site)sessiongetr?   r   objects_get_site_by_idDoesNotExist)requestsite_idsites      C/home/dcms/DCMS/lib/python3.12/site-packages/cms/admin/pageadmin.pyget_siterV   Y   sg    oo!!"23G!!"||++G4 K  "!K"s   A
 
A+*A+c                  &     e Zd ZdZdZ fdZ xZS )PageDeleteMessageMixinzQExpressive and simplified delete confirmation message for pages and translations.z'admin/cms/page/delete_confirmation.htmlc           	        dfdt        |      dk(  rWt        |d   t              rDt        t        j                  j                  |d   j                  |d   j                              }t        	| %  ||      \  }}}} |      }t        j                  j                  |j                  t        j                  j                  d      t        d      |j                  t        j                  j                  d      t         j                  j                  |j                  t         j                  j                  d      i}||||fS )zMinimize complexity of delete selected confirmation: Only show pages, page contents and plugins numbers,
        only show Page and PageContent objects in the details.
        c                6   t        | t              r| S g }| D ]}  } |      }t        |t              rL|j                  t        t        j
                  j                         d      rt        j                  d|      }|r$|j                  t        d|d   z   dz                |j                  t        d|j                  t        t        j
                  j                         d      z   dz                |j                  t        t        j
                  j                         d      s|j                  dt        |j                  t        t        j
                  j                         d                   i|sm|j                  |        |S )zRemove all objects that are not Page or PageContent from the nested list of deleted objects.
            Reformat the messages.z: z>(.*)<z<b>r   z</b>)
isinstancestr
startswithr$   r5   _metaverbose_namerefindallappendr#   removeprefixr8   insert)deleted_objectsresultobjitemtextrecursively_removes        rU   rj   zFPageDeleteMessageMixin.get_deleted_objects.<locals>.recursively_removep   sK    /3/&&F& ()#.dC(~~$**2I2I)J(K2&NO!zz)S9"MM)EDGOf4L*MN"MM )%$2C2CxPTPZPZPgPgGhFiikDl2m*mpv*v w 8GMM4N4N+O*PPR(STa43D3DQXQ^Q^QkQkHlGmmoEp3q)rsMM$'( M       r   pagelanguageTranslations)re   
list | strreturnrq   )lenr[   r6   listadmin_managerfilterrn   ro   superget_deleted_objectsr5   r^   verbose_name_pluralrN   _r8   r3   )
selfobjsrR   	to_deletetrad_model_countperms_needed	protectedmodel_countrj   	__class__s
           @rU   rx   z*PageDeleteMessageMixin.get_deleted_objectsk   s   
	. t9>ja+>1188d1gllUYZ[U\UeUe8fgD?Dw?Z[_ah?i<	#\9&y1	 JJ**,<,@,@A_A_ab,cn/33GMM4U4UWXYOO//1A1E1EiooFiFikl1m

 +|Y>>rk   )__name__
__module____qualname____doc__delete_confirmation_templaterx   __classcell__r   s   @rU   rX   rX   f   s    [#L (? (?rk   rX   c                      e Zd ZdZeZeZeZ	e
ZdZg dZd Zd Zd#dZd#dZd Zd	 Zd
 Z fdZ fdZd Z fdZd# fd	Zd# fd	Zd#dZd Zd Zeej@                  d               Z!d Z"d#dZ# fdZ$ fdZ%d Z&d Z'd#dZ(d#dZ)d#dZ*d#dZ+eej@                  d#d              Z,d  Z-eej@                  d!               Z.d" Z/ xZ0S )$	PageAdmin)admin/cms/page/tree/actions_dropdown.html)=id
urls__slugpagecontent_set__title
reverse_id)title
menu_title
page_titlec                     yNF r{   rR   s     rU   has_module_permissionzPageAdmin.has_module_permission       rk   c                     yr   r   r   s     rU   has_add_permissionzPageAdmin.has_add_permission   r   rk   c                    t        |      }|!t        j                  |j                  |      S t        j                  |j                  ||      S )
        Return true if the current user has permission on the page.
        Return the string 'All' if the user has all rights.
        userrT   rn   rT   )rV   r@   !user_can_change_at_least_one_pager   user_can_change_pager{   rR   rg   rT   s       rU   has_change_permissionzPageAdmin.has_change_permission   sL    
  ;#EE\\   44W\\RVWWrk   c                b    |syt        |      }t        j                  |j                  ||      S NFr   )rV   r@   &user_can_change_page_advanced_settingsr   r   s       rU   'has_change_advanced_settings_permissionz1PageAdmin.has_change_advanced_settings_permission   s-     FFw||Z]dhiirk   c                     y Nr   r{   rR   objectobject_reprs       rU   log_deletionzPageAdmin.log_deletion        	rk   c                     y r   r   r{   rR   querysets      rU   log_deletionszPageAdmin.log_deletions       rk   c                    | j                   j                   d| j                   j                   d| }t        ||      S Nrz   )argsopts	app_label
model_namerJ   r{   actionr   url_names       rU   get_admin_urlzPageAdmin.get_admin_url   ;    ii))*!DII,@,@+A6(KXD11rk   c                    t        |      }t        | 	  |      }t        |      j	                         }t        ||j                        }|r||d<   |j                         S zx
        This override is in place to preserve the "language" get parameter in
        the "Save" page redirect
        rS   ro   rV   rw   get_preserved_filtersr   copyrG   pk	urlencoder{   rR   rT   preserved_filters_encodedpreserved_filterslangr   s         rU   r   zPageAdmin.get_preserved_filters   a    
  $)G$A'$J!%&?@EEG-gtwwG,0j) **,,rk   c                `    t        |      }t        | 	  |      }|j                  |      }|S )NrT   )rV   rw   get_querysetrv   )r{   rR   rT   r   r   s       rU   r   zPageAdmin.get_queryset   s1     7'0???-rk   c                    | j                   j                  j                  j                  |      }	 | j                   j                  j                  |      }|S # | j                   j                  $ r d }Y |S w xY w)Nr   )modelr^   r   	to_pythonrO   rN   rQ   )r{   page_idrn   s      rU   get_page_from_idzPageAdmin.get_page_from_id   sp    **""%%//8	::%%))W)5D  zz&& 	D	s   &A A87A8c                R     j                   j                  j                   d j                   j                  j                    fd} |d j                         |d j
                         |d j                         |d j                         |d j                         |d j                         |d	 j                         |d
 j                         |d j                        g	}t        j                  r|t        j                         z  }|t          E         z   S )Get the admin urlsrz   c                p    t        | j                  j                  |       d|j                         S Nrz   )namer    
admin_site
admin_viewr   regexfninfor{   s     rU   patzPageAdmin.get_urls.<locals>.pat   4    5$//"<"<R"@$qQSQ\Q\P]G^__rk   z^list/$z^([0-9]+)/actions-menu/$z!^([0-9]+)/([a-z\-]+)/edit-field/$z^([0-9]+)/advanced-settings/$z^([0-9]+)/move-page/$z^([0-9]+)/copy-page/$z^([0-9]+)/dialog/copy/$z^([0-9]+)/permissions/$z^([0-9]+)/set-home/$)r   r^   r   r   get_listactions_menuedit_title_fieldsadvanced	move_page	copy_pageget_copy_dialogget_permissionsset_homer<   registered_pluginsget_patternsrw   get_urlsr{   r   url_patternsr   r   s   `  @rU   r   zPageAdmin.get_urls   s   **"",,-Qtzz/?/?/J/J.KL	` 
DMM*+T->->?4d6L6LM0$--@($..9($..9*D,@,@A*D,@,@A'7

 ))K4466Leg.000rk   c                r    |rt        d      r| j                  ||      }nd}|rt        |   ||      S g S )N
PERMISSIONrg   F)rC   !has_change_permissions_permissionrw   get_inline_instances)r{   rR   rg   can_change_permsr   s       rU   r   zPageAdmin.get_inline_instances   sD    ?<0#EEgSVEW$7/==	rk   c                X    t        |   ||fi |}t        |      |_        ||_        |S )i
        Get PageForm for the Page model and modify its fields depending on
        the request.
        )rw   get_formrV   _site_requestr{   rR   rg   kwargsformr   s        rU   r   zPageAdmin.get_form  s3    
 w77g&
rk   c                   | j                  ||      }|| j                  |      t        |      }|j                  j	                  d      xs |j                  j	                  d      }|| j
                  ||j                  |      |t        j                  |j                  |      t        j                  |j                  ||      | j                  ||      | j                  ||      | j                  ||      | j                  ||      | j                  ||      t!        d      d}|r|j#                  |       t%        || j&                  |      S )	N	object_idhas_copyhas_cuttargetr   r   r   )rn   r   rT   page_is_restrictedpaste_enabledr   has_copy_page_permissionr   r   r   has_move_page_permissionhas_delete_permissionCMS_PERMISSION)
get_object_get_404_exceptionrV   GETrN   r   has_view_restrictionsr@   user_can_add_subpager   user_can_view_page_draftr   r   r   r  r  rC   updater   actions_menu_template)r{   rR   r  extra_contextrn   rT   r	  contexts           rU   r   zPageAdmin.actions_menu  s?   w)<<)))44 
3Qw{{y7QII"&"<"<T"B*"2"G"G]a"b(8(Q(QRYR^R^`dko(p%)%?%?T%?%R7;7c7cdkqu7c7v151W1WX_ei1W1j(,(E(EgSW(E(X%)%?%?T%?%R-l;
  NN=)gt997CCrk   c                   | j                  ||      }| j                  ||      st        d      || j                  |      t	        d      r| j                  ||      }nd}t        d      |d}| j                  |||      S )	Nr  r   z+No permission for editing advanced settingsr   FzAdvanced Settings)r   show_permissionsr  )r  r   r   r  rC   r   rz   change_view)r{   rR   r  rn   r  r  s         rU   r   zPageAdmin.advanced,  s    w)<;;G;N"#PQQ<)))44<(#EEgSWEX$12HXY'JJrk   c                    t        j                  |j                  t        |      d      }|r-| j	                  |      }t        d      dz   |z   }t        |      S t        d      }t        |      S )zy
        Figure out where to redirect after the 'Save' button has been pressed
        when adding a new object.
        Fr   rT   	use_cachecms_pagecontent_changelist?index)r@   r   r   rV   r   rJ   r   )r{   rR   rg   can_change_any_pagequerypost_urls         rU   response_post_save_changez#PageAdmin.response_post_save_change<  su    
 /PP'"
 ..w7E$%ABSH5PH $H-- %W-H#H--rk   c                   | j                  ||      }| j                  ||      st        d      || j                  |      |j	                         st        t        d            S |j                  |j                        \  }}|r|j                         }nd}|s|j                         }|r
t                t        d      S )Nr  z)You do not have permission to set 'home'.z$The page is not eligible to be home.Fok)r  r   r   r  is_potential_homer   rz   set_as_homepager   has_apphooksr=   r   )r{   rR   r  rn   new_home_treeold_home_treeapphooks_affecteds          rU   r   zPageAdmin.set_homeN  s     w)<))'48"#NOO<)))44%%')!,R*STT'+';';GLL'I$}  - : : < %  - : : <  !D!!rk   c                   |d   }|j                   j                  d      dk(  r+|j                  j                  dd      j                  d      }|j                  j                  dt        j
                        }| j                  j                  j                  t        ||      t        ||	      z  t        ||
      z  t        ||      z        j                         }g }|D ]G  }|j                  |j                  |      |j                  |      |j                  |      d       I t        t!        j"                  |      d      S t%               S )zs
        This view is used by the PageSmartLinkWidget as the user type to feed the autocomplete drop-down.
        r   zx-requested-withXMLHttpRequestq /language_code)!pagecontent_set__title__icontainspagecontent_set__language)urls__path__icontainsr5  )&pagecontent_set__menu_title__icontainsr5  )&pagecontent_set__page_title__icontainsr5  ro   )pathr   redirect_urlapplication/jsoncontent_type)headersrN   r  stripr   LANGUAGE_CODEr   rO   rv   r   distinctrb   get_path	get_titleget_absolute_urlr   jsondumpsr   )	r{   r   r   rR   
query_termr3  matching_published_pagesresultsrn   s	            rU   r   zPageAdmin.get_listn  s;    q'??126FF b177<J#KKOOOX=S=STM'+zz'9'9'@'@JZgh*P]^_:anop :anop(
 hj % G0  $} E!%!G(,(=(=}(=(U  

7 3BTUU$&&rk   c                    |j                   rd|j                   j                         z   nd}t        t        d      |z         S )Nr   r1  r  )r  r   r   rJ   )r{   rR   r  	parameters       rU   changelist_viewzPageAdmin.changelist_view  s8    5<[[C'++//11b	#M2N$OR[$[\\rk   c                P    t        |j                         t        |   |||      S )zu
        Determine the HttpResponse for the delete_view stage. Clear the user's permission
        lru cache
        )rH   r   rw   response_delete)r{   rR   obj_displayobj_idr   s       rU   rO  zPageAdmin.response_delete  s%    
 	$GLL1w&wVDDrk   c                D   t        |t        j                  || j                        }|g}|j                  rV|j                         j                  dd      }|j                  | j                  j                  j                  |             t        j                  j                  t              }t        j                  j                  |      j                  dd      }t        j                  j                  ||      }t        j                  j                  |	      }	t!        j"                  |	       |j#                          t$        
| M  ||       t)        |t        j                  ||| j                  
       t+                |j,                  rt/                y y )NrR   	operationrg   senderidT)flatid__in)page__inr   r>  object_id__inplaceholder__inrR   rT  tokenrg   rU  )r;   r'   DELETE_PAGEr   	is_branchget_descendantsvalues_listextendrO   rv   r
   get_for_modelr6   ru   r9   r3   r   deleterw   delete_modelr:   r1   application_urlsr=   )r{   rR   rg   operation_token	cms_pagesdescendant_idsct_page_contentpage_content_objsplaceholderspluginsr   s             rU   rh  zPageAdmin.delete_model  sX   1z'='=3tzz
 E	== 002>>t$>ONTZZ//66n6MN &--;;KH'55<<i<P\\]ahl\m"**11(+ 2 
 ##**<*H Wc*  ,,!::	
 	 !  rk   c                   t        d      st        d      S | j                  |      }|| j                  |      |j                  dk(  r|j
                  }n|j                  }|j                  d      }	 |d   }t        j                  j                  |      }t        |      }|j                  }	t        j                   |	||      }
|
st"        |r>	 t$        j                  j                  |      }t        j*                  |	||      s"t"        t        j,                  |	|      st"        dt/               | j0                  d	}t3        |d
|      S # t        t        f$ r t        d      cY S w xY w# t$        j&                  $ r t(        w xY w)Nr   r1  r  r  source_siter   zsource_site is requiredzdialog-copy)	dialog_idr   r   z)admin/cms/page/tree/copy_premissions.html)rC   r   r   r  methodr  POSTrN   r   rO   KeyErrorr   r   rV   r   r@   user_can_view_pager   r5   rQ   r   r  user_can_add_pager-   r   r   )r{   rR   r   rn   data	target_idsource_site_idrr  rT   r   can_view_pager  r  s                rU   r   zPageAdmin.get_copy_dialog  sz   |,##$$W-<))'22>>U";;D<<DHHX&		E!-0N,,**n*=K  ||(;;D$T""))Y)7 $88vtL&&!33D$?"" '&(II

 gJGTT5 ,- 	E)*CDD	E $$ s   5%E  E1 E.-E.1Fc                    t        t        d      t        | j                  j                        t        |      dz        }|S Nz8%(name)s object with primary key %(key)r does not exist.)r   keyr   rz   r"   r   r_   r   r{   r  	exceptions      rU   r  zPageAdmin._get_404_exception  A    HI!$))"8"89i(
	 rk   c                &    | j                  ||      S r   )r   )r{   rR   rg   s      rU   has_view_permissionzPageAdmin.has_view_permission  s    ))'377rk   c                b    |syt        |      }t        j                  |j                  ||      S r   )rV   r@    user_can_change_page_permissionsr   r   s       rU   r   z+PageAdmin.has_change_permissions_permission  s-     @@TW^bccrk   c                b    |syt        |      }t        j                  |j                  ||      S zU
        Returns True if the current user has permission to delete the page.
        Fr   )rV   r@   user_can_delete_pager   r   s       rU   r  zPageAdmin.has_delete_permission  s.      44W\\RVWWrk   c                b    |syt        |      }t        j                  |j                  ||      S )NF)r   rn   rT   )rV   r@   user_can_move_pager   r   s       rU   r  z"PageAdmin.has_move_page_permission  s,     223UYZZrk   c                   t        |      }| j                  ||      }|t        t        d            S |j                  }| j                  |j                  xs d||      }|j                         s@t        t        t        |j                  j                  dt        d                              S |j                  d   }| j                  ||      }	|	r|r0|j                  |      st        d      }
t        t        |
            S t!        |t"        j$                  || j&                  	      }|j)                          t+        |t"        j$                  ||| j&                  
       t        t-        d            S )u(  
        Move the page to the requested target, at the given position.

        NOTE: We have to change from one "coordinate system" to another to
        adapt JSTree to Django Treebeard.

        If the Tree looks like this:

            <root>
               ⊢ …
               ⊢ …
               ⊢ Page 4
                   ⊢ Page 5 (position 0)
                   ⊢ …

        For example,
            target=4, position=1 => target=5, position="right"
            target=4, position=0 => target=4, position="first-child"

        r  Nerrorr   __all__r  r   zKError! You don't have permissions to move this page. Please reload the pagerS  r_     status)rV   r  rB   r   r   	move_formru  is_validr\   errorsrN   rz   cleaned_datar  r   r   r;   r'   	MOVE_PAGEr   r   r:   r   )r{   rR   r   r  rT   rn   r   r   r  can_move_pagemessagerj  s               rU   r   zPageAdmin.move_page  sE   .  w':<"#9'#BCC||~~gll2dD~I}}"#9#dkkooiYZ[bYc>d:e#fgg""8,55g45H 0I0I$0OefG"#8#ABB1 **::	
 	  **!::	
 |3788rk   c                   g }|j                   }| j                  ||      }|| j                  |      t        |      }t	        dg d      }t
        j                  j                  |j                  g      }t        j                  ||      }	|j                         D ]  }
 |d|	|
      }|j                  |         t        j                  j                  |      j                  d      }|	st!        j"                  ||d      }|j                         D ]M  }
|	rd}n*|
j$                  j&                  t)        fd	D              } |d||
      }|j                  |       O ||| j*                  d
}t-        |d|      S )Nr  
Permission)	is_global
can_change
permission)	sites__inTrn   F)check_globalc              3  @   K   | ]  }|j                          y wr   )contains).0
perm_tuple	page_paths     rU   	<genexpr>z,PageAdmin.get_permissions.<locals>.<genexpr>j  s      `J!4!4Y!? `s   )rn   rowsr   zadmin/cms/page/permissions.html)r   r  r  rV   r   r4   rO   rv   r   rA   "user_can_change_global_permissionsiteratorrb   r7   for_pageselect_relatedr@   get_change_perm_tuplesrn   r:  anyr   r   )r{   rR   r   r  r   rn   rT   PermissionRowglobal_permissionscan_change_global_permissionsr  row_page_permissionsallowed_pagesr  r  r  s                   @rU   r   zPageAdmin.get_permissionsJ  s   ||w':<))'22 "<1Z[199@@DGG9@U(3(V(VW[]a(b%,557 	J8%C
 KK	 +22;;DAPPQWX,,CCD$]bcM+446 	J,!
&OO00	  `R_ ``
%%C
 KK	 II

 g@'JJrk   c                L   | j                  |      }|t        t        d            S |j                  }t	        |      }| j                  |j                  xs d||      }|j                         st        t        d            S |j                  d   }|j                  d   }t        j                  |||      }	|	r|rt        j                  |||      }	n|	rt        j                  ||      }	|	st        d      }
t        t        |
            S |j                         t!        |j"                        }t%        fd|D              st        d	      }
t        t        |
            S |j'                  |      }t)        t+        j,                  d
|j"                  i      d      S )zz
        Copy the page and all its plugins and descendants to the requested
        target, at the given position
        Nr  r   r  rr  z4Error! You don't have permissions to copy this page.r   c              3  &   K   | ]  }|v  
 y wr   r   )r  r   page_languagess     rU   r  z&PageAdmin.copy_page.<locals>.<genexpr>  s     Ed4>)Es   zgError! The page you're pasting is not translated in any of the languages configured by the target site.rV  r<  r=  )r   rB   r   r   rV   	copy_formru  r  r  r@   rw  r  rx  rz   r   get_languagesrD   r   r  r   r   rF  rG  )r{   rR   r   rn   r   rT   r   r  rr  can_copy_pager  site_languagesnew_pager  s                @rU   r   zPageAdmin.copy_pagez  sv    $$W-<"#9'#BCC|| ~~gll2dD~I}}"#9'#BCC""8,''6 );;D$TV -AA$PTUM,>>tTJMNOG"#8#ABB++-*477;EnEEsG ##9'#BCC>>$'DJJhkk':;J\]]rk   c                   | j                  ||      }|j                  |      }| j                  ||      st        t	        d            S || j                  |      |st        d      d}|j                  j                  dd      }|j                  d      D cg c]  }|| j                  v s| c}|j                  j                  d	d      }	t        j                  }
sd
 G fddt        j                  j                         }|	sF|j"                  dk(  r7 |||j                        }|j%                         r|j'                          d}n	 ||      }t)        |d difgi |       }| j*                  |j*                  z   }t-        d      d||j.                  |dd||
ddddd}|	r |j1                  ddi       t3        |d|      S |	s|j"                  dk(  r|rt3        |d|      S t3        |d|      S c c}w )Nr  r   z,You do not have permission to edit this pagez*No translation matches requested language.Fedit_fieldsr   ,_cancel)r   c                  *    e Zd ZdZ G  fdd      Zy)2PageAdmin.edit_title_fields.<locals>.PageTitleFormzK
            Dynamic form showing only the fields to be edited
            c                      e Zd ZeZW  Zy)7PageAdmin.edit_title_fields.<locals>.PageTitleForm.MetaN)r   r   r   r6   r   fieldsr  s   rU   Metar    s    #$rk   r  N)r   r   r   r   r  r  s   rU   PageTitleFormr    s    % %rk   r  ru  )instancery  T)r  r  )	fieldsetsprepopulated_fieldsmodel_admin	MEDIA_URLTitle
   )CMS_MEDIA_URLr   plugin	plugin_id	adminformaddis_popupmediar   changesave_asr   window_close_timeoutcancelz'admin/cms/page/plugin/confirm_form.htmlz&admin/cms/page/plugin/change_form.html)r  get_admin_contentr   r   rz   r  r   r  rN   splittitle_frontend_editable_fieldsru  r6   r^   djangoforms	ModelFormrt  r  saver   r  rC   r   r  r   )r{   rR   r   ro   rn   translationsaved_successfully
raw_fieldsfieldcancel_clickedr   r  r   
admin_formr  r  r  s                   @rU   r   zPageAdmin.edit_title_fields  s   w':,,X6))'t)<(+Y)Z[[<))'22FGG"[[__]G<
*4*:*:3*?p5DLoLoCoup )))U;  $K	%FLL22 	% '..F": +GLLID}}		%)" +6DdX{$;<=SUcg

 

Z---,[9#"'$&
 NNd
 '#LgVV'..F":?Q'#LgVVgGQQk qs   G>2G>r   )1r   r   r   r  r)   r   r,   r  r/   r  r0   inlinessearch_fieldsr  r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r%  r&   r   atomicr   r   rM  rO  rh  r   r  r  r   r  r  r   r   r   r   r   r   s   @rU   r   r      s.   GDII&GQM%J"Xj
2-1.D8K .$ "  "<':]E#"J-U^8dX[ 99  99v.K` .^  .^`DRrk   r   c                      e Zd ZdZdZdZdZdZdZe	Z
e
ZeZeZeZeZeZd Zd Zd	 Zd
 Zd Z fdZ fdZ fdZd,dZd,dZd, fd	Z d Z!d Z"d Z#d- fd	Z$d- fd	Z% fdZ&d Z'd Z(d Z)d Z*d,dZ+d,dZ,d,dZ-d,dZ.d,d Z/d! Z0d,d"Z1e2d#        Z3e2e4jj                  d$               Z6d, fd%	Z7d& Z8e2d'        Z9d( Z:d.d)Z;e<d*        Z=e>d+        Z? xZ@S )/PageContentAdmin)
page__path)r   page__idpage__urls__slugr   page__reverse_idzadmin/cms/page/change_form.htmlzadmin/cms/page/tree/base.htmlr   zadmin/cms/page/tree/menu.htmlc                     y r   r   r   s       rU   log_additionzPageContentAdmin.log_addition  r   rk   c                     y r   r   r   s       rU   r   zPageContentAdmin.log_deletion  r   rk   c                     y r   r   r   s      rU   r   zPageContentAdmin.log_deletions  r   rk   c                     y r   r   )r{   rR   r   r  s       rU   
log_changezPageContentAdmin.log_change  r   rk   c                    | j                   j                   d| j                   j                   d| }t        ||      S r   r   r   s       rU   r   zPageContentAdmin.get_admin_url  r   rk   c                    t        |      }t        | 	  |      }t        |      j	                         }t        ||j                        }|r||d<   |j                         S r   r   r   s         rU   r   z&PageContentAdmin.get_preserved_filters  r   rk   c                    t        |      }t        |j                        }t        |   |      j                  d      }|j                  ||      }|S )Nrn   )language__in
page__site)rV   rD   r   rw   r   r  rv   )r{   rR   rT   	languagesr   r   s        rU   r   zPageContentAdmin.get_queryset'  sL     %dgg.	7'0??G??	d?Krk   c                t     j                   j                  j                   d j                   j                  j                    fd} |d j                         |d j
                         |d j                         |d j                         |d j                        g}|t         )         z   S )r   rz   c                p    t        | j                  j                  |       d|j                         S r   r   r   s     rU   r   z&PageContentAdmin.get_urls.<locals>.pat2  r   rk   z^get-tree/$z^([0-9]+)/duplicate/$z^([0-9]+)/copy-language/$z^([0-9]+)/change-navigation/$z^([0-9]+)/change-template/$)r   r^   r   r   get_tree	duplicatecopy_languagechange_innavigationchange_templaterw   r   r   s   `  @rU   r   zPageContentAdmin.get_urls.  s    **"",,-Qtzz/?/?/J/J.KL	` .($..9,d.@.@A0$2J2JK.0D0DE
 eg.000rk   c                    | j                  ||d       }	 |j                  }|S # t        $ r< t        |j                        t        | j                  ||            z   }d d|ifg}Y |S w xY w)N)r  r  )r   r  AttributeErrorrt   base_fieldsget_readonly_fields)r{   rR   rg   r   r  r  s         rU   get_fieldsetszPageContentAdmin.get_fieldsets>  s}    }}Wc$}7	5I   	5$**+d43K3KGUX3Y.ZZF6 234I	5s   $ AA)(A)c                    d|j                   v r| j                  S d|j                   v r| j                  S | j                  S )Nr  r  )	path_infochange_formduplicate_formadd_form)r{   rR   rg   r   s       rU   get_form_classzPageContentAdmin.get_form_classH  s@    w(((###G---&&&}}rk   c                |    t        |   ||fd| j                  ||      i|}t        |      |_        ||_        |S )r   r   )rw   r   r  rV   r   r   r   s        rU   r   zPageContentAdmin.get_formO  sG    
 w_43F3FwPS3T_X^_g&
rk   c                    t        | d      s*|j                  j                  |j                        | _        | j                  j
                  S Nurl_obj)hasattrrn   get_urlro   r  slugr{   rg   s     rU   r  zPageContentAdmin.slugY  s6    tY'88++CLL9DL||   rk   c                    t        | d      s*|j                  j                  |j                        | _        | j                  j
                  ry | j                  j                  S r  )r  rn   r  ro   r  managedr:  r  s     rU   overwrite_urlzPageContentAdmin.overwrite_url_  sF    tY'88++CLL9DL<<||   rk   c                    | j                  ||      }|| j                  |      |j                  dk(  r8|j                  j	                         |_        |j
                  |j                  d<   | j                  |      S )zE
        Leverages the add view logic to duplicate the page.
        r  r  source)r  r  rt  r  r   r   add_view)r{   rR   r  rg   s       rU   r  zPageContentAdmin.duplicateg  so     oogo;;)))44>>U" "++**,GK$'KKGKK!}}W%%rk   c                   t        |      }t        ||j                        }|i }d|j                  v r|j	                  dt        d      i       nGd|j                  v r|j	                  dt        d      i       n|j	                  dt        d      i       	 |j                  j                  d      xs |j                  j                  d      }t               j                  |      }t        j                  j                  |	      }|rC||d<   t        |j                        |d
<   | j!                  ||      |d<   t#        |d
         |d<   ||d<   t$        | M  |||      S # t        t        j                  f$ r d }Y yw xY w)Nr   r  r   zAdd Page Copyparent_pagezNew sub pagezNew pagecms_pager   language_tabsfilled_languagesshow_language_tabsro   r  )rV   rG   r   r	  r  rz   r  rN   ru  r   cleanr5   rO   r   rQ   rF   get_filled_languagesrs   rw   r  )	r{   rR   form_urlr  rT   ro   r   r  r   s	           rU   r  zPageContentAdmin.add_viewx  s    1'477K M'+++  Q/
 gkk)  Q~.   Qz]	kkooj1QW\\5E5Ej5QG"n**73G||''7'3H (0M*%-?-HM/*040I0I'S[0\M,-25mO6T2UM./$,j!wOO  !2!23 	H	s   A1E( (FFc           	        |ddi}| j                  ||      }|| j                  |      t        |      }|j                  t	        d      | j                  ||      |j                  t        |j                        | j                  ||j                        d}t        |d         |d<   |j                  |xs i        d|v r| j                  ||      }||d	<   t        	| 9  ||||
      S )zD
        The 'change' admin view for the PageContent model.
        
basic_infoTr  r   r   )r  r  r  ro   r  r   r  r!  can_change_advanced_settings)r$  r  )r  r  rV   rn   rC   r   ro   rF   r   r#  rs   r  r   rw   r  )
r{   rR   r  r$  r  rg   rT   r  _has_advanced_settings_permr   s
            rU   r  zPageContentAdmin.change_view  s     )40Moogo;;)))44 -l;44W#4F/8 $ 9 9'388 L
 ),GO,D(E$%}*+=(*.*V*VW^dg*V*h'6QG23w"7IX_"``rk   c                (   |j                   j                  dd      }|dk(  raddlm} ddlm}m} |j                   ||j                  d       |              t        |      }t        t        j                  |	            S t        | 9  ||      S )
NeditF1r   )cache)get_cache_keyget_cache_permission_versionchange_page)version)url)ru  rN   django.core.cacher,  cms.cache.permissionsr-  r.  rg  r   r>   r   r2   formatrw   response_add)	r{   rR   rg   redirectr,  r-  r.  r1  r   s	           rU   r5  zPageContentAdmin.response_add  sz    <<##FE2s?/YLLw||]CMiMkLl &c*C 3 : :s CDDw#GS11rk   c                    t        |      j                  }|j                         }t        |      D cg c]  }|d   	 }}|D cg c]	  }||v s| c}S c c}w c c}w )Nr   )rV   r   r  rF   )r{   rR   rn   rS   r   r   allowed_languagess          rU   r#  z%PageContentAdmin.get_filled_languages  s`    7#&&--/1CG1LMT!WMM!1OT=N5NOO NOs   A	AAc                    t        t        d      t        | j                  j                        t        |      dz        }|S r~  r  r  s      rU   r  z#PageContentAdmin._get_404_exception  r  rk   c                   t        |      }|j                  j                  d      x}r;	 t               j	                  |      }t
        j                  j                  |      }nd }|r$t        j                  |j                  ||      }|S t        j                  |j                  |      }|S # t        t
        j                  f$ r Y yw xY w)Nr  rV  F)r  rT   r   )rV   r  rN   r   r"  r5   rO   r   rQ   r@   r  r   rx  )r{   rR   rT   	parent_idparent_itemhas_perms         rU    _has_add_permission_from_requestz1PageContentAdmin._has_add_permission_from_request  s     6696(N00;	"ll..).< K'<<"H  (99',,TRH $T%6%67 s   9B/ /C
Cc                $    | j                  |      S )zS
        Return true if the current user has permission to add a new page.
        )r?  r   s     rU   r   z#PageContentAdmin.has_add_permission  s     44W==rk   c                    t        |      }|r,t        j                  |j                  |j                  |      S t        j
                  |j                  |      }|S )r   r   r   rV   r@   r   r   rn   r   )r{   rR   rg   rT   can_change_pages        rU   r   z&PageContentAdmin.has_change_permission  sQ    
  #88CHH[_``*LL
 rk   c                    t        |      }|r,t        j                  |j                  |j                  |      S t        j
                  |j                  t        |      d      }|S )r   r   Fr  rB  )r{   rR   rg   rT   r|  s        rU   r  z$PageContentAdmin.has_view_permission  sY      #88CHH[_``(JJ'"

 rk   c                v    |syt        |      }t        j                  |j                  |j                  |      S r  )rV   r@   r  r   rn   r   s       rU   r  z&PageContentAdmin.has_delete_permission  s2      44W\\W[\\rk   c                v    |syt        |      }t        j                  |j                  |j                  |      S r   )rV   r@   r   r   rn   r   s       rU   r   z8PageContentAdmin.has_change_advanced_settings_permission"  s3     FFw||Z]ZbZbimnnrk   c                h    |syt        |      }t        j                  |j                  |||      }|S )NF)r   rn   ro   rT   )rV   r@    user_can_delete_page_translationr   )r{   rR   ro   rg   rT   r>  s         rU   !has_delete_translation_permissionz2PageContentAdmin.has_delete_translation_permission(  s9     #DD	
 rk   c                    t         j                  j                  d      }t        d      r|j                  r|S t
        j                  }|D cg c]  } |||      s| c}S c c}w )Nr   r   )r   rO   order_byrC   is_superuserr@   r   )r{   r   sites	_has_permrT   s        rU   get_sites_for_userz#PageContentAdmin.get_sites_for_user5  sS    %%f-|,0A0AL$FF	!&@)D$*?@@@s   A#A#c                   ddl m} | j                  |d       st        |j                  dk(  rjd|j
                  v r\|j
                  d   }|j                         r=t        j                  j                  |      j                         r||j                  d<   t        |      }t        ||j                        }|j                  j!                  d	d
      }| j#                  |      }| j%                  |||      \  }}	| j'                  |j                        }
	 |
j)                          |
j+                  |      }t8        j                  j;                  |      j                  |      j=                         j?                  d      }|jA                  tC        dd|            }|
jE                         rtG        |      dk\  }n|j                         }| jH                  jK                  |      }|jM                  | jN                  jP                  | jR                  tU        d      tU        d      tW        |j                        ||
|| jY                  |      t[        | jN                  jP                  j\                        | || j_                  |j`                        ||
jE                         ||dd       |jM                  |xs i        | jH                  jb                  |_2        tg        || jh                  |      S # t,        t.        f$ rS ||j                  j1                         v rt3        dd |	d      i      cY S t5        |j6                  dz   |z   dz         cY S w xY w)Nr   )
ERROR_FLAGr   ru  rT   r   rL   r   r0  r1  zadmin/invalid_setup.htmlr   zDatabase errorr   z=1)pagecontent_set__inr:  pagecontent_setfiltered_translationsto_attrr   rl   r  r   )rT   rM  r#  is_filtereditems	has_items)r   r  r  r  r  preview_languagechangelist_formcms_current_siter   module_namer   tree)5django.contrib.admin.views.mainrQ  r   r   rt  ru  isdigitr   rO   rv   existsrM   rV   rG   r   r  rN   r   get_search_resultsr[  
full_cleanrun_filters
ValueErrorr   keysr   r   r:  r5   on_siterB  rK  prefetch_relatedr   rW  rs   r   each_contextr  r   r^   r  rC   rF   r   r"   ry   rO  r   r   current_appr   change_list_template)r{   rR   r  rQ  rS   rT   ro   r#  page_contentsrz   r[  pagesrY  r  s                 rU   rM  z PageContentAdmin.changelist_view=  s   >))'t)<"">>V#',,(>ll6*G T\\%8%8G%8%D%K%K%M4; 01 1'477KR())'2227M5Qq..w{{;	P&&(+77FM" $$T*11m1T]]_hhiop&&!/&
 &&(E
aII//..w7

((!0!="1,"?"4TWW"=$,#2$(&*&=&=g&F()9)9)M)MN !44W\\B"#2#>#>#@"!*	
. 	}*+"oo22)B)BGLLs O, 	P W[[--//-.#3!4  (s(:Z(G$(NOO	Ps   !K: :?M;MMc                   | j                  ||      }| j                  ||      st        d      || j                  |      | j	                  ||      st        d      |j
                  j                  dd       }t        d      r*|t        t        d            vr<t        t        d            S |d t        d      D        vrt        t        d	            S ||_        |j                          t        t        d
            S )Nr  r   z%No permissions to change the templatetemplate	TEMPLATESzTemplate not validc              3  &   K   | ]	  }|d      yw)r   Nr   )r  placeholder_sets     rU   r  z3PageContentAdmin.change_template.<locals>.<genexpr>  s     "m/?1#5"ms   PLACEHOLDERSzPlaceholder selection not validz%The template was successfully changed)r  r   r   r  r   ru  rN   rC   dictr   rz   ro  r  r   )r{   rR   r  page_contentto_templates        rU   r  z PageContentAdmin.change_template  s    w)D))'|)D"#JKK)))44;;G;V"#JKKll&&z48;'${'C"DD-a0D.EFF"m_]kMl"mm-a0Q.RSS +AEFGGrk   c                   |j                   j                  d      }| j                  ||      }| j                  ||      st        || j                  |      |j                  }|r|t        |j                        vrt        t        d            S |j                  |d      }|j                         D ]  }|j                         j                  |j                        }|j                  |j                        }	|j!                  |j"                  |	      st%        t        d	            c S t'        |	||
        t)        d      S )Ntarget_languager  r   r   z-Language must be set to a supported language!F)fallback)slotz1You do not have permission to copy these plugins.r9  r'  )ru  rN   r  r   r   r  rn   rD   rS   r   rz   get_content_objget_placeholdersrz  get_plugins_listro   has_add_plugins_permissionr   r   rI   r   )
r{   rR   r  rx  source_page_contentrn   target_page_contentplaceholderr  rp  s
             rU   r   zPageContentAdmin.copy_language  s7    ",,**+<="oogoK))'7J)K""&)))44"''/9JSWS_S_9`"`)!,[*\]]"22?U2S.??A 	SK(99;??[EUEU?VF!223F3O3OPG44W\\7K,Q/b-cdd'/R	S D!!rk   c                L   | j                  ||      }|j                  }| j                  ||j                  |      st	        t        d            S || j                  |      t        t        |j                                     dkD  st        d      S t        | 1  |||      S )Nr  z.You do not have permission to delete this pagerl   z/There only exists one translation for this page)r  rn   rI  ro   r   rz   r  rs   rt   r  r   rw   delete_view)r{   rR   r  r  ru  rn   r   s         rU   r  zPageContentAdmin.delete_view  s    w)D  55g|?T?TVZ[(+[)\]]<)))444**,-.2)*[\\w"7I}EErk   c                t   t         j                  j                  t              }t        j                  j                  |j                  |j                        }t        j                  j                  ||j                  d            }t        j                  j                  |      }|j                  j                  j                  |j                        }t        |t        j                  |j                  || j                         }t#        d      dt%        t'        |j                        d	         iz  }	t)        j*                  ||	       |j                  |j                  j,                  v r!|j                  j,                  |j                  = |j                  |j                  j.                  v r!|j                  j.                  |j                  = |j1                          |j1                          |j1                          t3        |t        j                  ||j                  || j                   
       y )Nrm   r   r[  r]  r9  )rR   rT  rg   r  rU  z8Title and plugins with language %(language)s was deletedro   r   )rR   rT  r`  rg   r  rU  )r
   rO   rf  r6   ru   rv   rn   ro   r9   valuesr3   urlsrN   r;   r'   DELETE_PAGE_TRANSLATIONr   rz   r"   rE   r   successadmin_content_cachepage_content_cacherg  r:   )
r{   rR   rg   rm  rl  ro  saved_pluginspage_urlrj  r  s
             rU   rh  zPageContentAdmin.delete_model  s   %--;;KH#1188chhQTQ]Q]8^"**11('..t4 2 
 "))000N88==$$cll$;1 88::
 NO	"5cll"CF"KLS
 
 	'*<<388777,,S\\:<<388666++CLL9  88!::	
rk   c                    | j                  ||      }| j                  ||      s*| j                  |      rd}nd}t        t        |            S || j	                  |      |j                          t        d      S )z4
        Switch the in_navigation of a page
        r  r   z?You do not have permission to change a page's navigation statusz/You cannot change this page's navigation status   r  )r  r   r   rz   r  toggle_in_navigationr   )r{   rR   r  ru  r  s        rU   r  z$PageContentAdmin.change_innavigation  s    
 w)D))'|)D))'2[ L(744)))44))+3''rk   c                   t        |      }t        j                  j                  |      j	                  d      }t        j                  dd|j                  j                  dd            xs d}|j                  j                  d      D cg c]  }|j                         st        |        }}|rDt        ||      }|j                         j                  t        |      t        |	      z        }n8d}|j                  t        d
      t        d|      z  t        |	      z        }|j!                  t#        ddt$        j&                  j)                         j+                                     }| j-                  ||t/        ||j0                        |r|j2                  d
z   nd
d      }t5        dj7                  |            S c c}w )z
        Get html for the descendants (only) of given page or if no page_id is
        provided, all the root nodes.

        Used for lazy loading pages in cms.pagetree.js
        r:  z[^\d]r1  nodeIdNzopenNodes[]r;  rX  )
parent__inrl   depth   )r  rY  rS  rT  rU  r   T)rm  ro   r  follow_descendants)rV   r5   rO   rg  rK  r`   subr  rN   getlistr`  intr   get_descendant_pagesrv   r   rh  r   r6   ru   r   latest_contentget_tree_rowsrG   r   r  r   join)	r{   rR   rT   rm  node_idrV  open_page_idsrn   r  s	            rU   r  zPageContentAdmin.get_tree  s     $$T*33F;&&2w{{x'DEM+2;;+>+>}+M^RQSQ[Q[Q]R^^$Uw7D--/66q7NQR^kQl7lmEDLL
QQ}==]@[[E &&!/$22??APPR
 !!3GTWWM%)4::>q# " 
 BGGDM**1 _s   G"Gc              #  2   	
K   j                   t              t        d      t         j                        t
        j                  v xs t
        j                  v 	t        j                        
t        j                  t        j                  t        j                  	
 fd}rfd|D        }n|}dk(  r,|D ]&  }|j                  t        |              ||       ( y|D ]  } ||        yw)zx
        Used for rendering the page tree, inserts into context everything what
        we need for single item
        r   c                   | j                   D ci c]  }|j                  | c}| _        t        j                  
j
                  |       }	r|sd}nd}i ddj                  dd| d| j                        d	| j                         D  cg c]  } |  c} d
 j                         D  cg c]  } |  c} d
dd|d j                         ddddd |       d 
j
                  |        
j
                  |       |d}|d   j                  k(  |d<   j                  |      S c c}w c c} w c c} w )Nr   z-{"valid_children": False, "draggable": False}r1  r   r   rT   rn   ru  	ancestorsdescendantsrR   r   metadatar  rZ  r  r  r  has_add_page_permissionr  r   )r   r  is_concrete)rT  ro   r  r@   r  r   r   r  get_cached_ancestorsget_cached_descendantsr  r   )rn   transr  r  r  r  r  ro   r  permissions_onrR   r{   rT   ro  r   user_can_adduser_can_changeuser_can_change_advanceds        rU   render_page_rowz7PageContentAdmin.get_tree_rows.<locals>.render_page_rowG  s   KOKeKe'f%(='fD$'7'J'J7<<Y]dh'i$&>J		  	
  6 6x @ t/H/H/JKtdK 1L1L1NOO 7  H !$"4"4"6 #H %&8 !) H  *<T+J!" (tT)R#$ <TT[T`T`bfhl;m,D'G* &-^%<%E%E%QGM"??7++? (g LOs   E	E2	Ec              3  B   K   | ]  }|j                   k(  s|  y wr   r  )r  rn   r  s     rU   r  z1PageContentAdmin.get_tree_rows.<locals>.<genexpr>j  s     H4DJJ%4G$Hs   rl   N)r   rV   rC   r   page_tree_row_templater	   ru  r  rD   r   r@   r  r   r   _set_hierarchyrt   )r{   rR   rm  ro   r  r  r  
root_pagesrn   r  r  r  rT   ro  r   r  r  r  s   `` ```   @@@@@@@@@rU   r  zPageContentAdmin.get_tree_rows8  s     
 || (6 ; ;<7<</N<7;;3N%dgg.	'<<*??#3#Z#Z  	,  	,  	,D H5HJ JA:" ,##DK0%d++, # ,%d++,s   DDc                0    t        d      t        d      dS )NzPublic contentEmpty)publicempty)rz   )r{   s    rU   indicator_descriptionsz'PageContentAdmin.indicator_descriptionsx  s     ()wZ
 	
rk   c                    d}|sB|t        d      dt        d      d|j                  j                   d|j                   z   d fgfS dg fS )Nz'admin/cms/page/tree/indicator_menu.htmlzCreate Contentzcms-icon-edit-newcms_pagecontent_addz
?cms_page=z
&language=r1  )rz   rJ   rn   r   ro   )clsrR   ru  menu_templates       rU   get_indicator_menuz#PageContentAdmin.get_indicator_menu  sn    A &''!"78"<#4#4#7#7"8
<CXCXBYZ[#   2vrk   r   )r1  N)rl   T)Ar   r   r   orderingr  change_form_templaterk  r  r  r(   r   r  r+   r
  r,   r  r/   r  r*   r[  r.   r  r  r   r   r  r   r   r   r   r  r  r   r  r  r  r  r  r5  r#  r  r?  r   r   r  r  r   rI  rO  rM  r&   r  r   r  r   r  rh  r  r  r  propertyr  classmethodr  r   r   s   @rU   r  r    sj   HXM<:G<DH KII$O&N
2-1 !!&"'PRa<2P*>$]oAOMb H H4 "  "6F&
P ( (,"+H=,@ 
 
  rk   r  )|
__future__r   rF  r`   collectionsr   r  django.confr   django.contribr   r   django.contrib.admin.helpersr   django.contrib.admin.optionsr	   "django.contrib.contenttypes.modelsr
   django.contrib.sites.modelsr   django.core.exceptionsr   r   r   	django.dbr   django.db.modelsr   r   django.db.models.queryr   django.forms.fieldsr   django.httpr   r   r   r   r   r   django.shortcutsr   r   django.template.defaultfiltersr   django.template.loaderr   django.template.responser   r   django.urlsr    django.utils.decoratorsr!   django.utils.encodingr"   django.utils.safestringr#   django.utils.textr$   django.utils.translationr%   rz   django.views.decorators.httpr&   cmsr'   cms.admin.formsr(   r)   r*   r+   r,   r-   r.   r/   cms.admin.permissionadminr0   r3  r1   cms.constantsr2   
cms.modelsr3   r4   r5   r6   r7   r8   r9   cms.operations.helpersr:   r;   cms.plugin_poolr<   cms.signals.apphookr=   cms.toolbar.utilsr>   	cms.utilsr?   r@   rA   cms.utils.adminrB   cms.utils.confrC   cms.utils.i18nrD   rE   rF   rG   cms.utils.permissionsrH   cms.utils.pluginsrI   cms.utils.urlutilsrJ   rV   rX   register
ModelAdminr   r  r   rk   rU   <module>r     sJ   "  	 "    * 2 5 : , 
 " ( + ,  7 1 / M  4 + - & 1 5 	 	 	 ? 8 -   ( 3 1 E E + *  > 9 ,-
-? -?` Y	R&(8(8 Y	R Y	Rx X
-u/?/? X
 X
rk   