a
    5Xh|                     @   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 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d0ddZ-ej,dddd Z.G dd dZ/G dd  d Z0G d!d" d"e0Z1ed#Z2d1d%d&Z3G d'd( d(e0Z4G d)d* d*Z5G d+d, d,Z6G d-d. d.Z7dS )2z
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)PicklingError)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d	 ZdS )ResolverMatchNc                 C   s   || _ || _|| _|| _|| _|| _|	| _|
| _|rBdd |D ng | _d	| j| _
|rhdd |D ng | _d	| j| _t|dr|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   Z/var/www/viveiro_mudafortebrasil/venv/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   
view_class__name__.)funcargskwargsurl_nameroutetriedcaptured_kwargsextra_kwargs	app_namesjoinapp_name
namespaces	namespacehasattrr!   	__class__
__module__r"   
_func_pathZ	view_name)selfr$   r%   r&   r'   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&   )r5   indexr   r   r   __getitem__K   s    zResolverMatch.__getitem__c                 C   sj   t | jtjrt| j}n| j}d|| j| j| j| j	| j
| j| jrNd| jnd| jrbd| jndf	 S )NzbResolverMatch(func=%s, args=%r, kwargs=%r, url_name=%r, app_names=%r, namespaces=%r, route=%r%s%s)z, captured_kwargs= z, extra_kwargs=)
isinstancer$   	functoolspartialreprr4   r%   r&   r'   r,   r/   r(   r*   r+   )r5   r$   r   r   r   __repr__N   s$    zResolverMatch.__repr__c                 C   s   t d| jj dd S )NzCannot pickle r#   )r   r2   __qualname__)r5   protocolr   r   r   __reduce_ex__e   s    zResolverMatch.__reduce_ex__)NNNNNNN)r"   r3   r@   r6   r9   r?   rB   r   r   r   r   r   !   s          
)r   c                 C   s   | d u rt j} t| S r7   )r   ZROOT_URLCONF_get_cached_resolverZurlconfr   r   r   get_resolveri   s    rE   )maxsizec                 C   s   t td| S N^/)URLResolverRegexPatternrD   r   r   r   rC   o   s    rC   c                 C   s.   t | }t||_t||j}tt d|gS rG   )rJ   dict
convertersrI   url_patterns)Z
ns_patternresolverrL   patternZns_resolverr   r   r   get_ns_resolvert   s    
rP   c                   @   s   e Zd Zdd ZdddZdS )LocaleRegexDescriptorc                 C   s
   || _ d S r7   )attr)r5   rR   r   r   r   r6      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)getattrrR   r;   str_compile__dict__r   _regex_dict)r5   instanceclsrO   language_coder   r   r   __get__   s    


zLocaleRegexDescriptor.__get__)N)r"   r3   r@   r6   r\   r   r   r   r   rQ      s   rQ   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)r5   descriptionr   r   r   describe   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.
        )/rH   z^\/rc   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)	rS   rO   r   ZAPPEND_SLASH
startswithendswithr   r_   rb   )r5   regex_patternwarningr   r   r   _check_pattern_startswith_slash   s    z-CheckURLMixin._check_pattern_startswith_slashN)r"   r3   r@   rb   rj   r   r   r   r   r]      s   	r]   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 )rJ   _regexNFc                 C   s"   || _ i | _|| _|| _i | _d S r7   )rk   rX   _is_endpointr`   rL   )r5   rS   r`   is_endpointr   r   r   r6      s
    zRegexPattern.__init__c                 C   st   | j r | jjdr | j|n
| j|}|rp| }|r@dn| }dd | D }||	 d  ||fS d S )N$r   c                 S   s   i | ]\}}|d ur||qS r7   r   )r   kvr   r   r   
<dictcomp>   r   z&RegexPattern.match.<locals>.<dictcomp>)
rl   rS   rO   rg   	fullmatchsearch	groupdictgroupsitemsend)r5   pathmatchr&   r%   r   r   r   ry      s    
zRegexPattern.matchc                 C   s*   g }| |   | js&| |   |S r7   )extendrj   rl   _check_include_trailing_dollarr5   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 )Nrn   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.W001rd   )rS   rO   rg   r   r_   rb   )r5   rh   r   r   r   r{      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
   )r5   rS   er   r   r   rV      s    
zRegexPattern._compilec                 C   s
   t | jS r7   )rU   rk   r5   r   r   r   __str__   s    zRegexPattern.__str__)NF)r"   r3   r@   rQ   rS   r6   ry   r~   r{   rV   r   r   r   r   r   rJ      s   
	rJ   z1<(?:(?P<converter>[^>:]+):)?(?P<parameter>[^>]+)>Fc           
   
   C   s:  | }dg}i }t | }|s2|t|  qn t| tj	sRt
d| |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>}.
    ^uA   URL route '%s' cannot contain whitespace in angle brackets <…>.N	parameterzLURL route '%s' uses parameter name %r which isn't a valid Python identifier.	converterrU   z'URL route %r uses invalid converter %r.(?P<>)z\Zr:   )_PATH_PARAMETER_COMPONENT_RErs   appendr   escapesetgroup
isdisjointstring
whitespacer
   startrw   isidentifierr   KeyErrorrS   r-   )
r(   rm   Zoriginal_routepartsrL   ry   r   Zraw_converterr   r   r   r   r   _route_to_regex   sP    

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   rX   rl   r`   r   rU   rL   )r5   r(   r`   rm   r   r   r   r6   +  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   )rS   rs   rt   rv   rL   Z	to_python
ValueErrorrw   )r5   rx   ry   r&   keyvaluer   r   r   r   ry   2  s    
zRoutePattern.matchc                 C   sJ   |   }| j}d|v s*|ds*|drF|td|  dd |S )Nr   r   rn   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.W001rd   )rj   r   rf   rg   r   r   r_   rb   )r5   r}   r(   r   r   r   r~   @  s    zRoutePattern.checkc                 C   s   t t|| jd S )Nr   )r   r   r   rl   )r5   r(   r   r   r   rV   N  s    zRoutePattern._compilec                 C   s
   t | jS r7   )rU   r   r   r   r   r   r   Q  s    zRoutePattern.__str__)NF)
r"   r3   r@   rQ   rS   r6   ry   r~   rV   r   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 r7   )prefix_default_languagerL   )r5   r   r   r   r   r6   V  s    zLocalePrefixPattern.__init__c                 C   s   t t | jS r7   )r   r   r   language_prefixr   r   r   r   rS   Z  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   r5   r[   r   r   r   r   _  s    z#LocalePrefixPattern.language_prefixc                 C   s*   | j }||r&|t|d  di fS d S r   )r   rf   len)r5   rx   r   r   r   r   ry   g  s    
zLocalePrefixPattern.matchc                 C   s   g S r7   r   r   r   r   r   r~   m  s    zLocalePrefixPattern.checkc                 C   s
   d | S )Nr^   )r_   r   r   r   r   rb   p  s    zLocalePrefixPattern.describec                 C   s   | j S r7   )r   r   r   r   r   r   s  s    zLocalePrefixPattern.__str__N)T)r"   r3   r@   r6   propertyrS   r   ry   r~   rb   r   r   r   r   r   r   U  s   


r   c                   @   sJ   e Zd ZdddZ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 r7   )rO   callbackdefault_argsr`   )r5   rO   r   r   r`   r   r   r   r6   x  s    
zURLPattern.__init__c                 C   s   d| j j| j f S )Nz<%s %s>)r2   r"   rO   rb   r   r   r   r   r?   ~  s    zURLPattern.__repr__c                 C   s*   |   }|| j  ||   |S r7   )_check_pattern_namerz   rO   r~   _check_callbackr|   r   r   r   r~     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.W003rd   )rO   r`   r   r_   rb   )r5   ri   r   r   r   r     s    zURLPattern._check_pattern_namec                 C   sL   ddl m} | j}t|rHt||rHtd| j |j	|j	f ddgS g S )Nr   )ViewzIYour URL pattern %s has an invalid view, pass %s.as_view() instead of %s.z	urls.E009rd   )
Zdjango.viewsr   r   inspectisclass
issubclassr   rO   rb   r"   )r5   r   viewr   r   r   r     s    zURLPattern._check_callbackc              	   C   sP   | j |}|rL|\}}}i || j}t| j||| j jt| j || jdS d S )N)r(   r*   r+   )rO   ry   r   r   r   r`   rU   )r5   rx   ry   new_pathr%   r*   r&   r   r   r   resolve  s    
zURLPattern.resolvec                 C   sV   | j }t|tjr|j}t|dr*|j}nt|dsF|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#   )r   r;   r<   r=   r$   r1   r!   r3   r2   r"   r@   )r5   r   r   r   r   
lookup_str  s    

zURLPattern.lookup_str)NN)r"   r3   r@   r6   r?   r~   r   r   r   r   r   r   r   r   r   r   w  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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 )&rI   Nc                 C   sT   || _ || _d | _|pi | _|| _|| _i | _i | _i | _t	 | _
d| _t | _d S )NF)rO   urlconf_namer   default_kwargsr0   r.   _reverse_dict_namespace_dict	_app_dictr   _callback_strs
_populatedr   _local)r5   rO   r   r   r.   r0   r   r   r   r6     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>)
r;   r   listr2   r"   r>   r.   r0   rO   rb   )r5   Zurlconf_reprr   r   r   r?     s    
zURLResolver.__repr__c                 C   s:   g }| j D ]}|t| q
||   |p8| j S r7   )rM   rz   r	   _check_custom_error_handlersrO   r~   )r5   messagesrO   r   r   r   r~     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_coderx   z	urls.E008)hintre   zeThe custom handler{status_code} view '{path}' does not take the correct number of arguments ({args}).r#   r   zrequest, exceptionrequest)r   rx   r%   z	urls.E007rd   )resolve_error_handlerImportErrorr   rT   urlconf_moduler_   r   r   rU   r   	signaturebind	TypeErrorr3   r@   )
r5   r   r   Znum_parametershandlerr   rx   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
populatingFTr   r   )&rT   r   r   r   r   reversedrM   rO   rS   rf   r;   r   r   addr   r   Z
appendlistr   r   rL   r`   	_populater.   
setdefaultr   r0   reverse_dictgetlistr   namespace_dictrv   updateapp_dictrz   r   r   r   r   )r5   lookupsr/   Zappsr[   Zurl_patternZ	p_patternbitsr`   matchespatdefaultsrL   Znew_matchesr0   prefixZsub_patternZcurrent_convertersr.   Znamespace_listr   r   r   r     s    


	







zURLResolver._populatec                 C   s"   t  }|| jvr|   | j| S r7   )r   r   r   r   r   r   r   r   g  s    
zURLResolver.reverse_dictc                 C   s"   t  }|| jvr|   | j| S r7   )r   r   r   r   r   r   r   r   n  s    
zURLResolver.namespace_dictc                 C   s"   t  }|| jvr|   | j| S r7   )r   r   r   r   r   r   r   r   u  s    
zURLResolver.app_dictc                    s2   |d u r|   g n|  fdd|D  d S )Nc                 3   s   | ]} g|V  qd S r7   r   )r   trO   r   r   	<genexpr>  r   z,URLResolver._extend_tried.<locals>.<genexpr>)r   rz   )r)   rO   Z	sub_triedr   r   r   _extend_tried|  s    zURLResolver._extend_triedc                 C   s&   | s|S | dr|dd }| | S )z<Join two routes, without the starting ^ in the second route.r   r   N)rf   )Zroute1Zroute2r   r   r   _join_route  s
    
zURLResolver._join_routec                 C   s   | j s|   || jv S r7   )r   r   r   )r5   r`   r   r   r   _is_callback  s    zURLResolver._is_callbackc                 C   sZ  t |}g }| j|}|rJ|\}}}| jD ]
}z||}W n> ty }	 z&| |||	jd d W Y d }	~	q.d }	~	0 0 |r.i || j	}
|

|j |j}|
s||j }t|trdnt |j}| |||j t|j||
|j| jg|j | jg|j | ||j||ji | j	|jd
  S ||g q.t||dtd|id S )Nr   r)   r:   )r*   r+   )r)   rx   rx   )rU   rO   ry   rM   r   r   r   r%   getr   r   r&   r;   r   r)   r   r$   r'   r.   r,   r0   r/   r   r(   r*   r+   r   )r5   rx   r)   ry   r   r%   r&   rO   Z	sub_matchr   Zsub_match_dictZsub_match_argsZcurrent_router   r   r   r     sP    
0

zURLResolver.resolvec                 C   s    t | jtrt| jS | jS d S r7   )r;   r   rU   r   r   r   r   r   r     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 the 'urlpatterns' variable with valid patterns in the file then the issue is probably caused by a circular import.)r`   )rT   r   iterr   r
   r_   r   )r5   patternsr   r   r   r   r   rM     s    *zURLResolver.url_patternsc                 C   s8   t | jd| d }|s0ddlm} t |d| }t|S )Nr   r   )urls)rT   r   django.confr   r   )r5   Z	view_typer   r   r   r   r   r     s
    z!URLResolver.resolve_error_handlerc                 O   s   | j |dg|R i |S )Nr:   )_reverse_with_prefix)r5   lookup_viewr%   r&   r   r   r   reverse  s    zURLResolver.reversec                 O   s6  |r|rt d| js|   | j|}|D ]^\}}}}	|D ]J\}
}|rpt|t|kr`q@tt||}nXt|	|
|rq@d}| D ]*\}}||v rq||||krd} qq|sq@|}i }d}| D ]X\}}||	v r$z|	| |||< W n  t y    d}Y  q2Y 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|rd| }nd}d||t||f }ndd|i }t|d S )Nz2Don't mix *args and **kwargs in call to reverse()!TF%z%%z^%s%sz/~:@)safer3   r"   z%s.%sc                 S   s   g | ]\}}}}|qS r   r   )r   _rO   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.r   )r   r   r   r   r   r   rK   zipr   symmetric_difference
differencerv   r   Zto_urlrU   replacer   rs   r   r   r   r   rT   r   )r5   r   _prefixr%   r&   possibilitiesZpossibilityrO   r   rL   resultparamsZcandidate_subsr   ro   rp   Ztext_candidate_subsry   Zcandidate_paturlmnZlookup_view_sr   Zarg_msgr   r   r   r   r     s    

z URLResolver._reverse_with_prefix)NNN)N)r"   r3   r@   r6   r?   r~   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   rM   r   r   r   r   r   r   r   rI     s2    
U



0


rI   )N)N)F)8__doc__r<   r   r   r   	importlibr   pickler   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   rL   r   
exceptionsr   r   utilsr   r   rE   	lru_cacherC   rP   rQ   r]   rJ   r   r   r   r   r   rI   r   r   r   r   <module>   sJ   H




#<
.-"Q