
    Bh'                         d dl mZ d dlmZ d dlmZ d dlmZmZ d dl	m
Z
mZmZ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 d dlmZ g ad Zd Z G d de      Z	 	 ddZ d Z!d Z"d Z#d Z$d Z%y)    )OrderedDict)import_module)ImproperlyConfigured)OperationalErrorProgrammingError)NoReverseMatchResolver404URLResolverreverse)RegexPattern
URLPattern)get_languageoverride)apphook_pool)Page)get_current_site)get_language_listc                      g a y N)APP_RESOLVERS     ?/home/dcms/DCMS/lib/python3.12/site-packages/cms/appresolver.pyclear_app_resolversr      s    Mr   c                    	 | j                   j                  t        d      dd      }t	               D ](  }|j                  |dz         s|t        |dz         d }* t        D ]5  }	 |j                  |      }t        j                  j                  |      c S  y# t        $ r | j                   }Y w xY w# t        $ r Y _t        j                  $ r Y sw xY w)z{Tries to find if given path was resolved over application.
    Applications have higher priority than other cms pages.
    z
pages-root    /N)id)	path_inforeplacer   r   r   
startswithlenr   resolve_page_idr   objectsgetr	   DoesNotExist)requestpathlangresolverpage_ids        r   applications_page_checkr-      s    !  (()>AF
 "# *??4#:&D3J()D* " 	..t4G<<##w#// #  !  !  	   		s)   &B '0B7B43B47	CCCc                   D     e Zd Z fdZed        Zed        Zd Z xZS )AppRegexURLResolverc                 @    d | _         i | _        t        |   |i | y r   )r,   url_patterns_dictsuper__init__)selfargskwargs	__class__s      r   r3   zAppRegexURLResolver.__init__4   s$    !#$)&)r   c                 J    | j                   j                  t               g       S r   )r1   r&   r   r4   s    r   urlconf_modulez"AppRegexURLResolver.urlconf_module9   s     %%)),."==r   c                     | j                   S r   )r:   r9   s    r   url_patternsz AppRegexURLResolver.url_patternsE   s    """r   c           	         g }t        | d|       }|j                  j                  |      }|r||j                         d }| j                  D ]{  }t        |t              r	 |j                  |      c S 	 |j                  |      }|rt        |dd      c S t        |d|      }|j                  |j                  j                         } t        ||d      y# t        $ r Y w xY w# t        $ rg}|j                  d   j                  d      }|*|j                  |D 	cg c]  }	|g|	z   
 nc c}	w c}	       n|j                  |g       Y d}~d}~ww xY w)zResolves requested path similar way how resolve does, but instead
        of return callback,.. returns page_id to which was application
        assigned.
        patternNr,   r   tried)r?   r)   )getattrregexsearchendr<   
isinstancer/   r$   r	   resolveappendr>   r5   r&   extend)
r4   r)   r?   r>   matchnew_path	sub_matchetried_matchts
             r   r$   z#AppRegexURLResolver.resolve_page_idI   sH   
 $	40$$T*EIIKL)H,, <g':;&66x@@<$+OOH$=	 %#*7It#DD")'9g"FW]]%:%:;'<( x@AA-  ' 
 ' 4&'ffQimmG&<&2!LL)MA7)a-)M)MN!LL'34s6    C4C(	C%$C%(	E1/E D.- EE)	__name__
__module____qualname__r3   propertyr:   r<   r$   __classcell__)r7   s   @r   r/   r/   3   s6    *
 > > # #Br   r/   Nc                    g }|D ]I  }t        |d|      j                  j                  }|j                  d      }| j                  d      } |sd|  | nd|z  }t	        |t
              rt|j                  }	|r|	j                  |       t        ||j                  ||	d      }
|}t        |      }t        ||
|j                  |j                  |j                        }nY|j                  }	|r|	j                  |       t        ||j                  d      }t        ||j                   |	|j                        }||_        |j%                  |       L |S )zN
    Recurse over a list of to-be-hooked patterns for a given path prefix
    r>   ^z^%sT)nested)nameis_endpoint)r@   rA   r>   lstriprD   r
   default_kwargsupdaterecurse_patternsr<   r   app_name	namespacedefault_argsrV   r   callbackr,   rF   )r)   pattern_listr,   r^   rU   newpatternsr>   app_patrA   r5   r:   regex_patternr+   s                r   r[   r[   j   sE   
 K %'9g6<<DD..%{{3,21TF7)$'8Jg{+))DL)-eW5I5I7TXaefN!M(/M"=.#*#9#97;K;K#*#4#46H
 ''DL)(W\\tTM!-1A1A4"),,0H"8$;%< r   c                     | D ]U  }t        |t              r&|j                  |v r"t        |j                  |       9ddlm}  ||j                        |_        W y )Nr   )	cms_perms)rD   r
   r]   _set_permissionsr<   cms.utils.decoratorsre   r_   )patternsexclude_permissionsr>   re   s       r   rf   rf      sT     ;g{+  $77W113FG6()9)9:G;r   c              #      K   | D ]f  }t        |t              r4t        |      }t        |d      st	        d|z        |j
                   Gt        |t        t        f      r| b|g h y w)Nurlpatternsz)URLConf `%s` has no urlpatterns attribute)rD   strr   hasattrr   rk   listtuple)urlsurlconfmods      r   get_app_urlsrs      sn      
gs#(C3.*?'IK K//!$/M)O
s   A-A/c                 @   | j                   }|r|j                  d      s|dz  }t        j                  | j                  j
                        }g }t        |j                  | j                  | j                              D ]  }|t        ||| j                        z  } |S )zd
    Resolve the urlconf module for a path+title combination
    Returns a list of url objects.
    r   )r)   endswithr   get_apphookpageapplication_urlsrs   get_urlslanguager[   r,   )page_urlr)   appr<   r`   s        r   get_patterns_for_page_urlr}      s    
 ==DDMM#&

"
"8==#A#A
BCL$S\\(--ARAR%ST O(|X=M=MNNOr   c                  \    	 t               } t        |       S # t        t        f$ r g cY S w xY wr   )r   _get_app_patternsr   r   )sites    r   get_app_patternsr      s6    ! &&./  		s    ++c                    ddl m} g }t               }|j                  j	                  |       }|j                  d      j                  d      j                  d      j                  d      }|D ]  }dj                  |j                  d	z   |j                  j                  |j                        }||v rGt        j                  |j                  j                        }|ss|j                  |vri ||j                  <   |j                   |j                  j"                  f}t%        |j                        5  |t'        |      |f||j                     |j                  <   ddd       |j)                  |        g }	|j+                         D ]  }
d}||
   j+                         D ]e  }||
   |   \  \  }}}}|s!t-        d      }t/        |d
||      }|
|_        |j0                  rt3        ||j4                         ||j6                  |<   g |	j)                  |       t8        j)                  |        |	S # 1 sw Y   xY w)aR  
    Get a list of patterns for all hooked apps.

    How this works:

    By looking through all titles with an app hook (application_urls) we find
    all urlconf modules we have to hook into titles.

    If we use the ML URL Middleware, we namespace those patterns with the title
    language.

    All 'normal' patterns from the urlconf get re-written by prefixing them with
    the title path and then included into the cms url patterns.

    If the app is still configured, but is no longer installed/available, then
    this method returns a degenerate patterns object: patterns('')
    r   )PageUrlN)page__application_urlsr   z-page__pathrw   z{}:{}:{}r   app_resolver)r\   r]   )cms.models.pagemodelr   r   r%   get_for_siteexcludeorder_byselect_relatedformatr)   rw   rx   rz   r   rv   r,   r\   application_namespacer   r}   rF   keysr   r/   permissionsrf   ri   r1   r   )r   r   includedhooked_applications	page_urlsr{   mix_idr|   app_nsapp_patternsr,   r+   r*   inst_nscurrent_patternsrc   s                   r   r   r      sA   $ -H%-
 ,,T2I 			-		+	-	 		    ""MMCMM**
 X&&x}}'E'EF#6646 0 01x}}BBBh''( 	B1(;SHB 0 01(2C2CD	B 	' * L&++- ''0557 
	@D7J77STX7Y4VW/ ,S 1.!>FgW#*  !133J3JK/?H&&t,
	@ 	H%X&' +	B 	Bs   7)H88I	)NF)&collectionsr   	importlibr   django.core.exceptionsr   	django.dbr   r   django.urlsr   r	   r
   r   django.urls.resolversr   r   django.utils.translationr   r   cms.apphook_poolr   r   r   	cms.utilsr   cms.utils.i18nr   r   r   r-   r/   r[   rf   rs   r}   r   r   r   r   r   <module>r      sq    # # 7 8 I I : ; ) % & ,
84B+ 4Bn @D!$N;$Jr   