
    \j%                         d dl Z d dlZd dlmZmZmZ d dlmZ d dlm	Z	m
Z
mZmZmZ  G d de      Z G d deej                         Zy)	    N)ListOptionalTuple)serializers)EXPAND_PARAMFIELDS_PARAM
OMIT_PARAMWILDCARD_EXPAND_VALUESsplit_levelsc                   l    e Zd ZdZi Z fdZ fdZ fdZd Zd Z	de
fdZd	e
d
e
deee
   ee
   f   fdZdee
   dee
   dee
   dee
   fdZde
dee
   dee
   dee
   def
dZdee
   dee
   dee
   dee
   dee
   f
dZedefd       Zde
dee
   fdZde
dee
   fdZdee
   defdZ xZS )FlexFieldsSerializerMixinz
    A ModelSerializer that takes additional arguments for
    "fields", "omit" and "expand" in order to
    control which fields are displayed, and whether to replace simple
    values with complex, nested serializations
    c                    t        |j                  t        g             }t        |j                  t        g             }t        |j                  t        g             }|j                  dd       }t        t        |   |i | || _        g | _	        d| _
        |||d| _        |s| j                  t              ng |s| j                  t              ng |s| j                  t              ng d| _        | j                  d   | j                  d   z   | j                  d   | j                  d   z   | j                  d   | j                  d   z   d| _        y )NparentF)expandfieldsomitr   r   r   )listpopr   r   r	   superr   __init__r   expanded_fields_flex_fields_rep_applied_flex_options_base'_get_permitted_expands_from_query_param_get_query_param_value_flex_options_rep_only_flex_options_all)selfargskwargsr   r   r   r   	__class__s          F/root/env/lib/python3.12/site-packages/rest_flex_fields/serializers.pyr   z"FlexFieldsSerializerMixin.__init__   sJ   fjjr23fjjr23FJJz2./Hd+'7HH!(-% #
 % CCLQ$ 22<@  00<
'
# --h7$:U:UV^:__--h7$:U:UV^:__++F3d6Q6QRX6YY"
    c                     | j                   s-| j                  | j                  | j                         d| _         t        |   |      S )NT)r   apply_flex_fieldsr   r   r   to_representation)r   instancer!   s     r"   r&   z+FlexFieldsSerializerMixin.to_representation<   s>    ,,""4;;0K0KL,0D)w(22r#   c                 \    t         |          }| j                  || j                         |S )N)r   
get_fieldsr%   r   )r   r   r!   s     r"   r)   z$FlexFieldsSerializerMixin.get_fieldsB   s+    #%vt'>'>?r#   c                 ^   t        |d         \  }}t        |d         \  }}t        |d         \  }}| j                  ||||      }	|	D ]  }
|j                  |
        | j                  ||||      }|D ]4  }| j                  j                  |       | j                  ||||      ||<   6 |S )Nr   r   r   )r   _get_fields_names_to_remover   _get_expanded_field_namesr   append_make_expanded_field_serializer)r   r   flex_optionsexpand_fieldsnext_expand_fieldssparse_fieldsnext_sparse_fieldsomit_fieldsnext_omit_fields	to_remove
field_nameexpanded_field_namesnames                r"   r%   z+FlexFieldsSerializerMixin.apply_flex_fieldsG   s    ,8h9O,P)),8h9O,P))(4\&5I(J%%44[-Qacij	# 	#JJJz"	#  $==;7G 
 ) 	D  ''-??(*<>NF4L	 r#   c                    | j                   |   }t        |t              r.|d   }t        |      dkD  rt	        j
                  |d         ni }n|}i }t        |      t        k(  r| j                  |      }t        |t        j                        r| j                  |d<   t        |t              r5| |d<   ||v r||   |t        <   ||v r||   |t        <   ||v r||   |t         <    |di |S )zS
        Returns an instance of the dynamically created nested serializer.
        r      contextr    )_expandable_fields
isinstancetuplelencopydeepcopytypestr&_get_serializer_class_from_lazy_string
issubclassr   
Serializerr<   r   r   r   r	   )r   r9   nested_expandnested_fieldsnested_omitfield_optionsserializer_classsettingss           r"   r.   z9FlexFieldsSerializerMixin._make_expanded_field_serializer]   s     //5mU+,Q/:=m:Lq:Pt}}]1%56VXH,H !S(#JJK[\&(>(>?"&,,HY&(AB!%HX}$)6t)<&}$)6t)<&{"'24'8$+(++r#   full_lazy_pathc                    |j                  d      }|j                         }dj                  |      }| j                  ||      \  }}|r)|j	                  d      s| j                  |dz   |      \  }}|r|S t        |      )N.z.serializers)splitr   join_import_serializer_classendswith	Exception)r   rO   
path_parts
class_namepathrM   errors          r"   rF   z@FlexFieldsSerializerMixin._get_serializer_class_from_lazy_string~   s    #))#.
^^%
xx
#"&"?"?j"Q%~6&*&C&C~%z'#e ##r#   rY   rX   returnc                     	 t        j                  |      }	 t        ||      d fS # t        $ r d d|d|fcY S w xY w# t        $ r d d|d|fcY S w xY w)NzNo module found at path: z when trying to import z	No class z class found in module )	importlibimport_moduleImportErrorgetattrAttributeError)r   rY   rX   modules       r"   rT   z2FlexFieldsSerializerMixin._import_serializer_class   sx    	,,T2F	U6:.44  	JNPZ[ 	  	U4TTT	Us   & ? <<AAr4   r2   next_level_omitsc                     t        |      dkD  }g }|st        |      dk(  r|S |D ]*  }| j                  ||||      }|r|j                  |       , |S )z
        Remove fields that are found in omit list, and if sparse names
        are passed, remove any fields not found in that list.
        r   )rA   _should_field_existr-   )	r   r4   r2   rc   r   sparser6   r7   should_exists	            r"   r+   z5FlexFieldsSerializerMixin._get_fields_names_to_remove   sq     ]#a'	#k*a/  	-J33K8HL    ,	- r#   r7   c                 <    ||v r||vryt        |      dkD  r||vryy)a   
        Next level omits take form of:
        {
            'this_level_field': [field_to_omit_at_next_level]
        }
        We don't want to prematurely omit a field, eg "omit=house.rooms.kitchen"
        should not omit the entire house or all the rooms, just the kitchen.
        Fr   T)rA   )r   r7   r4   r2   rc   s        r"   re   z-FlexFieldsSerializerMixin._should_field_exist   s1     $;K)K}!j&Er#   r0   c                     t        |      dk(  rg S | j                  |      r| j                  j                         }g }|D ]7  }|| j                  vr| j	                  ||||      s'|j                  |       9 |S )Nr   )rA   _contains_wildcard_expand_valuer>   keysre   r-   )r   r0   r4   r2   rc   accumr9   s          r"   r,   z3FlexFieldsSerializerMixin._get_expanded_field_names   s     }"I//> 3388:M! 	D4222++D+}N^_LL	 r#   c                     t        | d      r,t        | j                  d      r| j                  j                  S | j                  S )zIt's more consistent with DRF to declare the expandable fields
        on the Meta class, however we need to support both places
        for legacy reasons.Metaexpandable_fields)hasattrrn   ro   )r   s    r"   r>   z,FlexFieldsSerializerMixin._expandable_fields   s8    
 4 WTYY8K%L99...%%%r#   fieldc                    | j                   rg S t        | d      r| j                  j                  d      sg S | j                  d   j                  j                  |      }|s7| j                  d   j                  j                  dj                  |            }|r"t        |      dk(  r|d   j                  d      S |xs g S )zS
        Only allowed to examine query params if it's the root serializer.
        r<   requestz{}[]r;   r   ,)	r   rp   r<   getquery_paramsgetlistformatrA   rR   )r   rq   valuess      r"   r   z0FlexFieldsSerializerMixin._get_query_param_value   s     ;;ItY't||/?/?	/JIi(55==eD\\),99AA&--PUBVWFc&kQ&!9??3''|r#   expand_paramc                     | j                  |      }d| j                  v rB| j                  d   }| j                  |      r|S t        t	        |      t	        |      z        S |S )z
        If a list of permitted_expands has been passed to context,
        make sure that the "expand" fields from the query params
        comply.
        permitted_expands)r   r<   rj   r   set)r   rz   r   r|   s       r"   r   zAFlexFieldsSerializerMixin._get_permitted_expands_from_query_param  sc     ,,\:$,,. $-@ A33F;((CK#.?*@@AAr#   expand_valuesc                 t    t         yt        t        |      t        t               z        }t        |      dkD  S )NFr   )r
   r   r}   rA   )r   r~   intersecting_valuess      r"   rj   z9FlexFieldsSerializerMixin._contains_wildcard_expand_value  s7    !)"3}#5<R8S#ST&'!++r#   )__name__
__module____qualname____doc__ro   r   r&   r)   r%   r.   rE   rF   r   r   rT   r   r+   boolre   r,   propertydictr>   r   r   rj   __classcell__)r!   s   @r"   r   r      s     
D3
,,BS  UU%(U	x}hsm+	,U #Y Cy s)	 
c6 #Y Cy	
 s) 
.Cy #Y Cy	
 s) 
c4 &D & &C DI (C DQTI $,T#Y ,4 ,r#   r   c                       e Zd Zy)FlexFieldsModelSerializerN)r   r   r   r=   r#   r"   r   r   !  s    r#   r   )rB   r]   typingr   r   r   rest_frameworkr   rest_flex_fieldsr   r   r	   r
   r   objectr   ModelSerializerr   r=   r#   r"   <module>r      sB      ( ( & N, N,b	 9;;V;V 	r#   