
    ]j                     6   d dl Z d dlZd dlZd dlm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 g d	Zdd
Z G d de      Z e       Zd d dZ	 d dlZej3                  ej4                  ej4                  d       d Zd Zy# e$ r Y w xY w)    Nwraps)forms)settings)DjangoJSONEncoder)signals)HttpResponse)render)	render_tor   ajax_request	autostripc                       fd}|S )a{  
    Decorator for Django views that sends returned dict to render
    function.

    Template name can be decorator parameter or TEMPLATE item in returned
    dictionary.  If view doesn't return dict then decorator simply returns output.

    Parameters:
     - template: template name to use
     - content_type: content type to send in response headers

    Examples:
    # 1. Template name in decorator parameters

    @render_to('template.html')
    def foo(request):
        bar = Bar.object.all()
        return {'bar': bar}

    # equals to
    def foo(request):
        bar = Bar.object.all()
        return render(request, 'template.html', {'bar': bar})


    # 2. Template name as TEMPLATE item value in return dictionary.
         if TEMPLATE is given then its value will have higher priority
         than render_to argument.

    @render_to()
    def foo(request, category):
        template_name = '%s.html' % category
        return {'bar': bar, 'TEMPLATE': template_name}

    #equals to
    def foo(request, category):
        template_name = '%s.html' % category
        return render(request, template_name, {'bar': bar})

    c                 4     t                fd       }|S )Nc                 P    | g|i |}t        |t              s|S |j                  d      }|et        j                  j
                  j                  j                  d      d d  }t        j                  j                  |j                  dz         }t        | ||      S )NTEMPLATE.z.htmlcontent_type)

isinstancedictpopospathjoin
__module__split	func_namer
   )	requestargskwargsoutputtmpltemplate_dirr   functiontemplates	         =/root/env/lib/python3.12/site-packages/annoying/decorators.pywrapperz,render_to.<locals>.renderer.<locals>.wrapper;   s    g777Ffd+::j(3D|!ww||X-@-@-F-Fs-KCR-PQww||L(2D2Dw2NO'4'35 5    r   )r%   r(   r   r&   s   ` r'   rendererzrender_to.<locals>.renderer:   s     	x		5 
		5 r)    )r&   r   r*   s   `` r'   r   r      s    R Or)   c                   .    e Zd ZdZd Zd Zd Zd Zd Zy)Signalsa}  
    Convenient wrapper for working with Django's signals (or any other
    implementation using same API).

    Example of usage::


       # connect to registered signal
       @signals.post_save(sender=YourModel)
       def sighandler(instance, **kwargs):
           pass

       # connect to any signal
       signals.register_signal(siginstance, signame) # and then as in example above

       or

       @signals(siginstance, sender=YourModel)
       def sighandler(instance, **kwargs):
           pass

    In any case defined function will remain as is, without any changes.

    (c) 2008 Alexander Solovyov, new BSD License
    c                     i | _         t        j                  j                         D ]/  \  }}|j	                  d      r|dk7  s| j                  ||       1 y )N__Signal)_signalssignalmodule__dict__items
startswithregister_signal)selfkvs      r'   __init__zSignals.__init__d   sO     !))//1 	+DAq<<%!x-$$Q*	+r)   c                 >    | j                  | j                  |         S N)_connectr1   )r7   names     r'   __getattr__zSignals.__getattr__m   s    }}T]]4011r)   c                 N    t        j                  dt        d       fd}|S )Nzdjango-annoying signals decorator is deprecated and will be removed in a future version. Use Django's receiver decorator instead. https://docs.djangoproject.com/en/stable/topics/signals/#connecting-receiver-functions   
stacklevelc                 .     j                   | fi  | S r<   )connect)funcr!   signals    r'   innerzSignals.__call__.<locals>.innerz   s    FNN4*6*Kr)   )warningswarnDeprecationWarning)r7   rG   r!   rH   s    `` r'   __call__zSignals.__call__p   s)    e 	
	 r)   c                       fd}|S )Nc                       fi | S r<   r+   )r!   r7   rG   s    r'   r(   z!Signals._connect.<locals>.wrapper   s    )&))r)   r+   )r7   rG   r(   s   `` r'   r=   zSignals._connect   s    	*r)   c                 "    || j                   |<   y r<   )r1   )r7   rG   r>   s      r'   r6   zSignals.register_signal   s    $dr)   N)	__name__r   __qualname____doc__r:   r?   rL   r=   r6   r+   r)   r'   r-   r-   J   s     2+2
%r)   r-   c                 8    t        j                  | t              S N)clsjsondumpsr   responses    r'   <lambda>r[      s    HBS)T r)   c                 8    t        j                  | t              S rT   rV   rY   s    r'   r[   r[      s    $**X;L"M r)   )application/jsonz	text/json)zapplication/yamlz	text/yamlc                 .     t                fd       }|S )a  
    If view returned serializable dict, returns response in a format requested
    by HTTP_ACCEPT header. Defaults to JSON if none requested or match.

    Currently supports JSON or YAML (if installed), but can easily be extended.

    example:

        @ajax_request
        def my_view(request):
            news = News.objects.all()
            news_titles = [entry.title for entry in news]
            return {'news_titles': news_titles}
    c                 >   | j                   j                  dd      j                  d      D ]  }|t        j	                         v s|} n d} | g|i |}t        |t              st        t        d      rzt        j                  |   }t        |d      r	 ||      }n`t        |t        j                        rF|j                  dd      \  }}	t        ||	g	      }
t        |
|	      } ||      }nt        |   |      }t        |
      }t        |      |d<   |S )NHTTP_ACCEPT ,r]   FORMAT_TYPESrL   r      )fromlistr   zcontent-length)METAgetr   rc   keysr   r	   hasattrr   sixstring_typesrsplit
__import__getattrlen)r   r    r!   accepted_typeformat_typerZ   format_type_handlerdatamod_namer   moduler%   rF   s               r'   r(   zajax_request.<locals>.wrapper   s   $\\--mR@FFsK 	-M 1 1 33+	-
 -K1$1&1(L1x0&.&;&;K&H#.
;.x8D 3S5E5EF*=*D*DS!*L'Hi'I;GF&vy9H#H-D#K0:#D{CH),TH%&r)   r   )rF   r(   s   ` r'   r   r      s"     4[ . Nr)   c                 4   t        j                  dt        d       | j                  j	                         D cg c]$  \  }}t        |t        j                        s!||f& }}}|D ]'  \  }}d } |t        |d            }t        |d|       ) | S c c}}w )z
    strip text fields before validation

    example:
    @autostrip
    class PersonForm(forms.Form):
        name = forms.CharField(min_length=2, max_length=10)
        email = forms.EmailField()

    Author: nail.xx
    zdjango-annoying autostrip is deprecated and will be removed in a future version. Django now has native support for stripping form fields. https://docs.djangoproject.com/en/stable/ref/forms/fields/#django.forms.CharField.striprA   rB   c                       fdS )Nc                 8     | xr | j                               S r<   )strip)valueoriginal_cleans    r'   r[   z3autostrip.<locals>.get_clean_func.<locals>.<lambda>   s    0G%++-!H r)   r+   )r{   s   `r'   get_clean_funcz!autostrip.<locals>.get_clean_func   s	    HHr)   clean)
rI   rJ   rK   base_fieldsr4   r   r   	CharFieldrn   setattr)rU   keyrz   fields
field_namefield_objectr|   
clean_funcs           r'   r   r      s     MM	b 	 .1__-B-B-DkzsE
SXZ_ZiZiHjsElkFk$* 3 
L	I#GL'$BC
gz2	3
 J ls   "BB)NN)rW   r   rI   	functoolsr   rj   djangor   django.confr   django.core.serializers.jsonr   django.db.modelsr   r2   django.httpr	   django.shortcutsr
   __all__r   objectr-   rc   yamlupdatedumpImportErrorr   r   r+   r)   r'   <module>r      s     	   
    : 4 $ #
?6r;%f ;%| ) UM
  IIYY 'Tg  		s   B BB