U
    R+|jW$  ã                   @   sØ   d dl Z d dlmZm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 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)ÚiscoroutinefunctionÚmarkcoroutinefunction)ÚImproperlyConfigured)ÚHttpResponseÚHttpResponseGoneÚHttpResponseNotAllowedÚHttpResponsePermanentRedirectÚHttpResponseRedirect)ÚTemplateResponse)Úreverse)Úclassonlymethod)Úclassproperty)Úlog_responsez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   úac:\users\snmko\desktop\web_content\django_cbt\venv\Lib\site-packages\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                   @   sl   e Zd ZdZdddddddd	gZd
d„ Ze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__6   s    zView.__init__c                    sZ   ‡ fdd„ˆ j D ƒ}|sdS t|d ƒ‰t‡fdd„|dd … D ƒƒsVtˆ j› d�ƒ‚ˆS )	Nc                    s(   g | ] }|d krt ˆ |ƒrtˆ |ƒ‘qS )r$   )ÚhasattrÚgetattr)Ú.0Úmethod)Úclsr   r   Ú
<listcomp>B   s    
þz&View.view_is_async.<locals>.<listcomp>Fr   c                 3   s   | ]}t |ƒˆ kV  qd S ©N)r   )r-   Úh)Úis_asyncr   r   Ú	<genexpr>J   s     z%View.view_is_async.<locals>.<genexpr>é   z4 HTTP handlers must either be all sync or all async.)Úhttp_method_namesr   Úallr   r   )r/   Úhandlersr   )r/   r3   r   Úview_is_async@   s    
þ
ÿzView.view_is_asyncc                    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
¡ ˆ jr”t|ƒ |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()?)Úsetupr+   ÚAttributeErrorr   Údispatch)r:   Úargsr   r   ©r/   Ú
initkwargsr   r   r   a   s    

ÿÿzView.as_view.<locals>.view)r6   Ú	TypeErrorr   r+   Z
view_classZview_initkwargsr   r   r=   Ú__annotations__Ú__dict__r   r9   r   )r/   r@   r(   r   r   r?   r   Úas_viewQ   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;   ~   s
    z
View.setupc                 O   s<   |j  ¡ | jkr&t| |j  ¡ | jƒ}n| j}||f|ž|ŽS r1   )r.   Úlowerr6   r,   Úhttp_method_not_allowed)r   r:   r>   r   Úhandlerr   r   r   r=   †   s      ÿzView.dispatchc                    sB   t |  ¡ ƒ‰ td|j|jˆ |d� | jr:‡ fdd„}|ƒ S ˆ S d S )NzMethod Not Allowed (%s): %s©Úresponser:   c                   “   s   ˆ S r1   r   r   ©rJ   r   r   Úfuncž   s    z*View.http_method_not_allowed.<locals>.func)r   Ú_allowed_methodsr   r.   Úpathr9   ©r   r:   r>   r   rL   r   rK   r   rG   ’   s    ûzView.http_method_not_allowedc                    sD   t ƒ ‰ d |  ¡ ¡ˆ jd< dˆ jd< | jr<‡ fdd„}|ƒ S ˆ S dS )z8Handle responding to requests for the OPTIONS HTTP verb.z, ZAllowÚ0zContent-Lengthc                   “   s   ˆ S r1   r   r   rK   r   r   rL   ­   s    zView.options.<locals>.funcN)r   ÚjoinrM   Úheadersr9   rO   r   rK   r   r$   ¥   s    
zView.optionsc                    s   ‡ fdd„ˆ j D ƒS )Nc                    s   g | ]}t ˆ |ƒr| ¡ ‘qS r   )r+   Úupper)r-   Úm©r   r   r   r0   µ   s     
 z)View._allowed_methods.<locals>.<listcomp>)r6   rU   r   rU   r   rM   ´   s    zView._allowed_methodsN)r   r   r   r   r6   r*   r   r9   r   rD   r;   r=   rG   r$   rM   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   rW   Úresponse_classr:   Úget_template_namesÚtemplate_engine)r   rY   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   rU   r   r   r   r[   Ð   s
    
ÿz(TemplateResponseMixin.get_template_names)r   r   r   r   r^   r\   r
   rZ   rW   r]   r[   r   r   r   r   rV   ¸   s   rV   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 r1   )r   r]   )r   r:   r>   r   rY   r   r   r   r   ã   s    zTemplateView.getN)r   r   r   r   r   r   r   r   r   r_   Þ   s   r_   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   rc   r   r   r   Úget_redirect_urlð   s    
zRedirectView.get_redirect_urlc                 O   sH   | j ||Ž}|r(| jrt|ƒS t|ƒS ntƒ }td|j||d� |S d S )NzGone: %srI   )rf   Ú	permanentr   r	   r   r   rN   )r   r:   r>   r   rc   rJ   r   r   r   r     s    
zRedirectView.getc                 O   s   | j |f|ž|ŽS r1   ©r   rE   r   r   r   r#     s    zRedirectView.headc                 O   s   | j |f|ž|ŽS r1   rh   rE   r   r   r   r     s    zRedirectView.postc                 O   s   | j |f|ž|ŽS r1   rh   rE   r   r   r   r$     s    zRedirectView.optionsc                 O   s   | j |f|ž|ŽS r1   rh   rE   r   r   r   r"     s    zRedirectView.deletec                 O   s   | j |f|ž|ŽS r1   rh   rE   r   r   r   r      s    zRedirectView.putc                 O   s   | j |f|ž|ŽS r1   rh   rE   r   r   r   r!     s    zRedirectView.patch)r   r   r   r   rg   rc   rd   re   rf   r   r#   r   r$   r"   r    r!   r   r   r   r   r`   è   s   r`   )ÚloggingZasgiref.syncr   r   Zdjango.core.exceptionsr   Zdjango.httpr   r   r   r   r	   Zdjango.template.responser
   Zdjango.urlsr   Zdjango.utils.decoratorsr   Zdjango.utils.functionalr   Zdjango.utils.logr   Ú	getLoggerÚloggerr   r   rV   r_   r`   r   r   r   r   Ú<module>   s   
 &
