3
gm                 @   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   || _ || _|| _|| _|| _|| _|r6dd |D ng | _dj| j| _|r\dd |D ng | _	dj| j	| _
t|ds|jjd |jj | _n|jd |j | _|p| j}	dj| j	|	g | _d S )Nc             S   s   g | ]}|r|qS  r   ).0xr   r   S/var/www/tester-filtro-web/env/lib/python3.6/site-packages/django/urls/resolvers.py
<listcomp>+   s    z*ResolverMatch.__init__.<locals>.<listcomp>:c             S   s   g | ]}|r|qS r   r   )r   r   r   r   r   r   -   s    __name__.)funcargskwargsurl_nameroutetried	app_namesjoinapp_name
namespaces	namespacehasattr	__class__
__module__r   
_func_pathZ	view_name)
selfr    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"   )r/   indexr   r   r   __getitem__:   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$   )r/   r   r   r   __repr__=   s    zResolverMatch.__repr__)NNNNN)r   r-   __qualname__r0   r2   r3   r   r   r   r   r       s   
r   c             C   s   | d krt j} t| S )N)r   ZROOT_URLCONF_get_cached_resolver)urlconfr   r   r   get_resolverD   s    r7   )maxsizec             C   s   t td| S )Nz^/)URLResolverRegexPattern)r6   r   r   r   r5   J   s    r5   c             C   s.   t | }t||_t||j}tt d|gS )Nz^/)r:   dict
convertersr9   url_patterns)Z
ns_patternresolverr<   patternZns_resolverr   r   r   get_ns_resolverO   s    
r@   c               @   s   e Zd Zdd ZdddZdS )LocaleRegexDescriptorc             C   s
   || _ d S )N)attr)r/   rB   r   r   r   r0   [   s    zLocaleRegexDescriptor.__init__Nc             C   sj   |dkr| S t || j}t|tr<|j||jd< |jd S t }||jkr`|jt||j|< |j| S )zT
        Return a compiled regular expression based on the active language.
        Nregex)getattrrB   
isinstancestr_compile__dict__r   _regex_dict)r/   instanceclsr?   language_coder   r   r   __get__^   s    


zLocaleRegexDescriptor.__get__)N)r   r-   r4   r0   rM   r   r   r   r   rA   Z   s   rA   c               @   s   e Zd Zdd Zdd ZdS )CheckURLMixinc             C   s$   dj | }| jr |dj | j7 }|S )zI
        Format the URL pattern for display in warning messages.
        z'{}'z [name='{}'])formatname)r/   descriptionr   r   r   describer   s    
zCheckURLMixin.describec             C   sL   | j j}tjsg S |jdrD|jd rDtdj| j dd}|gS g S dS )	zM
        Check that the pattern does not begin with a forward slash.
        /^/^\/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   rT   rU   )	rC   r?   r   ZAPPEND_SLASH
startswithendswithr   rO   rR   )r/   regex_patternwarningr   r   r   _check_pattern_startswith_slash{   s    z-CheckURLMixin._check_pattern_startswith_slashN)r   r-   r4   rR   r[   r   r   r   r   rN   q   s   	rN   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 )N)r\   rI   _is_endpointrP   r<   )r/   rC   rP   is_endpointr   r   r   r0      s
    zRegexPattern.__init__c             C   st   | j r | jjjdr | jj|n
| jj|}|rp|j }|r@f n|j }dd |j D }||j	 d  ||fS d S )N$c             S   s   i | ]\}}|d k	r||qS )Nr   )r   kvr   r   r   
<dictcomp>   s    z&RegexPattern.match.<locals>.<dictcomp>)
r]   rC   r?   rX   	fullmatchsearch	groupdictgroupsitemsend)r/   pathmatchr"   r!   r   r   r   rj      s     zRegexPattern.matchc             C   s*   g }|j | j  | js&|j | j  |S )N)extendr[   r]   _check_include_trailing_dollar)r/   warningsr   r   r   check   s
    zRegexPattern.checkc             C   s>   | j j}|jdr6|jd r6tdj| j ddgS g S d S )Nr_   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.W001)rV   )rC   r?   rX   r   rO   rR   )r/   rY   r   r   r   rl      s    
z+RegexPattern._check_include_trailing_dollarc             C   sF   y
t j|S  t jk
r@ } ztd||f |W Y dd}~X nX dS )z0Compile and return the given regular expression.z*"%s" is not a valid regular expression: %sN)recompileerrorr	   )r/   rC   er   r   r   rG      s    
zRegexPattern._compilec             C   s
   t | jS )N)rF   r\   )r/   r   r   r   __str__   s    zRegexPattern.__str__)NF)r   r-   r4   rA   rC   r0   rj   rn   rl   rG   rs   r   r   r   r   r:      s   
	r:   z1<(?:(?P<converter>[^>:]+):)?(?P<parameter>[^>]+)>Fc       
      C   s<  | }dg}i }xt j| }|s4|jtj|  P n t|j jtj	sTt
d| |jtj| d|j   | |j d } |d }|j st
d||f |d }|dkrd}yt|}W n4 tk
r }	 zt
d||f |	W Y dd}	~	X nX |||< |jd	| d
 |j d  qW |r.|jd dj||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.	converterrF   z'URL route %r uses invalid converter %r.z(?P<>)z\Z )_PATH_PARAMETER_COMPONENT_RErd   appendro   escapesetgroup
isdisjointstring
whitespacer	   startrh   isidentifierr   KeyErrorrC   r'   )
r$   r^   Zoriginal_routepartsr<   rj   ru   Zraw_converterrv   rr   r   r   r   _route_to_regex   sD    

 
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   rI   r]   rP   r   rF   r<   )r/   r$   rP   r^   r   r   r   r0     s
    zRoutePattern.__init__c             C   sz   | j j|}|rv|j }xF|j D ]:\}}| j| }y|j|||< W q" tk
rZ   d S X q"W ||j d  f |fS d S )N)rC   rd   re   rg   r<   Z	to_python
ValueErrorrh   )r/   ri   rj   r"   keyvaluerv   r   r   r   rj   	  s    

zRoutePattern.matchc             C   sJ   | j  }| j}d|ks*|jds*|jdrF|jtdj| j dd |S )Nz(?P<rt   r_   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.W001)rV   )r[   r   rW   rX   r{   r   rO   rR   )r/   rm   r$   r   r   r   rn     s    
zRoutePattern.checkc             C   s   t jt|| jd S )Nr   )ro   rp   r   r]   )r/   r$   r   r   r   rG   #  s    zRoutePattern._compilec             C   s
   t | jS )N)rF   r   )r/   r   r   r   rs   &  s    zRoutePattern.__str__)NF)
r   r-   r4   rA   rC   r0   rj   rn   rG   rs   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 )N)prefix_default_languager<   )r/   r   r   r   r   r0   +  s    zLocalePrefixPattern.__init__c             C   s   t jt j| jS )N)ro   rp   r|   language_prefix)r/   r   r   r   rC   /  s    zLocalePrefixPattern.regexc             C   s.   t  p
tj}|tjkr"| j r"dS d| S d S )Nry   z%s/)r   r   ZLANGUAGE_CODEr   )r/   rL   r   r   r   r   4  s    z#LocalePrefixPattern.language_prefixc             C   s*   | j }|j|r&|t|d  f i fS d S )N)r   rW   len)r/   ri   r   r   r   r   rj   <  s    
zLocalePrefixPattern.matchc             C   s   g S )Nr   )r/   r   r   r   rn   B  s    zLocalePrefixPattern.checkc             C   s
   dj | S )Nz'{}')rO   )r/   r   r   r   rR   E  s    zLocalePrefixPattern.describec             C   s   | j S )N)r   )r/   r   r   r   rs   H  s    zLocalePrefixPattern.__str__N)T)r   r-   r4   r0   propertyrC   r   rj   rn   rR   rs   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 )N)r?   callbackdefault_argsrP   )r/   r?   r   r   rP   r   r   r   r0   M  s    
zURLPattern.__init__c             C   s   d| j j| jj f S )Nz<%s %s>)r,   r   r?   rR   )r/   r   r   r   r3   S  s    zURLPattern.__repr__c             C   s   | j  }|j| jj  |S )N)_check_pattern_namerk   r?   rn   )r/   rm   r   r   r   rn   V  s    zURLPattern.checkc             C   s>   | j jdk	r6d| j jkr6tdj| j 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.W003)rV   )r?   rP   r   rO   rR   )r/   rZ   r   r   r   r   [  s    
zURLPattern._check_pattern_namec             C   sH   | j j|}|rD|\}}}|j| j t| j||| j jt| j dS d S )N)r$   )r?   rj   updater   r   r   rP   rF   )r/   ri   rj   new_pathr!   r"   r   r   r   resolvei  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   rE   	functoolspartialr    r+   r-   r,   r   r4   )r/   r   r   r   r   
lookup_strq  s    
zURLPattern.lookup_str)NN)
r   r-   r4   r0   r3   rn   r   r   r   r   r   r   r   r   r   L  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 )&r9   Nc             C   sT   || _ || _d | _|pi | _|| _|| _i | _i | _i | _t	 | _
d| _t | _d S )NF)r?   urlconf_namer   default_kwargsr*   r(   _reverse_dict_namespace_dict	_app_dictr}   _callback_strs
_populatedr   _local)r/   r?   r   r   r(   r*   r   r   r   r0     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j	 f S )Nz	<%s list>r   z<%s %s (%s:%s) %s>)
rE   r   listr,   r   reprr(   r*   r?   rR   )r/   Zurlconf_reprr   r   r   r3     s    
zURLResolver.__repr__c             C   s>   g }x| j D ]}|jt| qW |j| j  |p<| jj S )N)r=   rk   r   _check_custom_error_handlersr?   rn   )r/   messagesr?   r   r   r   rn     s
    zURLResolver.checkc       
      C   s   g } xdD ]\}}y| j |}W n^ ttfk
r } z>t| jd| }dj||d	}|jt|t|d
d wW Y d d }~X nX t	j
|}d g| }	y|j|	  W q tk
 r   dj||jd |j |dkrdndd}|jt|dd Y qX qW |S )N           r   z	handler%szDThe custom handler{status_code} view '{path}' could not be imported.)status_coderi   z	urls.E008)hintrV   zeThe custom handler{status_code} view '{path}' does not take the correct number of arguments ({args}).r   zrequest, exceptionrequest)r   ri   r!   z	urls.E007)rV   r   r   r   r   r   r   r   r   )r   r   r   r   )resolve_error_handlerImportErrorr
   rD   urlconf_modulerO   r{   r   rF   inspect	signaturebind	TypeErrorr-   r4   )
r/   r   r   Znum_parametershandlerrr   ri   msgr   r!   r   r   r   r     s*    


z(URLResolver._check_custom_error_handlersc             C   s(  t | jddrd S zd| j_t }i }i }t }xt| jD ]}|jjj}|j	drf|dd  }t
|tr| jj|j t|jjj}|j|j|||j|jjf |jd k	r|j|j|||j|jjf q@|j  |jr|j|jg j|j ||f||j< nxh|jD ]^}xV|jj|D ]F\}	}
}}t||
 }|j||||
 ||j| jj|jj|f q W qW xB|jj D ]4\}\}}|jj}|jjj| || |f||< q|W x*|j j D ]\}}|j|g j!| qW | jj|j q@W || j"|< || j#|< || j$|< d| _%W d d| j_X d S )N
populatingFTrt   r   )&rD   r   r   r   r   reversedr=   r?   rC   rW   rE   r   r   addr   r   Z
appendlistr   r   r<   rP   	_populater(   
setdefaultr{   r*   reverse_dictgetlistr   namespace_dictrg   r   app_dictrk   r   r   r   r   )r/   lookupsr)   ZappsrL   Zurl_patternZ	p_patternbitsrP   matchespatdefaultsr<   Znew_matchesr*   prefixZsub_patternZcurrent_convertersr(   Znamespace_listr   r   r   r     s^    



"



zURLResolver._populatec             C   s"   t  }|| jkr| j  | j| S )N)r   r   r   )r/   rL   r   r   r   r      s    
zURLResolver.reverse_dictc             C   s"   t  }|| jkr| j  | j| S )N)r   r   r   )r/   rL   r   r   r   r     s    
zURLResolver.namespace_dictc             C   s"   t  }|| jkr| j  | j| S )N)r   r   r   )r/   rL   r   r   r   r     s    
zURLResolver.app_dictc                s2   |d kr| j  g n| j fdd|D  d S )Nc             3   s   | ]} f|V  qd S )Nr   )r   t)r?   r   r   	<genexpr>  s    z,URLResolver._extend_tried.<locals>.<genexpr>)r{   rk   )r%   r?   Z	sub_triedr   )r?   r   _extend_tried  s    zURLResolver._extend_triedc             C   s&   | s|S |j dr|dd }| | S )z<Join two routes, without the starting ^ in the second route.rt   r   N)rW   )Zroute1Zroute2r   r   r   _join_route  s
    
zURLResolver._join_routec             C   s   | j s| j  || jkS )N)r   r   r   )r/   rP   r   r   r   _is_callback%  s    zURLResolver._is_callbackc             C   s>  t |}g }| jj|}|r.|\}}}x| jD ]}y|j|}W n< tk
r~ }	 z | j|||	jd jd W Y d d }	~	X q0X |r|| j	}
|
j
|j |j}|
s||j }t|trdnt |j}| j|||j t|j||
|j| jg|j | jg|j | j||j|S |j|g q0W t||dtd|id S )Nr   r%   ry   )r%   ri   ri   )rF   r?   rj   r=   r   r   r   r!   getr   r   r"   rE   r   r%   r   r    r#   r(   r&   r*   r)   r   r$   r{   )r/   ri   r%   rj   r   r!   r"   r?   Z	sub_matchrr   Z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 )N)rE   r   rF   r   )r/   r   r   r   r   P  s    
zURLResolver.urlconf_modulec             C   s\   t | jd| j}yt| W n: tk
rV } zd}t|j| jd|W Y d d }~X nX |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.)rP   )rD   r   iterr   r	   rO   r   )r/   patternsrr   r   r   r   r   r=   W  s    &zURLResolver.url_patternsc             C   s8   t | jd| d }|s0ddlm} t |d| }t|S )Nz	handler%sr   )urls)rD   r   django.confr   r   )r/   Z	view_typer   r   r   r   r   r   f  s
    z!URLResolver.resolve_error_handlerc             O   s   | j |df||S )Nry   )_reverse_with_prefix)r/   lookup_viewr!   r"   r   r   r   reverseo  s    zURLResolver.reversec                s  |r rt d| js| j  | jj|}xD|D ]:\}}}}	x*|D ] \}
}|rxt|t|krhqHtt||}n6t j	|j
|rqHt fdd|j D rqH }i }d}x`|j D ]T\}}||	kry|	| j|||< W n t k
r   d}P Y nX qt|||< qW |s qH|jdd|
 }tjdtj||f || rHt|| td	 d
}t|S qHW q2W t|dd }t|dd }|d k	r|d k	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"   | ]\}} j |||kV  qd S )N)r   )r   r`   ra   )r"   r   r   r     s    z3URLResolver._reverse_with_prefix.<locals>.<genexpr>TF%z%%z^%s%sz/~:@)safer-   r   z%s.%sc             S   s   g | ]\}}}}|qS r   r   )r   _r?   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.view)r   r   r   r   r   r   r;   zipr}   symmetric_difference
differenceanyrg   Zto_urlrF   replacero   rd   r|   r   r   r   rD   r   )r/   r   _prefixr!   r"   possibilitiesZpossibilityr?   r   r<   resultparamsZcandidate_subsZtext_candidate_subsrj   r`   ra   Zcandidate_paturlmnZlookup_view_sr   Zarg_msgr   r   )r"   r   r   r  sb    



z URLResolver._reverse_with_prefix)NNN)N)r   r-   r4   r0   r3   rn   r   r   r   r   r   r   staticmethodr   r   r   r   r   r   r=   r   r   r   r   r   r   r   r9     s$   
=	&	r9   )N)N)F)6__doc__r   r   ro   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   r<   r   
exceptionsr   r   utilsr   r   r7   	lru_cacher5   r@   rA   rN   r:   rz   r   r   r   r   r9   r   r   r   r   <module>   sD   $

!:
.+"3