
    kȂiS                        S SK r S SKJr  S SKJr  S SKJr  S SKJr  S SK	J
r
JrJr  S SKJrJrJr  S SKJr  S	S
KJr  S	SKJr  S	SKJrJr  S rS rS rSr " S S\5      rS r  " S S\5      r!S r" " S S\5      r# " S S\5      r$S r%g)    N)Counter)parse)models)	force_str)RemovedInDRF317Warning
exceptionsserializers)coreapi
coreschemauritemplate)api_settings   )BaseSchemaGenerator)ViewInspector)get_pk_descriptionis_list_viewc                    U  Vs/ sH"  oR                  S5      R                  S5      PM$     nn[        U5      n[        U5      nUn[	        U5       H  u  pgXtU   :w  d  M  US U n  O   SSR                  U5      -   $ s  snf )N/)stripsplitminmax	enumeratejoin)pathspathsplit_pathss1s2commonics           OD:\sksbv-state-backend\venv\Lib\site-packages\rest_framework/schemas/coreapi.pycommon_pathr$      s    :?@%$::c?((-%K@	[	B	[	BF"1:VF  &!!! As   (A>c                     U S;  $ )N>   listcreateupdatedestroyretrievepartial_update )actions    r#   is_custom_actionr.      s           c                     U R                  5        H  u  p[        U5        M     U R                   H  u  p4U R                  U5      nX@U'   M     g N)itemsdistribute_linkslinksget_available_key)objkeyvaluepreferred_keylinks        r#   r3   r3   #   sF    iik
 "  #yy##M2C  )r/   a=  
Schema Naming Collision.

coreapi.Link for URL path {value_url} cannot be inserted into schema.
Position conflicts with coreapi.Link for URL path {target_url}.

Attempted to insert link with keys: {keys}.

Adjust URLs to avoid naming collision or override `SchemaGenerator.get_keys()`
to customise schema structure.
c                   .   ^  \ rS rSrU 4S jrS rSrU =r$ )LinkNode9   c                 N   > / U l         [        5       U l        [        TU ]  5         g r1   )r4   r   methods_countersuper__init__)self	__class__s    r#   rA   LinkNode.__init__:   s    
&yr/   c                 ~    X;  a  U$  U R                   U   nU R                   U==   S-  ss'   U SU 3nX0;  a  U$ M6  )Nr   _)r?   )rB   r9   current_valr7   s       r#   r5   LinkNode.get_available_key?   sV    $  ..}=K  /14/"O1[M2C
 r/   )r4   r?   )__name__
__module____qualname____firstlineno__rA   r5   __static_attributes____classcell__rC   s   @r#   r<   r<   9   s    

 
r/   r<   c                    USS  H  nX0;  a  [        5       X'   X   n M      U R                  R                  US   U45        g! [         a5    [        R                  UR                  U R                  US9n[        U5      ef = f)z
Nested dictionary insertion.

>>> example = {}
>>> insert_into(example, ['a', 'b', 'c'], 123)
>>> example
LinkNode({'a': LinkNode({'b': LinkNode({'c': LinkNode(links=[123])}}})))
N)	value_url
target_urlkeys)r<   r4   append	TypeErrorINSERT_INTO_COLLISION_FMTformaturl
ValueError)targetrT   r8   r7   msgs        r#   insert_intor]   L   s     CRy"*FK 
T"Xu-. '..iizz / 

 os    A ?Bc                   d   ^  \ rS rSrSrSSSSSS.rS	rSU 4S
 jjrSS jrSS jr	S r
S rSrU =r$ )SchemaGeneratore   z
Original CoreAPI version.
r*   r'   r(   r+   r)   )getpostputpatchdeleteNc                    > [         (       d   S5       e[         b  [        R                  " S[        5        [        (       d   S5       e[
        TU ]  XX4U5        [        R                  U l	        g )Nz/`coreapi` must be installed for schema support.CCoreAPI compatibility is deprecated and will be removed in DRF 3.17z2`coreschema` must be installed for schema support.)
r
   warningswarnr   r   r@   rA   r   SCHEMA_COERCE_METHOD_NAMEScoerce_method_names)rB   titlerY   descriptionpatternsurlconfversionrC   s          r#   rA   SchemaGenerator.__init__w   sX    wIIIwMM_awxzOOOz[GD#/#J#J r/   c                 \   [        5       nU R                  U5      u  p4U(       d  gU R                  U5      nU Ho  u  pgnU R                  XgU5      (       d  M  UR                  R                  XgU R                  S9n	U[        U5      S n
U R                  XU5      n[        X+U	5        Mq     U$ )zY
Return a dictionary containing all the links that should be
included in the API schema.
N)base_url)
r<   _get_paths_and_endpointsdetermine_path_prefixhas_view_permissionsschemaget_linkrY   lenget_keysr]   )rB   requestr4   r   view_endpointsprefixr   methodviewr:   subpathrT   s               r#   	get_linksSchemaGenerator.get_links   s    
 
 $ = =g F ++E2"0D$,,T4@@;;''txx'HD3v;<(G==$7DT* #1 r/   c                    U R                  5         U R                  U(       a  SOU5      nU(       d  gU R                  nU(       d  Ub  UR                  5       n[	        U5        [
        R                  " U R                  U R                  XCS9$ )z<
Generate a `coreapi.Document` representing the API schema.
N)rl   rm   rY   content)	_initialise_endpointsr   rY   build_absolute_urir3   r
   Documentrl   rm   )rB   r{   publicr4   rY   s        r#   
get_schemaSchemaGenerator.get_schema   st     	""$vt7;hhw*,,.C**$*:*:
 	
r/   c                 |   [        US5      (       a  UR                  nO1[        XU5      (       a  SnOU R                  UR	                  5          nUR                  S5      R                  S5       Vs/ sH  nSU;  d  M  UPM     nn[        U5      (       az  UR                   Vs1 sH  o"S:w  d  M
  UiM     nn[        U5      S:  a@  U R                  WR	                  5          nX@R                  ;   a  U R                  U   nXd/-   $ USS U/-   $ X@R                  ;   a  U R                  U   nXd/-   $ s  snf s  snf )	aU  
Return a list of keys that should be used to layout a link within
the schema document.

/users/                   ("users", "list"), ("users", "create")
/users/{pk}/              ("users", "read"), ("users", "update"), ("users", "delete")
/users/enabled/           ("users", "enabled")  # custom viewset list action
/users/{pk}/star/         ("users", "star")     # custom viewset detail action
/users/{pk}/groups/       ("users", "groups", "list"), ("users", "groups", "create")
/users/{pk}/groups/{pk}/  ("users", "groups", "read"), ("users", "groups", "update"), ("users", "groups", "delete")
r-   r&   r   {headr   NrQ   )hasattrr-   r   default_mappinglowerr   r   r.   
action_mapry   rk   )rB   r   r~   r   r-   	componentnamed_path_componentsmapped_methodss           r#   rz   SchemaGenerator.get_keys   sL    4""[[F GT22--flln= }}S!'',!
, $)# , 	 !
 F## &*__%46&8H_   >"Q&--flln=555!55f=F,x77,Sb1VH<<-----f5F %x//1!
s   2	D4?D4%D91D9c                    / nU H{  nUR                  S5      R                  S5      n/ nU H  nSU;   a    OUR                  U5        M     SR                  USS 5      nU(       d    gUR                  SU-   S-   5        M}     [	        U5      $ )aQ  
Given a list of all paths, return the common prefix which should be
discounted when generating a schema structure.

This will be the longest common string that does not include that last
component of the URL, or the last component before a path parameter.

For example:

/api/v1/users/
/api/v1/users/{pk}/

The path prefix is '/api/v1'
r   r   NrQ   )r   r   rU   r   r$   )rB   r   prefixesr   
componentsinitial_componentsr   r}   s           r#   ru   %SchemaGenerator.determine_path_prefix   s     DC..s3J!#'	)#")))4 ( XX0"56F OOC&L3./  8$$r/   )rk   )NNNNNNr1   )NF)rI   rJ   rK   rL   __doc__r   rk   rA   r   r   rz   ru   rM   rN   rO   s   @r#   r_   r_   e   sH    
 !O K0
*.0`% %r/   r_   c           
      $	   U R                   (       a  [        U R                   5      OSnU R                  (       a  [        U R                  5      OSn[        U [        R
                  [        R                  45      (       a+  [        U R                  5      n[        R                  " UUUS9$ [        U [        R                  5      (       a  [        R                  " UUS9$ [        U [        R                  5      (       aL  [        R                  " U R                  R                  5        VVs0 sH  u  pEU[        U5      _M     snnUUS9$ [        U [        R                   5      (       a+  [        U R"                  5      n[        R                  " UUUS9$ [        U [        R$                  5      (       au  [        R&                  n[)        U R*                  SS 5      nUbE  UR,                  R.                  n	[        U	[0        R2                  5      (       a  [        R4                  nU" XS9$ [        U [        R6                  5      (       a  [        R&                  " XS9$ [        U [        R8                  5      (       a;  [        R                  " [        R:                  " [=        U R>                  5      S9UUS9$ [        U [        R@                  5      (       a)  [        R:                  " [=        U R>                  5      UUS9$ [        U [        RB                  5      (       a  [        RD                  " XS9$ [        U [        RF                  [        RH                  45      (       a  [        RJ                  " XS9$ [        U [        RL                  5      (       a  [        R4                  " XS9$ [        U [        RN                  5      (       a  [        R&                  " UUSS	9$ [        U [        RP                  5      (       a  [        R&                  " UUS
S	9$ [        U [        RR                  5      (       a  [        R                  " XS9$ U RT                  RW                  S5      S:X  a  [        R&                  " UUSS	9$ [        R&                  " XS9$ s  snnf )N )r2   rl   rm   rl   rm   )
propertiesrl   rm   model)enum)r   rl   rm   date)rl   rm   rX   z	date-timebase_templateztextarea.htmltextarea),labelr   	help_text
isinstancer	   ListSerializer	ListFieldfield_to_schemachildr   Array	DictFieldObject
Serializerfieldsr2   ManyRelatedFieldchild_relationPrimaryKeyRelatedFieldStringgetattrqueryset_metapkr   	AutoFieldIntegerRelatedFieldMultipleChoiceFieldEnumr&   choicesChoiceFieldBooleanFieldBooleanDecimalField
FloatFieldNumberIntegerField	DateFieldDateTimeField	JSONFieldstylera   )
fieldrl   rm   child_schemar7   r8   related_field_schema
schema_clsr   model_fields
             r#   r   r      s   &+kkIekk"rE05)EOO,RK%+44k6K6KLMM&u{{3#
 	

 
E;00	1	1  #
 	
 
E;11	2	2   <<%%' ( C _U++'
 #
 	
 
E;77	8	8.u/C/CD&#
 	

 
E;==	>	>&&
6++..K+v'7'788'//
??	E;33	4	4  uFF	E;::	;	;//tEMM':;#
 	

 
E;22	3	3emm$#
 	

 
E;33	4	4!!GG	EK44k6L6LM	N	N  uFF	E;33	4	4!!GG	E;00	1	1  #
 	

 
E;44	5	5  #
 	

 
E;00	1	1  uFF{{'?:  #
 	
 5BBEs   +R
c                   p   ^  \ rS rSrSrSU 4S jjrS rS rS rS r	S r
S	 rS
 r\S 5       rS rSrU =r$ )
AutoSchemaiV  z^
Default inspector for APIView

Responsible for per-view introspection and schema generation.
c                 |   > [         TU ]  5         [        b  [        R                  " S[
        5        Uc  / nXl        g)z
Parameters:

* `manual_fields`: list of `coreapi.Field` instances that
    will be added to auto-generated fields, overwriting on `Field.name`
Nrg   )r@   rA   r
   rh   ri   r   _manual_fields)rB   manual_fieldsrC   s     r#   rA   AutoSchema.__init__\  s7     	MM_awx M+r/   c                 L   U R                  X5      nX@R                  X5      -  nX@R                  X5      -  nX@R                  X5      -  nU R	                  X5      nU R                  XE5      nU(       a>  [        U Vs/ sH  ofR                  S;   PM     sn5      (       a  U R                  X5      nOSnU R                  X5      nU(       a  UR                  S5      (       a  USS n[        R                  " [        R                  " X15      UR                  5       UUUS9$ s  snf )z
Generate `coreapi.Link` for self.view, path and method.

This is the main _public_ access point.

Parameters:

* path: Route path for view from URLConf.
* method: The HTTP request method.
* base_url: The project "mount point" as given to SchemaGenerator
)formbodyNr   r   rY   r-   encodingr   rm   )get_path_fieldsget_serializer_fieldsget_pagination_fieldsget_filter_fieldsget_manual_fieldsupdate_fieldsanylocationget_encodingget_description
startswithr
   Linkr   urljoinr   )	rB   r   r~   rs   r   r   r   r   rm   s	            r#   rx   AutoSchema.get_linkk  s    %%d3,,T::,,T::((66..t<##F:c6R6%>>-==6RSS((6HH**48,,8D||h-<<>#
 	
 Ss   =D!c                 $   U R                   n[        [        USS5      SS5      n/ n[        R                  " U5       GH;  nSnSn[        R
                  n	0 n
Ub   UR                  R                  U5      nUb&  UR                  (       a  [        UR                  5      nUb'  UR                  (       a  [        UR                  5      nOUb  UR                  (       a  [        XK5      n[        US5      (       a   UR                  U:X  a  UR                   U
S'   O/[#        U[$        R&                  5      (       a  [        R(                  n	[*        R,                  " USSU	" SXxS	.U
D6S
9nUR/                  U5        GM>     U$ ! [         a    Sn GNf = f)z[
Return a list of `coreapi.Field` instances corresponding to any
templated path variables.
r   Nr   r   lookup_value_regexpatternr   Tr   namer   requiredrw   r,   )r   r   r   	variablesr   r   r   	get_field	Exceptionverbose_namer   r   primary_keyr   r   lookup_fieldr   r   r   r   r   r
   FieldrU   )rB   r   r~   r   r   r   variablerl   rm   r   kwargsr   r   s                r#   r   AutoSchema.get_path_fields  sj   
 yyj$7$G#--d3HEK#**JF '"'++"7"7"AK *{/G/G%k&>&>?E*{/D/D"+K,A,A"BK ,1H1H"4U"HK4!5664;L;LPX;X(,(?(?F9%V-=-=>>!+!3!3JMM!QQ&Q	E MM% ? 4B 1 ! '"&K's   E??FFc           	      J   U R                   nUS;  a  / $ [        US5      (       d  / $  UR                  5       n[        U[        R                  5      (       a+  [        R                  " SSS[        R                   " 5       S9/$ [        U[        R"                  5      (       d  / $ / nUR$                  R'                  5        H  nUR(                  (       d  [        U[        R*                  5      (       a  M5  UR,                  =(       a    US	:g  n[        R                  " UR.                  S
U[1        U5      S9nUR3                  U5        M     U$ ! [        R                   a@    Sn[
        R                  " SR                  UR                  R                  X!5      5         GNhf = f)z|
Return a list of `coreapi.Field` instances corresponding to any
request body input, as determined by the serializer class.
)PUTPATCHPOSTget_serializerNzt{}.get_serializer() raised an exception during schema generation. Serializer fields will not be generated for {} {}.datar   Tr   r   r   )r   r   r   r   APIExceptionrh   ri   rX   rC   rI   r   r	   r   r
   r   r   r   r   r   values	read_onlyHiddenFieldr   
field_namer   rU   )rB   r   r~   r   
serializerr   r   r   s           r#   r    AutoSchema.get_serializer_fields  sl   
 yy11It-..I	J,,.J j+"<"<==#!%++-	  *k&<&<==I&&--/E*UK4K4K"L"L~~;&G*;HMM%%!&u-	E MM%  0 E && 	JJMM 1 "6$.."9"96HJ	Js   E AF"!F"c                     U R                   n[        XU5      (       d  / $ [        USS 5      nU(       d  / $ UR                  5       nUR	                  U5      $ )Npagination_class)r   r   r   r  get_schema_fields)rB   r   r~   r   
pagination	paginators         r#   r    AutoSchema.get_pagination_fields  sS    yyD$//IT#5t<
I))+	**400r/   c                     [        U R                  SS5      c  g[        U R                  S5      (       a  U R                  R                  S;   $ UR	                  5       S;   $ )af  
Determine whether to include filter Fields in schema.

Default implementation looks for ModelViewSet or GenericAPIView
actions/methods that cause filtering on the default implementation.

Override to adjust behaviour for your view.

Note: Introduced in v3.7: Initially "private" (i.e. with leading underscore)
    to allow changes based on user experience.
filter_backendsNFr-   )r&   r*   r(   r+   r)   )ra   rc   rd   re   )r   r   r   r-   r   rB   r   r~   s      r#   _allows_filtersAutoSchema._allows_filters  sT     499/6>499h''99##'bbb||~!BBBr/   c                     U R                  X5      (       d  / $ / nU R                  R                   H%  nX4" 5       R                  U R                  5      -  nM'     U$ r1   )r  r   r  r  )rB   r   r~   r   filter_backends        r#   r   AutoSchema.get_filter_fields  sR    ##D11I"ii77Nn&88CCF 8r/   c                     U R                   $ r1   r   r  s      r#   r   AutoSchema.get_manual_fields  s    """r/   c                     U(       d  U $ U  Vs0 sH  o"R                   U_M     nnU H  nX#UR                   '   M     [        UR                  5       5      n U $ s  snf )aA  
Update list of coreapi.Field instances, overwriting on `Field.name`.

Utility function to handle replacing coreapi.Field fields
from a list by name. Used to handle `manual_fields`.

Parameters:

* `fields`: list of `coreapi.Field` instances to update
* `update_with: list of `coreapi.Field` instances to add or replace.
)r   r&   r   )r   update_withfby_names       r#   r   AutoSchema.update_fields  sV     M&,-f6619f-AAFFO gnn&'	 .s   Ac                     U R                   n1 Skn[        US/ 5      nU H!  n[        USS5      nXt;   a  Us  $ US:X  d  M!    g   g)z>
Return the 'encoding' parameter to use for a given endpoint.
>   application/jsonmultipart/form-data!application/x-www-form-urlencodedparser_classes
media_typeNz*/*zapplication/octet-stream)r   r   )rB   r   r~   r   supported_media_typesr  parser_classr   s           r#   r   AutoSchema.get_encoding3  sZ     yy!

 !'7<*L |TBJ2!!U"1 + r/   r  r1   )rI   rJ   rK   rL   r   rA   rx   r   r   r   r  r   r   staticmethodr   r   rM   rN   rO   s   @r#   r   r   V  sR    
,$
L*X1f1C(#  * r/   r   c                   6   ^  \ rS rSrSrSU 4S jjrS rSrU =r$ )ManualSchemaiK  zJ
Allows providing a list of coreapi.Fields,
plus an optional description.
c                    > [         TU ]  5         [        b  [        R                  " S[
        5        [        S U 5       5      (       d   S5       eXl        X l        X0l	        g)zu
Parameters:

* `fields`: list of `coreapi.Field` instances.
* `description`: String description for view. Optional.
Nrg   c              3   T   #    U H  n[        U[        R                  5      v   M!     g 7fr1   )r   r
   r   ).0r  s     r#   	<genexpr>(ManualSchema.__init__.<locals>.<genexpr>[  s     @A:a//s   &(z2`fields` must be a list of coreapi.Field instances)
r@   rA   r
   rh   ri   r   all_fields_description	_encoding)rB   r   rm   r   rC   s       r#   rA   ManualSchema.__init__P  sS     	MM_awx@@@@vBvv@'!r/   c                     U(       a  UR                  S5      (       a  USS  n[        R                  " [        R                  " X15      UR                  5       U R                  U R                  U R                  S9$ )Nr   r   r   )	r   r
   r   r   r   r   r/  r-  r.  )rB   r   r~   rs   s       r#   rx   ManualSchema.get_link`  s[    ,,8D||h-<<>^^<<))
 	
r/   )r.  r/  r-  )r   N)	rI   rJ   rK   rL   r   rA   rx   rM   rN   rO   s   @r#   r&  r&  K  s    " 
 
r/   r&  c                      [         b  [        R                  " S[        5        [	        [
        R                  [        5      $ )zIs CoreAPI Mode enabled?rg   )r
   rh   ri   r   
issubclassr   DEFAULT_SCHEMA_CLASSr   r,   r/   r#   
is_enabledr6  n  s+    []stl77DDr/   )&rh   collectionsr   urllibr   	django.dbr   django.utils.encodingr   rest_frameworkr   r   r	   rest_framework.compatr
   r   r   rest_framework.settingsr   
generatorsr   
inspectorsr   utilsr   r   r$   r.   r3   rW   dictr<   r]   r_   r   r   r&  r6  r,   r/   r#   <module>rB     s        + J J B B 0 + % 3	"
 t &2U%) U%tTCnr rj 
=  
FEr/   