a
    xdk                     @   s  d Z ddlZddlZddlZddlZddlmZ ddlmZ ddl	m
Z
 ddlmZ ddlmZ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% ddl&m'Z' G dd dZ(d.ddZ)ej*ddd/ddZ+ej*dddd Z,G dd dZ-G dd dZ.G d d! d!e.Z/ed"Z0d0d$d%Z1G d&d' d'e.Z2G d(d) d)Z3G d*d+ d+Z4G d,d- d-Z5dS )1z
This module converts requested URLs to callback view functions.

URLResolver is the main class here. Its resolve() method takes a URL (as
a string) and returns a ResolverMatch object which provides access to all
attributes of the resolved URL match.
    N)import_module)quote)Local)settings)ErrorWarning)check_resolver)ImproperlyConfiguredViewDoesNotExist)MultiValueDict)cached_property)RFC3986_SUBDELIMSescape_leading_slashes)_lazy_re_compile	normalize)get_language   )get_converter)NoReverseMatchResolver404)get_callablec                   @   s&   e Zd ZdddZdd Zdd ZdS )	ResolverMatchNc           	      C   s   || _ || _|| _|| _|| _|r0dd |D ng | _d| j| _|rVdd |D ng | _d| j| _	t
|ds|jjd |jj | _n|jd |j | _|p| j}d| j|g | _d S )Nc                 S   s   g | ]}|r|qS  r   .0xr   r   M/var/www/html/Ranjet/env/lib/python3.9/site-packages/django/urls/resolvers.py
<listcomp>*       z*ResolverMatch.__init__.<locals>.<listcomp>:c                 S   s   g | ]}|r|qS r   r   r   r   r   r   r   ,   r   __name__.)funcargskwargsurl_nameroute	app_namesjoinapp_name
namespaces	namespacehasattr	__class__
__module__r    
_func_pathZ	view_name)	selfr"   r#   r$   r%   r'   r*   r&   Z	view_pathr   r   r   __init__!   s    

zResolverMatch.__init__c                 C   s   | j | j| jf| S N)r"   r#   r$   )r0   indexr   r   r   __getitem__9   s    zResolverMatch.__getitem__c                 C   s$   d| j | j| j| j| j| j| jf S )Nz^ResolverMatch(func=%s, args=%s, kwargs=%s, url_name=%s, app_names=%s, namespaces=%s, route=%s))r/   r#   r$   r%   r'   r*   r&   r0   r   r   r   __repr__<   s    zResolverMatch.__repr__)NNNN)r    r.   __qualname__r1   r4   r6   r   r   r   r   r       s   
r   c                 C   s   | d u rt j} t| S r2   )r   ZROOT_URLCONF_get_cached_resolverZurlconfr   r   r   get_resolverC   s    r:   )maxsizec                 C   s   t td| S N^/)URLResolverRegexPatternr9   r   r   r   r8   I   s    r8   c                 C   s.   t | }t||_t||j}tt d|gS r<   )r?   dict
convertersr>   url_patterns)Z
ns_patternresolverrA   patternZns_resolverr   r   r   get_ns_resolverN   s    
rE   c                   @   s   e Zd Zdd ZdddZdS )LocaleRegexDescriptorc                 C   s
   || _ d S r2   )attr)r0   rG   r   r   r   r1   Z   s    zLocaleRegexDescriptor.__init__Nc                 C   sj   |du r| S t || j}t|tr<|||jd< |jd S t }||jvr`|t||j|< |j| S )zT
        Return a compiled regular expression based on the active language.
        Nregex)getattrrG   
isinstancestr_compile__dict__r   _regex_dict)r0   instanceclsrD   language_coder   r   r   __get__]   s    


zLocaleRegexDescriptor.__get__)N)r    r.   r7   r1   rR   r   r   r   r   rF   Y   s   rF   c                   @   s   e Zd Zdd Zdd ZdS )CheckURLMixinc                 C   s$   d | }| jr |d | j7 }|S )zI
        Format the URL pattern for display in warning messages.
        '{}'z [name='{}'])formatname)r0   descriptionr   r   r   describeq   s    
zCheckURLMixin.describec                 C   sJ   | j j}tjsg S |drB|dsBtd|  dd}|gS g S dS )zM
        Check that the pattern does not begin with a forward slash.
        )/r=   z^\/rY   zYour URL pattern {} has a route beginning with a '/'. Remove this slash as it is unnecessary. If this pattern is targeted in an include(), ensure the include() pattern has a trailing '/'.z	urls.W002idN)	rH   rD   r   ZAPPEND_SLASH
startswithendswithr   rU   rX   )r0   regex_patternwarningr   r   r   _check_pattern_startswith_slashz   s    z-CheckURLMixin._check_pattern_startswith_slashN)r    r.   r7   rX   r`   r   r   r   r   rS   p   s   	rS   c                   @   sF   e Zd ZedZdddZdd Zdd	 Zd
d Zdd Z	dd Z
dS )r?   _regexNFc                 C   s"   || _ i | _|| _|| _i | _d S r2   )ra   rN   _is_endpointrV   rA   )r0   rH   rV   is_endpointr   r   r   r1      s
    zRegexPattern.__init__c                 C   sT   | j |}|rP| }|r dn| }dd | D }|| d  ||fS d S )Nr   c                 S   s   i | ]\}}|d ur||qS r2   r   r   kvr   r   r   
<dictcomp>   r   z&RegexPattern.match.<locals>.<dictcomp>)rH   search	groupdictgroupsitemsend)r0   pathmatchr$   r#   r   r   r   rn      s    zRegexPattern.matchc                 C   s*   g }| |   | js&| |   |S r2   )extendr`   rb   _check_include_trailing_dollarr0   warningsr   r   r   check   s
    zRegexPattern.checkc                 C   s<   | j j}|dr4|ds4td|  ddgS g S d S )N$z\$zYour URL pattern {} uses include with a route ending with a '$'. Remove the dollar from the route to avoid problems including URLs.z	urls.W001rZ   )rH   rD   r]   r   rU   rX   )r0   r^   r   r   r   rp      s    z+RegexPattern._check_include_trailing_dollarc              
   C   sJ   zt |W S  t jyD } ztd||f |W Y d}~n
d}~0 0 dS )z0Compile and return the given regular expression.z*"%s" is not a valid regular expression: %sN)recompileerrorr	   )r0   rH   er   r   r   rL      s    
zRegexPattern._compilec                 C   s
   t | jS r2   )rK   ra   r5   r   r   r   __str__   s    zRegexPattern.__str__)NF)r    r.   r7   rF   rH   r1   rn   rs   rp   rL   ry   r   r   r   r   r?      s   
	r?   z1<(?:(?P<converter>[^>:]+):)?(?P<parameter>[^>]+)>Fc           
   
   C   s4  t | tjstd|  | }dg}i }t| }|sL|t	|  q|t	| d|
   | | d } |d }| std||f |d }|du rd}zt|}W n6 ty }	 ztd||f |	W Y d}	~	n
d}	~	0 0 |||< |d	| d
 |j d  q*|r&|d d||fS )a  
    Convert a path pattern into a regular expression. Return the regular
    expression and a dictionary mapping the capture names to the converters.
    For example, 'foo/<int:pk>' returns '^foo\/(?P<pk>[0-9]+)'
    and {'pk': <django.urls.converters.IntConverter>}.
    z)URL route '%s' cannot contain whitespace.^N	parameterzLURL route '%s' uses parameter name %r which isn't a valid Python identifier.	converterrK   z'URL route %r uses invalid converter %r.(?P<>)rt    )set
isdisjointstring
whitespacer	   _PATH_PARAMETER_COMPONENT_RErh   appendru   escapestartrl   isidentifierr   KeyErrorrH   r(   )
r&   rc   Zoriginal_routepartsrA   rn   r{   Zraw_converterr|   rx   r   r   r   _route_to_regex   sH    

r   c                   @   s>   e Zd ZedZdddZdd Zdd	 Zd
d Zdd Z	dS )RoutePattern_routeNFc                 C   s0   || _ i | _|| _|| _tt||d | _d S )Nr   )r   rN   rb   rV   r   rK   rA   )r0   r&   rV   rc   r   r   r   r1      s
    zRoutePattern.__init__c              	   C   sx   | j |}|rt| }| D ]<\}}| j| }z||||< W q  tyZ   Y  d S 0 q || d  d|fS d S Nr   )rH   rh   ri   rk   rA   Z	to_python
ValueErrorrl   )r0   rm   rn   r$   keyvaluer|   r   r   r   rn     s    
zRoutePattern.matchc                 C   sJ   |   }| j}d|v s*|ds*|drF|td|  dd |S )Nr}   rz   rt   zYour URL pattern {} has a route that contains '(?P<', begins with a '^', or ends with a '$'. This was likely an oversight when migrating to django.urls.path().z2_0.W001rZ   )r`   r   r\   r]   r   r   rU   rX   )r0   rr   r&   r   r   r   rs     s    zRoutePattern.checkc                 C   s   t t|| jd S )Nr   )ru   rv   r   rb   )r0   r&   r   r   r   rL     s    zRoutePattern._compilec                 C   s
   t | jS r2   )rK   r   r5   r   r   r   ry     s    zRoutePattern.__str__)NF)
r    r.   r7   rF   rH   r1   rn   rs   rL   ry   r   r   r   r   r      s   
r   c                   @   sN   e Zd ZdddZedd Zedd Zdd	 Zd
d Zdd Z	dd Z
dS )LocalePrefixPatternTc                 C   s   || _ i | _d S r2   )prefix_default_languagerA   )r0   r   r   r   r   r1   #  s    zLocalePrefixPattern.__init__c                 C   s   t | jS r2   )ru   rv   language_prefixr5   r   r   r   rH   '  s    zLocalePrefixPattern.regexc                 C   s,   t  p
tj}|tjkr | js dS d| S d S )Nr   z%s/)r   r   ZLANGUAGE_CODEr   r0   rQ   r   r   r   r   ,  s    z#LocalePrefixPattern.language_prefixc                 C   s*   | j }||r&|t|d  di fS d S r   )r   r\   len)r0   rm   r   r   r   r   rn   4  s    
zLocalePrefixPattern.matchc                 C   s   g S r2   r   r5   r   r   r   rs   :  s    zLocalePrefixPattern.checkc                 C   s
   d | S )NrT   )rU   r5   r   r   r   rX   =  s    zLocalePrefixPattern.describec                 C   s   | j S r2   )r   r5   r   r   r   ry   @  s    zLocalePrefixPattern.__str__N)T)r    r.   r7   r1   propertyrH   r   rn   rs   rX   ry   r   r   r   r   r   "  s   


r   c                   @   sB   e Zd ZdddZdd Zdd Zdd	 Zd
d Zedd Z	dS )
URLPatternNc                 C   s    || _ || _|pi | _|| _d S r2   )rD   callbackdefault_argsrV   )r0   rD   r   r   rV   r   r   r   r1   E  s    
zURLPattern.__init__c                 C   s   d| j j| j f S )Nz<%s %s>)r-   r    rD   rX   r5   r   r   r   r6   K  s    zURLPattern.__repr__c                 C   s   |   }|| j  |S r2   )_check_pattern_namero   rD   rs   rq   r   r   r   rs   N  s    zURLPattern.checkc                 C   s>   | j jdur6d| j jv r6td| j  dd}|gS g S dS )zG
        Check that the pattern name does not contain a colon.
        Nr   zjYour URL pattern {} has a name including a ':'. Remove the colon, to avoid ambiguous namespace references.z	urls.W003rZ   )rD   rV   r   rU   rX   )r0   r_   r   r   r   r   S  s    zURLPattern._check_pattern_namec                 C   sH   | j |}|rD|\}}}|| j t| j||| j jt| j dS d S )N)r&   )rD   rn   updater   r   r   rV   rK   )r0   rm   rn   new_pathr#   r$   r   r   r   resolvea  s
    
zURLPattern.resolvec                 C   sD   | j }t|tjr|j}t|ds4|jd |jj S |jd |j	 S )zw
        A string that identifies the view (e.g. 'path.to.view_function' or
        'path.to.ClassBasedView').
        r    r!   )
r   rJ   	functoolspartialr"   r,   r.   r-   r    r7   )r0   r   r   r   r   
lookup_stri  s    
zURLPattern.lookup_str)NN)
r    r.   r7   r1   r6   rs   r   r   r   r   r   r   r   r   r   D  s   
r   c                   @   s   e Zd Zd"ddZdd Zdd Zdd	 Zd
d Zedd Z	edd Z
edd Zedd Zdd Zdd Zedd Zedd Zdd Zdd Zd d! ZdS )#r>   Nc                 C   sT   || _ || _d | _|pi | _|| _|| _i | _i | _i | _t	 | _
d| _t | _d S )NF)rD   urlconf_namer   default_kwargsr+   r)   _reverse_dict_namespace_dict	_app_dictr   _callback_strs
_populatedr   _local)r0   rD   r   r   r)   r+   r   r   r   r1   x  s    
zURLResolver.__init__c                 C   sP   t | jtr&| jr&d| jd jj }n
t| j}d| jj|| j| j| j	 f S )Nz	<%s list>r   z<%s %s (%s:%s) %s>)
rJ   r   listr-   r    reprr)   r+   rD   rX   )r0   Zurlconf_reprr   r   r   r6     s    
zURLResolver.__repr__c                 C   s:   g }| j D ]}|t| q
||   |p8| j S r2   )rB   ro   r   _check_custom_error_handlersrD   rs   )r0   messagesrD   r   r   r   rs     s
    
zURLResolver.checkc                 C   s  g }dD ]\}}z|  |\}}W nj ttfy } zNt| jd| }dj||d}|t|t|dd W Y d }~qW Y d }~n
d }~0 0 t	
|}	d g| }
z|	j|
  W q ty   dj||jd |j |d	krd
ndd}|t|dd Y q0 q|S )N))i     )i  r   )i  r   )i  r   	handler%szDThe custom handler{status_code} view '{path}' could not be imported.)status_coderm   z	urls.E008)hintr[   zeThe custom handler{status_code} view '{path}' does not take the correct number of arguments ({args}).r!   r   zrequest, exceptionrequest)r   rm   r#   z	urls.E007rZ   )resolve_error_handlerImportErrorr
   rI   urlconf_modulerU   r   r   rK   inspect	signaturebind	TypeErrorr.   r7   )r0   r   r   Znum_parametershandlerZ
param_dictrx   rm   msgr   r#   r   r   r   r     s2    "

z(URLResolver._check_custom_error_handlersc                 C   s$  t | jddrd S z d| j_t }i }i }t }t| jD ]}|jjj}|	drb|dd  }t
|tr| j|j t|jjj}||j|||j|jjf |jd ur||j|||j|jjf q<|  |jr||jg |j ||f||j< n|jD ]d}|j|D ]P\}	}
}}t||
 }|||||
 i ||ji | jj|jj|f qq|j D ]4\}\}}|jj}|jj| || |f||< qx|j  D ]\}}||g !| q| j|j q<|| j"|< || j#|< || j$|< d| _%W d| j_n
d| j_0 d S )N
populatingFTrz   r   )&rI   r   r   r   r   reversedrB   rD   rH   r\   rJ   r   r   addr   r   Z
appendlistr   r   rA   rV   	_populater)   
setdefaultr   r+   reverse_dictgetlistr   namespace_dictrk   r   app_dictro   r   r   r   r   )r0   Zlookupsr*   ZappsrQ   Zurl_patternZ	p_patternbitsrV   matchespatdefaultsrA   Znew_matchesr+   prefixZsub_patternZcurrent_convertersr)   Znamespace_listr   r   r   r     sf    




	


zURLResolver._populatec                 C   s"   t  }|| jvr|   | j| S r2   )r   r   r   r   r   r   r   r     s    
zURLResolver.reverse_dictc                 C   s"   t  }|| jvr|   | j| S r2   )r   r   r   r   r   r   r   r     s    
zURLResolver.namespace_dictc                 C   s"   t  }|| jvr|   | j| S r2   )r   r   r   r   r   r   r   r     s    
zURLResolver.app_dictc                 C   s&   | s|S | dr|dd }| | S )z<Join two routes, without the starting ^ in the second route.rz   r   N)r\   )Zroute1Zroute2r   r   r   _join_route  s
    
zURLResolver._join_routec                 C   s   | j s|   || jv S r2   )r   r   r   )r0   rV   r   r   r   _is_callback  s    zURLResolver._is_callbackc                    sX  t |}g }| j|}|rH|\}}}| jD ] z |}W nb ty } zJ|jd d}	|	d ur| fdd|	D  n|	 g W Y d }~q.d }~0 0 |r,i || j
}
|
|j |j}|
s||j }t trdnt  j}t|j||
|j| jg|j | jg|j | ||j  S |	 g q.t||dtd|id S )Nr   triedc                 3   s   | ]} g| V  qd S r2   r   )r   trD   r   r   	<genexpr>'  r   z&URLResolver.resolve.<locals>.<genexpr>r   )r   rm   rm   )rK   rD   rn   rB   r   r   r#   getro   r   r   r   r$   rJ   r   r   r"   r%   r)   r'   r+   r*   r   r&   )r0   rm   r   rn   r   r#   r$   Z	sub_matchrx   Z	sub_triedZsub_match_dictZsub_match_argsZcurrent_router   r   r   r     s@    
"
	zURLResolver.resolvec                 C   s    t | jtrt| jS | jS d S r2   )rJ   r   rK   r   r5   r   r   r   r   C  s    
zURLResolver.urlconf_modulec              
   C   s^   t | jd| j}zt| W n< tyX } z$d}t|j| jd|W Y d }~n
d }~0 0 |S )NZurlpatternszThe included URLconf '{name}' does not appear to have any patterns in it. If you see valid patterns in the file then the issue is probably caused by a circular import.)rV   )rI   r   iterr   r	   rU   r   )r0   patternsrx   r   r   r   r   rB   J  s    *zURLResolver.url_patternsc                 C   s<   t | jd| d }|s0ddlm} t |d| }t|i fS )Nr   r   )urls)rI   r   django.confr   r   )r0   Z	view_typer   r   r   r   r   r   Y  s
    z!URLResolver.resolve_error_handlerc                 O   s   | j |dg|R i |S )Nr   )_reverse_with_prefix)r0   lookup_viewr#   r$   r   r   r   reverseb  s    zURLResolver.reversec                    s  |r rt d| js|   | j|}|D ]8\}}}}	|D ]$\}
}|rpt|t|kr`q@tt||}n6t 	|
|rq@t fdd| D rq@ }i }d}| D ]T\}}||	v rz|	| |||< W n t y   d}Y  qY n0 qt|||< q|sq@|dd|
 }tdt||f || r@t|| td	 d
}t|    S q@q.t|dd }t|dd }|d ur|d urd||f }n|}dd |D }|r|rd|f }n rd  }nd}d||t||f }ndd|i }t|d S )Nz2Don't mix *args and **kwargs in call to reverse()!c                 3   s"   | ]\}}  |||kV  qd S r2   )r   rd   r$   r   r   r   w  r   z3URLResolver._reverse_with_prefix.<locals>.<genexpr>TF%z%%z^%s%sz/~:@)safer.   r    z%s.%sc                 S   s   g | ]\}}}}|qS r   r   )r   _rD   r   r   r   r     r   z4URLResolver._reverse_with_prefix.<locals>.<listcomp>zarguments '%s'zkeyword arguments '%s'zno argumentsz;Reverse for '%s' with %s not found. %d pattern(s) tried: %szZReverse for '%(view)s' not found. '%(view)s' is not a valid view function or pattern name.view)r   r   r   r   r   r   r@   zipr   symmetric_difference
differenceanyrk   Zto_urlrK   replaceru   rh   r   r   r   r   rI   r   )r0   r   _prefixr#   r$   possibilitiesZpossibilityrD   r   rA   resultparamsZcandidate_subsZtext_candidate_subsrn   re   rf   Zcandidate_paturlmnZlookup_view_sr   Zarg_msgr   r   r   r   r   e  sj    
z URLResolver._reverse_with_prefix)NNN)r    r.   r7   r1   r6   rs   r   r   r   r   r   r   staticmethodr   r   r   r   r   rB   r   r   r   r   r   r   r   r>   w  s,   
=



(

	r>   )N)N)F)6__doc__r   r   ru   r   	importlibr   urllib.parser   Zasgiref.localr   r   r   Zdjango.core.checksr   r   Zdjango.core.checks.urlsr   Zdjango.core.exceptionsr	   r
   Zdjango.utils.datastructuresr   Zdjango.utils.functionalr   Zdjango.utils.httpr   r   Zdjango.utils.regex_helperr   r   Zdjango.utils.translationr   rA   r   
exceptionsr   r   utilsr   r   r:   	lru_cacher8   rE   rF   rS   r?   r   r   r   r   r   r>   r   r   r   r   <module>   sH   #




!6
++"3