
    Bhr\                        d dl Z 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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 d dlmZ d dlmZmZ d dl m!Z! d dl"m#Z#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.m/Z/m0Z0 d dl1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z: d dl;m<Z< dZ=dZ> G d de      Z? edd        G d! d"e*             Z@ ed#       G d$ d%e*             ZA G d& d'e*      ZBy)(    N)settings)get_user_model)
Permission)ContentType)cache)Http404HttpResponse)Variable)override_settings)clear_url_cachesreverse)translation)MiddlewareMixin)override)create_pagecreate_page_content)ToolbarMiddleware)PageContentPagePermissionPlaceholderUserSettings)_handle_no_page)CMSTestCase)FuzzyInt)get_object_edit_urlget_object_preview_urlget_object_structure_url)get_cms_setting)get_page_from_request)admin_reverse)detailsloginrender_object_structure)	menu_pool	SampleAppz)cms.test_utils.project.sampleapp.cms_appsc                       e Zd ZdZd Zy)LanguageSettingMiddlewarezMiddleware that sets language based on subdomain.
    Example URLs:
    - de.example.com -> German
    - en.example.com -> English
    Falls back to German if no valid language subdomain is found.
    c                 (   |j                         j                  d      d   }	 |j                  d      d   j                         }|dk(  rd|_        t	        j
                  d       y d|_        t	        j
                  d       y # t        $ r Y y w xY w)N:r   .ende)get_hostsplitlowerLANGUAGE_CODEr   activate
IndexError)selfrequesthostnamelanguage_codes       D/home/dcms/DCMS/lib/python3.12/site-packages/cms/tests/test_views.pyprocess_requestz)LanguageSettingMiddleware.process_request/   s    ##%++C03	$NN3/288:M $(,%$$T* )-%$$T* 		s   AB (B 	BBN)__name__
__module____qualname____doc__r8        r7   r'   r'   '   s    r>   r'   Tzcms.test_utils.project.urls)CMS_PERMISSIONROOT_URLCONFc                        e Zd Zd Z f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 Zd Z ed      d        Z ed      d        Zd Zd Zd Zd Z eg dddg      d        Zd Zd Zd  Z xZS )!	ViewTestsc                     t                y N)r   r3   s    r7   setUpzViewTests.setUpH   s    r>   c                 6    t         |           t                y rD   )supertearDownr   )r3   	__class__s    r7   rI   zViewTests.tearDownK   s    r>   c                    t                | j                  d      5  | j                  j                  d      }| j	                  |j
                  d       | j	                  |j                  d       d d d        y # 1 sw Y   y xY w)NTDEBUG/en/   cms/welcome.html)r   r   clientgetassertEqualstatus_codetemplate_namer3   responses     r7   test_welcome_screen_debug_onz&ViewTests.test_welcome_screen_debug_onO   sn    ]]]& 	I{{v.HX1137X335GH	I 	I 	Is   AA::Bc                     | j                  d      5  | j                  j                  d      }| j                  |j                  d       | j                  |j
                  d       d d d        y # 1 sw Y   y xY w)NFrL   rN   rO   rP   )r   rQ   rR   rS   rT   rU   rV   s     r7   test_welcome_screen_debug_offz'ViewTests.test_welcome_screen_debug_offV   sh    ]]]' 	I{{v.HX1137X335GH	I 	I 	Is   AA00A9c                 \    | j                  d      }| j                  t        t        |       y)zD
        Test handle nopage correctly works with DEBUG=True
        z/not-existing/N)get_requestassertRaisesr   r   )r3   r4   s     r7   test_handle_no_pagezViewTests.test_handle_no_page\   s'     ""#34'?G<r>   c                     | j                  d      }t        |      }| j                  |j                  d       | j                  |j                  t        d             y)zF
        Test if _handle_no_page correctly works for root url
        rN   .  z admin:cms_pagecontent_changelistN)r\   r   rS   rT   urlr   r3   r4   rW   s      r7    test_handle_no_page_for_root_urlz*ViewTests.test_handle_no_page_for_root_urlc   sN     ""6*"7+--s3w/Q'RSr>   c                     t        ddd       | j                  j                  d      }| j                  |j                  d       y)zQ
        Test details view when visiting root and homepage doesn't exist
        onenav_playground.htmlr+   rN   r`   N)r   rQ   rR   rS   rT   rV   s     r7   ,test_handle_no_page_for_root_url_no_homepagez6ViewTests.test_handle_no_page_for_root_url_no_homepagel   s9     	E0$7;;??6*--s3r>   c                    t         t        j                  v rt        j                  t         = t          dt         f}t	        ddd      }| j                  |      5  | j                          | j                  j                  |j                               }| j                  |j                  d       | j                          ddd       y# 1 sw Y   yxY w)zk
        Test details view when apphook pool has apphooks, but they're not
        actually hooked
        r*   page2rf   r+   )CMS_APPHOOKSrO   N)
APP_MODULEsysmodulesAPP_NAMEr   r   apphook_clearrQ   rR   get_absolute_urlrS   rT   )r3   apphookspagerW   s       r7   test_apphook_not_hookedz!ViewTests.test_apphook_not_hookedt   s    
 $J'!l!H:.07$94@]]]1 	! {{t'<'<'>?HX1137 		! 	! 	!s   A&C

Cc           	         | j                         }t        ddd      }t        dd|d      }|j                          d|j                   d	|j                   d
}| j                  |      5  t        d      5  | j                  d      5  t        |d      }| j                  j                  |      }| j                  ||dd       d d d        | j                  d      5  t        |d      }| j                  j                  |      }| j                  ||dd       d d d        d d d        d d d        y # 1 sw Y   qxY w# 1 sw Y   &xY w# 1 sw Y   *xY w# 1 sw Y   y xY w)Nrr   rf   frr+   homezhttps://example.comredirectz
            <div class="cms-screenblock">
            <div class="cms-screenblock-inner">
            <h1>This page has no preview!</h1>
            <p>It is being redirected to: <a href="z">z7</a></p>
            </div>
            </div>
        z$Edit endpoint shows redirect messagelanguage   Tcounthtmlz'Preview endpoint shows redirect message)get_superuserr   r   set_as_homepagerx   login_user_contextforce_languagesubTestr   rQ   rR   assertContainsr   )r3   userrr   page_contentexpectedra   rW   s          r7   "test_redirect_preview_in_edit_modez,ViewTests.test_redirect_preview_in_edit_mode   sq   !!#6#8$?*4H]^4 5A4I4I3J"\MbMbLc d		 $$T* 	LN4,@ 	LDE L),F;;??3/##Hhad#KL GH L,\DI;;??3/##Hhad#KL	L 	L 	LL LL L	L 	L 	L 	LsT   +E7E	>D7E >EE&E7E <EEEE	EE$c                     d}t        ddd|      }|j                         }| j                  |      }t        ||j	                  d            }| j                  |j                  d       | j                  |d   |       y )Nhttps://www.django-cms.org/re   rf   r+   rw   r`   Locationr   rp   r\   r!   get_pathrS   rT   )r3   redirect_onere   ra   r4   rW   s         r7   test_external_redirectz ViewTests.test_external_redirect   sv    4%!6|T""$""3'7CLL$67--s3*-|<r>   c                 $   d}d}t        ddd|      }t        ddd||      }|j                         }| j                  |      }t        ||j	                  d            }| j                  |j                  d	       | j                  |d
   d       y )Nr   /re   rf   r+   rw   twoparentrx   r`   r   rN   r   )r3   r   redirect_twore   r   ra   r4   rW   s           r7   test_internal_neutral_redirectz(ViewTests.test_internal_neutral_redirect   s    4%!6|T%!6SS_`""$""3'7CLL$67--s3*-v6r>   c                 $   d}d}t        ddd|      }t        ddd||      }|j                         }| j                  |      }t        ||j	                  d            }| j                  |j                  d	       | j                  |d
   |       y )Nr   rN   re   rf   r+   rw   threer   r`   r   r   )r3   r   redirect_threere   r   ra   r4   rW   s           r7   test_internal_forced_redirectz'ViewTests.test_internal_forced_redirect   s    4%!6|TG%:DWef$$&""3'7ENN4$89--s3*-~>r>   c                     t        dddd      }|j                         }| j                  |      }t        ||j	                  d            }| j                  |j                  d       y )Nre   rf   r+   z/one/rw   rO   r   r3   re   ra   r4   rW   s        r7   test_redirect_to_selfzViewTests.test_redirect_to_self   s\    %!6wO""$""3'7CLL$67--s3r>   c                     t        dddd      }|j                         }| j                  |      }t        ||j	                  d            }| j                  |j                  d       y )Nre   rf   r+   zhttp://testserver/en/one/rw   rO   r   r   s        r7   test_redirect_to_self_with_hostz)ViewTests.test_redirect_to_self_with_host   s]    %!6Gbc""$""3'7CLL$67--s3r>   c                    d}t        ddd|      }|j                         }d}| j                  ||z         }t        ||j	                  d            }| j                  |j                  d       | j                  |d	   |       y 
NrN   re   rf   r+   rw   z?param_name=param_valuery   r`   r   r   r3   rx   re   ra   paramsr4   rW   s          r7   -test_redirect_not_preserving_query_parametersz7ViewTests.test_redirect_not_preserving_query_parameters   s    %!6xP""$*""3<07CLL$L$?@--s3*-x8r>   T)"CMS_REDIRECT_PRESERVE_QUERY_PARAMSc                    d}t        ddd|      }|j                         }d}| j                  ||z         }t        ||j	                  d            }| j                  |j                  d       | j                  |d	   ||z          y r   r   r   s          r7   )test_redirect_preserving_query_parametersz3ViewTests.test_redirect_preserving_query_parameters   s     %!6xP""$*""3<07CLL$L$?@--s3*-x&/@Ar>   )CMS_REDIRECT_TO_LOWERCASE_SLUGc                     d}t        ddd|      }t        dddi	      }| j                  |      }t        ||j	                  d
            }| j                  |j                  d       | j                  |d   |       y )Nz/en/one/re   rf   r+   rw   zpages-details-by-slugslugOne)kwargsry   r`   r   )r   r   r\   r!   r   rS   rT   )r3   rx   re   ra   r4   rW   s         r7   "test_redirecting_to_lowercase_slugz,ViewTests.test_redirecting_to_lowercase_slug   s{    %!6xP-vuoF""3'7CLL$L$?@--s3*-x8r>   c                    | j                  dddd       d}t        j                  d|z        }| j                  |dz   	      5  | j	                  d
      }t        |d      }| j                  |j                  d       | j                  |j                  |d                d d d        t        j                  d|z        }| j                  d|dz         5  | j	                  d      }t        |d      }| j                  |j                  d       | j                  |j                  |d                d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nrr   rf   r+   T)login_requiredz
/accounts/z%s\?(signin=|next=/en/)&z?signin)	LOGIN_URLrN    r`   r   z%s\?(signin=|next=/)&F)USE_I18Nr   r   )
create_homepagerecompiler   r\   r!   rS   rT   
assertTruesearch)r3   	plain_urllogin_rxr4   rW   s        r7   test_login_requiredzViewTests.test_login_required   sB   V%:DQUV 	::9IEF]]Y%:]; 	C&&v.Gw+HX1137OOHOOHZ,@AB		C
 ::6BC]]EY5J]K 	C&&s+Gw+HX1137OOHOOHZ,@AB		C 	C	C 	C	C 	Cs   AD>AE
>E
Ec                    t        ddd      }| j                  |      }t        |      }| j                  j	                  |      }| j                  |d|        | j                         }| j                  |      5  | j                  j	                  |      }d d d        |j                  j                  }|j                         d   j                  d   }| j                  |j                  d       | j                  |j                  t        |             | j                  |j                   g d       | j#                         }|j$                  j'                  t(        j*                  j	                  d	
             | j                  |      5  | j                  j	                  |      }d d d        |j                  j                  }| j                  t-        |j                               d       t.        j*                  j1                  d||       | j                  |      5  | j                  j	                  |      }d d d        |j                  j                  }|j                         d   j                  d   }| j                  |j                  d       | j                  |j                  t        |             | j                  |j                   g d       y # 1 sw Y   IxY w# 1 sw Y   CxY w# 1 sw Y   xY w)Nrr   rf   r+   z/en/admin/login/?next=   r   Editcms-btnzcms-btn-actionzcms-btn-switch-editchange_page)codenameT)
can_changer   rr   )r   get_pagecontent_objr   rQ   rR   assertRedirectsr   r   wsgi_requesttoolbarget_right_itemsbuttonsrS   namera   r   extra_classes"get_staff_user_with_no_permissionsuser_permissionsaddr   objectslenr   create)r3   rr   r   page_preview_urlrW   r   r   edit_buttons           r7   test_edit_permissionzViewTests.test_edit_permission   sy   6#8$?//51,?;;??#34X)?@P?Q'RS !!#$$T* 	9{{'78H	9''//--/2::1=))62*=l*KL224hi 668!!*"4"4"8"8-"8"PQ$$T* 	9{{'78H	9''//W4467;%%Dt%L$$T* 	9{{'78H	9''//--/2::1=))62*=l*KL224hi1	9 	9	9 	9	9 	9s$   ;KK+$K8K(+K58Lc           	         ddl m} | j                         }t        d|      }t	        d      }|j                          ||_        |j                          t        ddd      }t        d	d
|      }|j                          | j                  |      5  t        d	      5  t        |d	      }t        |d	      }t        |d	      }	| j                  j!                  |      }
d|	 d|	 d| d}| j#                  |
|dd       |
j$                  j&                  }| j)                  t+        |j-                         d   j.                        d       |j-                         d   j.                  d   }| j)                  |j0                   |d             | j)                  |j2                  |       | j)                  |j4                  ddg       | j                  j!                  |      }
| j#                  |
|dd       |
j$                  j&                  }| j)                  t+        |j-                         d   j.                        d       |j-                         d   j.                  d   }| j)                  |j0                   |d             | j)                  |j2                  |       | j)                  |j4                  g d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   )gettext_lazyr+   )rz   r   	clipboard)slotrr   rf   ru   french homery   z
                <a href="zn" class="cms-btn cms-btn-disabled" title="Toggle structure"
                data-cms-structure-btn='{ "url": "zJ", "name": "Structure" }'
                data-cms-content-btn='{ "url": "zi", "name": "Content" }'>
                <span class="cms-icon cms-icon-plugins"></span></a>
            r{   Tr|   r   Previewr   zcms-btn-switch-saver   r   )django.utils.translationr   r   r   r   saver   r   r   r   r   r   r   r   r   rQ   rR   r   r   r   rS   r   r   r   r   ra   r   )r3   _r   user_settingsplaceholderrr   r   edit_urlpreview_urlstructure_urlrW   r   r   preview_buttonr   s                  r7   test_toolbar_switch_urlsz"ViewTests.test_toolbar_switch_urls   s   >!!#$d>!{3"-6#8$?*4E$$T* %	nN4,@ %	n*<$GH0MK4\DQM{{x0H' )44A? C22: <H 	    ++33GS!8!8!:1!=!E!EFJ$446q9AA!DN^00!I,?^//=^99IG\;]^{{{3H	    ++33GS!8!8!:1!=!E!EFJ!113A6>>qAK[--qy9[__h7[668lmK%	n %	n %	n %	n %	n %	ns%   KH$KKK	KK(c                     t        ddd       t        ddd      }t        dd|       | j                  j                  d      }| j	                  |j
                  d       | j                  |d	       y
)z
        Test details view when page slug and current language don't match.
        In this case we refer to the user's current language and the page slug we have for that language.
        rv   rf   r+   	stevejobsr,   jobsz/de/stevejobs/r`   z	/de/jobs/N)r   r   rQ   rR   rS   rT   r   )r3   cms_pagerW   s      r7    test_incorrect_slug_for_languagez*ViewTests.test_incorrect_slug_for_languageV  se    
 	F148{,A4HD&(3;;??#34--s3X{3r>   )z4django.contrib.sessions.middleware.SessionMiddlewarez7django.contrib.auth.middleware.AuthenticationMiddlewarez)django.middleware.locale.LocaleMiddlewarez.cms.tests.test_views.LanguageSettingMiddlewarez)django.middleware.common.CommonMiddlewarez)django.middleware.csrf.CsrfViewMiddlewarez6django.middleware.clickjacking.XFrameOptionsMiddlewarez)cms.middleware.user.CurrentUserMiddlewarez)cms.middleware.page.CurrentPageMiddlewarez(cms.middleware.toolbar.ToolbarMiddlewarez0cms.middleware.language.LanguageCookieMiddlewareen.example.comde.example.com)
MIDDLEWAREALLOWED_HOSTSc                    t        ddd      }t        dd|       |j                          | j                  j	                  dd      }| j                  |j                  d	       | j                  |d
       | j                  |j                  j                  d       | j                  j	                  dd      }| j                  |j                  d	       | j                  |d       | j                  |j                  j                  d       y)z
        Test that the language code is respected with subdomains.
        Tests that:
        - German subdomain (de.example.com) serves content in German
        - English subdomain (en.example.com) serves content in English
        rv   rf   r+   r,   heimr   r   )	HTTP_HOSTr`   z/de/r   rN   N)
r   r   r   rQ   rR   rS   rT   r   r   r0   )r3   rr   rW   s      r7   6test_language_code_is_respected_with_prefix_subdomainsz@ViewTests.test_language_code_is_respected_with_prefix_subdomainsb  s    0 6#8$?D&$/ ;;??32B?C--s3Xv...<<dC ;;??32B?C--s3Xv...<<dCr>   c                 n    | j                  d      }d|_        t        |      }| j                  |d       y)z
        When sending a request the CMS uses get_page_from_request to return the appropriate page.
        None should be returned
        r   z!<script>alert('attack!')</script>N)r\   	path_infor   rS   rb   s      r7   !test_page_sanitisation_xss_attackz+ViewTests.test_page_sanitisation_xss_attack  s8    
 ""3'?(1 	4(r>   c                     t        | j                         t               j                        }| j	                  d||d      }t        |      }| j                  |j                  d       y )Nz3/en/admin/login/?q=<script>alert('Attack')</script>)usernamepassword)	post_dataz <script>alert('Attack')</script>)getattrr   r   USERNAME_FIELDr\   r"   assertNotInra   )r3   r   r4   rW   s       r7   $test_malicious_content_login_requestz.ViewTests.test_malicious_content_login_request  s`    4--/1A1P1PQ""A#+B # 

 >'IJr>   c                     t        ddd       t        ddd      }|j                         }| j                  d      5  | j                  j	                  |       d d d        y # 1 sw Y   y xY w)Nrv   simple.htmlr+   
dreinhardt   )r   rp   assertNumQueriesrQ   rR   )r3   r   ra   s      r7   test_querieszViewTests.test_queries  s_    FM40|]DA'')""1% 	! KKOOC 	! 	! 	!s   A!!A*)r9   r:   r;   rF   rI   rX   rZ   r^   rc   rg   rs   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  __classcell__)rJ   s   @r7   rB   rB   C   s    
II=T4!L0=
7
?44	9 $?	B @	B d;9 <9C "jH4nl
4 
 ()9: D! D0)	K
!r>   rB   )r@   c                       e Zd Zd Zy)ContextTestsc                 V   ddl m} d}dt        j                  i}| j	                  d|d      }t        d|d|      }| j                  j                  d	       t        j                          t        j                          d
|_         | j                  di |5  | j                  t        dd            5  | j                  j                  d	      }d
d
d
       | j                  t        dd            5  | j                  j                  d   j                         | j                  |j                  d   j                          d
d
d
       | j                  d      5  t#        d      j%                  j                        }| j'                  |t)        d      d   d          d
d
d
       d
d
d
       t        j                          t        j                           | j                  di |5  | j                  t        dd            5 }| j                  j                  d      }t#        d      j%                  |j                        }| j'                  ||       t+        |j,                        }d
d
d
       d
d
d
       t        j                          t        j                          |j/                  d        | j                  di |5  | j                  dz         5  | j                  j                  d      }t#        d      j%                  |j                        }| j'                  ||       d
d
d
       d
d
d
       y
# 1 sw Y   vxY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   xY w# 1 sw Y   
xY w# 1 sw Y   xY w# 1 sw Y   `xY w# 1 sw Y   y
xY w)z
        Asserts the number of queries triggered by
        `cms.context_processors.cms_settings` and `cms.middleware.page`
        r   )contextrf   	TEMPLATESrr   r+   zpage-2)r   z/en/plain_view/N   r{   r4   CMS_TEMPLATE      z/en/page-2/INHERIT)templater=   )django.templater  r   r  r   r   rQ   rR   r   clearr$   _standard_context_processorsr   r   assertFalsecurrent_page_current_page_cacher
   resolverS   r   r   captured_queriesupdate_translations)	r3   r  page_templateoriginal_contextrr   page_2rW   r  num_queries_pages	            r7   test_context_current_pagez&ContextTests.test_context_current_page  s    
 	,-'););<##FM4@X}d4H 	)*/3, T]].-. 	O&&x27 >;;??+<=> &&x1~6 R  !1!1)!<!I!IJ  !1!1)!<!P!PQR &&q) O#N3;;H<L<LM  ?;+G+J1+MNO	O 	 T]].-. 	A&&xB'78 AG;;??=9#N3;;H<L<LM  =9#&w'?'?#@ 	A	A 	""I"6T]].-. 	:&&'7!';< :;;??=9#N3;;H<L<LM  =9:	: 	:3> >R RO O	O 	O"A A	A 	A: :	: 	:s   M,5M#M,4AMM,AM$M,.N
A'M91NN"AN4NM	
M,M	M,M)	$M,,M69N	>NNN	NN(N)r9   r:   r;   r  r=   r>   r7   r  r    s    7:r>   r  c                   (    e Zd ZddZddZd Zd Zy)EndpointTestsNc                 P   d}| j                  d|d      | _        | j                  j                         | _        t	        dd| j                        | _        t        j                  j                  t              | _
        | j                  j                  | j                                y )Nr   rr   r+   ru   r   )r   rr   get_content_objpage_content_enr   page_content_frr   r   get_for_modelr   content_typerQ   force_loginr   )r3   r  s     r7   rF   zEndpointTests.setUp  s{    %((E	#yy88:24		R'//==kJ 2 2 45r>   c                 8    | j                   j                          y rD   )rr   deleterE   s    r7   rI   zEndpointTests.tearDown  s    		r>   c                 R   | j                  d      }| j                         |_        t        d       } ||       t	        || j
                  j                  | j                  j                        }| j                  |j                  | j                         | j                  |d       y )Nr   c                     t        d      S )Nr   )r	   )reqs    r7   <lambda>z<EndpointTests.test_render_object_structure.<locals>.<lambda>  s    L,< r>   z<div class="cms-toolbar">)r\   r   r   r   r#   r#  idr   pkrS   r  rr   r   )r3   r4   midrW   s       r7   test_render_object_structurez*EndpointTests.test_render_object_structure  s    ""3'))+ <=G*7D4E4E4H4H$J^J^JaJab--tyy9H&ABr>   c                    | j                   j                  d      j                         }| j                  |dd       t	        d      5  t
        j                  j                  | j                               \  }}d|_	        |j                          t        d| j                  j                  | j                  j                  f      }| j                   j#                  |      }| j%                  |d       d|_	        |j                          | j                   j#                  |      }| j%                  |d	       d
d
d
       y
# 1 sw Y   y
xY w)zLStructure view shows the page content's language not the request's language.ru   
TextPluginry   )r   'cms_placeholder_render_object_structure)argsz<strong>Texte</strong>r+   z<strong>Text</strong>N)rr   get_placeholdersfirst_add_plugin_to_placeholderr   r   r   get_or_creater   rz   r   r    r#  r+  r!  r,  rQ   rR   r   )r3   r   settingr   structure_endpoint_urlrW   s         r7   !test_render_object_structure_i18nz/EndpointTests.test_render_object_structure_i18n  s   ii006<<>''\D'QD! 	C%--;;ASASAU;VJGQ#GLLN%29%%((((++&" {{'=>H*BC#GLLN{{'=>H*AB%	C 	C 	Cs   	C1EE)returnN)r9   r:   r;   rF   rI   r.  r9  r=   r>   r7   r  r    s    6CCr>   r  )Cr   rl   django.confr   django.contrib.authr   django.contrib.auth.modelsr   "django.contrib.contenttypes.modelsr   django.core.cacher   django.httpr   r	   r  r
   django.test.utilsr   django.urlsr   r   django.utilsr   django.utils.deprecationr   r   r   r   cms.apir   r   cms.middleware.toolbarr   
cms.modelsr   r   r   r   cms.page_renderingr   cms.test_utils.testcasesr   cms.test_utils.util.fuzzy_intr   cms.toolbar.utilsr   r   r   cms.utils.confr   cms.utils.pager   cms.utils.urlutilsr    	cms.viewsr!   r"   r#   menus.menu_poolr$   rn   rk   r'   rB   r  r  r=   r>   r7   <module>rQ     s    	 
   . 1 : # - $ / 1 $ 4 ? 4 4 M M . 0 2 
 + 0 , = = %8
 8 .f! f!	f!R  =>8:; 8: ?8:v.CK .Cr>   