
^Q\UT                 @   s  d  Z  d d l m 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 m Z d d l m Z d d l m  Z  d d l! m" Z" m# Z# d d l$ m% Z% Gd d   d e&  Z' e j d d  d d d   Z( e j d d  d d    Z) Gd d   d e&  Z* Gd d   d e&  Z+ Gd d   d e+  Z, Gd  d!   d! e+  Z- Gd" d#   d# e-  Z. d S)$a   
This module converts requested URLs to callback view functions.

RegexURLResolver 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.
    )unicode_literalsN)import_module)settings)Warning)check_resolver)ImproperlyConfigured)	lru_cachesix)MultiValueDict)	force_str
force_text)cached_property)RFC3986_SUBDELIMSurlquote)	normalize)get_language   )NoReverseMatchResolver404)get_callablec               @   s=   e  Z d  Z d d d d d  Z d d   Z d d   Z d S)ResolverMatchNc             C   s  | |  _  | |  _ | |  _ | |  _ | r= d d   | D n g  |  _ d j |  j  |  _ | rt d d   | D n g  |  _ d j |  j  |  _ t	 | d  s d j | j
 j | j
 j g  |  _ n d j | j | j g  |  _ | p |  j } d j |  j | g  |  _ d  S)Nc             S   s   g  |  ] } | r |  q S r   ).0xr   r   ;/var/www/dbchiro/venv/build/Django/django/urls/resolvers.py
<listcomp>(   s   	 z*ResolverMatch.__init__.<locals>.<listcomp>:c             S   s   g  |  ] } | r |  q Sr   r   )r   r   r   r   r   r   *   s   	 __name__.)funcargskwargsurl_name	app_namesjoinapp_name
namespaces	namespacehasattr	__class__
__module__r   
_func_pathZ	view_name)selfr   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__7   s    zResolverMatch.__getitem__c             C   s,   d |  j  |  j |  j |  j |  j |  j f S)NzTResolverMatch(func=%s, args=%s, kwargs=%s, url_name=%s, app_names=%s, namespaces=%s))r+   r    r!   r"   r#   r&   )r,   r   r   r   __repr__:   s    zResolverMatch.__repr__)r   r*   __qualname__r-   r/   r0   r   r   r   r   r      s   r   maxsizec             C   s5   |  d  k r( d d l  m } | j }  n  t d |   S)Nr   )r   z^/)django.confr   ZROOT_URLCONFRegexURLResolver)Zurlconfr   r   r   r   get_resolverA   s    r5   c             C   s"   t  |  | j  } t  d | g  S)Nz^/)r4   url_patterns)Z
ns_patternresolverZns_resolverr   r   r   get_ns_resolverI   s    r8   c               @   s+   e  Z d  Z d d d  Z d d   Z d S)LocaleRegexDescriptorNc             C   s   | d k r |  St  | j t j  rI |  j | j  | j d <| j d St   } | | j k r |  j t | j   | j | <n  | j | S)zT
        Return a compiled regular expression based on the active language.
        Nregex)	
isinstance_regexr	   string_types_compile__dict__r   _regex_dictr   )r,   instanceclslanguage_coder   r   r   __get__S   s    	"zLocaleRegexDescriptor.__get__c             C   se   y t  j | t  j  SWnG t  j k
 r` } z$ t d | t j |  f   WYd d } ~ Xn Xd S)zB
        Compile and return the given regular expression.
        z*"%s" is not a valid regular expression: %sN)recompileUNICODEerrorr   r	   	text_type)r,   r:   er   r   r   r>   d   s    zLocaleRegexDescriptor._compile)r   r*   r1   rD   r>   r   r   r   r   r9   R   s   r9   c               @   sC   e  Z d  Z d Z d d   Z e   Z d d   Z d d   Z d S)	LocaleRegexProviderz\
    A mixin to provide a default regex property which can vary by active
    language.
    c             C   s   | |  _  i  |  _ d  S)N)r<   r@   )r,   r:   r   r   r   r-   v   s    	zLocaleRegexProvider.__init__c             C   sD   d j  |  j j  } t |  d d  r@ | d j  |  j  7} n  | S)zI
        Format the URL pattern for display in warning messages.
        z'{}'nameFz [name='{}'])formatr:   patterngetattrrL   )r,   descriptionr   r   r   describe   s    zLocaleRegexProvider.describec             C   sw   |  j  j } t j s g  S| j d  s7 | j d  ro | j d  ro t d j |  j    d d } | g Sg  Sd S)zM
        Check that the pattern does not begin with a forward slash.
        /z^/zYour URL pattern {} has a regex 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 '/'.idz	urls.W002N)	r:   rN   r   ZAPPEND_SLASH
startswithendswithr   rM   rQ   )r,   regex_patternwarningr   r   r   _check_pattern_startswith_slash   s    	.	z3LocaleRegexProvider._check_pattern_startswith_slashN)	r   r*   r1   __doc__r-   r9   r:   rQ   rX   r   r   r   r   rK   q   s
   		rK   c               @   sd   e  Z d  Z d d d d  Z d d   Z d d   Z d d	   Z d
 d   Z e d d    Z	 d S)RegexURLPatternNc             C   s5   t  j |  |  | |  _ | p" i  |  _ | |  _ d  S)N)rK   r-   callbackdefault_argsrL   )r,   r:   r[   r\   rL   r   r   r   r-      s    	zRegexURLPattern.__init__c             C   s&   t  d |  j j |  j |  j j f  S)Nz
<%s %s %s>)r   r)   r   rL   r:   rN   )r,   r   r   r   r0      s    zRegexURLPattern.__repr__c             C   s%   |  j    } | s! |  j   } n  | S)N)_check_pattern_namerX   )r,   warningsr   r   r   check   s    zRegexURLPattern.checkc             C   sN   |  j  d k	 rF d |  j  k rF t d j |  j    d d } | g Sg  Sd 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.rS   z	urls.W003)rL   r   rM   rQ   )r,   rW   r   r   r   r]      s    	z#RegexURLPattern._check_pattern_namec             C   si   |  j  j |  } | re | j   } | r0 f  n	 | j   } | j |  j  t |  j | | |  j  Sd  S)N)	r:   search	groupdictgroupsupdater\   r   r[   rL   )r,   pathmatchr!   r    r   r   r   resolve   s    zRegexURLPattern.resolvec             C   s   |  j  } x t | t j  r* | j } q Wt | d  sO | j d | j j St	 j
 rj | j d | j S| j d | j Sd S)zw
        A string that identifies the view (e.g. 'path.to.view_function' or
        'path.to.ClassBasedView').
        r   r   N)r[   r;   	functoolspartialr   r(   r*   r)   r   r	   PY3r1   )r,   r[   r   r   r   
lookup_str   s    		zRegexURLPattern.lookup_str)
r   r*   r1   r-   r0   r_   r]   rf   r   rj   r   r   r   r   rZ      s   rZ   c               @   s   e  Z d  Z d d 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 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) r4   Nc             C   s   t  j |  |  | |  _ d  |  _ | p+ i  |  _ | |  _ | |  _ i  |  _ i  |  _ i  |  _	 t
   |  _ d |  _ t j   |  _ d  S)NF)rK   r-   urlconf_namer[   default_kwargsr'   r%   _reverse_dict_namespace_dict	_app_dictset_callback_strs
_populated	threadinglocal_local)r,   r:   rk   rl   r%   r'   r   r   r   r-      s    								zRegexURLResolver.__init__c             C   sy   t  |  j t  r; t |  j  r; d |  j d j j } n t |  j  } t d  |  j j | |  j |  j	 |  j
 j f S)Nz	<%s list>r   z<%s %s (%s:%s) %s>)r;   rk   listlenr)   r   reprstrr%   r'   r:   rN   )r,   Zurlconf_reprr   r   r   r0      s    !	zRegexURLResolver.__repr__c             C   sL   |  j    } x$ |  j D] } | j t |   q W| sH |  j   } n  | S)N)_check_include_trailing_dollarr6   extendr   rX   )r,   r^   rN   r   r   r   r_      s    zRegexURLResolver.checkc             C   s[   |  j  j } | j d  rS | j d  rS t d j |  j    d d } | g Sg  Sd S)zS
        Check that include is not used with a regex ending with a dollar.
        $z\$zYour URL pattern {} uses include with a regex ending with a '$'. Remove the dollar from the regex to avoid problems including URLs.rS   z	urls.W001N)r:   rN   rU   r   rM   rQ   )r,   rV   rW   r   r   r   rz     s    	z/RegexURLResolver._check_include_trailing_dollarc          
   C   s  t  |  j d d  r d  Sd |  j _ t   } i  } i  } t   } xIt |  j  D]8} t | t  r~ |  j	 j
 | j  n  | j j } | j d  r | d d   } n  t | t  r/| j r| | f | | j <| j r| j | j g   j | j  qn | j j } xp | j D]e } x\ | j j |  D]H \ }	 }
 } t | |
  } | j | | | |
 t | | j  f  q4WqWx7 | j j   D]& \ } \ } } | | | f | | <qWx6 | j j   D]% \ } } | j | g   j |  qWt  | j d d  s| j   n  |  j	 j | j	  qS t |  } | j | j  | | | j! f  | j" d  k	 rS | j | j" | | | j! f  qS qS W| |  j# | <| |  j$ | <| |  j% | <d |  _& d |  j _ d  S)N
populatingFT^r   )'rO   ru   r}   r
   r   reversedr6   r;   rZ   rq   addrj   r:   rN   rT   r4   r'   r%   
setdefaultappendreverse_dictgetlistr   Z
appendlistdictrl   namespace_dictitemsapp_dictr{   	_populaterc   r[   r\   rL   rm   rn   ro   rr   )r,   Zlookupsr&   ZappsrC   rN   Z	p_patternZ
parent_patrL   matchespatdefaultsZnew_matchesr'   prefixZsub_patternr%   Znamespace_listbitsr   r   r   r     sV    				%""&	zRegexURLResolver._populatec             C   s0   t    } | |  j k r% |  j   n  |  j | S)N)r   rm   r   )r,   rC   r   r   r   r   J  s    	zRegexURLResolver.reverse_dictc             C   s0   t    } | |  j k r% |  j   n  |  j | S)N)r   rn   r   )r,   rC   r   r   r   r   Q  s    	zRegexURLResolver.namespace_dictc             C   s0   t    } | |  j k r% |  j   n  |  j | S)N)r   ro   r   )r,   rC   r   r   r   r   X  s    	zRegexURLResolver.app_dictc             C   s#   |  j  s |  j   n  | |  j k S)N)rr   r   rq   )r,   rL   r   r   r   _is_callback_  s    	zRegexURLResolver._is_callbackc       
         s  t  |  } g  } |  j j |  } | r| | j   d   } x=|  j D]2  y   j |  } Wnz t k
 r } zZ | j d j d  } | d  k	 r | j	   f d d   | D  n | j
   g  WYd  d  } ~ XqJ X| rlt | j   |  j  } | j | j  | j }	 | s3| j   | j }	 n  t | j |	 | | j |  j g | j |  j g | j  S| j
   g  qJ Wt i | d 6| d 6  n  t i | d 6  d  S)Nr   triedc             3   s   |  ] }   g | Vq d  S)Nr   )r   t)rN   r   r   	<genexpr>p  s    z+RegexURLResolver.resolve.<locals>.<genexpr>rd   )r   r:   r`   endr6   rf   r   r    getr{   r   r   ra   rl   rc   r!   rb   r   r   r"   r%   r#   r'   r&   )
r,   rd   r   re   new_pathZ	sub_matchrJ   Z	sub_triedZsub_match_dictZsub_match_argsr   )rN   r   rf   d  s:    ##	zRegexURLResolver.resolvec             C   s-   t  |  j t j  r" t |  j  S|  j Sd  S)N)r;   rk   r	   r=   r   )r,   r   r   r   urlconf_module  s    zRegexURLResolver.urlconf_modulec             C   s`   t  |  j d |  j  } y t |  Wn3 t k
 r[ d } t | j d |  j    Yn 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.rL   )rO   r   iter	TypeErrorr   rM   rk   )r,   patternsmsgr   r   r   r6     s     zRegexURLResolver.url_patternsc             C   sU   t  |  j d | d   } | sE d d l m } t  | d |  } n  t |  i  f S)Nz	handler%sr   )urls)rO   r   r3   r   r   )r,   Z	view_typer[   r   r   r   r   resolve_error_handler  s
    z&RegexURLResolver.resolve_error_handlerc             O   s   |  j  | d | |  S)N )_reverse_with_prefix)r,   lookup_viewr    r!   r   r   r   reverse  s    zRegexURLResolver.reversec             O   s  | r | r t  d   n  d d   | D } d d   | j   D } |  j s] |  j   n  |  j j |  } x| D]\ } }	 }
 xz| D]r\ } } | r t |  t |  k r q n  t t | |   } n t	 | j
    t	 |
 j
    Bt	 |  t	 |
 j
    Bk rq n  d } x< |
 j   D]. \ } } | j | |  | k r+d } Pq+q+W| siq n  | } | j d d	  | } t j d
 t j |  |	 f | | t j  r t | | d t t d  } | j d  rd | d d   } n  | Sq Wqv Wt | d d   } t | d d   } | d  k	 rU| d  k	 rUd | | f } n | } d d   | D } | r| rd | f } n | rd | f } n d } d | | t |  | f } n d i | d 6} t |   d  S)Nz2Don't mix *args and **kwargs in call to reverse()!c             S   s   g  |  ] } t  |   q Sr   )r   )r   vr   r   r   r     s   	 z9RegexURLResolver._reverse_with_prefix.<locals>.<listcomp>c             S   s%   i  |  ] \ } } t  |  |  q Sr   )r   )r   kr   r   r   r   
<dictcomp>  s   	 z9RegexURLResolver._reverse_with_prefix.<locals>.<dictcomp>TF%z%%z^%s%ssafez/~:@z//z/%%2F%s   r*   r   z%s.%sc             S   s   g  |  ] \ } } } |  q Sr   r   )r   possibilityrN   r   r   r   r   r     s   	 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.Zview)
ValueErrorr   rr   r   r   r   rw   r   ziprp   keysr   replacerE   r`   escaperG   r   r   ry   rT   rO   r   )r,   r   _prefixr    r!   Z	text_argsZtext_kwargspossibilitiesr   rN   r   resultparamsZcandidate_subsr   r   r   Zcandidate_paturlmnZlookup_view_sr   Zarg_msgr   r   r   r   r     s^    	(/ z%RegexURLResolver._reverse_with_prefix)r   r*   r1   r-   r0   r_   rz   r   propertyr   r   r   r   rf   r   r   r6   r   r   r   r   r   r   r   r4      s   6'	r4   c                   sF   e  Z d  Z d Z d d d d   f d d  Z e d d    Z   S)LocaleRegexURLResolverz
    A URL resolver that always matches the active language code as URL prefix.

    Rather than taking a regex argument, we just override the ``regex``
    function to always return the active language-code as regex.
    NTc                s/   t  t |   j d  | | | |  | |  _ d  S)N)superr   r-   prefix_default_language)r,   rk   rl   r%   r'   r   )r)   r   r   r-     s    zLocaleRegexURLResolver.__init__c             C   sw   t    p t j } | |  j k rl | t j k rC |  j rC d } n
 d | } t j | t j  |  j | <n  |  j | S)Nr   z^%s/)r   r   ZLANGUAGE_CODEr@   r   rE   rF   rG   )r,   rC   Zregex_stringr   r   r   r:     s    	
zLocaleRegexURLResolver.regex)r   r*   r1   rY   r-   r   r:   r   r   )r)   r   r     s   	r   )/rY   
__future__r   rg   rE   rs   	importlibr   r3   r   Zdjango.core.checksr   Zdjango.core.checks.urlsr   Zdjango.core.exceptionsr   Zdjango.utilsr   r	   Zdjango.utils.datastructuresr
   Zdjango.utils.encodingr   r   Zdjango.utils.functionalr   Zdjango.utils.httpr   r   Zdjango.utils.regex_helperr   Zdjango.utils.translationr   
exceptionsr   r   utilsr   objectr   r5   r8   r9   rK   rZ   r4   r   r   r   r   r   <module>   s8   "	.> 