§
    _}dg;  ã                   óô   — d 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 ddlmZ ddlmZ d„ Zd„ Zd„ Z ej        d¦  «        Z G d„ d¦  «        Z G d„ d¦  «        ZdS )z]
generators.py   # Top-down schema generation

See schemas.__init__.py for package overview.
é    N)Úimport_module)Úsettings)Úsimplify_regex)ÚPermissionDenied)ÚHttp404)Ú
URLPatternÚURLResolver)Ú
exceptions)Úclone_request)Úapi_settings)Ú_get_pkc                 óL   — | j         j        j         }t          |¦  «        j        S ©N)Ú_metaÚconcrete_modelr   Úname)ÚmodelÚmetas     ú`/var/www/surfInsights/venv3-11/lib/python3.11/site-packages/rest_framework/schemas/generators.pyÚget_pk_namer      s   € ØŒ;Ô%Ô+€DÝ�4‰=Œ=ÔÐó    c                 óX   — ddl m} t          | dd¦  «        }|duot          ||¦  «        S )zT
    Return `True` if the given view callback is a REST framework view/viewset.
    r   )ÚAPIViewÚclsN)Úrest_framework.viewsr   ÚgetattrÚ
issubclass)Úcallbackr   r   s      r   Úis_api_viewr      s@   € ð
 -Ð,Ð,Ð,Ð,Ð,Ý
�(˜E 4Ñ
(Ô
(€CØ�tˆOÐ9¥¨C°Ñ!9Ô!9Ð9r   c                 óL   — | \  }}}ddddddœ                      |d¦  «        }|fS )Nr   é   é   é   é   )ÚGETÚPOSTÚPUTÚPATCHÚDELETEé   )Úget)ÚendpointÚpathÚmethodr   Úmethod_prioritys        r   Úendpoint_orderingr0   $   sF   € Ø%Ñ€Dˆ&�(àØØØØðð ÷ 
‚cˆ&�!�n„nð ð ÐÐr   z/<(?:(?P<converter>[^>:]+):)?(?P<parameter>\w+)>c                   ó4   — e Zd ZdZd	d„Zd
d„Zd„ Zd„ Zd„ ZdS )ÚEndpointEnumeratorzR
    A class to determine the available API endpoints that a project exposes.
    Nc                 ó�   — |€<|€t           j        }t          |t          ¦  «        rt	          |¦  «        }n|}|j        }|| _        d S r   )r   ÚROOT_URLCONFÚ
isinstanceÚstrr   ÚurlpatternsÚpatterns)Úselfr8   ÚurlconfÚurlss       r   Ú__init__zEndpointEnumerator.__init__9   sP   € ØÐØˆå"Ô/�õ ˜'¥3Ñ'Ô'ð Ý$ WÑ-Ô-��à�ØÔ'ˆHà ˆŒˆˆr   Ú c                 óü  — |€| j         }g }|D ]Ù}|t          |j        ¦  «        z   }t          |t          ¦  «        re|                      |¦  «        }|j        }|                      ||¦  «        r2|                      |¦  «        D ]}|||f}	| 	                    |	¦  «         ŒŒ“t          |t          ¦  «        r1|                      |j        |¬¦  «        }
|                     |
¦  «         ŒÚt          |t          ¬¦  «        S )zZ
        Return a list of all available API endpoints by inspecting the URL conf.
        N)r8   Úprefix)Úkey)r8   r6   Úpatternr5   r   Úget_path_from_regexr   Úshould_include_endpointÚget_allowed_methodsÚappendr	   Úget_api_endpointsÚurl_patternsÚextendÚsortedr0   )r9   r8   r?   Úapi_endpointsrA   Ú
path_regexr-   r   r.   r,   Únested_endpointss              r   rF   z$EndpointEnumerator.get_api_endpointsH   s!  € ð ÐØ”}ˆHàˆàð 	7ð 	7ˆGØ¥# g¤oÑ"6Ô"6Ñ6ˆJÝ˜'¥:Ñ.Ô.ð 7Ø×/Ò/°
Ñ;Ô;�Ø"Ô+�Ø×/Ò/°°hÑ?Ô?ð 7Ø"&×":Ò":¸8Ñ"DÔ"Dð 7ð 7˜Ø$(¨&°(Ð#;˜Ø%×,Ò,¨XÑ6Ô6Ð6Ð6øå˜G¥[Ñ1Ô1ð 7Ø#'×#9Ò#9Ø$Ô1Ø%ð $:ñ $ô $Ð ð ×$Ò$Ð%5Ñ6Ô6Ð6øå�mÕ):Ð;Ñ;Ô;Ð;r   c                 óV   — t          |¦  «        }t          j        t          d|¦  «        S )zG
        Given a URL conf regex, return a URI template string.
        z{\g<parameter>})r   ÚreÚsubÚ_PATH_PARAMETER_COMPONENT_RE)r9   rK   r-   s      r   rB   z&EndpointEnumerator.get_path_from_regexd   s)   € õ ˜jÑ)Ô)ˆõ ŒvÕ2Ð4FÈÑMÔMÐMr   c                 óÌ   — t          |¦  «        sdS |j        j        €dS d|j        v r|j        d         €dS |                     d¦  «        s|                     d¦  «        rdS dS )zI
        Return `True` if the given endpoint should be included.
        FNÚschemaz	.{format}z
.{format}/T)r   r   rR   Ú
initkwargsÚendswith)r9   r-   r   s      r   rC   z*EndpointEnumerator.should_include_endpointq   s{   € õ ˜8Ñ$Ô$ð 	Ø�5àŒ<ÔÐ&Ø�5à�xÔ*Ð*Ð*ØÔ" 8Ô,Ð4Ø�uà�=Š=˜Ñ%Ô%ð 	¨¯ª°|Ñ)DÔ)Dð 	Ø�5àˆtr   c                 óæ   — t          |d¦  «        r=t          |j        ¦  «        }t          |j        j        ¦  «        }d„ ||z  D ¦   «         }n|                     ¦   «         j        }d„ |D ¦   «         S )zL
        Return a list of the valid HTTP methods for this endpoint.
        Úactionsc                 ó6   — g | ]}|                      ¦   «         ‘ŒS © )Úupper©Ú.0r.   s     r   ú
<listcomp>z:EndpointEnumerator.get_allowed_methods.<locals>.<listcomp>‹   s    € ÐPÐPÐP¨&�v—|’|‘~”~ÐPÐPÐPr   c                 ó   — g | ]}|d v¯|‘Œ	S ))ÚOPTIONSÚHEADrX   rZ   s     r   r\   z:EndpointEnumerator.get_allowed_methods.<locals>.<listcomp>�   s#   € ÐRÐRÐR˜6°Ð>QÐ0QÐ0Q�Ð0QÐ0QÐ0Qr   )ÚhasattrÚsetrV   r   Úhttp_method_namesÚallowed_methods)r9   r   rV   rb   Úmethodss        r   rD   z&EndpointEnumerator.get_allowed_methods„   sx   € õ �8˜YÑ'Ô'ð 	5Ý˜(Ô*Ñ+Ô+ˆGÝ # H¤LÔ$BÑ CÔ CÐØPÐP°GÐ>OÑ4OÐPÑPÔPˆGˆGà—l’l‘n”nÔ4ˆGàRÐR WÐRÑRÔRÐRr   )NN)Nr=   )	Ú__name__Ú
__module__Ú__qualname__Ú__doc__r<   rF   rB   rC   rD   rX   r   r   r2   r2   5   s{   € € € € € ðð ð!ð !ð !ð !ð<ð <ð <ð <ð8Nð Nð Nðð ð ð&Sð Sð Sð Sð Sr   r2   c                   óF   — e Zd ZeZdZd
d„Zd„ Zd„ Zdd„Z	d„ Z
dd„Zd	„ ZdS )ÚBaseSchemaGeneratorNc                 óÂ   — |r|                      d¦  «        s|dz  }t          j        | _        || _        || _        || _        || _        || _        || _	        d | _
        d S )Nú/)rT   r   ÚSCHEMA_COERCE_PATH_PKÚcoerce_path_pkr8   r:   ÚtitleÚdescriptionÚversionÚurlÚ	endpoints)r9   ro   rr   rp   r8   r:   rq   s          r   r<   zBaseSchemaGenerator.__init__š   sg   € Øð 	�s—|’| CÑ(Ô(ð 	Ø�3‰JˆCå*Ô@ˆÔà ˆŒØˆŒØˆŒ
Ø&ˆÔØˆŒØˆŒØˆŒˆˆr   c                 óŠ   — | j         €;|                      | j        | j        ¦  «        }|                     ¦   «         | _         d S d S r   )rs   Úendpoint_inspector_clsr8   r:   rF   )r9   Ú	inspectors     r   Ú_initialise_endpointsz)BaseSchemaGenerator._initialise_endpoints¨   sB   € ØŒ>Ð!Ø×3Ò3°D´MÀ4Ä<ÑPÔPˆIØ&×8Ò8Ñ:Ô:ˆDŒNˆNˆNð "Ð!r   c                 óä   — g }g }| j         D ]a\  }}}|                      |||¦  «        }|                      |||¦  «        }|                     |¦  «         |                     |||f¦  «         Œb||fS )zY
        Generate (path, method, view) given (path, method, callback) for paths.
        )rs   Úcreate_viewÚcoerce_pathrE   )r9   ÚrequestÚpathsÚview_endpointsr-   r.   r   Úviews           r   Ú_get_paths_and_endpointsz,BaseSchemaGenerator._get_paths_and_endpoints­   s�   € ð ˆØˆØ&*¤nð 	8ð 	8Ñ"ˆD�&˜(Ø×#Ò# H¨f°gÑ>Ô>ˆDØ×#Ò# D¨&°$Ñ7Ô7ˆDØ�LŠL˜ÑÔÐØ×!Ò! 4¨°Ð"6Ñ7Ô7Ð7Ð7à�nÐ$Ð$r   c           	      ój  —  |j         di t          |di ¦  «        ¤Ž}d|_        i |_        d|_        d|_        t          |dd¦  «        |_        t          |dd¦  «        }|�:|dk    rd|_        n,|                     | 	                    ¦   «         ¦  «        |_        |�t          ||¦  «        |_        |S )zC
        Given a callback, return an actual view instance.
        rS   rX   NrV   r^   Úmetadata)r   r   ÚargsÚkwargsÚformat_kwargr{   Ú
action_mapÚactionr+   Úlowerr   )r9   r   r.   r{   r~   rV   s         r   ry   zBaseSchemaGenerator.create_view»   s¹   € ð ˆxŒ|ÐBÐB�g h°¸bÑAÔAÐBÐBˆØˆŒ	ØˆŒØ ˆÔØˆŒÝ! (¨I°tÑ<Ô<ˆŒå˜( I¨tÑ4Ô4ˆØÐØ˜Ò"Ð"Ø(�”�à%Ÿkšk¨&¯,ª,©.¬.Ñ9Ô9�”àÐÝ(¨°&Ñ9Ô9ˆDŒLàˆr   c                 ó¶   — | j         rd|vr|S t          t          |dd¦  «        dd¦  «        }|rt          |¦  «        }nd}|                     dd|z  ¦  «        S )zâ
        Coerce {pk} path arguments into the name of the model field,
        where possible. This is cleaner for an external representation.
        (Ie. "this is an identifier", not "this is a database primary key")
        z{pk}ÚquerysetNr   Úidz{%s})rn   r   r   Úreplace)r9   r-   r.   r~   r   Ú
field_names         r   rz   zBaseSchemaGenerator.coerce_pathÒ   sp   € ð Ô"ð 	 f°DÐ&8Ð&8ØˆKÝ�  j°$Ñ7Ô7¸À$ÑGÔGˆØð 	Ý$ UÑ+Ô+ˆJˆJàˆJØ�|Š|˜F F¨ZÑ$7Ñ8Ô8Ð8r   Fc                 ó    — t          d¦  «        ‚)Nz0.get_schema() must be implemented in subclasses.)ÚNotImplementedError)r9   r{   Úpublics      r   Ú
get_schemazBaseSchemaGenerator.get_schemaá   s   € Ý!Ð"TÑUÔUÐUr   c                 ó–   — |j         €dS 	 |                     |j         ¦  «         n## t          j        t          t
          f$ r Y dS w xY wdS )zY
        Return `True` if the incoming request has the correct view permissions.
        NTF)r{   Úcheck_permissionsr
   ÚAPIExceptionr   r   )r9   r-   r.   r~   s       r   Úhas_view_permissionsz(BaseSchemaGenerator.has_view_permissionsä   sa   € ð Œ<ÐØ�4ð	Ø×"Ò" 4¤<Ñ0Ô0Ð0Ð0øÝÔ'­Õ2BÐCð 	ð 	ð 	Ø�5�5ð	øøøàˆts   ‹& ¦AÁA)NNNNNNr   )NF)re   rf   rg   r2   ru   rn   r<   rw   r   ry   rz   r�   r”   rX   r   r   rj   rj   ’   s�   € € € € € Ø/Ðð
 €Nðð ð ð ð;ð ;ð ;ð
%ð %ð %ðð ð ð ð.9ð 9ð 9ðVð Vð Vð Vðð ð ð ð r   rj   )rh   rN   Ú	importlibr   Údjango.confr   Údjango.contrib.admindocs.viewsr   Údjango.core.exceptionsr   Údjango.httpr   Údjango.urlsr   r	   Úrest_frameworkr
   Úrest_framework.requestr   Úrest_framework.settingsr   Úrest_framework.utils.model_metar   r   r   r0   ÚcompilerP   r2   rj   rX   r   r   ú<module>r       s�  ððð ð
 
€	€	€	Ø #Ð #Ð #Ð #Ð #Ð #à  Ð  Ð  Ð  Ð  Ð  Ø 9Ð 9Ð 9Ð 9Ð 9Ð 9Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3Ø Ð Ð Ð Ð Ð Ø /Ð /Ð /Ð /Ð /Ð /Ð /Ð /à %Ð %Ð %Ð %Ð %Ð %Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 0Ð 0Ð 0Ð 0Ð 0Ð 0Ø 3Ð 3Ð 3Ð 3Ð 3Ð 3ðð ð ð
:ð :ð :ð	ð 	ð 	ð  *˜rœzØ6ñ ô  Ð ð
ZSð ZSð ZSð ZSð ZSñ ZSô ZSð ZSðz]ð ]ð ]ð ]ð ]ñ ]ô ]ð ]ð ]ð ]r   