U
     5i)                     @   s   d dl Z d dlmZ d dlmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ e dZG dd	 d	ZG d
d dZG dd dZG dd deeeZG dd deZdS )    N)ImproperlyConfigured)HttpResponseHttpResponseGoneHttpResponseNotAllowedHttpResponsePermanentRedirectHttpResponseRedirect)TemplateResponse)reverse)classonlymethodzdjango.requestc                   @   s   e Zd ZdZdZdd ZdS )ContextMixinz
    A default context mixin that passes the keyword arguments received by
    get_context_data() as the template context.
    Nc                 K   s&   | d|  | jd k	r"|| j |S )Nview)
setdefaultextra_contextupdate)selfkwargs r   =/tmp/pip-unpacked-wheel-gcyiijx6/django/views/generic/base.pyget_context_data   s    
zContextMixin.get_context_data)__name__
__module____qualname____doc__r   r   r   r   r   r   r      s   r   c                   @   s`   e Zd ZdZdddddddd	gZd
d Zedd Zdd Zdd Z	dd Z
dd Zdd ZdS )Viewz}
    Intentionally simple parent class for all views. Only implements
    dispatch-by-method and simple sanity checking.
    getpostputpatchdeleteheadoptionstracec                 K   s"   |  D ]\}}t| || qdS )z|
        Constructor. Called in the URLconf; can contain helpful extra
        keyword arguments, and other things.
        N)itemssetattr)r   r   keyvaluer   r   r   __init__%   s    zView.__init__c                    s   D ]<}| j kr$td| jf t |std j|f q fdd} |_|_ j|_ j|_ jj	|_	|j
 jj
 |S )z0Main entry point for a request-response process.zAThe method name %s is not accepted as a keyword argument to %s().zm%s() received an invalid keyword %r. as_view only accepts arguments that are already attributes of the class.c                    sF    f }|j | f|| t|ds4td j |j| f||S )Nrequestz\%s instance has no 'request' attribute. Did you override setup() and forget to call super()?)setuphasattrAttributeErrorr   dispatch)r'   argsr   r   cls
initkwargsr   r   r   =   s    

zView.as_view.<locals>.view)http_method_names	TypeErrorr   r)   Z
view_classZview_initkwargsr   r   r+   __annotations____dict__r   )r.   r/   r$   r   r   r-   r   as_view/   s&    

	
zView.as_viewc                 O   s2   t | drt | ds| j| _|| _|| _|| _dS )z1Initialize attributes shared by all view methods.r   r   N)r)   r   r   r'   r,   r   r   r'   r,   r   r   r   r   r(   U   s
    z
View.setupc                 O   s<   |j  | jkr&t| |j  | j}n| j}||f||S N)methodlowerr0   getattrhttp_method_not_allowed)r   r'   r,   r   handlerr   r   r   r+   ]   s    zView.dispatchc                 O   s(   t jd|j|jd|dd t|  S )NzMethod Not Allowed (%s): %si  status_coder'   extra)loggerwarningr7   pathr   _allowed_methodsr5   r   r   r   r:   g   s      zView.http_method_not_allowedc                 O   s(   t  }d|  |jd< d|jd< |S )z8Handle responding to requests for the OPTIONS HTTP verb.z, ZAllow0zContent-Length)r   joinrC   headers)r   r'   r,   r   responser   r   r   r    n   s    
zView.optionsc                    s    fdd j D S )Nc                    s   g | ]}t  |r| qS r   )r)   upper).0mr   r   r   
<listcomp>v   s     
 z)View._allowed_methods.<locals>.<listcomp>)r0   rK   r   rK   r   rC   u   s    zView._allowed_methodsN)r   r   r   r   r0   r&   r
   r4   r(   r+   r:   r    rC   r   r   r   r   r      s   

%
r   c                   @   s0   e Zd ZdZdZdZeZdZdd Z	dd Z
dS )TemplateResponseMixinz.A mixin that can be used to render a template.Nc                 K   s0   | d| j | jf | j|  || jd|S )z
        Return a response, using the `response_class` for this view, with a
        template rendered with the given context.

        Pass response_kwargs to the constructor of the response class.
        content_type)r'   templatecontextZusing)r   rN   response_classr'   get_template_namestemplate_engine)r   rP   Zresponse_kwargsr   r   r   render_to_response   s    z(TemplateResponseMixin.render_to_responsec                 C   s    | j dkrtdn| j gS dS )z
        Return a list of template names to be used for the request. Must return
        a list. May not be called if render_to_response() is overridden.
        NztTemplateResponseMixin requires either a definition of 'template_name' or an implementation of 'get_template_names()')template_namer   rK   r   r   r   rR      s
    
z(TemplateResponseMixin.get_template_names)r   r   r   r   rU   rS   r   rQ   rN   rT   rR   r   r   r   r   rM   y   s   rM   c                   @   s   e Zd ZdZdd ZdS )TemplateViewzT
    Render a template. Pass keyword arguments from the URLconf to the context.
    c                 O   s   | j f |}| |S r6   )r   rT   )r   r'   r,   r   rP   r   r   r   r      s    zTemplateView.getN)r   r   r   r   r   r   r   r   r   rV      s   rV   c                   @   s`   e Zd ZdZdZdZdZdZdd Zdd Z	dd	 Z
d
d Zdd Zdd Zdd Zdd ZdS )RedirectViewz&Provide a redirect on any GET request.FNc                 O   sX   | j r| j | }n| jr*t| j||d}ndS | jjdd}|rT| jrTd||f }|S )z
        Return the URL redirect to. Keyword arguments from the URL pattern
        match generating the redirect request are provided as kwargs to this
        method.
        )r,   r   NQUERY_STRING z%s?%s)urlpattern_namer	   r'   ZMETAr   query_string)r   r,   r   rZ   r   r   r   get_redirect_url   s    
zRedirectView.get_redirect_urlc                 O   sJ   | j ||}|r(| jrt|S t|S ntjd|jd|dd t S d S )NzGone: %si  r<   r>   )r]   	permanentr   r   r@   rA   rB   r   )r   r'   r,   r   rZ   r   r   r   r      s    
 zRedirectView.getc                 O   s   | j |f||S r6   r   r5   r   r   r   r      s    zRedirectView.headc                 O   s   | j |f||S r6   r_   r5   r   r   r   r      s    zRedirectView.postc                 O   s   | j |f||S r6   r_   r5   r   r   r   r       s    zRedirectView.optionsc                 O   s   | j |f||S r6   r_   r5   r   r   r   r      s    zRedirectView.deletec                 O   s   | j |f||S r6   r_   r5   r   r   r   r      s    zRedirectView.putc                 O   s   | j |f||S r6   r_   r5   r   r   r   r      s    zRedirectView.patch)r   r   r   r   r^   rZ   r[   r\   r]   r   r   r   r    r   r   r   r   r   r   r   rW      s   rW   )loggingZdjango.core.exceptionsr   Zdjango.httpr   r   r   r   r   Zdjango.template.responser   Zdjango.urlsr	   Zdjango.utils.decoratorsr
   	getLoggerr@   r   r   rM   rV   rW   r   r   r   r   <module>   s   
\$	