o
    lf|                     @   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d/d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#Z2d0d%d&Z3G d'd( d(e0Z4G d)d* d*Z5G d+d, d,Z6G d-d. d.Z7d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)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   || _ || _|| _|| _|| _|| _|	| _|
| _|r!dd |D ng | _d	| j| _
|r4dd |D ng | _d	| j| _t|drF|j}t|dsW|jjd |jj | _n	|jd |j | _|pd| j}d	| j|g | _d S )Nc                 S      g | ]}|r|qS  r   .0xr   r   Y/var/www/ticemtrilhas/avaliacao_env/lib/python3.10/site-packages/django/urls/resolvers.py
<listcomp>:       z*ResolverMatch.__init__.<locals>.<listcomp>:c                 S   r   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_path	view_name)selfr%   r&   r'   r(   r-   r0   r)   r*   r+   r,   	view_pathr   r   r   __init__"   s&   


zResolverMatch.__init__c                 C   s   | j | j| jf| S N)r%   r&   r'   )r7   indexr   r   r   __getitem__K      zResolverMatch.__getitem__c                 C   sn   t | jtjrt| j}n| j}d|| j| j| j| j	| j
| j| jr'd| jnd| jr3d| jf	 S 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reprr5   r&   r'   r(   r-   r0   r)   r+   r,   )r7   r%   r   r   r   __repr__N   s,   zResolverMatch.__repr__c                 C   s   t d| jj d)NzCannot pickle r$   )r   r3   __qualname__)r7   protocolr   r   r   __reduce_ex__e   r=   zResolverMatch.__reduce_ex__)NNNNNNN)r#   r4   rD   r9   r<   rC   rF   r   r   r   r   r   !   s    
)r   c                 C   s   | d u rt j} t| S r:   )r   ROOT_URLCONF_get_cached_resolverurlconfr   r   r   get_resolveri   s   rK   )maxsizec                 C   s   t td| S N^/)URLResolverRegexPatternrI   r   r   r   rH   o   s   rH   c                 C   s.   t | }t||_t||j}tt d|gS rM   )rP   dict
convertersrO   url_patterns)
ns_patternresolverrR   patternns_resolverr   r   r   get_ns_resolvert   s   
rX   c                   @   s   e Zd Zdd ZdddZdS )LocaleRegexDescriptorc                 C   s
   || _ d S r:   )attr)r7   rZ   r   r   r   r9         
zLocaleRegexDescriptor.__init__Nc                 C   sj   |du r| S t || j}t|tr|||jd< |jd S t }||jvr0|t||j|< |j| S )zT
        Return a compiled regular expression based on the active language.
        Nregex)getattrrZ   r?   str_compile__dict__r   _regex_dict)r7   instanceclsrV   language_coder   r   r   __get__   s   



zLocaleRegexDescriptor.__get__r:   )r#   r4   rD   r9   re   r   r   r   r   rY      s    rY   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)r7   descriptionr   r   r   describe   s   
zCheckURLMixin.describec                 C   sF   | j j}tjs	g S |dr!|ds!td|  dd}|gS g S )zM
        Check that the pattern does not begin with a forward slash.
        )/rN   z^\/rl   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id)	r\   rV   r   APPEND_SLASH
startswithendswithr   rh   rk   )r7   regex_patternwarningr   r   r   _check_pattern_startswith_slash   s   z-CheckURLMixin._check_pattern_startswith_slashN)r#   r4   rD   rk   rt   r   r   r   r   rf      s    	rf   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 )rP   _regexNFc                 C   s"   || _ i | _|| _|| _i | _d S r:   )ru   ra   _is_endpointri   rR   )r7   r\   ri   is_endpointr   r   r   r9      s
   
zRegexPattern.__init__c                 C   st   | j r| jjdr| j|n| j|}|r8| }|r dn| }dd | D }||	 d  ||fS d S )N$r   c                 S   s   i | ]\}}|d ur||qS r:   r   )r   kvr   r   r   
<dictcomp>   s    z&RegexPattern.match.<locals>.<dictcomp>)
rv   r\   rV   rq   	fullmatchsearch	groupdictgroupsitemsend)r7   pathmatchr'   r&   r   r   r   r      s   
zRegexPattern.matchc                 C   s*   g }| |   | js| |   |S r:   )extendrt   rv   _check_include_trailing_dollarr7   warningsr   r   r   check   s
   zRegexPattern.checkc                 C   s8   | j j}|dr|dstd|  ddgS g S )Nrx   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.W001rm   )r\   rV   rq   r   rh   rk   )r7   rr   r   r   r   r      s   
	z+RegexPattern._check_include_trailing_dollarc              
   C   s:   zt |W S  t jy } z	td||f |d}~ww )z0Compile and return the given regular expression.z*"%s" is not a valid regular expression: %sN)recompileerrorr
   )r7   r\   er   r   r   r_      s   
zRegexPattern._compilec                 C   
   t | jS r:   )r^   ru   r7   r   r   r   __str__   r[   zRegexPattern.__str__NF)r#   r4   rD   rY   r\   r9   r   r   r   r_   r   r   r   r   r   rP      s    
	rP   z1<(?:(?P<converter>[^>:]+):)?(?P<parameter>[^>]+)>Fc           
   
   C   s*  | }dg}i }	 t | }|s|t|  not| tj	s(t
d| |t| d|   | | d } |d }| sNt
d||f |d }|du rXd}zt|}W n tys }	 z	t
d	||f |	d}	~	ww |||< |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>}.
    ^TuA   URL route '%s' cannot contain whitespace in angle brackets <…>.N	parameterzLURL route '%s' uses parameter name %r which isn't a valid Python identifier.	converterr^   z'URL route %r uses invalid converter %r.(?P<>)z\Zr>   )_PATH_PARAMETER_COMPONENT_REr}   appendr   escapesetgroup
isdisjointstring
whitespacer
   startr   isidentifierr   KeyErrorr\   r.   )
r)   rw   original_routepartsrR   r   r   raw_converterr   r   r   r   r   _route_to_regex   sX   

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   ra   rv   ri   r   r^   rR   )r7   r)   ri   rw   r   r   r   r9   +  s
   zRoutePattern.__init__c              	   C   sv   | j |}|r9| }| D ]\}}| j| }z	||||< W q ty-   Y  d S w || d  d|fS d S Nr   )r\   r}   r~   r   rR   	to_python
ValueErrorr   )r7   r   r   r'   keyvaluer   r   r   r   r   2  s   
zRoutePattern.matchc                 C   sJ   |   }| j}d|v s|ds|dr#|td|  dd |S )Nr   r   rx   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.W001rm   )rt   r   rp   rq   r   r   rh   rk   )r7   r   r)   r   r   r   r   @  s   
zRoutePattern.checkc                 C   s   t t|| jd S )Nr   )r   r   r   rv   )r7   r)   r   r   r   r_   N     zRoutePattern._compilec                 C   r   r:   )r^   r   r   r   r   r   r   Q  r[   zRoutePattern.__str__r   )
r#   r4   rD   rY   r\   r9   r   r   r_   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 r:   )prefix_default_languagerR   )r7   r   r   r   r   r9   V  s   
zLocalePrefixPattern.__init__c                 C   s   t t | jS r:   )r   r   r   language_prefixr   r   r   r   r\   Z  s   zLocalePrefixPattern.regexc                 C   s(   t  ptj}|tjkr| jsdS d| S )Nr>   z%s/)r   r   LANGUAGE_CODEr   r7   rd   r   r   r   r   _  s   z#LocalePrefixPattern.language_prefixc                 C   s*   | j }||r|t|d  di fS d S r   )r   rp   len)r7   r   r   r   r   r   r   g  s   
zLocalePrefixPattern.matchc                 C   s   g S r:   r   r   r   r   r   r   m  s   zLocalePrefixPattern.checkc                 C   s
   d | S )Nrg   )rh   r   r   r   r   rk   p  r[   zLocalePrefixPattern.describec                 C   s   | j S r:   )r   r   r   r   r   r   s  s   zLocalePrefixPattern.__str__N)T)r#   r4   rD   r9   propertyr\   r   r   r   rk   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 r:   )rV   callbackdefault_argsri   )r7   rV   r   r   ri   r   r   r   r9   x  s   

zURLPattern.__init__c                 C   s   d| j j| j f S )Nz<%s %s>)r3   r#   rV   rk   r   r   r   r   rC   ~  r   zURLPattern.__repr__c                 C   s*   |   }|| j  ||   |S r:   )_check_pattern_namer   rV   r   _check_callbackr   r   r   r   r     s   zURLPattern.checkc                 C   s:   | j jdurd| j jv rtd| j  dd}|gS g 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.W003rm   )rV   ri   r   rh   rk   )r7   rs   r   r   r   r     s   zURLPattern._check_pattern_namec                 C   sL   ddl m} | j}t|r$t||r$t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.E009rm   )
django.viewsr   r   inspectisclass
issubclassr   rV   rk   r#   )r7   r   viewr   r   r   r     s   zURLPattern._check_callbackc              	   C   sP   | j |}|r&|\}}}i || j}t| j||| j jt| j || jdS d S )N)r)   r+   r,   )rV   r   r   r   r   ri   r^   )r7   r   r   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s#|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@   rA   r%   r2   r"   r4   r3   r#   rD   )r7   r   r   r   r   
lookup_str  s   

zURLPattern.lookup_str)NN)r#   r4   rD   r9   rC   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 )&rO   Nc                 C   sT   || _ || _d | _|pi | _|| _|| _i | _i | _i | _t	 | _
d| _t | _d S r   )rV   urlconf_namer   default_kwargsr1   r/   _reverse_dict_namespace_dict	_app_dictr   _callback_strs
_populatedr   _local)r7   rV   r   r   r/   r1   r   r   r   r9     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   listr3   r#   rB   r/   r1   rV   rk   )r7   urlconf_reprr   r   r   rC     s   
zURLResolver.__repr__c                 C   s:   g }| j D ]	}|t| q||   |p| j S r:   )rS   r   r	   _check_custom_error_handlersrV   r   )r7   messagesrV   r   r   r   r     s
   
zURLResolver.checkc           
      C   s   g }dD ]r\}}z|  |}W n/ ttfy> } z!t| jd| }dj||d}|t|t|dd W Y d }~qd }~ww t	
|}d g| }	z|j|	  W q tyv   dj||jd |j |d	krgd
ndd}|t|dd Y qw |S )N))i     )i  r   )i  r   )i  r   	handler%szDThe custom handler{status_code} view '{path}' could not be imported.)status_coder   z	urls.E008)hintrn   zeThe custom handler{status_code} view '{path}' does not take the correct number of arguments ({args}).r$   r   zrequest, exceptionrequest)r   r   r&   z	urls.E007rm   )resolve_error_handlerImportErrorr   r]   urlconf_modulerh   r   r   r^   r   	signaturebind	TypeErrorr4   rD   )
r7   r   r   num_parametershandlerr   r   msgr   r&   r   r   r   r     s6   


z(URLResolver._check_custom_error_handlersc                 C   s  t | jddr	d S zd| j_t }i }i }t }t| jD ]}|jjj}|	dr/|dd  }t
|trd| j|j t|jjj}||j|||j|jjf |jd urc||j|||j|jjf q|  |jr~||jg |j ||f||j< nf|jD ]0}|j|D ]'\}	}
}}t||
 }|||||
 i ||ji | jj|jj|f qq|j D ]\}\}}|jj}|jj| || |f||< q|j  D ]\}}||g !| q| j|j q|| j"|< || j#|< || j$|< d| _%W d| j_d S d| j_w )N
populatingFTr   r   )&r]   r   r   r   r   reversedrS   rV   r\   rp   r?   r   r   addr   r   
appendlistr   r   rR   ri   	_populater/   
setdefaultr   r1   reverse_dictgetlistr   namespace_dictr   updateapp_dictr   r   r   r   r   )r7   lookupsr0   appsrd   url_pattern	p_patternbitsri   matchespatdefaultsrR   new_matchesr1   prefixsub_patterncurrent_convertersr/   namespace_listr   r   r   r     s   



	






zURLResolver._populatec                 C   "   t  }|| jvr|   | j| S r:   )r   r   r   r   r   r   r   r   g     

zURLResolver.reverse_dictc                 C   r   r:   )r   r   r   r   r   r   r   r   n  r   zURLResolver.namespace_dictc                 C   r   r:   )r   r   r   r   r   r   r   r   u  r   zURLResolver.app_dictc                    s4   |d u r|   g d S |  fdd|D  d S )Nc                 3   s    | ]} g|V  qd S r:   r   )r   trV   r   r   	<genexpr>  s    z,URLResolver._extend_tried.<locals>.<genexpr>)r   r   )r*   rV   	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)rp   )route1route2r   r   r   _join_route  s
   
zURLResolver._join_routec                 C   s   | j s|   || jv S r:   )r   r   r   )r7   ri   r   r   r   _is_callback  s   
zURLResolver._is_callbackc                 C   sP  t |}g }| j|}|r|\}}}| jD ]}z||}W n ty> }	 z| |||	jd d W Y d }	~	qd }	~	ww |ri || j	}
|

|j |j}|
sX||j }t|tr_d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)Nr   r*   r>   )r+   r,   )r*   r   r   )r^   rV   r   rS   r   r   r   r&   getr   r   r'   r?   r   r*   r   r%   r(   r/   r-   r1   r0   r   r)   r+   r,   r   )r7   r   r*   r   r   r&   r'   rV   	sub_matchr   sub_match_dictsub_match_argscurrent_router   r   r   r     sT   

&

zURLResolver.resolvec                 C   s   t | jtrt| jS | jS r:   )r?   r   r^   r   r   r   r   r   r     s   
zURLResolver.urlconf_modulec              
   C   sP   t | jd| j}zt| W |S  ty' } zd}t|j| jd|d }~ww )N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.)ri   )r]   r   iterr   r
   rh   r   )r7   patternsr   r   r   r   r   rS     s   
	zURLResolver.url_patternsc                 C   s8   t | jd| d }|sddlm} t |d| }t|S )Nr   r   )urls)r]   r   django.confr  r   )r7   	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)r7   lookup_viewr&   r'   r   r   r   reverse  s   zURLResolver.reversec                 O   s  |r|rt d| js|   | j|}|D ]\}}}}	|D ]\}
}|r6t|t|kr.qtt||}n,t|	|
|rAqd}| D ]\}}||v rPqG||||kr\d} nqG|s`q|}i }d}| D ]&\}}||	v rz|	| |||< W qj t y   d}Y  nw t|||< qj|sq|dd|
 }tdt||f || rt|| 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 }t|dd|i }t|)Nz2Don't mix *args and **kwargs in call to reverse()!TF%z%%z^%s%sz/~:@)safer4   r#   z%s.%sc                 S   s   g | ]\}}}}|qS r   r   )r   _rV   r   r   r   r   )  s    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   rQ   zipr   symmetric_difference
differencer   r   to_urlr^   replacer   r}   r   r   r   r   r]   r   )r7   r  _prefixr&   r'   possibilitiespossibilityrV   r   rR   resultparamscandidate_subsr   ry   rz   text_candidate_subsr   candidate_paturlmnlookup_view_sr  arg_msgr   r   r   r   r    s   3
z URLResolver._reverse_with_prefix)NNNr:   )r#   r4   rD   r9   rC   r   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   rS   r   r  r  r   r   r   r   rO     s4    
U



0


rO   r:   )F)8__doc__r@   r   r   r   	importlibr   pickler   urllib.parser   asgiref.localr   r	  r   django.core.checksr   r   django.core.checks.urlsr	   django.core.exceptionsr
   r   django.utils.datastructuresr   django.utils.functionalr   django.utils.httpr   r   django.utils.regex_helperr   r   django.utils.translationr   rR   r   
exceptionsr   r   utilsr   r   rK   	lru_cacherH   rX   rY   rf   rP   r   r   r   r   r   rO   r   r   r   r   <module>   sL    
H



#<
.-"Q