
    lKd                     r    d Z ddlmZmZmZ  G d de          Zd Zd ZddZ	d	 Z
d
 Zd Zd Zd Zd ZdS )zCFunctions that help with dynamically creating decorators for views.    )partialupdate_wrapperwrapsc                         e Zd Zd fd	Z xZS )classonlymethodNc                 j    |t          d          t                                          ||          S )Nz=This method is available only on the class, not on instances.)AttributeErrorsuper__get__)selfinstancecls	__class__s      =F:\djangOuth\env\Lib\site-packages\django/utils/decorators.pyr   zclassonlymethod.__get__   s8     O   wwx---    N)__name__
__module____qualname__r   __classcell__)r   s   @r   r   r      s=        . . . . . . . . . .r   r   c                 <    |d             }t          | |           d S )Nc                      d S r    )argskwargss     r   dummyz%_update_method_wrapper.<locals>.dummy   s    r   )r   )_wrapper	decoratorr   s      r   _update_method_wrapperr      s5       Y 8U#####r   c                      t           d          r ddd          n g  fd} D ]}t          ||           t          |           |S )z
    Decorate `method` with one or more function decorators. `decorators` can be
    a single decorator or an iterable of decorators.
    __iter__Nc           
           t                    t                              | t          |                                         }D ]} ||          } ||i |S r   )r   r   r   type)r   r   r   bound_methoddec
decoratorsmethods        r   r   z!_multi_decorate.<locals>._wrapper&   sk    
 %uV}}WV^^D$t**-M-M%N%NOO 	- 	-C3|,,LL|T,V,,,r   )hasattrr   r   )r'   r(   r   r&   s   ``  r   _multi_decorater*      s    
 z:&& "  "%

 \
- - - - - -  . .x----8V$$$Or    c                       fd}t           d          st          |            t           d          r n j        }d|j        z  |_        |S )z>
    Convert a function decorator into a method decorator
    c           	      T   t          | t                    st          |           S rt          |           st	          d| dd          t          |           }t          |          st          dd| d|d          t          |          }t          | |           | S )NzQThe keyword argument `name` must be the name of a method of the decorated class: z. Got 'z
' instead.zCannot decorate 'z&' as it isn't a callable attribute of z (z).)	
isinstancer$   r*   r)   
ValueErrorgetattrcallable	TypeErrorsetattr)objr(   r   r   names      r   _deczmethod_decorator.<locals>._decA   s    #t$$ 	3"9c222 	d++ 	*CF33N   d## 	)"ddCCC1   #9f55T8$$$
r   r!   r   zmethod_decorator(%s))r)   r   r   r   )r   r5   r6   r4   s   ``  r   method_decoratorr7   8   st         ( 9j)) (tY'''y*55
N))9;NC*S\9DMKr   c                      t          |           S )a<  
    Like decorator_from_middleware, but return a function
    that accepts the arguments to be passed to the middleware_class.
    Use like::

         cache_page = decorator_from_middleware_with_args(CacheMiddleware)
         # ...

         @cache_page(3600)
         def my_view(request):
             # ...
    make_middleware_decoratormiddleware_classs    r   #decorator_from_middleware_with_argsr=   ]   s     %%5666r   c                 0     t          |                       S )z
    Given a middleware class (not an instance), return a view decorator. This
    lets you use middleware functionality on a per-view basis. The middleware
    is created with no params passed.
    r9   r;   s    r   decorator_from_middlewarer?   m   s     7$%566888r   c                       fd}|S )Nc                        fd}|S )Nc                 Z       gR i t                      fd            }|S )Nc                     t          d          r                               }||S t          d          r                     ||          }||S 	   g|R i |}nB# t          $ r5}t          d          r                     |          }||cY d }~S  d }~ww xY wt          |d          rft          |j                  rRt          d          r                     |          }t          d          r fd}|                    |           n&t          d          r	                     |          S |S )Nprocess_requestprocess_viewprocess_exceptionrenderprocess_template_responseprocess_responsec                 0                         |           S r   )rI   )response
middlewarerequests    r   callbackzomake_middleware_decorator.<locals>._make_decorator.<locals>._decorator.<locals>._wrapper_view.<locals>.callback   s    #-#>#>w#Q#QQr   )
r)   rD   rE   	ExceptionrF   r1   rG   rH   add_post_render_callbackrI   )	rM   r   r   resultrK   erN   rL   	view_funcs	   `      r   _wrapper_viewz]make_middleware_decorator.<locals>._make_decorator.<locals>._decorator.<locals>._wrapper_view{   s   :'899 &'77@@F)%:~66 &'44WivVVF)%(yB4BBB6BBHH    z+>?? *!+!=!=gq!I!I!-#)MMMMMM 8X.. N8HO3L3L Nz+FGG #-#G#G#X$ $
 z+=>> DR R R R R R !99(CCCz+=>> N)::7HMMMs$   A& &
B%0)B B%B  B%)r   )rS   rT   rL   m_argsm_kwargsr<   s   ` @r   
_decoratorzFmake_middleware_decorator.<locals>._make_decorator.<locals>._decoratorx   s_    )))IfIIIIIJ9!  !  !  !  !  ! F ! r   r   )rU   rV   rW   r<   s   `` r   _make_decoratorz2make_middleware_decorator.<locals>._make_decoratorw   s1    '	! '	! '	! '	! '	! '	! '	!R r   r   )r<   rX   s   ` r   r:   r:   v   s%    * * * * *X r   c                 "    d| _         d| _        | S )zj
    Mark a middleware factory as returning a hybrid middleware supporting both
    types of request.
    Tsync_capableasync_capablefuncs    r   sync_and_async_middlewarer_      s    
 DDKr   c                 "    d| _         d| _        | S )z\
    Mark a middleware factory as returning a sync middleware.
    This is the default.
    TFrZ   r]   s    r   sync_only_middlewarera      s    
 DDKr   c                 "    d| _         d| _        | S )z;Mark a middleware factory as returning an async middleware.FTrZ   r]   s    r   async_only_middlewarerc      s    DDKr   N)r+   )__doc__	functoolsr   r   r   classmethodr   r   r*   r7   r=   r?   r:   r_   ra   rc   r   r   r   <module>rg      s    E E 4 4 4 4 4 4 4 4 4 4. . . . .k . . .$ $ $  >" " " "J7 7 7 9 9 9- - -`        r   