
    Bh,:                       d dl 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 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 d dlm Z m!Z! d dl"m#Z#m$Z$m%Z%m&Z& d dl'm(Z(m)Z)m*Z* d dl+m,Z,m-Z-m.Z. d dl/m0Z0 d dl1m2Z2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl8m9Z9 d dl:m;Z; d dl<m=Z= d dl>m?Z?m@Z@ d dlAmBZB d dlCmDZDmEZEmFZF  G d de0      ZG G d de#e0      ZH G d d e#eG      ZI G d! d"e$eG      ZJ G d# d$eG      ZK ed%&       G d' d(e%e0             ZL G d) d*e&eG      ZM G d+ d,eG      ZN ed-d./       G d0 d1e0             ZO ed-d2/       G d3 d4e0             ZP ed%&       G d5 d6e0             ZQy)7    N)settings)AnonymousUserGroup
Permission)Site)TemplateTemplateSyntaxError)Context)override_settings)activateoverride)create_pagecreate_page_content)apphook_pool)get_visible_page_contents)ACCESS_PAGE_AND_DESCENDANTSPagePageContent)GlobalPagePermissionPagePermission)ExtendedMenusFixtureMenusFixtureSoftrootFixtureSubMenusFixture)NamespacedApp	SampleApp
SampleApp2)SampleAppMenu
StaticMenuStaticMenu2)CMSTestCase)LanguageOverrideapphooks)AttributeObject)get_current_site)get_cms_setting)get_default_language_for_site)NavigationNode)_build_nodes_inner_for_one_menu	menu_pool)CacheKey)
cut_levelsfind_selectedmark_descendantsc                   6     e Zd ZddZ fdZ fdZd Z xZS )BaseMenuTestc                 N   t        ddd      }t        dddd      }t        ddd	d      }t        d
ddd      }t        ddd      }|||||g}t        |D cg c]  }| c}d      }	| j                  |      }
t        j                  |
      }|j                  |	|
       |	|fS c c}w )N1z/1/   2z/2/   3z/3/   4z/4/   5z/5/   test)r(   r)   get_requestr*   get_rendererapply_modifiers)selfpathnode1node2node3node4node5nodesntreerequestrenderers               C/home/dcms/DCMS/lib/python3.12/site-packages/cms/tests/test_menu.py
_get_nodeszBaseMenuTest._get_nodes-   s    sE1-sE1a0sE1a0sE1a0sE1-ueU3.5/Aa/A6J""4())'2  w/U{	 0Bs   	B"c                 $   t         |           t        j                  st        j                          t        j
                  | _        d| j                  d   it        _        t        j                  t        j                         t        d       y )NCMSMenuen)supersetUpr*   
discovereddiscover_menusmenusold_menuclearr   SITE_IDr   r@   	__class__s    rL   rR   zBaseMenuTest.setUp:   sZ    ##$$&!$dmmI&>?	(()    c                 L    | j                   t        _        t        |           y NrV   r*   rU   rQ   tearDownrY   s    rL   r_   zBaseMenuTest.tearDownC       --	r[   c                 H    t         j                  j                  d|z        S NzP%spagecontent_set__titler   objectsgetr@   nums     rL   get_pagezBaseMenuTest.get_pageG       ||us{CCr[   )/)__name__
__module____qualname__rM   rR   r_   rj   __classcell__rZ   s   @rL   r0   r0   ,   s    Dr[   r0   c                   @     e Zd Z fdZ fdZd Zd Zd Zd Z xZ	S )MenuDiscoveryTestc                 6   t         |           dt        _        t        j                  | _        i t        _        t        j                          t        j                  t               t        j                  t               t        j                  t               y )NF)rQ   rR   r*   rS   rU   rV   rT   register_menur   r   r    rY   s    rL   rR   zMenuDiscoveryTest.setUpL   s\    $	!	  ".
+,r[   c                 L    | j                   t        _        t        |           y r]   r^   rY   s    rL   r_   zMenuDiscoveryTest.tearDownV   r`   r[   c                    dt         _        t        j                          t        j                  d      }t        j                  d      }| j	                  t        |      d       | j	                  t        |      d       t        dddd	
       t        dddd
       t        j                  d      }t        j                  d      }| j	                  t        |      d       | j	                  t        |      d       y )NFfor_renderingTr7   r3   apphooked-pagenav_playground.htmlrP   r   navigation_extendersr    )r*   rS   rT   get_registered_menusassertEquallenr   )r@   
registeredregistered_for_renderings      rL   test_menu_registeredz&MenuDiscoveryTest.test_menu_registeredZ   s    $	  " 33%H
 $-#A#APT#U  	Z!, 	56: 	$&;TXde$&;TXef33%H
#,#A#APT#U  	Z!,56:r[   c                    dt         _        t        j                          | j                  d      }t        j                  |      }t        j
                  d      }| j                  t        |      d       | j                  t        |j                        d       t        dddd	
       t        dddd
       | j                  d      }t        j                  |      }| j                  t        |j                        d       y )NF/en/rx   r7   r3   rz   r{   rP   r   r|   r    )
r*   rS   rT   r=   r>   r~   r   r   rU   r   )r@   	request_1request_1_rendererr   	request_2request_2_renderers         rL    test_menu_registered_in_rendererz2MenuDiscoveryTest.test_menu_registered_in_renderer|   s    $	  "
 $$V,	&33I>33%H
Z!,/556:$&;TXde$&;TXef$$V,	&33I>/556:r[   c           
         dt         _        t        j                          | j                  d      5  t	        t
              5  t        ddddd	      }| j                  t         j                         t        j                         }| j                  t         j                         d
}d
}|j                         D ]  \  }}|j                  d      r^|d
z  }| j                  |j                  t        |j                              xs$ |j                  t        |j                                     |dk(  s{|d
z  } | j                  |d       | j                  |d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)NF-cms.test_utils.project.urls_for_apphook_testsROOT_URLCONFrz   r{   rP   r   r   )apphookr}   r3   zStaticMenu:r    r   )r*   rS   rT   r   r#   r   r   
assertTruer~   items
startswithendswithstrpkr   )r@   pagerU   static_menusstatic_menus_2keymenus          rL   test_menu_expandedz$MenuDiscoveryTest.test_menu_expanded   sP   $	  "]](W]X 	4)$ 4"$)')5 	 4 45!668	 4 45  !!"!& ,IC~~m4$)S\(B(`cllSVW[W^W^S_F`am+&!+,   q1  374	4 	44 4	4 	4s*   E<C1E04+E0E<0E9	5E<<Fc           
         | j                  d      5  t        t        t              5  dt        _        t	        j                          t        dddd       t        dddd	
       t        dddddd	       | j                  t        t        j                  dd            d       d d d        d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)Nr   r   Frz   r{   rP   r   )r   r   r|   r   whatever)r   apphook_namespacer}   cms_enabledTr5   )r   r#   r   r   r   rS   discover_appsr   r   r   r*   get_menus_by_attributer@   s    rL   test_multiple_menusz%MenuDiscoveryTest.test_multiple_menus   s    ]](W]X 	`-4 `*/'**,,.CTS_`,.CT`lm$)+&0)5   Y%E%EmUY%Z![]^_`	` 	`` `	` 	`s#   CA>B7&C7C 	<CC)
rm   rn   ro   rR   r_   r   r   r   r   rp   rq   s   @rL   rs   rs   K   s$    - ;D;. 4D`r[   rs   c                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	ExtendedFixturesMenuTestsz
    Tree from fixture:

        + P1
        | + P2
        |   + P3
        | + P9
        |   + P10
        |      + P11
        + P4
        | + P5
        + P6 (not in menu)
          + P7
          + P8
    c                 H    t         j                  j                  d|z        S rb   re   rh   s     rL   rj   z"ExtendedFixturesMenuTests.get_page   rk   r[   c                 >    t         j                  j                         S r]   r   rf   allr   s    rL   get_all_pagesz'ExtendedFixturesMenuTests.get_all_pages       ||!!r[   c                     | j                         }| j                  d      |d<   | j                  dd      5  t        d      }| j	                  t
        |j                  |       d d d        y # 1 sw Y   y xY wNr3   childT)DEBUGTEMPLATE_DEBUGzB{% load menu_tags %}{% show_menu 0 0 0 0 'menu/menu.html' child %}get_contextrj   r   r   assertRaisesr	   renderr@   contexttpls      rL   #test_menu_failfast_on_invalid_usagez=ExtendedFixturesMenuTests.test_menu_failfast_on_invalid_usage   n    ""$==+]]d]; 	H_`C13::wG	H 	H 	H   -A..A7c                 b   | j                  d      }| j                  |      }t        d      }|j                  |       |d   }| j	                  t        |      d       | j	                  t        |d   j                        d       | j	                  t        |d   j                        d       y )Nr5   r   -{% load menu_tags %}{% show_menu 1 100 0 1 %}childrenr   r3   )rj   r   r   r   r   r   r   r@   rootr   r   rG   s        rL   test_show_menu_cut_inactivez5ExtendedFixturesMenuTests.test_show_menu_cut_inactive   s    }}Q"""-FG

7
#UQ'U1X../3U1X../3r[   c                    | j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }| j                  |d   j                         | j                  t        |d   j                        d       | j                  |d   j                  d   j                         t        d      }|j	                  |       |d   }| j                  t        |d   j                        d       | j                  t        |d   j                  d   j                        d       y )Nr5   rA   r   z/{% load menu_tags %}{% show_sub_menu 100 1 1 %}r   r   r3   -{% load menu_tags %}{% show_sub_menu 100 1 %})rj   r   get_absolute_urlr   r   r   selectedr   r   r   assertFalse)r@   page_2r   r   rG   s        rL   test_show_submenu_nephewsz3ExtendedFixturesMenuTests.test_show_submenu_nephews   s   q!""(?(?(A"OHI

7
#a))*U1X../3q**1-667FG

7
#U1X../3U1X..q1::;Q?r[   c                     | j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }| j                  t        |      d       y )Nr3   r   z4{% load menu_tags %}{% show_sub_menu 100 None 100 %}r   r5   )rj   r   r   r   r   r   r   r   s        rL   :test_show_submenu_template_root_level_none_no_nephew_limitzTExtendedFixturesMenuTests.test_show_submenu_template_root_level_none_no_nephew_limit  sc    }}Q""(=(=(?d"KMN

7
#UQ'r[   N)
rm   rn   ro   __doc__rj   r   r   r   r   r    r[   rL   r   r      s(     D"H4@&(r[   r   c                       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 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d Zd Zd Zd Zd Z d Z!y )!FixturesMenuTestsz
    Tree from fixture:

        + P1
        | + P2
        |   + P3
        + P4
        | + P5
        + P6 (not in menu)
          + P7
          + P8
    c                 H    t         j                  j                  d|z        S rb   re   rh   s     rL   rj   zFixturesMenuTests.get_page  rk   r[   c                 >    t         j                  j                         S r]   r   r   s    rL   r   zFixturesMenuTests.get_all_pages  r   r[   c                     | j                         }| j                  d      |d<   | j                  dd      5  t        d      }| j	                  t
        |j                  |       d d d        y # 1 sw Y   y xY wr   r   r   s      rL   r   z5FixturesMenuTests.test_menu_failfast_on_invalid_usage!  r   r   c                    t        j                         }| j                  t        |      d       t	        d      5  | j
                  j                  | j                               }d d d        | j                  j                  d       | j                         }t        j                  |      }|j                  d      }|j                  |      }| j                         j                  d      }| j                  t        |      t        |             | j                  |D cg c]  }|j!                          c}|D 	cg c]  }	|	j!                          c}	       y # 1 sw Y   xY wc c}w c c}	w )Nr3   rP      rO   rA   )r*   r~   r   r   force_languageclientrg   get_pages_rootstatus_coder=   r>   get_menu	get_nodesr   order_byassertSequenceEqualr   )
r@   rU   responserJ   rK   r   rG   pagesnoder   s
             rL   test_basic_cms_menuz%FixturesMenuTests.test_basic_cms_menu)  s$   ..0UQ'D! 	>{{t':':'<=H	>--s3""$))'2   +w'""$--f5USZ0  167T""$7167T""$7	
	> 	> 87s   *E"E*?E/
E'c                    t        ddd      }| j                  d      }t        j                  |      }d|_        |j                         }t        |      D cg c]%  \  }}|j                  |j                         k(  s$|' }}}| j                  t        j                  j                         d       | j                  | j                               5  |j                  dd}| j!                  t"        d|j                        }	| j$                  j'                  |	|      }
| j                  |
j(                  d	       | j                  t        j                  j                         d
       ddd       | j                  d      }t        j                  |      }d|_        |j                         }t        |      D cg c]%  \  }}|j                  |j                         k(  s$|' }}}| j                  t        j                  j                         d       | j+                  ||d       yc c}}w # 1 sw Y   xY wc c}}w )zK
        Test checks if the menu cache is cleaned after move page.
        zpage to mover{   rP   rl   Tr3   )idposition	move_pager   r   Nz:Index should not be the same after move page in navigation)r   r=   r*   r>   draft_mode_activer   	enumeratetitle	get_titler   r+   rf   countlogin_user_contextget_superuserr   get_admin_urlr   r   postr   assertNotEqual)r@   r   rJ   rK   nodes_beforeisindex_beforedataendpointr   nodes_afterindex_afters                rL   &test_show_page_in_menu_after_move_pagez8FixturesMenuTests.test_show_page_in_menu_after_move_page=  s    >+@$G""3'))'2%)"))+&/&=]daDNNL\A\]]))//115$$T%7%7%9: 	:''q1D))$TWWEH{{''$7HX1137X--335q9	: ""3'))'2%)"((*%.{%;[TQqww$..JZ?Zq[[))//115L+7st% ^	: 	: \s%   %H,?H,BH2=%H>#H>2H;c                    | j                         j                  d      }| j                  dd      }t        j                  |      }|j                  d      }|j                  |      }| j                  t        |      t        |             t        d      5  | j                  |D cg c]  }|j                          c}|D cg c]  }|j                  dd       c}       d d d        | j                  dd      }t        j                  t        d	            }d
|d   d   d<   | j                  |      5  t        j                  |      }|j                  d      }|j                  |      }| j                  t        |      d       d d d        t         j"                  j%                         D ]>  }t'        d|j)                  d      |dj+                  |j-                  d                   @ | j                  dd      }t        j                  |      }|j                  d      }|j                  |      }| j                  t        |      t        |             t        d      5  | j                  |D cg c]  }|j                          c}|D cg c]  }|j                  dd       c}       d d d        | j                  dd      }| j                  |      5  t        j                  |      }|j                  d      }|j                  |      }t        d      5  | j                  |D cg c]  }|j                          c}|D cg c]  }|j                  dd       c}       d d d        d d d        y c c}w c c}w # 1 sw Y   xY w# 1 sw Y   xY wc c}w c c}w # 1 sw Y   xY wc c}w c c}w # 1 sw Y   VxY w# 1 sw Y   y xY w)NrA   z/de/de)rA   languagerO   rP   F)fallback	LANGUAGESTr3   hide_untranslatedCMS_LANGUAGESr   z{}-de)r   r   r   slug)r   r   r=   r*   r>   r   r   r   r   r   r   r   copydeepcopyr&   r   r   rf   r   r   r   formatget_slug)	r@   r   rJ   rK   r   rG   r   r   lang_settingss	            rL   ,test_cms_menu_public_with_multiple_languagesz>FixturesMenuTests.test_cms_menu_public_with_multiple_languages[  sn   ""$--f5 """>))'2  +w'USZ0D! 	 $$5:;T&&(;INO&&te&<O	 """>ok&BC37a/0]]]7 	, --g6H$$Y/DNN7+ESZ+		, LL$$& 	DT^^D%97>>Z^ZgZghlZmKn	 """>))'2  +w'USZ0D! 	$$5:;T&&(;INO&&te&<O	 """>]]]7 		 --g6H$$Y/DNN7+E% ((9>?T**,?MRSTT**4%*@S		 		K <O	 		, 	,* <O	 	  @S 		 		s   N)N
 NN N=AN$0N; N1
N;N67N;+AO.O>OOO5O<O
NN!$N.1
N;;O
OO	OO&c                    | j                  d      }| j                  |      }t        d      }|j                  |       |d   }| j	                  t        |      d       | j	                  |d   j                  d       | j	                  |d   j                  d       | j	                  |d   j                  d       | j	                  |d   j                  d   j                  d       | j	                  |d   j                  d   j                  d   j                  d       | j	                  |d   j                         | j                                | j	                  |d   j                         | j                  d	      j                                | j	                  |d   j                  d       | j	                  |d   j                  d       y )
Nr3   r   #{% load menu_tags %}{% show_menu %}r   r5   r   TFr9   )rj   r   r   r   r   r   r   sibling
descendantr   r   r   r   s        rL   test_show_menuz FixturesMenuTests.test_show_menu  s   }}Q"""-<=

7
#UQ'q**D1q))51q,,e4q**1-88$?q**1-66q9DDdKq224d6I6I6KLq224dmmA6F6W6W6YZq))40q**E2r[   c                     | j                         }| j                  d      5  	 t        d      }|j                  |       d d d        y # 1 sw Y   y xY w)Nr;   r  )r   assertNumQueriesr   r   r   s      rL   test_show_menu_num_queriesz,FixturesMenuTests.test_show_menu_num_queries  sQ    ""$""1% 
	  @ACJJw
	  
	  
	 s   A		Ac                    | j                         }t        d      }| j                  t        j                  j                         d       |j                  |       | j                  t        j                  j                         d       |j                  |       | j                  t        j                  j                         d       y )Nr  r   r3   )r   r   r   r+   rf   r   r   r   s      rL   test_show_menu_cache_key_leakz/FixturesMenuTests.test_show_menu_cache_key_leak  s    ""$<=))//115

7))//115

7))//115r[   c                    | j                  d      }| j                  |j                         |      }d|d   j                  d<   | j	                  d      5  t        d      j                  |       d d d        | j                  t        j                  j                         d       | j	                  d      5  t        d      j                  |       d d d        t        j                  j                         j                          | j	                  d      5  t        d      j                  |       d d d        y # 1 sw Y   xY w# 1 sw Y   vxY w# 1 sw Y   y xY w)Nr3   r   FrJ   cms_editr;   r  )rj   r   r   sessionr  r   r   r   r+   rf   r   r   delete)r@   cms_pager   s      rL   &test_menu_cache_respects_database_keysz8FixturesMenuTests.test_menu_cache_respects_database_keys  sD   ==#""(A(A(C("S16	"":. ""1% 	L :;BB7K	L 	))//115 ""1% 	L :;BB7K	L 	%%' ""1% 	L :;BB7K	L 	L-	L 	L	L 	L	L 	Ls$   D<8EE<EEEc                 r   t         j                  j                  ddd       t         j                  j                  ddd       | j                  t         j                  j	                         d       t        j                  dd       | j                  t         j                  j	                         d       y)	zL
        Tests that the menu clears all keys, including duplicates.
        frr3   a)r   siter   r5   )site_idr   r   N)r+   rf   creater   r   r*   rW   r   s    rL   test_menu_keys_duplicate_clearz0FixturesMenuTests.test_menu_keys_duplicate_clear  s     	A3?A3?))//115D1))//115r[   c                    | j                  | j                  d            }t        d      }|j                  |       |d   }| j	                  t        |      d       | j                  |d   j                         | j	                  t        |d   j                        d       | j	                  t        |d   j                        d       | j	                  t        |d   j                  d   j                        d       | j                  d      }| j                  |j                         |      }t        d      }|j                  |       |d   }| j	                  t        |      d       | j	                  t        |d   j                        d       | j                  |d   j                         | j	                  t        |d   j                        d       | j	                  |d   j                  d   j                  g        y )	Nr3   r   /{% load menu_tags %}{% show_menu 0 100 0 100 %}r   r5   r   r9   r   )
r   rj   r   r   r   r   r   r   r   r   )r@   r   r   rG   page_4s        rL   test_only_active_treez'FixturesMenuTests.test_only_active_tree  s   ""a(8"9HI

7
# 	UQ'a))*U1X../3U1X../3U1X..q1::;Q?q!""(?(?(A"OHI

7
# 	UQ'U1X../3a))*U1X../3q**1-66;r[   c                    | j                  | j                  d            }t        d      }|j                  |       |d   }| j	                  t        |d   j                        d       | j	                  t        |d   j                        d       | j	                  t        |d   j                  d   j                        d       y )Nr3   r   z-{% load menu_tags %}{% show_menu 0 100 0 1 %}r   r   )r   rj   r   r   r   r   r   r@   r   r   rG   s       rL   test_only_one_active_levelz,FixturesMenuTests.test_only_one_active_level  s    ""a(8"9FG

7
#U1X../3U1X../3U1X..q1::;Q?r[   c                     | j                         }t        d      }|j                  |       |d   }|D ]'  }| j                  t	        |j
                        d       ) y )Nz+{% load menu_tags %}{% show_menu 0 0 0 0 %}r   r   r   r   r   r   r   r   r@   r   r   rG   r   s        rL   test_only_level_zeroz&FixturesMenuTests.test_only_level_zero!  sY    ""$DE

7
# 	4DS/3	4r[   c                 f   t               }| j                         }t        d      }|j                  |       |d   }t        j
                  j                  d|      }| j                  t        |      |j                                |D ]'  }| j                  t        |j                        d       ) y )Nz/{% load menu_tags %}{% show_menu 1 1 100 100 %}r   r5   )depthr  r   )r%   r   r   r   r   rf   filterr   r   r   r   )r@   r  r   r   rG   level_2_pagesr   s          rL   test_only_level_onez%FixturesMenuTests.test_only_level_one*  s    !""$HI

7
#++!$+?U]%8%8%:; 	4DS/3	4r[   c                 L   | j                  | j                  d            }t        d      }|j                  |       |d   }| j	                  t        |      d       | j	                  |d   j                  d       | j	                  t        |d   j                        d       y )Nr3   r   z-{% load menu_tags %}{% show_menu 1 1 0 100 %}r   r   Tr   rj   r   r   r   r   r
  r   r#  s       rL   test_only_level_one_activez,FixturesMenuTests.test_only_level_one_active6  s    ""a(8"9FG

7
# 	UQ'q,,d3U1X../3r[   c                    | j                  | j                  d            }t        d      }|j                  |       |d   }| j	                  t        |      d       | j	                  |d   j                  d       | j	                  |d   j                  d       |D ]'  }| j	                  t        |j                        d       ) y )	Nr3   r   z-{% load menu_tags %}{% show_menu 1 1 1 100 %}r   r9   r   TFr/  r'  s        rL   (test_only_level_one_active_and_inacgtivez:FixturesMenuTests.test_only_level_one_active_and_inacgtiveC  s    ""a(8"9FG

7
# 	UQ'q,,d3q,,e4 	4DS/3	4r[   c                     | j                         }t        d      }|j                  |       |d   }| j                  t	        |      d       |D ]'  }| j                  t	        |j
                        d       ) y )Nz/{% load menu_tags %}{% show_menu 0 1 100 100 %}r   r5   r3   r&  r'  s        rL   test_level_zero_and_onez)FixturesMenuTests.test_level_zero_and_oneV  so    ""$HI

7
# 	UQ' 	4DS/3	4r[   c                 X   | j                         }t        d      }|j                  |       |d   }| j                  t	        |      d       |D ]Y  }| j                  t	        |j
                        d       | j                  t	        |j
                  d   j
                        d       [ y )Nz/{% load menu_tags %}{% show_menu 0 100 1 100 %}r   r5   r3   r   r&  r'  s        rL   test_one_inactivez#FixturesMenuTests.test_one_inactiveg  s    ""$HI

7
# 	UQ' 	@DS/3Sq!1!:!:;Q?	@r[   c                    | j                  | j                  d            }t        d      }|j                  |       |d   }| j	                  |d   j
                  d       | j	                  t        |      d       | j	                  t        |d   j                        d       t        d      }|j                  |       |d   }| j	                  t        |      d       | j	                  t        |d   j                        d       | j                  d      }| j                  |j                         |	      }t        d
      }|j                  |       |d   }| j                  |d   j                         | j                  |d   j                  d   j                         | j	                  |d   j                         | j                  d      j                                | j	                  t        |d   j                        d       | j                  d      }| j                  |j                         |	      }t        d      }|j                  |       |d   }| j	                  |d   j                         | j                  d      j                                | j                  |d   j                  d   j                         y )Nr3   r   '{% load menu_tags %}{% show_sub_menu %}r   r   Tz*{% load menu_tags %}{% show_sub_menu 1  %}r7   r   r   r5   z-{% load menu_tags %}{% show_sub_menu 100 0 %})r   rj   r   r   r   r
  r   r   r   r   r   r   )r@   r   r   rG   page_3r   s         rL   test_show_submenuz#FixturesMenuTests.test_show_submenuy  sQ   ""a(8"9@A

7
#q,,d3UQ'U1X../3CD

7
#UQ'U1X../3q!""(?(?(A"OFG

7
#q**+a))!,556q224dmmA6F6W6W6YZU1X../3q!""(?(?(A"OFG

7
#q224dmmA6F6W6W6YZa))!,556r[   c                 X   | j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }| j                  |d   j                         | j                  t        |      d       | j                  |d   j                         y )Nr3   r   z2{% load menu_tags %}{% show_sub_menu 100 None 1 %}r   r   )rj   r   r   r   r   r   r   r   r   r   r   r   s        rL   *test_show_submenu_template_root_level_nonez<FixturesMenuTests.test_show_submenu_template_root_level_none  s    }}Q""(=(=(?d"KKL

7
#q**+UQ'a))*r[   c                    | j                  d      }| j                  | j                  d      j                         |      }t        d      }|j	                  |       |d   }| j                  t        |      d       t        d      }|j	                  |       |d   }| j                  t        |      d       | j                         }t        d      }|j	                  |       |d   }| j                  t        |      d       t        d      }|j	                  |       |d   }| j                  t        |      d       | j                  d      }d	|_        |j                          | j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }| j                  t        |      d       | j                  |d   j                         | j                                | j                  t        |d   t              d
       | j                  |d   j                         |j                                y )Nr7   r   ){% load menu_tags %}{% show_breadcrumb %}	ancestorsz+{% load menu_tags %}{% show_breadcrumb 1 %}r5   r3   r   FT)rj   r   r   r   r   r   r   in_navigationsaver   
isinstancer(   )r@   r9  r   r   rG   page1page2s          rL   test_show_breadcrumbz&FixturesMenuTests.test_show_breadcrumb  s   q!""a(8(I(I(KRX"YBC

7$UQ'DE

7$UQ'""$BC

7$UQ'DE

7$UQ'a #

a ""(>(>(@u"MBC

7$UQ'q224d6I6I6KLE!Hn=tDq224e6L6L6NOr[   c                 n   t        j                  t        d            }d|d   d   d<   | j                  |      5  | j	                  | j                  d      j                               }t        d	      }|j                  |       | j                  t        |d
         d       t        d      }|j                  |       | j                  |d   d       t        d      }|j                  |       | j                  |d   d       |d
   D ]  } | j                  |   	 d d d        y # 1 sw Y   y xY w)Nr   Fr3   r   publicr   r7   rA   *{% load menu_tags %}{% language_chooser %}	languageszL{% load menu_tags %}{% language_chooser 'menu/test_language_chooser.html' %}templatezmenu/test_language_chooser.htmlzT{% load menu_tags %}{% language_chooser 'short' 'menu/test_language_chooser.html' %})r  r  r&   r   r   rj   r   r   r   r   r   )r@   r  r   r   langs        rL   test_language_chooserz'FixturesMenuTests.test_language_chooser  s    ok&BC(-aH%]]]7 	(&&DMM!,<,M,M,O&PGGHCJJwS!56:ijCJJwWZ02STqrCJJwWZ02ST, (   $'(	( 	( 	(s   C%D++D4c           	      B   | j                         }t        j                  t        d            }d|d   d   d<   d|d   d   d<   | j	                  |      5  | j                  |      5  | j                  | j                  d      j                               }t        d	      j                  |       | j                  t        |d
         d       | j                  t        d |d
   D              g d       ddd       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)zy
        Language chooser should show all configured languages
        on the current site if the user is staff.
        r   Fr3   rG  r5   r   r7   rH  rI  rJ  r;   c              3   &   K   | ]	  }|d      ywr   Nr   .0rL  s     rL   	<genexpr>zHFixturesMenuTests.test_language_chooser_all_for_staff.<locals>.<genexpr>  s     Dt47D   )r   rP   es-mxr  zpt-brN)r   r  r  r&   r   r   r   rj   r   r   r   r   r   r   sorted)r@   	superuserr  r   s       rL   #test_language_chooser_all_for_staffz5FixturesMenuTests.test_language_chooser_all_for_staff  s   
 &&(	ok&BC(-aH%(-aH%]]]7 	((3 **a0@0Q0Q0S*TEFMMgV  W[%9!:A>((Dw{/CDDFj		 	 	 	s%   D)BD	8D	D	DDc                    t        j                  t        d            }d|d   d   d<   d|d   d   d<   | j                  |      5  | j	                  | j                  d      j                               }t        d	      j                  |       | j                  t        |d
         d       | j                  t        d |d
   D              ddg       ddd       y# 1 sw Y   yxY w)z
        Language chooser should only show public configured languages
        on the current site if the user is anon.
        r   Fr3   rG  r5   r   r7   rH  rI  rJ  c              3   &   K   | ]	  }|d      ywrP  r   rQ  s     rL   rS  zJFixturesMenuTests.test_language_chooser_public_for_anon.<locals>.<genexpr>  s     +UDG+UrT  rP   rU  N)r  r  r&   r   r   rj   r   r   r   r   r   r   rV  )r@   r  r   s      rL   %test_language_chooser_public_for_anonz7FixturesMenuTests.test_language_chooser_public_for_anon  s     ok&BC(-aH%(-aH%]]]7 	h&&DMM!,<,M,M,O&PGABII'RS!56:$$V+U@T+U%UX\^eWfg		h 	h 	hs   BCC(c                     | j                  d      j                         }| j                  |      }t        ddz        }|j	                  |      }| j                  |d|z         y )Nr7   rH  z4{%% load menu_tags %%}{%% page_language_url '%s' %%}rP   z%s)rj   r   r   r   r   r   )r@   rA   r   r   urls        rL   test_page_language_urlz(FixturesMenuTests.test_page_language_url	  s_    }}Q002"""-MPTTUjj!dTk*r[   c                 8   | j                  d      }d|_        |j                          | j                  |      }| j	                  |j                  d       | j                  d      }| j                  |j                               }t        d      }|j                  |       |d   }| j	                  t        |      d       | j                  d      j                         }| j	                  |d	   j                         |       d
|_
        |j                          | j                  |j                               }t        d      }|j                  |       |d   }| j	                  t        |      d       | j	                  |d	   j                         |       y )Nr5   hellor;   rH  z4{% load menu_tags %}{% show_menu_below_id 'hello' %}r   r3   r7   r   F)rj   
reverse_idrA  reloadr   r   r   r   r   r   r@  )r@   rD  page5r   r   rG   	page3_urls          rL   test_show_menu_below_idz)FixturesMenuTests.test_show_menu_below_id  sW   a "

E"))73a ""(>(>(@"AMN

7
#UQ'MM!$557	q224i@#

""(>(>(@"AMN

7
#UQ'q224i@r[   c                    | j                  d      }|j                  d       |j                          | j                  d      }|j                  d       |j                          | j                         }t	        d      }|j                  |       |d   }| j                  t        |      d       | j                  |d   j                         | j                  d      j                                | j                  |d   j                  d   j                         | j                  d	      j                                | j                  d      }|j                  d
       |j                          t        j                  t        j                         | j                         }t	        d      }|j                  |       |d   }| j                  t        |      d       y )Nr3   Fr@  r9   1{% load menu_tags %}{% show_menu 0 100 100 100 %}r   r   r5   r7   T)rj   update_translationsrA  r   r   r   r   r   r   r   r*   rW   r   rX   )r@   rC  page4r   r   rG   s         rL   test_home_not_in_menuz'FixturesMenuTests.test_home_not_in_menu'  s|   a !!!6

a !!!6

""$JK

7
#UQ'q224dmmA6F6W6W6YZq**1->>@$--PQBRBcBcBefa !!!5

(()""$JK

7
#UQ'r[   c                    | j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }|j                         j                  dd      j                         }| j                  t        |      |       | j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }| j                  t        |      |       t        d	      }|j	                  |       |d   }|j                         j                  dd      j                         }| j                  t        |      |       y
)z
        Here's the structure bit we're interested in:

        + P6 (not in menu)
          + P7
          + P8

        When we render P6, there should be a menu entry for P7 and P8 if the
        tag parameters are "1 XXX XXX XXX"
           r   r   r   rP   T)pagecontent_set__languagepagecontent_set__in_navigation   z-{% load menu_tags %}{% show_menu 2 100 0 1 %}N)
rj   r   r   r   r   get_child_pagesr+  r   r   r   )r@   page6r   r   rG   number_of_p6_childrenpage7number_of_p7_childrens           rL   $test_show_submenu_from_non_menu_pagez6FixturesMenuTests.test_show_submenu_from_non_menu_page?  sX    a ""5#9#9#;%"HFG

7
#!!#**Tjn*ouuw 	 	U%:;a ""5#9#9#;%"HFG

7
#U%:;FG

7
#!!#**Tjn*ouuw 	 	U%:;r[   c                    t         j                  j                  d      }t        ddd|d      }| j	                  |j                         |      }t        d	      }|j                  |       |d
   }| j                  t        |      d       t        d      }|j                  |       |d
   }| j                  t        |      d       t        d      }|j                  |       |d
   }| j                  t        |      d       y )NP3rc   	invisibler{   rP   Fparentr@  r   r>  r?  r7   zD{% load menu_tags %}{% show_breadcrumb 0 'menu/breadcrumb.html' 1 %}zD{% load menu_tags %}{% show_breadcrumb 0 'menu/breadcrumb.html' 0 %}r9   )
r   rf   rg   r   r   r   r   r   r   r   )r@   r{  invisible_pager   r   rG   s         rL   test_show_breadcrumb_invisiblez0FixturesMenuTests.test_show_breadcrumb_invisiblec  s    !!!>$[2GV\lqr""002 # 
 BC

7$UQ']^

7$UQ']^

7$UQ'r[   N)"rm   rn   ro   r   rj   r   r   r   r   r  r  r  r  r  r  r!  r$  r(  r-  r0  r2  r4  r6  r:  r<  rE  rM  rX  r[  r^  re  rk  rv  r}  r   r[   rL   r   r     s    D"H
(u<<|3$ 6#LJ	6"<H@4
444&4"@$%7N+ PD(&*h$+A.(0"<H(r[   r   c                   N    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y)	MenuTestsc                 >   t        dddd      }t        dddd      }t        dd	dd
      }t        ddd
d      }t        dddd      }d}|||||g}t        |      }t        ||      }	| j                  t        |	      |       | j                  |j                  |       | j                  |j                  |       | j                  |j                  |       | j                  |j                  |       | j                  |j                  d       | j                  |j
                  g        | j                  |j
                  |g       | j                  |j
                  |g       | j                  |j
                  |g       | j                  |j
                  |g       y)z
        Tests the worst case scenario

        node5
         node4
          node3
           node2
            node1
        Test1/test1/r3   r5   Test2/test2/r7   Test3/test3/r9   Test4/test4/r;   Test5/test5/NTest)r(   r   r)   r   r{  r   )
r@   rB   rC   rD   rE   rF   menu_class_namerG   	len_nodes
final_lists
             rL   *test_build_nodes_inner_for_worst_case_menuz4MenuTests.test_build_nodes_inner_for_worst_case_menuy  sj    w	1a8w	1a8w	1a8w	1a8w	1d; 
 J	4UOL
Z)4u-u-u-u-t,,%1%1%1%1r[   c                      y)z
        TODO:
            To properly handle this test we need to have a circular dependency
            detection system.
            Go nuts implementing it :)
        Nr   r   s    rL   (test_build_nodes_inner_for_circular_menuz2MenuTests.test_build_nodes_inner_for_circular_menu  s     	r[   c                 p   t        dddd      }t        dddd      }t        dd	d
d      }t        dddd      }t        dddd      }d}|||||g}t        ||      }| j                  t        |      d
       | j	                  ||v        | j	                  ||v        | j                  |j
                  d       | j                  |j
                  d       | j                  |j
                  |       | j                  |j
                  |       | j                  |j
                  d       | j                  |j                  g        | j                  |j                  g        | j                  |j                  g        | j                  |j                  |g       | j                  |j                  |g       y)z
        Tests a broken menu tree (non-existing parent)

        node5
         node4
          node3

        <non-existent>
         node2
          node1
        r  r  r3   r5   r  r     r  r  r7   r9   r  r  r;   r  r  Nr  )r(   r)   r   r   r   r{  r   )	r@   rB   rC   rD   rE   rF   r  rG   r  s	            rL   &test_build_nodes_inner_for_broken_menuz0MenuTests.test_build_nodes_inner_for_broken_menu  s    w	1a8w	1b9w	1a8w	1a8w	1d; 
 5UOL
Z!,*,-*,-t,t,u-u-t,,,,%1%1r[   c                     | j                         \  }}t        |       |D ]  }| j                  |j                  |         y r]   )rM   r.   r   r
  )r@   
tree_nodes
flat_nodesr   s       rL   test_utils_mark_descendantsz%MenuTests.test_utils_mark_descendants  s<    !%!2
J$ 	3DOODOOT2	3r[   c                     | j                         \  }}|d   }t        |      }| j                  ||       t        g       }| j                  |d        y )Nr   )rM   r-   r   )r@   r  r  r   r   s        rL   test_utils_find_selectedz"MenuTests.test_utils_find_selected  sP    !%!2
J!} ,4( $4(r[   c                 j    | j                         \  }}| j                  t        |d      |d   g       y Nr3   )rM   r   r,   )r@   r  r  s      rL   test_utils_cut_levelszMenuTests.test_utils_cut_levels  s0    !%!2
JJ2Z]ODr[   c                     | j                         }t        d      }|j                  |       |d   }| j                  t	        |      d       y )Nrh  r   r   )r   r   r   r   r   r#  s       rL   test_empty_menuzMenuTests.test_empty_menu  sE    ""$JK

7
#UQ'r[   c                 D   t         j                  j                  ddd      }|ddd}|ddd}t        d!d	d
i| t        d"d	d
i| t        d#d	d
i| t        d$d	d
i| t        d%d	d
i| | j	                  d      5  | j                  d      }t               }||d<   t        d      }|j                  |       |d   }| j                  t        |      d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       ddd       t        j                  d       | j	                  d      5  | j                  d       }t               }||d<   t        d      }|j                  |       |d   }| j                  t        |      d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       | j                  |d   j                  d       | j                  |d   j                         d       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)&zp
        When rendering the menu, always fallback to a configured
        language on the current site.
        r5   example-2.comr   namedomainr{   r   )r  rK  r   r  DE-P1r@  TDE-P2DE-P3FR-P1FR-P2rX   r   rJ   rh  r   r;   r   
/de/de-p1/r3   
/de/de-p2/
/de/de-p3/r7   z
/fr/fr-p1/r9   
/fr/fr-p2/Nr  
/en/de-p2/r  r  r  )r  )r  )r   rf   r  r   r   r=   r
   r   r   r   r   r   r   r*   rW   )r@   site_2de_defaultsfr_defaultsrJ   r   r   rG   s           rL   &test_render_menu_with_invalid_languagez0MenuTests.test_render_menu_with_invalid_language  s    $$$X-
 -

 	?4?;??4?;??4?;??4?;??4?;?]]1]% 	H&&v.GiG!(GINOCJJwJ'ESZ+U1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,G#	H& 	"]]1]% 	H&&|4GiG!(GINOCJJwJ'ESZ+U1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,G#	H 	H+	H 	H*	H 	Hs   F'P	F'P	PPc                 <   t         j                  j                  ddd      }|dddd}t        d#i | t        d$i | t        d%i | t	        |      }|j                          |j                          |j                  j                  dddd       t	        |      }|j                          |j                          |j                  j                  dddd       t        dd|d       | j                  d      5  | j                  d      }t               }||d<   t        d      }|j                  |       |d   }| j                  t        |      d       | j                  |d   j                   d       | j                  |d   j#                         d       | j                  |d   j                   d	       | j                  |d   j#                         d       | j                  |d   j                   d
       | j                  |d   j#                         d       | j                  |d   j                   d       | j                  |d   j#                         d       d d d        t%        j&                  d!       | j                  d      5  | j                  d"      }t               }||d<   t        d      }|j                  |       |d   }| j                  t        |      d       | j                  |d   j                   d       | j                  |d   j#                         d       | j                  |d   j                   d	       | j                  |d   j#                         d       | j                  |d   j                   d
       | j                  |d   j#                         d       | j                  |d   j                   d       | j                  |d   j#                         d       d d d        y # 1 sw Y   xY w# 1 sw Y   y xY w)&z
        This tests an edge-case where the user requests a
        language not configure for the current site
        while having pages on the current site with unconfigured
        translations.
        r5   r  r  r{   r   T)r  rK  r   r@  r  r  r  )r  nlzNL-P1)r   r   rK  r@  zNL-P2r  r  rg  r  r   rJ   rh  r   r9   r   r  r3   r  r  r7   r  Nr  r  r  r  r  )r   rf   r  r   r   add_to_treerA  pagecontent_setr   r   r=   r
   r   r   r   r   r   r   r*   rW   )	r@   r  r  	nl_page_1	nl_page_2rJ   r   r   rG   s	            rL   /test_render_menu_with_invalid_language_and_pagez9MenuTests.test_render_menu_with_invalid_language_and_page/  s    $$$X-!	
 	+{++{++{+ f%	!!((*	 	) 	
 f%	!!((*	 	) 	
 	D'9DI]]1]% 	H&&v.GiG!(GINOCJJwJ'ESZ+U1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,G	H" 	"]]1]% 	H&&|4GiG!(GINOCJJwJ'ESZ+U1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,GU1X^^W5U1X668,G	H 	H'	H 	H&	H 	Hs   E%PE%PPPc                    ddd}t        dddi| t        dddi| t        dddi| t        j                  t        d            }g |d   d   d	<   g |d   d   d	<   | j	                  |
      5  | j                  d      }t               }||d<   t        d      }|j                  |       |d   }| j                  t        |      d       ddd       t        j                  d       | j	                  |
      5  | j                  d      }t               }||d<   t        d      }|j                  |       |d   }| j                  t        |      d       ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z
        The requested language is valid but there's no page
        with it and the user has disabled all fallbacks.
        The cms should render only nodes for the requested language.
        r{   r   )rK  r   r@  Tr   r3   r   	fallbacksr   r   rJ   rh  r   Nr  r  r  r  r  )r   r  r  r&   r   r=   r
   r   r   r   r   r*   rW   )r@   defaultsr  rJ   r   r   rG   s          rL   7test_render_menu_with_invalid_language_and_no_fallbackszAMenuTests.test_render_menu_with_invalid_language_and_no_fallbacks}  s    .
 	<4<8<<4<8<<4<8<ok&BC+-aK(+-aK(]]]7 	,&&v.GiG!(GINOCJJwJ'ESZ+	, 	"]]]7 	,&&|4GiG!(GINOCJJwJ'ESZ+	, 	,	, 	,	, 	,s   3AE& AE2&E/2E;c                    t         j                  j                         }| j                  d      }d|_        t        j                  |      }| j                  |j                  d       | j                  d      }t        |d      rt        |d       t        j                  |      }t        |j                        }| j                  |j                  |       y)z
        Tests that MenuRenderer correctly handles language code determination:
        1. Uses request.LANGUAGE_CODE if available
        2. Falls back to site's default language if LANGUAGE_CODE not set
        rl   r  LANGUAGE_CODEN)r   rf   get_currentr=   r  r*   r>   r   request_languagehasattrdelattrr'   r   )r@   r  rJ   rK   expected_languages        rL   )test_menu_renderer_language_code_handlingz3MenuTests.test_menu_renderer_language_code_handling  s     ||'') ""3' $))'222D9 ""3'7O,G_-))'29$''B224EFr[   N)rm   rn   ro   r  r  r  r  r  r  r  r  r  r  r  r   r[   rL   r  r  x  sC    '2R*2X3)E(=H~LH\$,LGr[   r  F)CMS_PERMISSIONc                   4    e Zd ZdZd Zd Zd Zd Zd Zd Z	y)	AdvancedSoftrootTestsaQ  
    Tree in fixture (as taken from issue 662):

        top
            root
                aaa
                    111
                        ccc
                            ddd
                    222
                bbb
                    333
                    444

    In the fixture, all pages are "in_navigation", "published" and
    NOT-"soft_root".

    What is a soft root?

        If a page is a soft root, it becomes the root page in the menu if
        we are currently on or under that page.

        If we are above that page, the children of this page are not shown.
    c                     t         j                  j                         j                          t	        j
                  d       y )NT)r   )r   rf   r   r  r*   rW   r   s    rL   r_   zAdvancedSoftrootTests.tearDown  s'    !!#D!r[   c                 B    t         j                  j                  |      S )N)
urls__slugre   )r@   r  s     rL   rj   zAdvancedSoftrootTests.get_page  s    ||400r[   c                    dt        |      dt        |      d|d|}| j                  t        |      t        |      |       t        ||      D ]q  \  }}|D ]A  }t        ||      }t        ||      }	| d|d|	d|d|d| d}| j                  ||	|       C | j	                  |j
                  |j
                         s y)	zu
        Checks that the node-lists a and b are the same for attrs.

        This is recursive over the tree
        zroot nodes: z != z with z, z: z ()N)r   r   zipgetattrassertTreeQualityr   )
r@   r  battrsmsgn1n2attra1a2s
             rL   r  z'AdvancedSoftrootTests.assertTreeQuality  s     SVJd3q6*F1%r!GQQ-!Qi 	=FB .R&R&bd2&rfBrfBtfAN  R-	.
 ""2;;<	=r[   c                    | j                  d      }d|_        |j                          | j                  d      }| j                  |j	                               }t        d      }|j                  |       |d   }| j                  d      }|j                  d       | j                  d      }| j                  |j	                               }t        d      }|j                  |       |d   }| j                  ||d	d
       y)a  
        top: not in navigation

        tag: show_menu 0 100 0 100

        context shared: current page is aaa
        context 1: root is NOT a softroot
        context 2: root IS a softroot

        expected result: the two node-trees should be equal
        topFaaar  r   r   T	soft_rootlevelr   N)	rj   r@  rA  r   r   r   r   ri  r  )r@   r  r  r   r   	hard_rootr   r  s           rL   test_top_not_in_navz)AdvancedSoftrootTests.test_top_not_in_nav  s     mmE"!
mmE"""3#7#7#9:HI

7J'	}}V$  4 0mmE"""3#7#7#9:HI

7J'	y)WgFr[   c                    | j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }t        ddt        ddt        dd	t        d
dt        ddt        ddg       g      g      t        ddg       g      t        dd	g       g      g      g}| j                  ||       y)a  
        tag: show_menu 0 100 0 100

        expected result 1:
            0:top
               1:root
                  2:aaa
                     3:111
                        4:ccc
                           5:ddd
                     3:222
                  2:bbb
        r  r   r  r   r  r   r   r3   r5   111r7   cccr9   dddr;   r   r  r   222bbbN)rj   r   r   r   r   r$   r  )r@   r  r   r   r  	mock_trees         rL    test_menu_tree_without_soft_rootz6AdvancedSoftrootTests.test_menu_tree_without_soft_root  s     mmE"""3#7#7#9"DHI

7J'	#$+&+&'$3.3./,;6;67:IPU]^ik:l9m-.2*
%& %4%qSU$V*"$ ,%q2N'" 
	B 	y)4r[   c                    | j                  d      }|j                  d       | j                  d      }| j                  |j                         |      }t	        d      }|j                  |       |d   }t        ddt        dd	t        d
dt        ddt        ddg       g      g      t        ddg       g      t        dd	g       g      g}| j                  ||dd       y)z
        tag: show_menu 0 100 0 100

        expected result 2:
            0:root
               1:aaa
                  2:111
                     3:ccc
                        4:ddd
                  2:222
               1:bbb
        r   Tr  r  r   r  r   r   r3   r  r5   r  r7   r  r9   r  r  r  r   r  N)rj   ri  r   r   r   r   r$   r  )r@   r   r  r   r   r  r  s          rL   test_menu_tree_with_soft_rootz3AdvancedSoftrootTests.test_menu_tree_with_soft_rootE  s    }}V$  4 0mmE"""3#7#7#9"DHI

7J'	##+&+&'$3.3./2AUVac2d1e%&*"
 ,%q2N"$ $%q2F'
	6 	y)WgFr[   N)
rm   rn   ro   r   r_   rj   r  r  r  r  r   r[   rL   r  r    s)    2"1= G@55n0Gr[   r  c                       e Zd ZdZd Zd Zy)ShowSubMenuCheckz
    Tree from fixture:

        + P1
        | + P2
        |   + P3
        + P4
        | + P5
        + P6
          + P7 (not in menu)
          + P8
    c                 T   | j                  d      }| j                  d      }| j                  |j                         |      }t        d      }|j	                  |       |d   }| j                  t        |      d       | j                  |d   j                  |j                         y )Nrm     r   r8  r   r3   r   )	rj   r   r   r   r   r   r   r   r   r@   r   subpager   r   rG   s         rL   r:  z"ShowSubMenuCheck.test_show_submenu  s    }}Q--"""4#8#8#:"F@A

7
#UQ'qgjj1r[   c                    | j                  d      }| j                  d      }| j                  |j                         |      }| j                  d      5  	 t	        d      }|j                  |       |d   }| j                  t        |      d       | j                  |d   j                  |j                         d d d        y # 1 sw Y   y xY w)	Nrm  r  r   r;   r8  r   r3   r   )
rj   r   r   r  r   r   r   r   r   r   r  s         rL   test_show_submenu_num_queriesz.ShowSubMenuCheck.test_show_submenu_num_queries  s    }}Q--"""4#8#8#:"F ""1% 	6 DECJJwJ'ESZ+U1X[['**5	6 	6 	6s   A'CCN)rm   rn   ro   r   r:  r  r   r[   rL   r  r  x  s    	26r[   r  c                   (    e Zd ZdZd Zd Zd Zd Zy)ShowMenuBelowIdTestsz{
    Test for issue 521

    Build the following tree:

        A
        |-B
          |-C
          \-D (not in nav)
    c                 h   t        ddddd      }t        ddd|d      }t        d	dd|d      }t        d
dd| j                  |      d       | j                  |j                               }t	        d      }|j                  |       |d   }| j                  t        |      d|       |d   }| j                  |j                  |j                         |j                  }| j                  t        |      dt        |             |d   }	| j                  |	j                  |j                         y )NAr{   rP   Tr  r@  ra  Brz  CDF>{% load menu_tags %}{% show_menu_below_id 'a' 0 100 100 100 %}r   r3   r   )r   rb  r   r   r   r   r   r   r   r   r   repr
r@   r  r  cr   r   rG   r   r   r   s
             rL   test_not_in_navigationz+ShowMenuBelowIdTests.test_not_in_navigation  s   2DY\]2DRVW2DRVWC.T[[^[`a""1#5#5#78WX

7
#UQ.Qx!$$'==X4>:144(r[   c                 h   dddd}t        dddi|}t        d|dd|}t        dd|i|}| j                  |j                         |	      }t        d
      }|j	                  |       |d   }| j                  t        |      d       |d   }| j                  |j                  |j                         | j                  t        |j                        d       |j                  d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  d   }
| j                  |
j                  |j                         | j                  t        |
j                        d       | j                  |j                         |	      }t        d
      }|j	                  |       |d   }| j                  t        |      d       |d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  d   }
| j                  |
j                  |j                         | j                  t        |
j                        d       | j                  |j                         |	      }t        d
      }|j	                  |       |d   }| j                  t        |      d       |d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  d   }
| j                  |
j                  |j                         | j                  t        |
j                        d       | j                  |j                         |	      }t        d      }|j	                  |       |d   }| j                  t        |      d       |d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  d   }
| j                  |
j                  |j                         | j                  t        |
j                        d       | j                  |j                         |	      }t        d      }|j	                  |       |d   }| j                  t        |      d       |d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  d   }
| j                  |
j                  |j                         | j                  t        |
j                        d       | j                  |j                         |	      }t        d      }|j	                  |       |d   }| j                  t        |      d       |d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  d   }
| j                  |
j                  |j                         | j                  t        |
j                        d       y)z
        Test for issue 4107

        Build the following tree:

            A
            |-B (soft_root)
              |-C
        r{   rP   TrK  r   r@  ra  r  r{  r  r{  r   rh  r   r3   r   r  N)r  )r  )r  
r   r   r   r   r   r   r   r   r   r   )r@   	stdkwargsr  r  r  r   r   rG   a_nodeb_nodec_nodes              rL   test_menu_beyond_soft_rootz/ShowMenuBelowIdTests.test_menu_beyond_soft_root  sU    .!
	
 99y9CACC3A33""1#5#5#7a"@JK

7
#UQ'qADD)V__-q1#ADD)V__-q1#ADD)V__-q1""1#5#5#7a"@JK

7
#UQ'qADD)V__-q1#ADD)V__-q1""1#5#5#7a"@JK

7
#UQ'qADD)V__-q1#ADD)V__-q1""1#5#5#7a"@WX

7
#UQ'qADD)V__-q1#ADD)V__-q1""1#5#5#7a"@WX

7
#UQ'qADD)V__-q1#ADD)V__-q1""1#5#5#7a"@WX

7
#UQ'qADD)V__-q1#ADD)V__-q1r[   c                    t        ddddd      }t        ddd|d      }t        d	dd|d      }t        d
dd| j                  |      d       t        d      5  | j                  |j	                               }| j                  d      5  	 t        d      }|j                  |       ddd       |d   }| j                  t        |      d|       |d   }| j                  |j                  |j                         |j                  }| j                  t        |      dt        |             |d   }	| j                  |	j                  |j                         ddd       y# 1 sw Y   xY w# 1 sw Y   yxY w)z
        Test for issue 521

        Build the following tree:

            A
            |-B
              |-C
              \-D (not in nav)
        r  r{   rP   Tr  r  r  rz  r  r   Fr;   r  Nr   r3   r   )r   rb  r"   r   r   r  r   r   r   r   r   r   r   r  r  s
             rL   "test_not_in_navigation_num_queriesz7ShowMenuBelowIdTests.test_not_in_navigation_num_queries(  s]    2DY\]2DRVW2DRVWC.T[[^[`ad# 	-&&q'9'9';<G&&q) $ _`

7#$ J'ESZE28DTWWadd+}}HS]AtH~>QKEUXXqtt,+	- 	-$ $	- 	-s%   1E/E#*B0E/#E,	(E//E8c                 |   t        ddddd      }t        ddd|d      }t        d	dddd
      }| j                  |j                               }t        d      }|j	                  |       |d   }| j                  t        |      d       |d   }| j                  |j                  |j                         | j                  |j                               }t        d      }|j	                  |       |d   }| j                  t        |      d       |d   }| j                  |j                  |j                         y)z
        Test for issue 3504

        Build the following tree:

            A
            |-B
            C (soft_root)
        r  r{   rP   Tr  r  r  rz  r  )r@  r  z0{% load menu_tags %}{% show_menu_below_id 'a' %}r   r3   r   N)	r   r   r   r   r   r   r   r   r   )r@   r  r  r  r   r   rG   r   s           rL   test_menu_in_soft_rootz+ShowMenuBelowIdTests.test_menu_in_soft_rootO  s    2DY\]2DRVW2DX\]""1#5#5#78IJ

7
#UQ'Qx!$$'""1#5#5#78IJ

7
#UQ'Qx!$$'r[   N)rm   rn   ro   r   r  r  r  r  r   r[   rL   r  r    s    	)"b2H%-N(r[   r  Tstaff)r  CMS_PUBLIC_FORc                       e Zd Zd ZddZd Z ed      d        Z ed      d        Zd	 Z	d
 Z
d Zd Zd Zd Zy)ViewPermissionMenuTestsc                     t        ddd      | _        | j                  g| _        | j                         | _        t               | _        y )Nr   r{   rP   )r   r   r   get_standard_useruserr%   r  r   s    rL   rR   zViewPermissionMenuTests.setUpq  s:    (=tD	ii[
**,	$&	r[   Nc                 N    |xs
 t               i i i i d}t        dt        f|      S )Nr  REQUESTPOSTGETr  Request)r   typeobject)r@   r  r  s      rL   r=   z#ViewPermissionMenuTests.get_requestw  s2    +MO
 Iy%00r[   c                 T   | j                  | j                        }d|j                  _        | j                  D cg c]  }|j	                          }}| j                  d      5  	 t        ||| j                        }| j                  ||       d d d        y c c}w # 1 sw Y   y xY w)NTr9   )	r=   r  is_staffr   get_content_objr  r   r  r   r@   rJ   r   r   visibles        rL   test_public_for_all_staffz1ViewPermissionMenuTests.test_public_for_all_staff  s    ""499- $26**=$t##%==""1% 		+ 0diiHGWc*		+ 		+ >		+ 		+s   B%+BB'r   )r  c                 2   | j                  | j                        }| j                  D cg c]  }|j                          }}| j	                  d      5  	 t        ||| j                        }| j                  ||       d d d        y c c}w # 1 sw Y   y xY wNr9   r=   r  r   r$  r  r   r  r   r%  s        rL   test_public_for_allz+ViewPermissionMenuTests.test_public_for_all  s    ""499-26**=$t##%==""1% 		+ 0diiHGWc*		+ 		+ >		+ 		+   B+BBc                    | j                         }| j                  D cg c]  }|j                          }}| j                  d      5  	 t	        ||| j
                        }| j                  ||       d d d        y c c}w # 1 sw Y   y xY wr  )r=   r   r$  r  r   r  r   r%  s        rL   test_unauthedz%ViewPermissionMenuTests.test_unauthed  s    ""$26**=$t##%==""1% 	+ 0diiHGWc*	+ 	+ >	+ 	+s   A=	+BBc                    | j                   j                  j                  t        j                  j                  d             | j                  | j                         }| j                  D cg c]  }|j                          }}| j                  d      5  	 t        ||| j                        }| j                  ||       d d d        y c c}w # 1 sw Y   y xY w)N	view_page)codenamer5   )r  user_permissionsaddr   rf   rg   r=   r   r$  r  r   r  r   r%  s        rL   test_authed_basic_permz.ViewPermissionMenuTests.test_authed_basic_perm  s    		""&&z'9'9'='={'='ST""499-26**=$t##%==""1% 	+
 0diiHGWc*	+ 	+ >	+ 	+s   -C+CCc                 2   | j                  | j                        }| j                  D cg c]  }|j                          }}| j	                  d      5  	 t        ||| j                        }| j                  |g        d d d        y c c}w # 1 sw Y   y xY wr)  r*  r%  s        rL   test_authed_no_accessz-ViewPermissionMenuTests.test_authed_no_access  s    ""499-26**=$t##%==""1% 		* 0diiHGWb)		* 		* >		* 		*r,  c                     | j                         }| j                  d      5  t        |d | j                  D        | j                        }| j                  |g        d d d        y # 1 sw Y   y xY w)Nr   c              3   <   K   | ]  }|j                           y wr]   )get_page_content_obj_attribute)rR  r   s     rL   rS  zBViewPermissionMenuTests.test_unauthed_no_access.<locals>.<genexpr>  s     WD$==?Ws   )r=   r  r   r   r  r   )r@   rJ   rG   s      rL   test_unauthed_no_accessz/ViewPermissionMenuTests.test_unauthed_no_access  sg    ""$""1% 	(-WDJJWY]YbYbE UB'		( 	( 	(s   ;A&&A/c                    | j                  | j                        }t        j                  j	                  d| j                  | j
                         | j                  D cg c]  }|j                          }}| j                  d      5  	 t        ||| j                        }| j                  ||       d d d        y c c}w # 1 sw Y   y xY w)NT)can_viewr  r   r9   )r=   r  r   rf   r  r   r   r$  r  r   r  r   r%  s        rL   test_page_permissionsz-ViewPermissionMenuTests.test_page_permissions  s    ""499-%%t$))$))%T26**=$t##%==""1% 		+ 0diiHGWc*		+ 		+ >		+ 		+s    B>
+CCc                    t         j                  j                  d      }| j                  j                  j                  |       | j                  | j                        }t        j                  j                  d|| j                         | j                  D cg c]  }|j                          }}| j                  d      5  	 t        ||| j                        }| j                  ||       d d d        y c c}w # 1 sw Y   y xY w)N	testgroupr  Tr<  groupr   r;   )r   rf   r  r  groupsr3  r=   r   r   r   r$  r  r   r  r   )r@   rB  rJ   r   r   r&  s         rL   !test_page_permissions_view_groupsz9ViewPermissionMenuTests.test_page_permissions_view_groups  s    $$+$6		U#""499-%%t5tyy%Q26**=$t##%==""1% 
	+ 0diiHGWc*
	+ 
	+ >
	+ 
	+s   C9+C>>Dc                     t         j                  j                  d| j                         | j	                  | j                        }t
        j                  j                  d      }t        j                  j                  d|| j                         | j                  D cg c]  }|j                          }}| j                  d      5  	 t        ||| j                        }| j                  ||       d d d        y c c}w # 1 sw Y   y xY w)NT)r<  r  r?  r@  rA  r7   )r   rf   r  r  r=   r   r   r   r   r$  r  r   r  r   )r@   rJ   rB  r   r   r&  s         rL   test_global_permissionz.ViewPermissionMenuTests.test_global_permission  s    $$++T		+J""499-$$+$6%%t5tyy%Q26**=$t##%==""1% 	+ 0diiHGWc*	+ 	+ >	+ 	+s   !C?+DDr]   )rm   rn   ro   rR   r=   r'  r   r+  r.  r4  r6  r:  r=  rD  rF  r   r[   rL   r  r  l  sa    
'1+ e,+ -+ e,	+ -	++*(++&+r[   r  r   c                       e Zd Zd Zd Zd Zy)PublicViewPermissionMenuTestsc                    d}t        d      }t        d|dfi |}t        d|dfd|i|}t        d|dfd|i|}t        d	|dfd|i|}t        d
|dfd|i|}t        d|dfd|i|}t        d|dfd|i|}	|||||||	g| _        t               | _        | j                  ddd      | _        | j                  ddd      | _        t        j                  j                  || j                  dt               t        j                  j                  || j                  dt               | j                  i i i i d}
t        dt        f|
      | _        y)zc
        Create this published hierarchy:
        A
        B1     B2
        C1 C2  C3 C4
        r{   Trg  r  rP   b1r{  b2c1c2c3c4standardF)r#  is_superuserother)r   r  r<  grant_onr  r  N)dictr   r   r%   r  _create_userr  rR  r   rf   r  r   r   r!  rJ   )r@   rK  kwr  rJ  rK  rL  rM  rN  rO  r  s              rL   rR   z#PublicViewPermissionMenuTests.setUp  sz    )%Xt2r2x>a>2>x>a>2>x?b?B?x?b?B?x?b?B?x?b?B?RRR0
$&	%%j5u%U	&&wU&S
%%2DIIWr%s%%2DJJXs%tII
 Iy%8r[   c                    | j                   D cg c]  }|j                          }}t        | j                  || j                        }|D cg c]  }|j
                   }}| j                  t        |      g d       y c c}w c c}w N)r  rJ  rL  rM  )r   r$  r   rJ   r  r   r   rV  )r@   r   page_contentspage_contenttitless        rL   test_list_accessz.PublicViewPermissionMenuTests.test_list_access(  so    <@JJGD--/GG1$,,tyyY9FG,$$GG  1HI HGs   B Bc                     t         j                  j                         }t        | j                  || j
                        }|D cg c]  }|j                   }}| j                  t        |      g d       y c c}w rX  )	r   rf   r   r   rJ   r  r   r   rV  )r@   rY  rZ  r[  s       rL   test_qs_accessz,PublicViewPermissionMenuTests.test_qs_access.  s`    #++//11$,,tyyY9FG,$$GG  1HI Hs   A7N)rm   rn   ro   rR   r\  r^  r   r[   rL   rH  rH    s    
9@JJr[   rH  c                   (    e Zd ZdZd Zd Zd Zd Zy)SoftrootTestsu	  
    Ask evildmp/superdmp if you don't understand softroots!

    Softroot description from the docs:

        A soft root is a page that acts as the root for a menu navigation tree.

        Typically, this will be a page that is the root of a significant new
        section on your site.

        When the soft root feature is enabled, the navigation menu for any page
        will start at the nearest soft root, rather than at the real root of
        the site’s page hierarchy.

        This feature is useful when your site has deep page hierarchies (and
        therefore multiple levels in its navigation trees). In such a case, you
        usually don’t want to present site visitors with deep menus of nested
        items.

        For example, you’re on the page “Introduction to Bleeding”, so the menu
        might look like this:

            School of Medicine
                Medical Education
                Departments
                    Department of Lorem Ipsum
                    Department of Donec Imperdiet
                    Department of Cras Eros
                    Department of Mediaeval Surgery
                        Theory
                        Cures
                        Bleeding
                            Introduction to Bleeding <this is the current page>
                            Bleeding - the scientific evidence
                            Cleaning up the mess
                            Cupping
                            Leaches
                            Maggots
                        Techniques
                        Instruments
                    Department of Curabitur a Purus
                    Department of Sed Accumsan
                    Department of Etiam
                Research
                Administration
                Contact us
                Impressum

        which is frankly overwhelming.

        By making “Department of Mediaeval Surgery” a soft root, the menu
        becomes much more manageable:

            Department of Mediaeval Surgery
                Theory
                Cures
                    Bleeding
                        Introduction to Bleeding <current page>
                        Bleeding - the scientific evidence
                        Cleaning up the mess
                    Cupping
                    Leaches
                    Maggots
                Techniques
                Instruments
    c                 z   dddd}t        di |}t        d|dd|}t        dd|i|}t        dd|i|}t        dd|i|}| j                  |j                               }t        d      }|j	                  |       |d   }	| j                  t        |	      d	       |	d
   }
| j                  |
j                  |j                         | j                  t        |
j                        d       |
j                  \  }}| j                  |j                  |j                         | j                  |j                  |j                         | j                  t        |j                        d       |j                  \  }}| j                  |j                  |j                         | j                  |j                  |j                         | j                  t        |j                        d
       | j                  t        |j                        d
       | j                  t        |j                        d
       y)aN  
        Given the tree:

        |- Home
        | |- Projects (SOFTROOT)
        | | |- django CMS
        | | |- django Shop
        | |- People

        Expected menu when on "Home" (0 100 100 100):

        |- Home
        | |- Projects (SOFTROOT)
        | | |- django CMS
        | | |- django Shop
        | |- People
        r{   rP   Tr  r  r{  rh  r   r3   r   r5   NHomeProjectsz
django CMSzdjango ShopPeopler	  r@   r
  homeprojects	djangocms
djangoshoppeopler   r   rG   homenodeprojectsnode
peoplenodecmsnodeshopnodes                  rL   test_basic_homezSoftrootTests.test_basic_homez     & .!
	
 /Y/T$$T)TKXKK	 MxM9M
@d@i@""4#8#8#:;JK

7
#UQ'8dgg.X../3#+#4#4 j(++6		2\223Q7(11Y\\2jmm4W--.2X../3Z00115r[   c                 4   dddd}t        di |}t        d|dd|}t        dd|i|}t        dd|i|}t        dd|i| | j                  |j                         |      }t        d      }|j	                  |       |d	   }| j                  t        |      d
       |d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  \  }
}| j                  |
j                  |j                         | j                  |j                  |j                         | j                  t        |
j                        d       | j                  t        |j                        d       y)a(  
        Given the tree:

        |- Home
        | |- Projects (SOFTROOT)
        | | |- django CMS
        | | |- django Shop
        | |- People

        Expected menu when on "Projects" (0 100 100 100):

        |- Projects (SOFTROOT)
        | |- django CMS
        | |- django Shop
        r{   rP   Tr  r  r{  r   rh  r   r3   r   r5   Nrb  rd  rf  rg  rh  r	  r@   r
  rk  rl  rm  rn  r   r   rG   rq  rs  rt  s               rL   test_basic_projectsz!SoftrootTests.test_basic_projects  sp   " .!
	
 /Y/T$$T)TKXKK	 MxM9M
7T7Y7""8#<#<#>X"NJK

7
#UQ'Qx(++6\223Q7(11Y\\2jmm4W--.2X../3r[   c                 4   dddd}t        di |}t        d|dd|}t        dd|i|}t        dd|i|}t        dd|i| | j                  |j                         |      }t        d      }|j	                  |       |d	   }| j                  t        |      d
       |d   }	| j                  |	j                  |j                         | j                  t        |	j                        d       |	j                  \  }
}| j                  |
j                  |j                         | j                  |j                  |j                         | j                  t        |
j                        d       | j                  t        |j                        d       y)a*  
        Given the tree:

        |- Home
        | |- Projects (SOFTROOT)
        | | |- django CMS
        | | |- django Shop
        | |- People

        Expected menu when on "django CMS" (0 100 100 100):

        |- Projects (SOFTROOT)
        | |- django CMS
        | |- django Shop
        r{   rP   Tr  r  r{  r   rh  r   r3   r   r5   Nrb  rd  rf  rg  rh  r	  rx  s               rL   test_basic_djangocmsz"SoftrootTests.test_basic_djangocms  sp   " .!
	
 /Y/T$$T)TKXKK	 MxM9M
7T7Y7""9#=#=#?i"PJK

7
#UQ'Qx(++6\223Q7(11Y\\2jmm4W--.2X../3r[   c                 z   dddd}t        di |}t        d|dd|}t        dd|i|}t        dd|i|}t        dd|i|}| j                  |j                               }t        d      }|j	                  |       |d   }	| j                  t        |	      d	       |	d
   }
| j                  |
j                  |j                         | j                  t        |
j                        d       |
j                  \  }}| j                  |j                  |j                         | j                  |j                  |j                         | j                  t        |j                        d       |j                  \  }}| j                  |j                  |j                         | j                  |j                  |j                         | j                  t        |j                        d
       | j                  t        |j                        d
       | j                  t        |j                        d
       y)aP  
        Given the tree:

        |- Home
        | |- Projects (SOFTROOT)
        | | |- django CMS
        | | |- django Shop
        | |- People

        Expected menu when on "People" (0 100 100 100):

        |- Home
        | |- Projects (SOFTROOT)
        | | |- django CMS
        | | |- django Shop
        | |- People
        r{   rP   Tr  r  r{  rh  r   r3   r   r5   Nrb  rd  rf  rg  rh  r	  rj  s                  rL   test_basic_peoplezSoftrootTests.test_basic_people  rv  r[   N)rm   rn   ro   r   ru  ry  r{  r}  r   r[   rL   r`  r`  5  s     AF/6b(4T(4T/6r[   r`  )Rr  django.confr   django.contrib.auth.modelsr   r   r   django.contrib.sites.modelsr   django.templater   r	   django.template.contextr
   django.test.utilsr   django.utils.translationr   r   r   cms.apir   r   cms.apphook_poolr   cms.cms_menusr   
cms.modelsr   r   r   cms.models.permissionmodelsr   r   cms.test_utils.fixtures.menusr   r   r   r   )cms.test_utils.project.sampleapp.cms_appsr   r   r   *cms.test_utils.project.sampleapp.cms_menusr   r   r    cms.test_utils.testcasesr!   $cms.test_utils.util.context_managersr"   r#   cms.test_utils.util.mockr$   	cms.utilsr%   cms.utils.confr&   cms.utils.i18nr'   
menus.baser(   menus.menu_poolr)   r*   menus.modelsr+   menus.utilsr,   r-   r.   r0   rs   r   r   r  r  r  r  r  rH  r`  r   r[   rL   <module>r     s      G G , 9 + / I 4 ) 3 E E L  
 
 1 K 4 & * 8 % F ! C CD; D>y`,k y`xC( 4l C(Lh	(l h	(VAG AGH
 %(xGO[ xG )xGv,6 ,6^B(< B(J P+k P+	P+f +JK +J	+J\ %(x6K x6 )x6r[   