
    hH                       d dl mZ d dlmZ d dlmZmZmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZmZmZmZm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  e       Zd	 Z"d
 Z# G d dejH                        Z% G d dejH                        Z& G d dejH                        Z% G d dejN                        Z( G d dejR                        Z* G d dejR                        Z+ G d dejR                        Z, G d dejR                        Z- G d dejR                        Z. G d dejR                        Z/ G d dejR                        Z0 G d  d!ejR                        Z1 G d" d#ejR                        Z2 G d$ d%ejH                        Z3 G d& d'ejR                        Z4	  G d( d)ejR                        Z5 G d* d+ejR                        Z6 G d, d-ejR                        Z7 G d. d/ejR                        Z8 G d0 d1ejR                        Z9 G d2 d3ejR                        Z: G d4 d5ejR                        Z;	  G d6 d7ejR                        Z< G d8 d9ejR                        Z= G d: d;ejR                        Z> G d< d%ejH                        Z3 G d= d>ej~                        Z@ G d? d@ej~                        ZA G dA dBej~                        ZB G dC dDejR                        ZCdRdEZDd dlEZE G dF dGejR                        ZF	  G dH dIejR                        ZG	  G dJ dKej                        ZI G dL dMejR                        ZJ	 	 	 	 	  G dN dOejR                        ZK G dP dQejR                        ZLy)S    )serializers)get_user_model)UserCompanyClientClientRelationClientDocumentClientFrequentFlyerCities	CountriesState
ClientVisaClientPassport	ClientLogAirlinesAssocClientCompanyMenuLoginOTPUserPermissionsClientTravelInsurance
EmailSetupCompanyDataViewClientDataView)transactionN)datetime)timezone)
parse_datec                 "    | r| j                   S d S N)name)
file_fields    ?D:\Kush\my_value_trip_django\my_value_trip\users\serializers.pyget_file_namer#      s    (:??2d2    c                     | r| S dS )zq
    Return the provided file object if it exists,
    otherwise return None to prevent invalid assignments.
    N values    r"   safe_get_filer)   !   s    
 5#t#r$   c                       e Zd Zd Zy)FileUrlFieldc                     |sy 	 |j                   }| j                  j	                  d      }|r|j                  |      S |S # t        $ r t        |      cY S w xY w)Nrequest)url	Exceptionstrcontextgetbuild_absolute_uri)selfr(   r.   r-   s       r"   to_representationzFileUrlField.to_representation)   s`    	))C ,,""9---c22
  	u:	s   A AAN)__name__
__module____qualname__r5   r&   r$   r"   r+   r+   (   s    
r$   r+   c                   "     e Zd ZdZ fdZ xZS )OptionalFileFieldz<Accepts either an uploaded file or a string (existing path).c                 F    t        |t              r|S t        |   |      S r   
isinstancer0   superto_internal_valuer4   data	__class__s     r"   r?   z#OptionalFileField.to_internal_value7   s"    dC Kw(..r$   )r6   r7   r8   __doc__r?   __classcell__rB   s   @r"   r:   r:   5   s    F/ /r$   r:   c                       e Zd ZdZd Zy)r+   z
    Ensures file fields serialize to URL (or string) instead of a FieldFile object,
    preventing "Object of type FieldFile is not JSON serializable".
    c                 V    |sy 	 |j                   S # t        $ r t        |      cY S w xY wr   )r.   r/   r0   r4   r(   s     r"   r5   zFileUrlField.to_representationE   s0    	99 	u:	s    ((N)r6   r7   r8   rC   r5   r&   r$   r"   r+   r+   @   s    r$   c                   2     e Zd Z fdZ fdZ fdZ xZS )FlexibleDateFieldc                 J    |j                  ddg       t        |   |i | y )Ninput_formats%Y-%m-%d)
setdefaultr>   __init__)r4   argskwargsrB   s      r"   rO   zFlexibleDateField.__init__O   s'    /J<8$)&)r$   c                 ,    |dv ry t         |   |      S )N) N)r>   r?   r4   r(   rB   s     r"   r?   z#FlexibleDateField.to_internal_valueT   s    Jw(//r$   c                 (    |sy t         |   |      S r   )r>   r5   rT   s     r"   r5   z#FlexibleDateField.to_representationZ   s    w(//r$   )r6   r7   r8   rO   r?   r5   rD   rE   s   @r"   rJ   rJ   N   s    *
00 0r$   rJ   c                        e Zd Z G d d      Zy)UserSerializerc                       e Zd ZeZdZy)UserSerializer.Meta__all__N)r6   r7   r8   r   modelfieldsr&   r$   r"   MetarY   b   s    r$   r]   Nr6   r7   r8   r]   r&   r$   r"   rW   rW   a        r$   rW   c                   8     e Zd Z G d d      Z fdZd Z xZS )CountrySerializerc                       e Zd ZeZdZy)CountrySerializer.MetarZ   N)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   rc   h   s    r$   r]   c                 &   |dv rddiS t        |t              rt        |   |      S t        |t        t
        f      rt        |      j                         rt	        |      }t        j                  j                  |      j                         }|rd|j                  iS t        j                  j                  |      j                         }|rd|j                  iS t        j                  dd| i      t        j                  dd| i      )	zA
        Normalize incoming value into a dict with 'id'.
        )NrS   nullidN)country_coderf   countryzInvalid country id or code: zInvalid input for country: )r=   dictr>   r?   intr0   isdigitr   objectsfilterfirstrf   r   ValidationError)r4   rA   	num_valueri   rB   s       r"   r?   z#CountrySerializer.to_internal_valuel   s    %%$< dD!7,T22 dS#J'CI,=,=,?D	I  ''..I.FLLNGgjj))  ''..).<BBDGgjj))--:4&AB  ))5dV<=
 	
r$   c                     |y |j                   |j                  |j                  |j                  |j                  |j
                  dS )Nrf   r    	shortnamerg   
min_length
max_lengthrs   r4   instances     r"   r5   z#CountrySerializer.to_representation   sG    ++MM!++$11"--"--
 	
r$   )r6   r7   r8   r]   r?   r5   rD   rE   s   @r"   ra   ra   g   s     !
H

r$   ra   c                        e Zd Z G d d      Zy)StateSerializerc                       e Zd ZeZddgZy)StateSerializer.Metarf   r    N)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   r|      s    r$   r]   Nr^   r&   r$   r"   rz   rz             r$   rz   c                        e Zd Z G d d      Zy)CitySerializerc                       e Zd ZeZddgZy)CitySerializer.Metarf   r    N)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   r      s    r$   r]   Nr^   r&   r$   r"   r   r      r}   r$   r   c                        e Zd Z G d d      Zy)CompanydataSerializerc                       e Zd ZeZdZy)CompanydataSerializer.MetarZ   Nr6   r7   r8   r   r[   r\   r&   r$   r"   r]   r          r$   r]   Nr^   r&   r$   r"   r   r      s     r$   r   c                       e Zd Z ej                         Z ej                         Z ej                         Z ej                         Z ej                         Z	 G d d      Z
d Zd Zd Zd Zd Zd Zy	)
CompanyDataSerializerc                       e Zd ZeZdZy)CompanyDataSerializer.MetarZ   Nr   r&   r$   r"   r]   r      r   r$   r]   c                 H    |j                   rt        |j                         S d S r   )
created_byr0   r4   objs     r"   get_created_by_namez)CompanyDataSerializer.get_created_by_name       &)nns3>>">$>r$   c                 H    |j                   rt        |j                         S d S r   )
updated_byr0   r   s     r"   get_updated_by_namez)CompanyDataSerializer.get_updated_by_name   r   r$   c                 J    |j                   r|j                   j                  S d S r   )company_countryr    r   s     r"   get_company_countryz)CompanyDataSerializer.get_company_country   s!    +.+>+>s""''HDHr$   c                 J    |j                   r|j                   j                  S d S r   )company_stater    r   s     r"   get_company_statez'CompanyDataSerializer.get_company_state   s!    ),):):s  %%DDr$   c                 J    |j                   r|j                   j                  S d S r   )company_cityr    r   s     r"   get_company_cityz&CompanyDataSerializer.get_company_city   s!    (+(8(8s$$BdBr$   c                 H    |j                   r|j                   j                  S y r   )gst_document_filer.   r   s     r"   get_gst_document_filez+CompanyDataSerializer.get_gst_document_file   s       ((,,,r$   N)r6   r7   r8   r   SerializerMethodFieldcreated_by_nameupdated_by_namer   r   r   r]   r   r   r   r   r   r   r&   r$   r"   r   r      s}    7k779O7k779O7k779O5K557M4;446L ??IECr$   r   c                       e Zd Z ej                  ej                  j                         dd      Z ej                  e	j                  j                         d      Z
 ej                  ej                  j                         d      Z ed      Z ed      Z eddd      Z G d d      Z fd	Z fd
Zd Z xZS )CompanySerializerFTquerysetrequired
allow_null)r   r   r   r   r   use_urlc                       e Zd ZeZdZy)CompanySerializer.MetarZ   Nr   r&   r$   r"   r]   r      r   r$   r]   c                 ~   t         |   |      }|j                  r0|j                  j                  |j                  j                  d|d<   |j
                  r0|j
                  j                  |j
                  j                  d|d<   |j                  r0|j                  j                  |j                  j                  d|d<   |j                  r0|j                  j                  |j                  j                  d|d<   |j                  r0|j                  j                  |j                  j                  d|d<   |S )z9Customize output: return id + name for country/state/city)rf   r    r   r   r   %account_concerned_person_country_code$travel_concerned_person_country_code)	r>   r5   r   rf   r    r   r   r   r   r4   rx   rA   rB   s      r"   r5   z#CompanySerializer.to_representation   s#   w(2##..11 0055'D"#
 !!,,// ..33%D!
   ++.. --22$D 
 99DDGG FFKK=D89
 88CCFF EEJJ<D78
 r$   c                    |j                  dd       }|j                  dd       }|j                  dd       }| j                  d   j                  |d<   t        j                         |d<   |rLt        |t              r't        j                  j                  |d         |d<   nt        |t              r||d<   |rLt        |t              r't        j                  j                  |d         |d<   nt        |t              r||d<   |rLt        |t              r't        j                  j                  |d         |d<   nt        |t              r||d<   t        | -  |      S )	Nr   r   r   r-   r   
created_atrf   rh   )popr1   userr   nowr=   rj   r   rm   r2   r>   create)r4   validated_datacompany_country_dataaccount_country_datatravel_country_datarB   s        r"   r   zCompanySerializer.create"  sW   -112CTJ-112Y[_`,001WY]^'+||I'>'C'C|$'/||~|$.54=4E4E4I4IMabfMg4I4h010)<4H01.5JSJ[J[J_J_cwx|c}J_J~FG0)<J^FG-t4IRIZIZI^I^buvzb{I^I|EF/;I\EFw~n--r$   c                    |j                  dd       }|r%t        |d      r||_        nt        |t              r	 |j                  dd       }|j                  dd       }|j                  dd       }| j
                  d   j                  |d<   t        j                         |d<   |rPt        |t              r)t        j                  j                  |d	   
      |_        nt        |t              r||_        |rPt        |t              r)t        j                  j                  |d	   
      |_        nt        |t              r||_        |rPt        |t              r)t        j                  j                  |d	   
      |_        nt        |t              r||_        |j!                         D ]  \  }}t#        |||        |j%                          |S )Nr   readr   r   r   r-   r   
updated_atrf   rh   )r   hasattrr   r=   r0   r1   r   r   r   rj   r   rm   r2   r   r   r   itemssetattrsave)	r4   rx   r   gst_filer   r   r   attrr(   s	            r"   updatezCompanySerializer.update>  s   !%%&94@x(-5*Hc*  .112CTJ-112Y[_`,001WY]^'+||I'>'C'C|$'/||~|$.5+4+<+<+@+@DXY]D^+@+_(0)<+?(.5AJARARAVAVZnosZtAVAu>0)<AU>-t4@I@Q@Q@U@UYlmqYr@U@s=/;@S= *//1KD%HdE* 2 	r$   )r6   r7   r8   r   PrimaryKeyRelatedFieldr   rm   allr   r   r   r   r   ra   r   r   r:   r   r]   r5   r   r   rD   rE   s   @r"   r   r      s     9k88""&&(5TO 7K66""$uM 6;55##%L ->u,M)+<e+L() "J.8'r$   r   c                        e Zd Z G d d      Zy)UserPermissionsSerializerc                       e Zd ZeZdZy)UserPermissionsSerializer.MetarZ   N)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   r   j  s    r$   r]   Nr^   r&   r$   r"   r   r   i  r_   r$   r   c                       e Zd Z ej                  ej                  j                         dd      Z ej                  e	j                  j                         dd      Z
 G d d      Zy)ClientLogSerializerFTr   c                       e Zd ZeZg dZy)ClientLogSerializer.Meta)rf   ref_client_idref_table_nameref_idaction_typechanged_dataperformed_byperformed_atN)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   r   s  s    	
r$   r]   N)r6   r7   r8   r   r   r   rm   r   r   r   r   r]   r&   r$   r"   r   r   o  sV    6K66@R@R@T_dquvM5;55t||?O?O?Q\anrsL
 
r$   r   c                        e Zd Z fdZ xZS )FlexibleFileFieldc                 F    t        |t              r|S t        |   |      S r   r<   r@   s     r"   r?   z#FlexibleFileField.to_internal_value  "    dC Kw(..r$   r6   r7   r8   r?   rD   rE   s   @r"   r   r         / /r$   r   c                        e Zd Z ej                  ddd      Z edd      Z edd      Z	 G d d      Z
 fdZd Z xZS )	ClientPassportSerializerFTr   allow_blankr   r   r   c                   $    e Zd ZeZg dZdddiiZy)ClientPassportSerializer.Meta)rf   passport_nopassport_expiry_datepassport_file
ref_clientr   
write_onlyTN)r6   r7   r8   r   r[   r\   extra_kwargsr&   r$   r"   r]   r     s    ]$|T&:;r$   r]   c                     t        |t              r|r|d   }t        |t              r5dD ]0  }|j                  |      }t        |t              s%|r|d   nd ||<   2 t        |   |      S )Nr   )r   r   r   )r=   listrj   r2   r>   r?   )r4   rA   kvrB   s       r"   r?   z*ClientPassportSerializer.to_internal_value  sg    dD!d7DdD!MHHQKa&&'adTDG N w(..r$   c                 >    |dv ry t        |      j                         S )NNrS   )r0   striprH   s     r"   validate_passport_noz-ClientPassportSerializer.validate_passport_no  s     J5z!!r$   )r6   r7   r8   r   	CharFieldr   r   r   rJ   r   r]   r?   r   rD   rE   s   @r"   r   r     sG    '+''DUYZK%uFM,eM< <

/"r$   r   c                   h     e Zd Z ej                  ddd      Z G d d      Zd Zd Z fdZ	 xZ
S )	OtherDocumentSerializerFTr   c                   4    e Zd ZeZg dZddidddddddZy)OtherDocumentSerializer.Meta)rf   other_documentother_document_namer   r   TFr   )r   r   r   N)r6   r7   r8   r	   r[   r\   r   r&   r$   r"   r]   r     s+    N'.05T#J+0E
r$   r]   c                 J    |j                   r|j                   j                  S d S r   )r   r.   r   s     r"   get_other_documentz*OtherDocumentSerializer.get_other_document  s!    ),););s!!%%EEr$   c                 V    |j                  d      }|j                  d      }|s|si S |S )Nr   r   r2   )r4   rA   r   r   s       r"   validatez OtherDocumentSerializer.validate  s3    "23"hh'<= &9Ir$   c                     t         |   |      }t        |j                  d      t              r|j                  d   g|j                  d<   |S )Nclient_documents)r>   r?   r=   r2   rj   r@   s     r"   r?   z)OtherDocumentSerializer.to_internal_value  sI    w(. dhh12D9,0HH5G,H+IDHH'(r$   )r6   r7   r8   r   	FileFieldr   r]   r   r   r?   rD   rE   s   @r"   r   r     s9    *[**EdTXYN
 
F r$   r   c                   &   e Zd Z ej                  ej                  j                         dd      Z ej                  ddd      Z
 ej                  ddd      Z ej                  ddd      Z ej                         Z G d d      Zd Zd	 Zy
)ClientVisaSerializerFTr   r   r   c                   $    e Zd ZeZg dZdddiiZy)ClientVisaSerializer.Meta)ref_visa_country	visa_typepassport_size_photographvisa_from_datevisa_to_datepassport_size_photograph_urlr   r   TN)r6   r7   r8   r   r[   r\   r   r&   r$   r"   r]   r    s!    
 <.
r$   r]   c                    |j                  d      xs |j                  d      }t        |t              r||d<   n,|r%	 t        j                  j                  |      |d<   nd|d<   d } ||j                  d            |d<    ||j                  d            |d<   |S # t        j                  $ r t        j                  ddi      w xY w)	z,Clean date fields and resolve country safelyr  ref_visa_country_idpkzInvalid country ID.Nc                     | rt        |       j                         dk(  ry 	 t        j                  t        |       d      j	                         S # t
        $ r Y y w xY wNrS   rM   r0   r   r   strptimedate
ValueErrorr'   s    r"   
clean_datez1ClientVisaSerializer.validate.<locals>.clean_date5  S    CJ,,."4((UZ@EEGG    ,A 	AAr	  r
  )r2   r=   r   rm   DoesNotExistr   rp   )r4   rA   
country_idr  s       r"   r   zClientVisaSerializer.validate$  s     XX01TTXX>S5T
j),'1D#$_+4+<+<+@+@J+@+O'( (,D#$	 ",DHH5E,F!G)$((>*BC^ )) _!113EG\2]^^_s   #B   +Cc                 h    |j                   r	 |j                   j                  S y # t        $ r Y y w xY wr   )r  r.   r  r   s     r"    get_passport_size_photograph_urlz5ClientVisaSerializer.get_passport_size_photograph_urlE  s;    ''33777   s   % 	11N)r6   r7   r8   r   r   r   rm   r   r  r  r  r   r	  r
  r   r  r]   r   r  r&   r$   r"   r  r  	  s     :{99""&&(5T  5{44ePT^bc*[**EtX\]N(;((%TVZ[L $E;#D#D#F 
 
Br$   r  c                       e Zd Z ej                  ddd      Z ej                  ddd      Z ej                  ddd      Z G d d      Z	d Z
d Zy	)
ClientTravelInsuranceSerializerFTr   r   c                        e Zd ZeZdZdddiiZy)$ClientTravelInsuranceSerializer.MetarZ   r   r   TN)r6   r7   r8   r   r[   r\   r   r&   r$   r"   r]   r   V  s    % <.
r$   r]   c                 t    d } ||j                  d            |d<    ||j                  d            |d<   |S )Nc                     | rt        |       j                         dk(  ry 	 t        j                  t        |       d      j	                         S # t
        $ r Y y w xY wr  r  r'   s    r"   r  z<ClientTravelInsuranceSerializer.validate.<locals>.clean_date_  r  r  insurance_from_dateinsurance_to_dater   )r4   rA   r  s      r"   r   z(ClientTravelInsuranceSerializer.validate^  sB    	 '1:O1P&Q"#$.txx8K/L$M !r$   c                 J    |j                   r|j                   j                  S d S r   )insurance_documentr.   r   s     r"   get_insurance_documentz6ClientTravelInsuranceSerializer.get_insurance_documentj  s!    -0-C-Cs%%))MMr$   N)r6   r7   r8   r   r  r&  r   r#  r$  r]   r   r'  r&   r$   r"   r  r  Q  s_    ...$X\]/+//D]ab---u$[_`
 

Nr$   r  c                        e Zd Z G d d      Zy)AirlinesSerializerc                       e Zd ZeZg dZy)AirlinesSerializer.Meta)rf   iataicaoairlinecallsignri   N)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   r+  x  s    Ir$   r]   Nr^   r&   r$   r"   r)  r)  w  s    J Jr$   r)  c                        e Zd Z ej                  ej                  j                         dd      Z G d d      Z	 fdZ
d Z xZS )FrequentflyerSerializerFTr   c                       e Zd ZeZg dZy)FrequentflyerSerializer.Meta)rf   ref_airliner   ff_noN)r6   r7   r8   r
   r[   r\   r&   r$   r"   r]   r3    s    #=r$   r]   c                    t        |t              r'd|v r"|d   }t        |      j                         r:	 t        j
                  j                  t        |            }|j                  |d<   nt        |t              rt        j
                  j                  |      j                         xs^ t        j
                  j                  |      j                         xs. t        j
                  j                  |      j                         }|st        j                  dd| di      |j                  |d<   t        | =  |      S # t        j                  $ r t        j                  dd| di      w xY w)	Nr4  rh   zAirline id 'z' not found.)airline__iexact)iata__iexact)icao__iexactz	Airline ')r=   rj   r0   rl   r   rm   r2   rk   rf   r  r   rp   rn   ro   r>   r?   )r4   rA   airline_valuer.  rB   s       r"   r?   z)FrequentflyerSerializer.to_internal_value  se   dD!mt&; /M=!))+&..22c-6H2IG*1**D'
 M3/$$++M+JPPR S''..M.JPPRS''..M.JPPR 
 %55%=/'N7   '.jj]#w(..!  ,, %55%m_L'Q7  s   8E	 	/E8c           	      T   |j                   |j                  j                  |j                  |j                  rn|j                  j                   |j                  j
                  |j                  j                  |j                  j                  |j                  j                  ddS ddS )zReturn airline details too)rf   r.  r,  r-  ri   rS   )rf   r   r5  r4  )	rf   r   	client_idr5  r4  r.  r,  r-  ri   rw   s     r"   r5   z)FrequentflyerSerializer.to_representation  s     ++"--77^^ %% **--#//77 ,,11 ,,11#//77	
 	
 ,.
 	
r$   )r6   r7   r8   r   r   r   rm   r   r4  r]   r?   r5   rD   rE   s   @r"   r1  r1  ~  s>    4+44h>N>N>R>R>T_dswxK> >/4
r$   r1  c                        e Zd Z G d d      Zy)AssocClientCompanySerializerc                        e Zd ZeZdZdddiiZy)!AssocClientCompanySerializer.MetarZ   r   r   TN)r6   r7   r8   r   r[   r\   r   r&   r$   r"   r]   r@    s    " <.
r$   r]   Nr^   r&   r$   r"   r>  r>    s    
 
r$   r>  c                        e Zd Z G d d      Zy)ClientRelationSerializerc                       e Zd ZeZdZy)ClientRelationSerializer.MetarZ   N)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   rD    s    r$   r]   Nr^   r&   r$   r"   rB  rB    r_   r$   rB  c                   h   e Zd Z edd      Z ej                  ddd      Z ej                  ddd      Z ej                  ddd      Z	 ej                  ddd      Z
 ej                  ddd      Z ej                  ddd      Z ej                  ddd      Z ej                  ddd      Z ej                  ddd      Z ej                   ddd      Z ej$                  dd      Z ej                  ddd      Z ej                  ddd      Z edd      Z G d d      Zy)	FamilyMemberSerializerTFmanyr   r   r   c                       e Zd ZeZg dZy)FamilyMemberSerializer.Meta)client_codeclient_salutationclient_first_nameclient_middle_nameclient_last_namerelationcrossrelationis_prepaymentrg   
contact_noemaildobgender
occupation
aadhaar_noaadhaar_card_filepan_nopan_card_file	passportsrelationsWithOthersNr6   r7   r8   r   r[   r\   r&   r$   r"   r]   rJ    s    
r$   r]   N)r6   r7   r8   r   r\  r   r   rM  rN  rO  rK  rL  rP  rQ  rg   rS  
EmailFieldrT  	DateFieldrU  rV  rW  rB  r]  r]   r&   r$   r"   rF  rF    sU    )dUCI---u$[_`...4\`a,{,,eZ^_'+''DUYZK---u$[_`${$$eRVWH)K))5dW[\M(;((%TVZ[L&&&4TXYJ"K""EtPTUE
+

4
@C"[""EtPTUF&&&4TXYJ 3uM	
 	
r$   rF  c                   t    e Zd Z eddd      Z ej                         Z eddd      Z G d d      Z	d Z
y)ClientSerializerFTNr   r   defaultc                       e Zd ZeZdZy)ClientSerializer.MetarZ   Nr^  r&   r$   r"   r]   rf        r$   r]   c                 ~    |j                   }|r/|j                  |j                  |j                  |j                   dS y )N)rf   rt   r    rg   )rg   rf   rt   r    )r4   r   con_ccs      r"   get_country_code_detailz(ClientSerializer.get_country_code_detail  s7    !! ))&2B2BFKKioi|i|}}r$   )r6   r7   r8   rJ   rU  r   r   rg   anniversary_dater]   rj  r&   r$   r"   rb  rb    s?    
UtT
JC4;446L(%DRVW r$   rb  c                        e Zd Z G d d      Zy)ClientDeleteSerializerc                       e Zd ZeZdZy)ClientDeleteSerializer.MetarZ   Nr^  r&   r$   r"   r]   ro    rg  r$   r]   Nr^   r&   r$   r"   rm  rm    r_   r$   rm  c                        e Zd Z fdZ xZS )r   c                 F    t        |t              r|S t        |   |      S r   r<   r@   s     r"   r?   z#FlexibleFileField.to_internal_value%  r   r$   r   rE   s   @r"   r   r   $  r   r$   c                   ^    e Zd Z ej                  dd      Z eddd      Z edd      Z	y)PassportInSerializerFTr   r   Nrc  r   )
r6   r7   r8   r   r   r   rJ   r   r   r   r&   r$   r"   rs  rs  +  s2    '+''DIK,eVZ[%uFMr$   rs  c                       e Zd Z ej                  dd      Z ej                  dd      Z ej                  dd      Z ej                  dd      Z	y)RelationsWithOthersInSerializerFTr   rt  N)
r6   r7   r8   r   IntegerFieldfrom_client	to_clientr   rP  cross_relationr&   r$   r"   rv  rv  0  sR    *+**EdKK(((%DII${$$eFH*[**EtLNr$   rv  c                      e Zd Z ej                  dd      Z ej                  dd      Z ej                  dd      Z ej                  dd      Z ej                  dd      Z	 ej                  dd      Z
 ej                  dd      Z eddd      Z edd      Z edd      Z ej                  dd      Z ej&                  ddd      Z edd      Z ej                  dd      Z ej                  dd      Z ej                  dd      Z ej4                  dd      Z ej                  dd      Z ej4                  dd      Z edd      Z ej                  dd      Z ej@                  e!jD                  jG                         dd      Z$ ej@                  e%jD                  jG                         dd      Z& edd      Z' ej                  dd      Z(y	)
FamilyMemberInSerializerFTrt  rH  r   r   rG  r   r   r   N))r6   r7   r8   r   r   
clientCode
salutation	firstName
middleNamelastNamerP  rQ  rs  fam_passportrv  r]  ra   countryCode	contactNor_  rT  rJ   rU  rV  rW  	aadhaarNor  aadhaarCardpanNopanCardclient_passportresidential_addressr   r   rm   r   residential_cityr   residential_stateresidential_countryresidential_pincoder&   r$   r"   r|  r|  6  s    '&&4HJ&&&4HJ%%%u$GI&&&4HJ${$$eFH${$$eFH)K))5dKM'TEdSL9teT $UtDK%%%u$GI"K""EtPTUE
Ut
<C"[""EtDF&&&4HJ%%%u$GI'+''4HK!K!!5dCE#k##UtDG +uEO/+//DQ9{99##%$ ;::""$u ,UtL/+//DQr$   r|  c                        e Zd Z G d d      Zy)FamilyMemberOutSerializerc                       e Zd ZeZg dZy)FamilyMemberOutSerializer.Meta)+rK  client_typerL  rM  rN  rO  rU  rg   rR  contacst_norT  rV  r  r  r  r  r  marital_statusrk  reference_fromreference_remarkrW  preferred_contact_methodrX  rZ  rY  r[  ref_preferred_airlinestar_ratingstay_preferenceroom_preferenceextra_amenitiesseat_preferenceseat_preference_othermeal_preferencefare_preferencer   r   r   r   fam_passportsr  r]  Nr^  r&   r$   r"   r]   r  u  s    
r$   r]   Nr^   r&   r$   r"   r  r  l  s    
 
r$   r  c                     |xs g }i }| j                         D ]O  \  }}t        |t              r5||vr1t        |      dk(  r	|d   ||<   1t        |      dk(  rd||<   E|||<   K|||<   Q |S )z
    Convert single-item lists into scalars for all fields except skip_keys.
    Example: {"client_code": ["ABC123"]} -> {"client_code": "ABC123"}
       r   N)r   r=   r   len)rA   	skip_keyscleanedr   r   s        r"   unwrap_scalarsr    s|    
 RIG

1a1I#51v{qT
Q1!

GAJ  Nr$   c                       e Zd Z ed      Z ej                  ej                  j                         dd      Z
 ej                  ej                  j                         dd      Z ej                  ej                  j                         dd      Z ed      Z ej                  ej                  j                         ddd      Z ed      Z eddd      Z eddd      Z eddd      Z eddd      Z eddd      Z eddd      Z e ddd      Z! e"ddd      Z# e$ddd      Z% ejL                  d      Z' ejP                  dd	      Z) ejP                  dd	      Z* ejV                  ddd
      Z, ejV                  ddd
      Z- G d d      Z.de/dz  de/dz  fdZ0d Z1ddZ2d Z3d Z4d Z5d Z6d Z7d Z8	 e9jt                  d        Z;e9jt                  d        Z<	 d Z= fdZ> xZ?S )FullClientSerializerFr   T)r   r   r   r   )r   r   r   r   )	read_onlyr}  r   r   c                       e Zd ZeZg dZdZy)FullClientSerializer.Meta)8r<  rK  r  rL  rM  rP  rQ  rN  rO  rU  rR  rg   rS  rT  rV  r  r  r  r  r  r  rk  r  reference_idr  rW  r  rX  rZ  rY  r[  r  preferred_airliner  r  r  r  r  r  r  r  r  r   r   r   r   r  client_visatravel_insuranceclient_companiesr   client_frequent_flyersfamily_membersfamilyMembersr  r]  )r   r   r   r   N)r6   r7   r8   r   r[   r\   read_only_fieldsr&   r$   r"   r]   r    s    
 Tr$   r]   codeNreturnc                 6    |xs dj                         }|xs d S r   )r   )r4   r  s     r"   _normalize_codez$FullClientSerializer._normalize_code  s    
!!#|tr$   c                     |rt        |      j                         dk(  ry t        |t               r%	 t        j                  |d      j                         S |S # t        $ r Y y w xY wr  )r0   r   r=   r   r  r  r  rH   s     r"   r  zFullClientSerializer.clean_date  sb    E
((*b0eS!((
;@@BB   s   #A 	A#"A#c                 &   i }|j                         D ]  \  }}|dg dgfv rd ||<   t        |t              rt        |      dk(  r|d   n|||<   =t        |t              r|j                         j                  d      rb|j                         j                  d      rC	 t        j                  |      }t        |t              rt        |      dk(  r	|d   ||<   n|||<   |||<    d|v r5|d   t	        |d         j                         dk(  r|j                  d       |rY| j                  j                  d      r>| j                  d   j                  }|j                         D ]  \  }}	|	|v s||	   ||<    |S # t        $ r	 |||<   Y |w xY w)NrS   r  r   []rf   r-   )r   r=   r   r  r0   r   
startswithendswithastliteral_evalr/   r   r1   r2   FILES)
r4   rowfile_mapr  r   r   parsedrequest_filesfield	req_fields
             r"   	clean_rowzFullClientSerializer.clean_row  s   IIKDAqRbTN"!
At$%(Vq[QqTa
As#	(<(<S(AaggiFXFXY\F]# --a0F!&$/CK14D%+AY
%+
 
  $ 7? 5WT]9K9Q9Q9SWY9YKK ((3 LL399M$,NN$4 y-%29%=GEN %5 ! ! #!"GAJ#s   AE>>FFc                    |ddg dgfv ryt        |t              r3t        |      dk(  r|d   }ndj                  t	        t
        |            S t        |t
              rz|j                         j                  d      r[|j                         j                  d      r<	 t        j                  |      }t        |t              rt        |      dk(  r|d   }n|}t        |      j                         xs dS # t        $ r Y (w xY w)u   
        Normalize string/choice/char fields:
        - Handle None, "", [], [""] → None
        - Unwrap single-item lists
        - If it's a stringified list like "['Male']", eval to "Male"
        rS   Nr  r    r  r  )r=   r   r  joinmapr0   r   r  r  r  r  r/   )r4   r(   r  s      r"   	clean_strzFullClientSerializer.clean_str  s     RrB4(( eT"5zQaxxC00 eS!ekkm&>&>s&CH^H^_bHc))%0fd+Fq0@"1IE"E 5z!)T)  s   ;C5 5	D Dc                     |sy	 t        |t              r|S t        |      }|j                  j                  |      j	                         r|S y# t
        t        f$ r Y yw xY w)z<
        Return the ID of the foreign key, or None.
        Nrh   )r=   rk   rm   rn   existsr  	TypeError)r4   model_classr(   	value_ints       r"   safe_fkzFullClientSerializer.safe_fk#  sg     	%%E
I""))Y)7>>@  I& 		s   A 6A A! A!c                 b   g }|sg S t        |t              r|g}|D ]  }d }t        |t              r8|j                  d      xs$ |j                  d      xs |j                  d      }nt        |      }|s[|j	                  t        |      j                         j                                 |S )Nrf   r(   label)r=   r0   rj   r2   appendlowerr   )r4   r(   
normalizedr   keys        r"   "normalize_preferred_contact_methodz7FullClientSerializer.normalize_preferred_contact_methodD  s    
I eS!GEAC!T"eeDkEQUU7^EquuW~!f!!#c(.."2"8"8":;  r$   c                     dD ]?  }|j                  |      }|st        |t              r|c S t        |t              s<|gc S  g S )zc
        Returns a list of passport dicts for a family member by trying all standard keys.
        )r  r  r\  )r2   r=   r   rj   )r4   famr  r(   s       r"   extract_family_passportsz-FullClientSerializer.extract_family_passportsX  sG    
 DCGGCLEeT* Lt,!7N D 	r$   c                    t        |g d      }d }g d}|D ]  }|j                  |g       }g }|D ]5  }t        |t              r|j	                  |       %|j                  |       7 g }|D ]*  }t        |t              s|j                   ||             , |||<    | j                  |j                  d            }	|	r}t        j                  j                  |	      }
| j                  r&|
j                  | j                  j                        }
|
j                         rt        j                   dd|	 di      | j                  s|j                  d	g       D ]p  }| j                  |j                  d
            }|s&t        j                  j                  |      }
|
j                         sWt        j                   dd| di       | j#                  |j                  d            |d<   | j#                  |j                  d            |d<   d }g }|j                  dg       D ]\  }t        |t              rJt%        d |j'                         D              r|j	                   ||             K|j                  |       ]^ t)        |      D ]	  \  }}t        |j                  d      t              r|d   r|d   d   nd |d<   t        |j                  d      t              r|d   r|d   d   nd |d<   d| d}| j*                  j                  d      r:|| j*                  d   j,                  v r| j*                  d   j,                  |   |d<   | j/                  |j                  d            |d<   | j#                  |j                  d            |d<    ||d<   t)        |j                  dg             D ]z  \  }}| j/                  |j                  d            |d<   | j#                  |j                  d            |d<   | j*                  d   j,                  j                  d| d      |d<   | |j                  dg       D ]%  }| j/                  |j                  d            |d<   ' |j                  d g       D ]9  }| j/                  |j                  d!            |d!<   |j                  d"      |d"<   ; t)        |j                  d#g             D ]  \  }}d$| d%}| j*                  j                  d      r:|| j*                  d   j,                  v r| j*                  d   j,                  |   |d&<   | j/                  |j                  d'            |d'<    |j                  d(g       D ]%  }| j/                  |j                  d)            |d)<   ' |j                  d*g       D ]H  }| j#                  |j                  d+            |d+<   | j#                  |j                  d,            |d,<   J |j                  d-g       D ]H  }| j#                  |j                  d.            |d.<   | j#                  |j                  d/            |d/<   J t)        |j                  d	g             D ]  \  }}| j#                  |j                  d            |d<   | j#                  |j                  d            |d<   d|v sRg }|d   D ]\  }t        |t              rJt%        d0 |j'                         D              r|j	                   ||             K|j                  |       ]^ t)        |      D ]=  \  }}t        |j                  d      t              r|d   r|d   d   nd |d<   t        |j                  d      t              r|d   r|d   d   nd |d<   t        |j                  d      t              r|d   r|d   d   nd |d<   d1| d2| d}| j*                  j                  d      r:|| j*                  d   j,                  v r| j*                  d   j,                  |   |d<   | j/                  |j                  d            |d<   | j#                  |j                  d            |d<   @ ||d<    |S )3N)	r  r  r  r  r   r  r  r  r]  )r  c                     t        | j                               D ]A  \  }}t        |t               st        |      dk(  r	|d   | |<   .t        |      dk(  s=d | |<   C | S )Nr  r   )r   r   r=   r  )dr   r   s      r"   normalize_nested_dictz<FullClientSerializer.validate.<locals>.normalize_nested_dictq  sW    QWWY1a&1v{ t!Q1#! ( Hr$   rK  )rK  r  zClient code 'z' already exists.r  r~  family_member_client_coderU  rk  c                    t        d | j                         D              }g }t        |      D ]Z  }i }| j                         D ]2  \  }}t	        |t
              r|t        |      k  s%||   ||<   .|||<   4 |j                  |       \ |S )zY
            Expand a passport dict with lists into multiple passport dicts.
            c              3   \   K   | ]$  }|t        |t              rt        |      nd & y w)Nr  r=   r   r  .0r   s     r"   	<genexpr>zJFullClientSerializer.validate.<locals>.expand_passports.<locals>.<genexpr>  s+     pH^1bcboJq$$7#a&Q>H^s   ,",)maxvaluesranger   r=   r   r  r  )passport_dictmax_lenresultsirecordr  r(   s          r"   expand_passportsz7FullClientSerializer.validate.<locals>.expand_passports  s     pH\H\H^ppGG7^"/"5"5"7JC!%.s5z>*/(F3K&+s #8 v& $ Nr$   r  c              3   \   K   | ]$  }t        |t              xr t        |      d kD   & ywr  Nr  r  s     r"   r  z0FullClientSerializer.validate.<locals>.<genexpr>  s(     N:az!T*9s1vz9:   *,r   r   r   zclient_passport[][passport_file]r-   r   r  fam_passport_nofam_passport_expiry_datezfam_passport[z][fam_passport_file]fam_passport_passport_filer]  relation_with_other_client_coder  designationprimary_companyr   zclient_documents[z][other_document]r   r   r  r5  r  r	  r
  r  r#  r$  c              3   \   K   | ]$  }t        |t              xr t        |      d kD   & ywr  r  r  s     r"   r  z0FullClientSerializer.validate.<locals>.<genexpr>   s(     V:az!T2As1vzA:r  family_members[][fam_passport][)r  r2   r=   r   extendr  rj   r  r   rm   rn   rx   excluder<  r  r   rp   r  anyr  	enumerater1   r  r  )r4   rA   r  nested_fieldsr  val	flat_listitemnormalized_list	main_codeqsr  fam_coder  expanded_passportspr  file_keyrcr  fr   t	fam_indexexpanded_fam_passportspis                              r"   r   zFullClientSerializer.validateg  s    d /
 	

 #E((5"%CIdD)$$T*$$T*	 
 !O!dD)#**+@+FG " *DK # ((-)@A	&&9&=B}}ZZ4==#:#:Z;yy{!11=MR[Q\\mBn2opp}}xx 0"5//0EF..8.DByy{)99;VZghpgq  rC  YD  ;E  F  F 6 oodhhuo6U#'??488<N3O#P 	$  +R0A!T"N188:NN&--.>q.AB&--a0 1 01DAq!%%.5:;M:J1]#3A#6PT- !%% 67>LMNdLeA.D,Ea,Hko() *!,<=H||	*x4<<	;R;X;X/X%)\\)%<%B%B8%L/"  $~~aeeM.BCAm(,>T8U(VA$% 2  #5dhh~r:;DAq#'>>!%%8I2J#KA ,0OOAEEB\<],^A().2ll9.E.K.K.O.OR_`a_bbvPw.xA*+ < /4A37>>!%%HiBj3kA/0 5 ,b1A#~~aeeM.BCAm#$55):#;A  2
 dhh'92>?DAq*1#->?H||	*x4<<	;R;X;X/X&*ll9&=&C&CH&M"#'+~~aee<Q6R'SA#$ @ 2B7Ag7AgJ 8
 -,A"&//!%%8H2I"JA $n0E FAn -
 ,b1A'+quu=R7S'TA#$%)__QUU;N5O%PA!" 2
 (1A2(FGNIs8CJ&*oocgg>P6Q&RC"#$)+&^,A!!T*V188:VV299:J1:MN299!<  - ''=>EB!!%%"6=BCMBR1]+;A+>X\-(!!%%(>"?F<=>T<UA45a8[_ 01 "!%%"8$?565GAo.q1T /*
 "1;KB4O_`H||''	2x4<<PYCZC`C`7`-1\\)-D-J-J8-T/* (,~~aeeM6J'KAm$04F\@]0^A,-) ?* '=N#I HL r$   c                     t         j                  j                  |      }t        |d| j                        j
                  S )Nr   TrH  r1   )r   rm   rn   r  r1   rA   )r4   r   memberss      r"   get_familyMembersz&FullClientSerializer.get_familyMembers"  s2    ..''3'7#G$MRRRr$   c                   67 d }|j                  dg       }|j                  dg       }|j                  dg       }|j                  dg       }|j                  dg       }|j                  dg       }|j                  dg       }	|j                  d	g       }
|j                  d
g       }|j                  dd       }|j                  dd       }|j                  dd       }|j                  dd       }|j                  dd       }|r{t        |t              r$t        j                  j                  |d         }nIt        |t              r!t        j                  j                  |      }nt        |t              r|}nd }nd }||d<   | j                   ||j                  d            t              |d<   | j                   ||j                  d            t              |d<   | j                   ||j                  d            t              |d<   | j                   ||j                  d            t              |d<   | j                  |j                  d            |d<   | j                  |j                  d            |d<   d|d<   d|d<   | j                  j                  d      r%| j                  j                  d      j                  ni }dD ]  }|j                  |      ||<    t        j                  j                   d`i |}|r||_        |r-t        |t              r|n| j                  |t              |_        |r-t        |t              r|n| j                  |t              |_        |r-t        |t              r|n| j                  |t              |_        |r-t        |t              r|n| j                  |t              |_        |j-                          |D ]  }| j/                  |ddi      }t1        |j3                               s2| j5                  |j                  d      xs d      |d<   | j7                  |j                  d      xs d      |d<   |d   s|d   st9        j                  j                   d`d|i|  |D ]k  }| j/                  |d d i      }| j7                  |j                  d!            |d!<   | j7                  |j                  d"            |d"<   |j                  d#d       }|rt        |t:        t        f      r$t        j                  j                  |$      |d#<   nXt        |t              r3t        j                  j                  |j                  d      $      |d#<   nt        |t              r||d#<   |j                  d!      s5|j                  d"      s$|j                  d#      s|j                  d       sKt=        j                  j                   d`d|i| n |D ]  }| j/                  |d%d%i      }t1        |j3                               s2| j7                  |j                  d&            |d&<   | j7                  |j                  d'            |d'<   |d&   s|d'   st?        j                  j                   d`d|i|  |D ]u  }| j/                  |d(d(i      }t1        |j3                               s2| j5                  |j                  d)            |d)<   tA        j                  j                   d`d|i| w 	 |D ]  }| j/                  |      }t1        |j3                               s.|j                  d*      }|sB	 tB        j                  j                  |+      }|jF                  |d,<   |j                  d*d        tI        j                  j                   d`d|i|  |D ]  }| j/                  |      }t1        |j3                               s.|j                  d-      }|sB	 t        j                  j                  |.      }|jF                  |d/<   |j                  d-d        | j5                  |j                  d0            |d0<   tK        j                  j                   d`d|i|  g d1} d2 7d }!i }"tM        |	      D ]  \  }#6t        6t              s	 tO        jP                  6      6tU        67fd3| D              rC| j                  6j                  d4            }$i d|dd5ddd|$d66j                  d7      d86j                  d9      d:6j                  d;      d<6j                  d=      d>6j                  d>      d?6j                  d?      d@6j                  dA      dB6j                  dB      dC| j7                  6j                  dC            dD| j7                  6j                  dD            dE6j                  dE      dF6j                  dF      dG6j                  dH      6j                  dI      6j                  dJ      6j                  dK      6j                  dL      xs |jV                  | j                  t        6j                  d            xs |j&                  | j                  t        6j                  d            xs |j(                  | j                  t        6j                  d            xs |j*                  6j                  dM      xs |jX                  dN}%dO|# dP}&dO|# dQ}'|&|v r|j                  |&      |%dR<   |'|v r|j                  |'      |%dS<   t        j                  j                   d`i |%| j                  j                  d      r| j                  d   jZ                  nd t]        j^                         dT}(6j                  d
g       }tM        |      D ]  \  })}t        |t              s| j5                  |j                  d      xs |j                  dU            }*| j7                  |j                  d      xs |j                  dV            }+dO|# dW|) dX},|j                  |,      }-|*s|+st8        j                  j!                  |(|*|+|-Y        	 	 |!r6j                  d>      r1t`        j                  j!                  |!|(6j                  d>      Z       6j                  d?      s6j                  d[      rF6j                  d?      xs 6j                  d[      }.t`        j                  j!                  |(|!|.\       |(}! |
D ]	  }/t        |/t:              r	 tO        jP                  |/      }/t        |/t              s;|/j                  d]      }0|/j                  d^      }1|/j                  d>      }2|/j                  d[      }3|0|1|"j                  t        |0            }4|4s|"j                  t        |1            }5|5s*	 t        j                  j                  t        |1      $      }5t`        j                  j!                  |4|5|2|3_        |S # tB        jD                  $ r Y fw xY w# t        jD                  $ r Y w xY w# tR        $ r Y w xY w# tR        $ r Y _w xY w# t        jD                  $ r Y yw xY w)aNc                 >    t        | t              r| r| nd } | dvr| S d S )N)rS   re   )r=   r   r'   s    r"   unwrapz+FullClientSerializer.create.<locals>.unwrapP  s'    %&!&D!55?4?r$   r  r  r  r   r  r  r  r]  r  r  r  r  r  rg   rf   rh   r  rK  zPrimary Memberr  r  client_statusr-   )rY  r[  r   )r  r   rS   r   r   r  r	  r
  r  r  r&  r#  r$  r   r   ref_company)company_nameref_company_idr4  )r.  ref_airline_idr5  )r~  r  r  rP  rT  r  c                     | d u xsG t        | t              xr | j                         dk(  xs  t        | t              xr t	        |       dk(  S )NrS   r   )r=   r0   r   r   r  r'   s    r"   is_blank_fieldz3FullClientSerializer.create.<locals>.is_blank_field)  s_    D=  FZs%;%SQS@S  FYcdikoYp  ZEuxy~u  DE  vE  Fr$   c              3   L   K   | ]  } j                  |              y wr   r   )r  r  r  r&  s     r"   r  z.FullClientSerializer.create.<locals>.<genexpr>5  s!     Q?Pe>#''%.1?Ps   !$r~  Family MemberrL  r  rM  r  rN  r  rO  r  rP  rQ  rS  r  rT  rU  rk  rV  rW  rX  r  r  r  r  r  r  )rY  rZ  r[  r  r  r  r  r  r   z][aadhaarCard]z
][panCard]rY  r[  )r   r   
passportNopassportExpiryDater  r  r   r   r   r   rx  ry  rP  crossRelation)rx  ry  rz  	fromIndextoIndex)rx  ry  rP  rz  r&   )1r   r=   rj   r   rm   r2   rk   r  r   r   r   r  r  r1   r  r   r   rg   r  r  r  r  r   r  r  r  r  r  r   r0   r   r   r	   r   r  rf   r   r
   r  r  r  r/   r   r  r  r   r   r   r   )8r4   r   r  passports_data
visas_datainsurances_data	docs_datacompanies_datafrequent_flyers_datafamily_members_datar]  r  r.  ri   statecityrg   country_code_instancer  r!   clientpdvdcountry_valueinsdoccdr"  company_instance
flyer_datar:  airline_instancemeaningful_fieldsprev_family_clientcreated_family_membersr  r  fam_datafam_aadhaar_keyfam_pan_keyfamily_clientpd_indexf_passport_nof_passport_expiry_datefam_passport_keyf_passport_file	cross_relrel
from_indexto_indexrP  rz  rx  target_clientr  r&  s8                                                         @@r"   r   zFullClientSerializer.createM  s]   	@ (++,=rB#''r:
(,,-?D"&&'92>	'++,>C-112JBO,001A2F,001FK&**>2> !$$%<dC $$%:DA""#6=!!"4d;%)).$?  ,-(1(9(9(=(=dAS(=(T%L#.(1(9(9(=(=(=(N%L)4(4%(,%$(! *?~&04VNDVDVWlDm=npy0z,-.2ll6.BTBTUhBi;jlq.r*+-1\\&ASASTfAg:hjp-q)*26,,vnFXFXYpFq?rt|2}./595\5\]k]o]o  qK  ^L  6M12(,(<(<^=O=OP]=^(_}%(8}%*+' >B\\=M=Mi=X((399^`@J)6):)::)FN:& A &&88 !"7F%gx8dll7T\>] ( %gy9t||GU^?_ & #E51t||E57Q $ "40dll46P # 	 !Bo-OPBryy{# $rvvm/D/J KB})-@V9W9][])^B%&- B'=$>&&--FF2F ! B.HJd-efB#'??266:J3K#LB !%1G!HB~ FF#5t<Mmc3Z8-6->->-B-Bm-B-TB)*t4-6->->-B-BmFWFWX\F]-B-^B)*y9-:B)* vv&'266.+ARVVL^E_cecici  kE  dF""))BVBrB# ( #C..0DFZ/[.\Cszz|$)-AV9W)XC%&'+sww?R7S'TC#$()S1D-E%--44NN#N # C..0@BR/S.TC3::< -1^^CGGDY<Z-[)*&&--GG3G	  	B !B#Bryy{#66-0L#*??#6#6L#6#Q  $4#6#6B FF=$'&&--FF2F !  /J
3Jz((*+&NN=9M #+#3#3#7#7#7#N  ,<+>+>J'(NN=$/ #'..1H"IJw  ''..O&OJO- /2 f	F "!#'(;<NIsc4(**3/C Q?PQQ++CGGL,ABHf   x	
 $SWW\%: $SWW[%9 %cggl&; #CGGJ$7 CGGJ/  !9 cggk2 ) tswwu~6 #DOOCGG<N4O$P #''(+  cggl3!" cggk2#$ &)WW]%;'''*!$!3'*ww/D'E'cIcIc'+||IswwG\?]'^'|bhb|b|%)\\%AT9U%V%rZ`ZrZr$(LLAS9T$U$pY_YpYp'*ww/D'E'cIcIc3H8 !0	{.IO+I;jAK-/0=0A0A/0R,-m+,9,=,=k,J)"NN11  kH  kimiuiuiyiy  {D  jEV_I`IeIe  KO  \d  \h  \h  \j  kM  GGNB7M )- 8"!"d+ $rvvm/D/\|H\ ])-@V9W9w[][a[abv[w)x& &5YK?OPXzYi#j "/"3"34D"E %;"**11#0$1-C&5	 2  !9&0.b "77:&"**11$6"/!$!4 2 
 77?+sww/G # 8 TCGGO<TI"**11$1"4'0 2  "/{ =@ 'C#s#**3/C c4(-Jwwy)Hwwz*H WW_5N!X%5044S_EK266s8}EM $*NN$6$6#h-$6$HM ""))''!-	 * 9 'D U ''   (( 8 ! @ ! * ** sZ   ( y5 zz);z9$){	5zzz&%z&)	z65z69	{{	{ { c                    g d}t         t         t        t        d}|D ]  }|j                  |      }|rt	        |t
              r|j                  d      }|j                  |      }t	        |t              r	||| d<   nWt	        ||      r|j                  || d<   n8	 |j                  j                  t        |            }|j                  || d<   |j                  |d         | j                  |j                  d            |d<   | j                  |j                  d            |d<   | j                  |j                  d            |d<   d|v r#| j                  |j                  d            |d<   d	 }	h d
}
|j!                         D ]  \  }}||
v rt#        |||        |j%                          |j                  dg       }g }|D ]  } |	|      r| j                  |j                  d            |d<   |j                  dd       }|rBt'        j                  j)                  ||      j*                  di | |j-                  |       t'        j                  j.                  dd|i|\  }}|j-                  |j                          t&        j                  j)                  |      j1                  |      j3                          |j                  dg       }g }|D ]  } |	|      r| j                  |j                  d            |d<   | j                  |j                  d            |d<   |j                  dd       }|rBt5        j                  j)                  ||      j*                  di | |j-                  |       t5        j                  j.                  dd|i|\  }}|j-                  |j                          t4        j                  j)                  |      j1                  |      j3                          |j                  dg       }g }|D ]  } |	|      r| j                  |j                  d            |d<   | j                  |j                  d            |d<   |j                  dd       }|rBt7        j                  j)                  ||      j*                  di | |j-                  |       t7        j                  j.                  dd|i|\  }}|j-                  |j                          t6        j                  j)                  |      j1                  |      j3                          |j                  dg       }g }|D ]  } |	|      r|j                  dd       }|rBt9        j                  j)                  ||      j*                  di | |j-                  |       bt9        j                  j.                  dd|i|\  }}|j-                  |j                          t8        j                  j)                  |      j1                  |      j3                          |j                  dg       }g }|D ]  } |	|      r|j                  dd       }|rBt;        j                  j)                  ||      j*                  di | |j-                  |       bt;        j                  j.                  dd|i|\  }}|j-                  |j                          t:        j                  j)                  |      j1                  |      j3                          |j                  dg       }g }|D ]  } |	|      r|j                  dd       }|rBt=        j                  j)                  ||      j*                  di | |j-                  |       bt=        j                  j.                  dd|i|\  }}|j-                  |j                          t<        j                  j)                  |      j1                  |      j3                          |S # t        t        |j                  f$ r d || d<   Y w xY w)N)rg   r  r  r  rf   _idrh   rK  rU  rk  r  c                 D    t        d | j                         D               S )Nc              3   2   K   | ]  }|d dg i fvs|  y wr   r&   r  s     r"   r  z@FullClientSerializer.update.<locals>.is_empty.<locals>.<genexpr>A  s!     PjAdBB=O4O1js   )r  r  )r  s    r"   is_emptyz-FullClientSerializer.update.<locals>.is_empty@  s    PahhjPPPPr$   >   r  r  r  r   r  r  r  r   )rf   r   r   r  )id__inr  r	  r
  r  r#  r$  r   r  r  r&   )r   r   r   r2   r=   rj   rk   rf   rm   r  r  r  r   r  r  r  r   r   r   r   rn   r   r  update_or_creater  deleter   r   r	   r   r
   )r4   rx   r   	fk_fields	fk_modelsfk_fieldfk_valuer  fk_instancerY  r  r   r(   r0  keep_idsr;  obj_idr   createdr1  r<  ins_datar>  r3  r?  company_datacompflyers_dataffs                                r"   r   zFullClientSerializer.update  s    e	%#,!& &	
	 "H%))(3Hh-'||D1H'mmH5h,7?NhZs#34+67?{{NhZs#34@&1&9&9&=&=X&=&O;F>>(3'78 x.! "& )-(<(<^=O=OP]=^(_}% $0B0B50I Ju-1__^=O=OPb=c-d)*%79=9`9`""#=>:N56	Q
	
 *//1KD%y HdE* 2
 	 (++,=rB B|)-@V9W)XB%&VVD$'F&&--H-MTTZWYZ'-55FFaRZa^`aW' ! 	%%%:BB(BSZZ\ $''r:
B|#'??266:J3K#LB !%1G!HB~VVD$'F""))V)IPPVSUV')11BB]h]Z\]W'  	!!X!6>>h>OVVX "%%&8"=C})-AV9W)XC%&'+sww?R7S'TC#$WWT4(F%--4484T[[b^ab'4<<MMiYaiehiW'  	%%,,,AIIQYIZaac #&&'92>	C}WWT4(F&&--H-MTT[WZ['-55FFbRZb^abW'  	%%%:BB(BSZZ\ &))*<bA D~XXdD)F"**11V1QXX`[_`'199JJgV^gbfgW' ! 	""))X)>FFhFW^^` %(()A2FB|VVD$'F#++22f2RYY_\^_'2::KKfW_fcefW'  	##**h*?GGxGX__aO '	;3K3KL @;?(3'78@s   7`66"aac                     t        |t              r|gS t        |t              rAg }|D ]8  }t        |t              r|j                  |       %|s(|j	                  |       : |S g S )z
        Ensure the given value is always a list of dicts.
        Handles cases where DRF/multipart wraps in extra list.
        )r=   rj   r   r  r  )r4   r(   flatr   s       r"   ensure_listz FullClientSerializer.ensure_liste	  s]    
 eT"7NeT"Da&KKNKKN	 
 K	r$   c                    t         |   |      }t        |d      r=t        |j                  j                         d| j                        j                  |d<   t        |d      r=t        |j                  j                         d| j                        j                  |d<   t        |d      r=t        |j                  j                         d| j                        j                  |d<   t        |d      r=t        |j                  j                         d| j                        j                  |d<   t        |d      r=t        |j                  j                         d| j                        j                  |d<   t        |d      r=t!        |j"                  j                         d| j                        j                  |d<   | j%                  |      |d	<   |S )
Nr  Tr  r  r  r  r   r  r  )r>   r5   r   r   r  r   r1   rA   r  r  r  r  r>  r  r   r   r1  r  r  r   s      r"   r5   z&FullClientSerializer.to_representationx	  s   w(2 8./&>((,,.T4<<'d "# 8]+"6$$((*t||#d  8/0'F))--/dDLL(d #$ 8/0'C))--/dDLL(d #$ 8/0'>))--/dDLL(d #$ 856-D//335D$,,.d )*
 !% 6 6x @_r$   r   )@r6   r7   r8   ra   rg   r   r   r   rm   r   r  r   r  r   r  r  r   r  r)  r  r   r  r  r  r  r  r>  r  r   r   r1  r  r|  r  rs  r  rv  r]  r   r  r  rY  r[  r   rU  rk  r]   r0   r  r  r  r  r  r  r  r   r  r   atomicr   r   rl  r5   rD   rE   s   @r"   r  r    sz    %e4L<+<<""&&(TE ;::""$u :{99##%$ )%8>K>>HXHXH\H\H^in{  MQ  R*T: /D5UYZO&D5TRK6D5]ab3Z^_.D5UYZ4$[_`-4%TXYN'TEdSL9te`de5K55EM .--uN)K))5TJM  +

DT
RC,{,,eZ^_T T$C$J 3: @*<B(wvSdN	 c ct f fPph&%PIr$   r  c                       e Zd Z ej                  dd      Z ej                  dd      Z ej                  dd      Z G d d      Zy)	ClientDataSerializerz residential_country.country_nameT)sourcer  zresidential_state.state_namezresidential_city.city_namec                       e Zd ZeZdZy)ClientDataSerializer.MetarZ   Nr^  r&   r$   r"   r]   rs    rg  r$   r]   N)	r6   r7   r8   r   r   r  r  r  r]   r&   r$   r"   rp  rp    sX    /+//1T .--- -{,,+t r$   rp  c                   0    e Zd Zej                  d        Zy)FamilyMemberListSerializerc                     | j                   d   }| j                   j                  d      }g }|D ]E  }t        |||d      }|j                  d       |j	                         }|j                  |       G |S )Nprimary_clientr   )rw  r   )rA   r1   T)raise_exception)r1   r2   AddFamilyMemberSerializeris_validr   r  )r4   r   rw  r   r  r	  
serializerrx   s           r"   r   z!FamilyMemberListSerializer.create\  s~    &67\\%%l3
"D2+9TJ 5!(H!!(+ # r$   N)r6   r7   r8   r   rn  r   r&   r$   r"   ru  ru  [  s     r$   ru  c                       e Zd Z eddd      Z ej                  ddd      Z ej                  ddd      Z ej                  ddd      Z
 ej                         Z G d d      Zd Zej                   d	        Z fd
Z xZS )ry  TFr}  r   r   c                       e Zd ZeZeZg dZy)AddFamilyMemberSerializer.Meta)rK  rL  rM  rN  rO  rU  rV  rS  rT  rP  rQ  rX  rY  rZ  r[  r  r   r   N)r6   r7   r8   r   r[   ru  list_serializer_classr\   r&   r$   r"   r]   r~  u  s     :
r$   r]   c                 J    |j                   r|j                   j                  S d S r   )r   usernamer   s     r"   get_created_byz(AddFamilyMemberSerializer.get_created_by  s    *-..s~~&&BdBr$   c                    | j                   j                  d      }| j                   j                  d      }|j                  d      }|r|dv rd |d<   n8t        |t              r(	 t	        j
                  |d      j                         |d<   |j                  dg       }|j                  dd       }|j                  dd       }|j                  d	      r|j                  d
      st        j                  ddi      i d|ddddd	|j                  d	      d
|j                  d
      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  dd      d|j                  d      d|j                  dd      d|j                  dd      d|j                  dd      d||j                  dd      ||d}t        j                  j                  d&i |}	|D ]  }
|
j                  d      xs |
j                  d       }|
j                  d!      }|
j                  d"      xs |
j                  d#      }|s|sat        |t              r%	 t	        j
                  |d      j                         }t        j                  j                  |	|||$        |j                  d      r%t        j                  j                  ||	|d   %       |j                  d      r%t        j                  j                  |	||d   %       |	S # t        $ r	 d |d<   Y w xY w# t        $ r d }Y w xY w)'Nrw  r   rU  )rS   re   NrM   r  rY  r[  rK  rM  detailzIclient_code and client_first_name are required to create a family member.r   r  r(  r   r  rN  rS   rO  rL  rP  rQ  rS  rT  rV  rW  rX  rZ  )rZ  r[  r   r   r)  r   r   expiryr+  r,  r&   )r1   r2   r=   r0   r   r  r  r  r   r   rp   r   rm   r   r   r   )r4   r   rw  r   	dob_valuer0  aadhaar_filepan_filerG  
fam_clientr;  r   r   expiry_values                 r"   r   z AddFamilyMemberSerializer.create  s   ))*:;\\%%l3
 #&&u-	I);;$(N5!	3'-(0(9(9)Z(P(U(U(Wu%
 (++,=rB%))*=tD!%%ot< !!-08J8JK^8_--e/  
.
?
 Q
 >--m<	

  !3!34G!H
 !."4"45I2"N
  2 23Er J
  !3!34G!L
 **:r:
 ^//D
 .,,\2>
 ^''4
 >%%e,
 n((26
 .,,\2>
  .,,\2>!
"  #
$ %((26%$)
0 ^^**6X6
 !B&&/G266,3GKFF?3M66"89MRVVH=ML},,(#+#4#4\:#N#S#S#UL ""))%'%1+	 *  !, <<
#""))*j8T^K_ *  <<(""))&.8TcKd *  Q  -(,u%-h " (#'L(s$   %'M &$M2M/.M/2N ?N c                 p    t         |   |      }|j                  r|j                  j                  |d<   |S )Nr   )r>   r5   r   r  )r4   rx   reprB   s      r"   r5   z+AddFamilyMemberSerializer.to_representation  s6    g'1 ( 3 3 < <C
r$   )r6   r7   r8   r   r  r   r  rY  r[  r   rU  r   r   r]   r  r   rn  r   r5   rD   rE   s   @r"   ry  ry  m  s    .D5UYZO---uW[\)K))5TSWXM
+

DT
RC2224J
 
C S Sj r$   ry  c                   H    e Zd Z ej                         Z G d d      Zd Zy)MenuSerializerc                       e Zd ZeZg dZy)MenuSerializer.Meta)rf   	menu_namemenu_actionmenu_urlmenu_order_nomenu_defaultmenu_statussubmenusN)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   r    s    	
r$   r]   c                 `    t        |j                  j                         d      j                  S )NT)rH  )r  r  r   rA   r   s     r"   get_submenuszMenuSerializer.get_submenus  s"    cll..0t<AAAr$   N)r6   r7   r8   r   r   r  r]   r  r&   r$   r"   r  r    s"    0{002H
 
Br$   r  c                   ,    e Zd Z G d d      Zd Zd Zy)EmailSetupSerializerc                       e Zd ZeZg dZy)EmailSetupSerializer.Meta)rf   report_typeemailsN)r6   r7   r8   r   r[   r\   r&   r$   r"   r]   r    s    0r$   r]   c                 h    |j                  dg       }t        j                  j                  di |}|S )Nr  r&   )r   r   rm   r   )r4   r   emails_datasetups       r"   r   zEmailSetupSerializer.create  s4    $((26""));N;
 r$   c                     |j                  dg       }|j                  d|j                        |_        |j                          |S )Nr  r  )r   r2   r  r   )r4   rx   r   r  s       r"   r   zEmailSetupSerializer.update  sA    $((26  .11-AUAUV r$   N)r6   r7   r8   r]   r   r   r&   r$   r"   r  r    s    1 1r$   r  r   )Mrest_frameworkr   django.contrib.authr   users.modelsr   r   r   r   r	   r
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   	django.dbr   jsonr   django.utilsr   django.utils.dateparser   r#   r)   r  r+   r:   r`  rJ   ModelSerializerrW   ra   rz   r   r   r   r   r   r   r   r   r   r  r  r)  r1  r>  rB  rF  rb  rm  
Serializerrs  rv  r|  r  r  r  r  rp  ListSerializerru  ry  r  r  r&   r$   r"   <module>r     sC   & .} } } } } } "   ! - . 3$;(( /-- /;(( 0-- 0&[00 3
33 3
n k11   [00  K77 )K77 )XA33 AJ ; ; 
+55 
$/-- /"{:: "86r!k99 !VB;66 BPNk&A&A NLJ44 J.
k99 .
b
;#>#> 
{:: >!
[88 !
H{22 6[88 /-- /G;11 G
Mk&<&< M4R{55 4Rl
 ; ; 
4& O;66 Od6Sl;66 "BP"!;!; $r ; ; rjph2hIV@DJ^B[00 B,;66 r$   