o
    )iC                    @   s  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 d d	l"m#Z# d d
l$m%Z%m&Z& d dl'Z'd dl(Z(d dl)m*Z* d dl+m,Z, ddl-m.Z. d dl/m0Z0 e Zdd Z1dd Z2G dd dej3Z4G dd dej3Z5G dd dej3Z4G dd dej6Z7G dd dej8Z9G dd dej8Z:G dd  d ej8Z;G d!d" d"ej8Z<G d#d$ d$ej8Z=G d%d& d&ej8Z>G d'd( d(ej8Z?G d)d* d*ej8Z@G d+d, d,ej8ZAG d-d. d.ej3ZBG d/d0 d0ej8ZC	 G d1d2 d2ej8ZDG d3d4 d4ej8ZEG d5d6 d6ej8ZFG d7d8 d8ej8ZGG d9d: d:ej8ZHG d;d< d<ej8ZIG d=d> d>ej8ZJ	 G d?d@ d@ej8ZKG dAdB dBej8ZLG dCdD dDej8ZMG dEdF dFej8ZNG dGd. d.ej3ZBG dHdI dIejOZPG dJdK dKejOZQG dLdM dMejOZRG dNdO dOej8ZSd^dPdQZTd dlUZUG dRdS dSej8ZVG dTdU dUej8ZW	 G dVdW dWejXZYG dXdY dYej8ZZ	 	 	 	 	 G dZd[ d[ej8Z[G d\d] d]ej8Z\d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_date)BytesIO)InMemoryUploadedFileTemporaryUploadedFile)Q)DjangoJSONEncoder   )build_changes)serialize_client_with_relatedc                 C   s   | r| j S d S N)name)
file_field r(   O/var/www/html/myvaluetrips/my_value_trip_new/my_value_trip/users/serializers.pyget_file_name$   s   r*   c                 C   s   | r| S dS )zq
    Return the provided file object if it exists,
    otherwise return None to prevent invalid assignments.
    Nr(   valuer(   r(   r)   safe_get_file'   s   r-   c                   @   s   e Zd Zdd ZdS )FileUrlFieldc                 C   sL   |sd S z|j }W n ty   t| Y S w | jd}|r$||S |S )Nrequest)url	Exceptionstrcontextgetbuild_absolute_uri)selfr,   r0   r/   r(   r(   r)   to_representation/   s   

FileUrlField.to_representationN)__name__
__module____qualname__r7   r(   r(   r(   r)   r.   .   s    r.   c                       s    e Zd ZdZ fddZ  ZS )OptionalFileFieldz<Accepts either an uploaded file or a string (existing path).c                       t |tr|S t |S r%   
isinstancer2   superto_internal_valuer6   data	__class__r(   r)   rA   =   s   
z#OptionalFileField.to_internal_value)r9   r:   r;   __doc__rA   __classcell__r(   r(   rD   r)   r<   ;   s    r<   c                   @   s   e Zd ZdZdd ZdS )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                 C   s,   |sd S z|j W S  ty   t| Y S w r%   )r0   r1   r2   r6   r,   r(   r(   r)   r7   K   s   r8   N)r9   r:   r;   rF   r7   r(   r(   r(   r)   r.   F   s    c                       s4   e Zd Z fddZ fddZ fddZ  ZS )FlexibleDateFieldc                    s$   | ddg t j|i | d S )Ninput_formats%Y-%m-%d)
setdefaultr@   __init__)r6   argskwargsrD   r(   r)   rM   U   s   zFlexibleDateField.__init__c                    s   |dv rd S t  |S )N) N)r@   rA   rH   rD   r(   r)   rA   Z   s   z#FlexibleDateField.to_internal_valuec                    s   |sd S t  |S r%   )r@   r7   rH   rD   r(   r)   r7   `   s   z#FlexibleDateField.to_representation)r9   r:   r;   rM   rA   r7   rG   r(   r(   rD   r)   rI   T   s    rI   c                   @      e Zd ZG dd dZdS )UserSerializerc                   @      e Zd ZeZdZdS )zUserSerializer.Meta__all__N)r9   r:   r;   r   modelfieldsr(   r(   r(   r)   Metah       rW   Nr9   r:   r;   rW   r(   r(   r(   r)   rR   g       rR   c                       s2   e Zd ZG dd dZ fddZdd Z  ZS )CountrySerializerc                   @   rS   )zCountrySerializer.MetarT   N)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW   n   rX   rW   c                    s   |dv rddiS t |trt |S t |ttfrNt| rNt|}tjj	|d
 }|r4d|jiS tjj	|d
 }|rDd|jiS tdd| itdd| i)	zA
        Normalize incoming value into a dict with 'id'.
        )NrP   nullidN)country_coder]   countryzInvalid country id or code: zInvalid input for country: )r?   dictr@   rA   intr2   isdigitr   objectsfilterfirstr]   r   ValidationError)r6   rC   	num_valuer`   rD   r(   r)   rA   r   s$   


z#CountrySerializer.to_internal_valuec                 C   s*   |d u rd S |j |j|j|j|j|jdS )Nr]   r&   	shortnamer^   
min_length
max_lengthri   r6   instancer(   r(   r)   r7      s   z#CountrySerializer.to_representation)r9   r:   r;   rW   rA   r7   rG   r(   r(   rD   r)   r[   m   s    $r[   c                   @   rQ   )StateSerializerc                   @      e Zd ZeZddgZdS )zStateSerializer.Metar]   r&   N)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW          rW   NrY   r(   r(   r(   r)   ro      rZ   ro   c                   @   rQ   )CitySerializerc                   @   rp   )zCitySerializer.Metar]   r&   N)r9   r:   r;   r
   rU   rV   r(   r(   r(   r)   rW      rq   rW   NrY   r(   r(   r(   r)   rr      rZ   rr   c                   @   rQ   )CompanydataSerializerc                   @   rS   )zCompanydataSerializer.MetarT   Nr9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW      rX   rW   NrY   r(   r(   r(   r)   rs      s    
rs   c                   @   sr   e Zd Ze Ze Ze Ze Ze Z	G dd dZ
dd Zdd Zdd Zd	d
 Zdd Zdd ZdS )CompanyDataSerializerc                   @   rS   )zCompanyDataSerializer.MetarT   Nrt   r(   r(   r(   r)   rW      rX   rW   c                 C      |j rt|j S d S r%   )
created_byr2   r6   objr(   r(   r)   get_created_by_name      z)CompanyDataSerializer.get_created_by_namec                 C   rv   r%   )
updated_byr2   rx   r(   r(   r)   get_updated_by_name   r{   z)CompanyDataSerializer.get_updated_by_namec                 C   s   |j j|j r|j jfS d fS r%   )company_countryr&   r^   rx   r(   r(   r)   get_company_country   s   z)CompanyDataSerializer.get_company_countryc                 C      |j r|j jS d S r%   )company_stater&   rx   r(   r(   r)   get_company_state      z'CompanyDataSerializer.get_company_statec                 C   r   r%   )company_cityr&   rx   r(   r(   r)   get_company_city   r   z&CompanyDataSerializer.get_company_cityc                 C   r   r%   )gst_document_filer0   rx   r(   r(   r)   get_gst_document_file   s   z+CompanyDataSerializer.get_gst_document_fileN)r9   r:   r;   r   SerializerMethodFieldcreated_by_nameupdated_by_namer~   r   r   rW   rz   r}   r   r   r   r   r(   r(   r(   r)   ru      s    ru   c                       s   e Zd Zejej dddZeje	j dddZ
ejej dddZejej dddZejej dddZeddddZG dd dZ fddZ  ZS )	CompanySerializerFTquerysetrequired
allow_nullr   r   use_urlc                   @   rS   )zCompanySerializer.MetarT   Nrt   r(   r(   r(   r)   rW     rX   rW   c                    s   t  |}|jr|jj|jj|jjd|d< |jr%|jj|jjd|d< |jr3|jj|jjd|d< |jrD|jj|jj|jjd|d< |j	rU|j	j|j	j|j	jd|d< |S )N)r]   r&   r^   r~   )r]   r&   r   r   %account_concerned_person_country_code$travel_concerned_person_country_code)
r@   r7   r~   r]   r&   r^   r   r   r   r   r6   rn   rC   rD   r(   r)   r7     s2   




z#CompanySerializer.to_representation)r9   r:   r;   r   PrimaryKeyRelatedFieldr   rd   allr~   r   r   r
   r   r   r   r<   r   rW   r7   rG   r(   r(   rD   r)   r     s&    r   c                   @   rQ   )UserPermissionsSerializerc                   @   rS   )zUserPermissionsSerializer.MetarT   N)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW     rX   rW   NrY   r(   r(   r(   r)   r     rZ   r   c                   @   sT   e Zd Zejej dddZeje	j dddZ
ejdddZG dd dZdS )ClientLogSerializerFTr   r   r   c                   @      e Zd ZeZg dZdS )zClientLogSerializer.Meta)r]   ref_client_idref_table_nameref_idaction_typechanged_dataperformed_byperformed_atN)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW     rq   rW   N)r9   r:   r;   r   r   r   rd   r   r   r   r   IntegerFieldr]   rW   r(   r(   r(   r)   r     s
    r   c                          e Zd Z fddZ  ZS )FlexibleFileFieldc                    r=   r%   r>   rB   rD   r(   r)   rA        
#FlexibleFileField.to_internal_valuer9   r:   r;   rA   rG   r(   r(   rD   r)   r         r   c                       sv   e Zd ZejddddZejddddZejdddZ	ej
dddZG dd dZ fdd	Zd
d Zdd Z  ZS )ClientPassportSerializerFTr   allow_blankr   r   r   c                   @   s*   e Zd ZeZg dZddiddidZdS )zClientPassportSerializer.Meta)r]   passport_nopassport_expiry_datepassport_file
ref_client
write_onlyT	read_only)r   r]   N)r9   r:   r;   r   rU   rV   extra_kwargsr(   r(   r(   r)   rW   !  s    
rW   c                    s   t |tr|r|d }t |tr:dD ]'}||}t |tr(|r$|d nd ||< |dkr9|r9t |ttfs9d ||< qt |S )Nr   )r   r   r   r   )r?   listra   r4   r   r   r@   rA   )r6   rC   kvrD   r(   r)   rA   )  s   


z*ClientPassportSerializer.to_internal_valuec                 C   s   |dv rd S t | S )NNrP   )r2   striprH   r(   r(   r)   validate_passport_no7  s   z-ClientPassportSerializer.validate_passport_noc                 C   (   |d u rd S t |ttfstd|S )Nz&Invalid file format for passport_file.r?   r   r   r   rg   rH   r(   r(   r)   validate_passport_file<  
   
z/ClientPassportSerializer.validate_passport_file)r9   r:   r;   r   	CharFieldr   	FileFieldr   	DateFieldr   r   r]   rW   rA   r   r   rG   r(   r(   rD   r)   r     s    r   c                   @   sX   e Zd ZejddddZejdddZejddddZ	G dd dZ
dd	 Zd
d ZdS )OtherDocumentSerializerFTr   r   r   c                   @   s6   e Zd ZeZg dZddiddddddddZdS )	zOtherDocumentSerializer.Meta)r]   other_documentother_document_namer   r   TF)r   r   r   r   )r   r   r   N)r9   r:   r;   r   rU   rV   r   r(   r(   r(   r)   rW     s    

rW   c              	   C   s*  |  }|d}|d}d|v r?|d r?zt|d |d< tjj|d d s.d |d< W n ttfy>   d |d< Y nw | j	dd}d| d}| j	d	re|| j	d	 j
v re| j	d	 j
| |d< n| j	d	r|| j	d	 jv r| j	d	 j| d
v rd |d< d|v r|d r|d  nd |d< |S )Nr   r   r]   r_   indexr   client_documents[][other_document]r/   rP   r\   N)copyr4   rb   r   rd   re   exists
ValueError	TypeErrorr3   FILESrC   r   )r6   rC   r   r   r   file_keyr(   r(   r)   validate  s*   

0z OtherDocumentSerializer.validatec                 C   r   r%   )r   r0   rx   r(   r(   r)   get_other_document  r   z*OtherDocumentSerializer.get_other_documentN)r9   r:   r;   r   r   r   r   r]   r   r   rW   r   r   r(   r(   r(   r)   r     s    	r   c                   @   s   e Zd Zejej dddZej	ddddZ
ejddddZejddddZe ZejdddZG dd dZd	d
 Zdd ZdS )ClientVisaSerializerFTr   r   r   r   c                   @   s.   e Zd ZeZg dZdddiiZede dS )zClientVisaSerializer.Meta)r]   ref_visa_country	visa_typepassport_size_photographvisa_from_datevisa_to_datepassport_size_photograph_urlr   r   Tz>>>>>fields<<<<<<<<<<N)r9   r:   r;   r   rU   rV   r   printr(   r(   r(   r)   rW     s    
rW   c                 C   s   | dp	| d}t|tr||d< n!|r1ztjj |d|d< W n tjy0   tddiw d|d< dd }|| d|d< || d	|d	< |S )
z,Clean date fields and resolve country safelyr   ref_visa_country_idpkzInvalid country ID.Nc                 S   D   | r
t |  dkrd S ztt | d W S  ty!   Y d S w NrP   rK   r2   r   r   strptimedater   r+   r(   r(   r)   
clean_date
     z1ClientVisaSerializer.validate.<locals>.clean_dater   r   )r4   r?   r   rd   DoesNotExistr   rg   )r6   rC   
country_idr   r(   r(   r)   r     s   

zClientVisaSerializer.validatec                 C   s*   |j rz|j jW S  ty   Y d S w d S r%   )r   r0   r   rx   r(   r(   r)    get_passport_size_photograph_url  s   
z5ClientVisaSerializer.get_passport_size_photograph_urlN)r9   r:   r;   r   r   r   rd   r   r   r   r   r   r   r   r   r   r   r]   rW   r   r   r(   r(   r(   r)   r     s    !r   c                   @   sh   e Zd ZejddddZejddddZejddddZej	dddZ
G dd dZdd	 Zd
d ZdS )ClientTravelInsuranceSerializerFTr   r   r   c                   @   s$   e Zd ZeZg dZdddiiZdS )z$ClientTravelInsuranceSerializer.Meta)r]   insurance_documentinsurance_from_dateinsurance_to_dater   r   r   TN)r9   r:   r;   r   rU   rV   r   r(   r(   r(   r)   rW   R  s
    rW   c              	   C   s   |  }dd }||d|d< ||d|d< d|v rK|d rKzt|d |d< tjj|d d s:d |d< W n ttfyJ   d |d< Y nw | j	dd}d	| d
}| j	drr|| j	d j
v rr| j	d j
| |d< |S | j	dr|| j	d jv r| j	d j| dv rd |d< |S )Nc                 S   r   r   r   r+   r(   r(   r)   r   [  r   z<ClientTravelInsuranceSerializer.validate.<locals>.clean_dater   r   r]   r_   r   r   ztravel_insurance[z][insurance_document]r/   r   r   )r   r4   rb   r   rd   re   r   r   r   r3   r   rC   )r6   rC   r   r   r   r(   r(   r)   r   Y  s*   0z(ClientTravelInsuranceSerializer.validatec                 C   r   r%   )r   r0   rx   r(   r(   r)   get_insurance_documenty  r   z6ClientTravelInsuranceSerializer.get_insurance_documentN)r9   r:   r;   r   r   r   r   r   r   r   r]   rW   r   r   r(   r(   r(   r)   r   L  s     r   c                   @   (   e Zd ZejdddZG dd dZdS )AirlinesSerializerFTr   c                   @   r   )zAirlinesSerializer.Meta)r]   iataicaoairlinecallsignr`   N)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW   ~  s    rW   Nr9   r:   r;   r   r   r]   rW   r(   r(   r(   r)   r   |      r   c                       sV   e Zd Zejej dddZej	dddZ
G dd dZ fddZd	d
 Z  ZS )FrequentflyerSerializerFTr   r   c                   @   r   )zFrequentflyerSerializer.Meta)r]   ref_airliner   ff_noN)r9   r:   r;   r	   rU   rV   r(   r(   r(   r)   rW     rq   rW   c              	      s   t |trid|v ri|d }t| r7ztjjt|d}|j|d< W nE tj	y6   t
dd| diw t |tritjj|d pVtjj|d pVtjj|d }|sdt
dd| di|j|d< t |S )	Nr   r_   zAirline id 'z' not found.)airline__iexact)iata__iexact)icao__iexactz	Airline ')r?   ra   r2   rc   r   rd   r4   rb   r]   r   r   rg   re   rf   r@   rA   )r6   rC   airline_valuer   rD   r(   r)   rA     s.   

z)FrequentflyerSerializer.to_internal_valuec              	   C   sD   |j |jj|j|jr|jj |jj|jj|jj|jjddS ddS )zReturn airline details too)r]   r   r   r   r`   rP   )r]   r   r   r   )	r]   r   	client_idr   r   r   r   r   r`   rm   r(   r(   r)   r7     s   
z)FrequentflyerSerializer.to_representation)r9   r:   r;   r   r   r   rd   r   r   r   r]   rW   rA   r7   rG   r(   r(   rD   r)   r     s    r   c                   @   r   )AssocClientCompanySerializerFTr   c                   @   s    e Zd ZeZdZdddiiZdS )z!AssocClientCompanySerializer.MetarT   r   r   TN)r9   r:   r;   r   rU   rV   r   r(   r(   r(   r)   rW     s
    rW   Nr   r(   r(   r(   r)   r     r   r   c                   @   r   )ClientRelationSerializerFTr   c                   @   rS   )zClientRelationSerializer.MetarT   N)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW     rX   rW   Nr   r(   r(   r(   r)   r     r   r   c                   @   sR  e Zd ZejdddZejdddZe Z	e Z
e ZejddddZejddddZejd	ddd
Zejd	ddd
Zejd	ddd
Zejd	ddd
Zejd	ddd
Zejd	ddd
Zejd	ddd
Ze Zejd	ddd
Zejd	ddd
Zed	ddZejd	ddd
Zejd	ddd
ZG dd dZdd Zdd Z dd Z!dd Z"dS )FamilyMemberSerializerr   Tsourcer   client_typeget_client_status_displayr   r   r   %d-%m-%Yformatr   r   Fr   r   c                   @   r   )zFamilyMemberSerializer.Meta)r]   client_codeclient_salutation	full_nameclient_first_nameclient_middle_nameclient_last_name
contact_noemailresidential_city	companiesrelationcrossrelationtype
created_atclient_statusstatus_label	is_activedobr^   gender
occupation
aadhaar_noaadhaar_card_filepan_nopan_card_fileNr9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW   Q  rq   rW   c                 C   s4   |j pd|jpd|jpdg}ddd |D  S )NrP    c                 s   s    | ]}|r|V  qd S r%   r(   ).0partr(   r(   r)   	<genexpr>\  s    z7FamilyMemberSerializer.get_full_name.<locals>.<genexpr>)r  r  r	  joinr   )r6   ry   partsr(   r(   r)   get_full_nameZ  s   z$FamilyMemberSerializer.get_full_namec                 C      dd |j  D S )Nc                 S   s:   g | ]}|j r|j jnd |j r|j jnd |j|jdqS N)
company_idcompany_namedesignationprimary_company)ref_companyr]   r'  r(  r)  r  assocr(   r(   r)   
<listcomp>_  s    z8FamilyMemberSerializer.get_companies.<locals>.<listcomp>client_companiesr   rx   r(   r(   r)   get_companies^  s   z$FamilyMemberSerializer.get_companiesc                 C   sZ   z"| j d}|r||W S |j}|r |j|j|j|jdW S W d S  ty,   Y d S w )Nparent_serializerr]   rj   r&   r^   )r3   r4   get_country_code_detailr^   r]   rj   r&   AttributeError)r6   ry   r1  con_ccr(   r(   r)   get_country_codei  s   z'FamilyMemberSerializer.get_country_codec                 C   s0   z|j }|rt|W S d W S  ty   Y d S w r%   )r  r2   r4  )r6   ry   cityr(   r(   r)   get_residential_city{  s   z+FamilyMemberSerializer.get_residential_cityN)#r9   r:   r;   r   r   r]   r   r  r   r  r  r  r  DateTimeFieldr  r  r  r	  r  r  r  r  r^   r
  
EmailFieldr  rI   r  r  r  rW   r#  r0  r6  r8  r(   r(   r(   r)   r   ;  s4    	r   c                   @   sd   e Zd ZejdddZejdddZe Z	e Z
eddddZG dd	 d	Zd
d Zdd ZdS )ClientExportSerializerr   Tr   r   FNr   r   defaultc                   @   r   )zClientExportSerializer.Meta)r]   r  r  r
  is_prepaymentr  r  r  r  r  r  r  r  r	  r  Nr  r(   r(   r(   r)   rW   *  rq   rW   c                 C   ,   d td |jpd|jpd|jpdg S Nr  rP   r!  re   r  r  r	  r   rx   r(   r(   r)   r#  2     z$ClientExportSerializer.get_full_namec                 C   rv   r%   r  r2   rx   r(   r(   r)   r8  ;     z+ClientExportSerializer.get_residential_city)r9   r:   r;   r   r   r]   r   r  r   r  r  rI   r  rW   r#  r8  r(   r(   r(   r)   r;  #  s    	r;  c                   @   s   e Zd ZejdddZejdddZe Z	e Z
e Ze ZejddddZejddddZed	dd
dZe Zed	dd
dZG dd dZdd Zdd Zdd Zdd Zdd Zd
S )ClientSerializerr   Tr   r   r   r   r  r  FNr<  c                   @   r   )zClientSerializer.Meta)r]   r  r  r
  r>  r  r  r  r  r  r  r  r  family_membersr  r^   anniversary_dater  r  r  r	  r  r  r  r  r  r  Nr  r(   r(   r(   r)   rW   M  rq   rW   c                 C   r?  r@  rA  rx   r(   r(   r)   r#  W  rB  zClientSerializer.get_full_namec                 C   r$  )Nc                 S   s.   g | ]}|j |jr|jjnd |j|jdqS r%  )ref_company_idr*  r'  r(  r)  r+  r(   r(   r)   r-  a  s    z2ClientSerializer.get_companies.<locals>.<listcomp>r.  rx   r(   r(   r)   r0  _  s   zClientSerializer.get_companiesc                 C   s(   |j r|j j|j j|j j|j j dS d S )Nr2  )r^   r]   rj   r&   rx   r(   r(   r)   r6  k  s   z!ClientSerializer.get_country_codec                 C   s(   t |j d| jd| dd}|jS )NTr/   )r/   r1  manyr3   )r   related_clientsr   r3   r4   rC   )r6   ry   
serializerr(   r(   r)   get_family_membersv  s   z#ClientSerializer.get_family_membersc                 C   rv   r%   rC  rx   r(   r(   r)   r8    rD  z%ClientSerializer.get_residential_city)r9   r:   r;   r   r   r]   r   r  r   r  r  r  rF  r  r9  r  rI   r  r^   rG  rW   r#  r0  r6  rM  r8  r(   r(   r(   r)   rE  @  s$    
	rE  c                   @   rQ   )ClientDeleteSerializerc                   @   rS   )zClientDeleteSerializer.MetarT   Nr  r(   r(   r(   r)   rW     rX   rW   NrY   r(   r(   r(   r)   rN    rZ   rN  c                       r   )r   c                    r=   r%   r>   rB   rD   r(   r)   rA     r   r   r   r(   r(   rD   r)   r     r   c                   @   s4   e Zd ZejdddZeddddZedddZ	dS )PassportInSerializerFTr   r   Nr<  r   )
r9   r:   r;   r   r   r   rI   r   r   r   r(   r(   r(   r)   rO    s    rO  c                   @   sD   e Z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	dS )RelationsWithOthersInSerializerFTr   rP  N)
r9   r:   r;   r   r   from_client	to_clientr   r  cross_relationr(   r(   r(   r)   rQ    s
    rQ  c                   @   s  e Z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ddddZedddZedddZejdddZejddd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dddZejdddZejdddZedddZ ejdddZ!ej"e#j$% dddZ&ej"e'j$% dddZ(edddZ)ejdddZ*d	S )
FamilyMemberInSerializerFTr   rP  rJ  r   r   )rJ  r   r   r   N)+r9   r:   r;   r   r   r]   r   
clientCode
salutation	firstName
middleNamelastNamer  r  rO  fam_passportrQ  relationsWithOthersr[   countryCode	contactNor:  r  rI   r  r  r  	aadhaarNor   aadhaarCardpanNopanCardclient_passportresidential_addressr   r
   rd   r   r  r   residential_stateresidential_countryresidential_pincoder(   r(   r(   r)   rU    s>    	rU  c                   @   rQ   )FamilyMemberOutSerializerc                   @   r   )zFamilyMemberOutSerializer.Meta)+r  r   r  r  r  r	  r  r^   r>  contacst_nor  r  re  r  rf  rg  rh  marital_statusrG  reference_fromreference_remarkr  preferred_contact_methodr  r  r  r  ref_preferred_airlinestar_ratingstay_preferenceroom_preferenceextra_amenitiesseat_preferenceseat_preference_othermeal_preferencefare_preferencer  rw   
updated_atr|   fam_passportsrd  r]  Nr  r(   r(   r(   r)   rW     rq   rW   NrY   r(   r(   r(   r)   ri    s    	ri  c                 C   sv   |pg }i }|   D ].\}}t|tr4||vr4t|dkr$|d ||< q
t|dkr/d||< q
|||< q
|||< q
|S )z
    Convert single-item lists into scalars for all fields except skip_keys.
    Example: {"client_code": ["ABC123"]} -> {"client_code": "ABC123"}
    r"   r   Nitemsr?   r   len)rC   	skip_keyscleanedr   r   r(   r(   r)   unwrap_scalars  s   


r  c                       s  e Zd Zejej dddZejej dddZ	eje
j dddZejej dddZejej dddZeddZejej dddZeddddZeddddZeddddZeddddZeddddZeddddZeddddZ e!ddddZ"e#ddddZ$ej%ddZ&ej'dddZ(ej'dddZ)ej*ddddZ+ej*ddddZ,G dd	 d	Z-d
e.dB de.dB fddZ/dd Z0d'ddZ1dd Z2dd Z3dd Z4dd Z5dd Z6dd Z7e8j9dd  Z:e8j9d!d" Z;d#d$ Z< fd%d&Z=  Z>S )(FullClientSerializerFTr   )r   rV  r   r   c                   @   s   e Zd ZeZg dZdZdS )zFullClientSerializer.Meta)8r   r  r   r  r  r  r  r  r	  r  r>  r^   r
  r  r  re  r  rf  rg  rh  rk  rG  rl  reference_idrm  r  rn  r  r  r  r  ro  preferred_airlinerp  rq  rr  rs  rt  ru  rv  r   rw  r  rw   rx  r|   rd  client_visatravel_insurancer/  client_documentsclient_frequent_flyersrF  familyMembersr\  r]  )r  rw   rx  r|   N)r9   r:   r;   r   rU   rV   read_only_fieldsr(   r(   r(   r)   rW     s    rW   codeNreturnc                 C   s   |pd  }|p	d S r   )r   )r6   r  r(   r(   r)   _normalize_code  s   z$FullClientSerializer._normalize_codec                 C   sN   |r
t | dkrd S t|t r%z	t|d W S  ty$   Y d S w |S r   )r2   r   r?   r   r   r   r   rH   r(   r(   r)   r     s   
zFullClientSerializer.clean_datec           
   	   C   s^  t d| i }| D ]g\}}|dg dgfv rd ||< qt|tr0t|dkr+|d n|||< qt|trn| drn| drnzt	
|}t|tr[t|dkr[|d ||< n|||< W q tym   |||< Y qw |||< qd|v r|d d u st|d  dkr|d |r| jdr| jd j}| D ]\}}	|	|v r||	 ||< q|S )	Nz$>>>>>>> clean_row Details <<<<<<<<<<rP   r"   r   []r]   r/   )r   r{  r?   r   r|  r2   r   
startswithendswithastliteral_evalr1   popr3   r4   r   )
r6   rowfile_mapr~  r   r   parsedrequest_filesfield	req_fieldr(   r(   r)   	clean_row  s6   


&

(
zFullClientSerializer.clean_rowc                 C   s   t d| 	 |dd g dgfv rd S t|tr)t|dkr!|d }ndtt|S t|tr_| dr_| 	dr_zt
|}t|trRt|dkrR|d }n|}W n	 ty^   Y nw t| pfd S )Nz$>>>>>>> clean_str Details <<<<<<<<<<rP   r"   r   r  r  r  )r   r?   r   r|  r!  mapr2   r   r  r  r  r  r1   )r6   r,   r  r(   r(   r)   	clean_str  s&   


&

zFullClientSerializer.clean_strc              	   C   sd   t d| 	 |s
d S zt|tr|W S t|}|jj|d r#|W S W d S  ttfy1   Y d S w )Nz">>>>>>> safe_fk Details <<<<<<<<<<r_   )r   r?   rb   rd   re   r   r   r   )r6   model_classr,   	value_intr(   r(   r)   safe_fk  s   

zFullClientSerializer.safe_fkc                 C   s   t d| g }|sg S t|tr|g}|D ]*}d }t|tr.|dp,|dp,|d}nt|}|r?|t|   q|S )Nz<>>>>>>> normalize_preferred_contact_method Details<<<<<<<<<<r]   r,   label)r   r?   r2   ra   r4   appendlowerr   )r6   r,   
normalizedr   keyr(   r(   r)   "normalize_preferred_contact_method  s   


 z7FullClientSerializer.normalize_preferred_contact_methodc                 C   sB   dD ]}| |}|rt|tr|  S t|tr|g  S qg S )zc
        Returns a list of passport dicts for a family member by trying all standard keys.
        )r\  rd  	passports)r4   r?   r   ra   )r6   famr  r,   r(   r(   r)   extract_family_passports'  s   



z-FullClientSerializer.extract_family_passportsc           !   
   C   s  dd }||g dd}dd }g d}|D ]I}| |g }|d u r'g ||< qg }|D ]}t|tr8|| q+|| q+g }	|D ]}t|trQ|	|| qB|d u rZ|	d  qB|	||< q| | d}
|
rtjj	|
d	}| j
r||j| j
jd
}| rtdd|
 di| j
s| dg D ]"}| | d}|rtjj	|d	}| rtdd| diqd|v r| | d|d< d|v r| | d|d< dd }g }| dg D ] }t|trtdd | D r||| q|| qqt|D ]\}}t| dtr |d r|d d nd |d< t| dtr8|d r4|d d nd |d< d| d}| j drY|| jd jv rY| jd j| |d< nd|v ri|d dv rid |d< d|v rx| | d|d< d|v r| | d|d< q||d< t| dg D ][\}}t|trd |v r| | d |d < d!|v r| | d!|d!< d"| d#}| j dr|| jd jv r| jd j| |d$< qd$|v r|d$ dv rd |d$< q| d%g D ]_}t|trUd&|v r&z|d& rt|d& nd |d&< W n ttfy%   d |d&< Y nw d'|v r5| | d'|d'< d(|v rE|d( d)v rEd |d(< d*|v rU|d* dv rUd |d*< qt| d+g D ]K\}}t|trd,| d-}| j dr|| jd jv r| jd j| |d.< nd.|v r|d. dv rd |d.< d/|v r| | d/|d/< q_| d0g D ](}t|trd1|v r| | d1|d1< d2|v r|d2 dv rd |d2< q| d3g D ]F}t|tr%d&|v r| | d&|d&< d4|v r| | d4|d4< d5|v r| | d5|d5< d6|v r%|d6 dv r%d |d6< q| d7g D ]'}t|trSd8|v rD| | d8|d8< d9|v rS| | d9|d9< q-t| dg D ]A\}}t|trd&|v rz|d& ryt|d& nd |d&< W n ttfy   d |d&< Y nw d|v r| | d|d< d|v r| | d|d< d|v r| | d|d< d:|v r| | d:|d:< d;|v r| | d;|d;< d<|v r| | d<|d<< d=|v r| | d=|d=< d>|v r| | d>|d>< d?|v r| | d?|d?< d@|v r%| | d@|d@< dA|v r4| | dA|dA< dB|v rC| | dB|dB< dC|v rR| | dC|dC< dD|v ra| | dD|dD< dE|v rp| | dE|dE< dF|v r| | dF|dF< dG|v r| | dG|dG< dH|v r|dH dv rd |dH< dI|v r|dI dv rd |dI< dJ|v r|dJ dv rd |dJ< d|v r| | dg }g }|D ]%}t|tsڐqtdKd | D r||| q|| qt|D ]\}}t| dtr|d r|d d nd |d< t| dtr.|d r*|d d nd |d< t| dtrF|d rB|d d nd |d< dL| dM| d}| j drj|| jd jv rj| jd j| |d< nd|v rz|d dv rzd |d< d|v r| | d|d< d|v r| | d|d< q||d< q]| dNg D ]}}t|tr"d&|v rz|d& rt|d& nd |d&< W n ttfy   d |d&< Y nw dO|v r| | dO|dO< d>|v r| | d>|d>< dP|v r| | dP|dP< dQ|v r|dQ dv rd |dQ< dR|v r"|dR dv r"d |dR< q| d+g }g }t|D ]/\}}t|tr^t|i | jdS|idT} |  sXtd,| dU| ji|| j q0||d+< |S )VNc                 S   sx   i }|   D ]3\}}||v r|||< qt|tr%t|dkr%|d ||< qt|tr5t|dkr5d ||< q|||< q|S Nr"   r   rz  )rC   r}  resultr   r   r(   r(   r)   r  8  s   


z5FullClientSerializer.validate.<locals>.unwrap_scalars)	rd  r  r  r/  r  r  rF  r\  r]  )r}  c                 S   sb   t |  D ](\}}t|t r&t|dkr|d | |< n
t|dkr&d | |< |d u r.d | |< q| S r  )r   r{  r?   r|  )dr   r   r(   r(   r)   normalize_nested_dictK  s   
z<FullClientSerializer.validate.<locals>.normalize_nested_dict)rd  r  r  r/  r  r  rF  r\  r  )r  r   zClient code 'z' already exists.rF  rW  family_member_client_coder  rG  c                 S   s   | sg S t dd |  D }g }t|D ]*}i }|  D ]\}}t|tr5|t|k r0|| nd||< q|||< q|| q|S )zY
            Expand a passport dict with lists into multiple passport dicts.
            c                 s   s.    | ]}|d urt |trt|ndV  qd S )Nr"   r?   r   r|  r  r   r(   r(   r)   r     s   , zJFullClientSerializer.validate.<locals>.expand_passports.<locals>.<genexpr>N)maxvaluesranger{  r?   r   r|  r  )passport_dictmax_lenresultsirecordr  r,   r(   r(   r)   expand_passports  s   

z7FullClientSerializer.validate.<locals>.expand_passportsrd  c                 s   &    | ]}t |tot|d kV  qdS r"   Nr  r  r(   r(   r)   r        $ z0FullClientSerializer.validate.<locals>.<genexpr>r   r   r   zclient_passport[][passport_file]r/   r   r   r\  fam_passport_nofam_passport_expiry_datezfam_passport[z][fam_passport_file]fam_passport_passport_filer/  r]   r(  r)  rP   r\   r*  r  r   r   r   r   r  r   r   r  r   r   r   r  r   r   rX  rY  rZ  r[  r  r  r_  r  r  r  r`  rb  re  rh  rg  rf  r  c                 s   r  r  r  r  r(   r(   r)   r   >  r  family_members[][fam_passport][r]  relation_with_other_client_codecrossRelation	fromIndextoIndexr   rC   r3   r  )r4   r?   r   extendr  ra   r  r   rd   re   rn   excluder   r   r   rg   r   anyr  	enumerater3   r   r  rb   r   r   ensure_listr   is_validerrorsvalidated_data)!r6   rC   r  r  nested_fieldsr  val	flat_listitemnormalized_list	main_codeqsr  fam_coder  expanded_passportspr  r   cr  fr   t	fam_indexry  expanded_fam_passportspir	documentsvalidated_documentsdocrL  r(   r(   r)   r   6  s  




 



 
"
 







"

















 


"



zFullClientSerializer.validatec                 C   s    t jj|d}t|d| jdjS )Nr   TrI  )r   rd   re   r  r3   rC   )r6   ry   membersr(   r(   r)   get_familyMembersx  s   z&FullClientSerializer.get_familyMembersc           6         s
  dd }| dg }| dg }| dg }| dg }| dg }| dg }| d	g }	| d
g }
| dg }| dd }| dd }| dd }| dd }| dd }|rt|tritjj|d d}nt|trvtjj|d}nt|tr~|}nd }nd }||d< | ||dt|d< | ||dt|d< | ||dt	|d< | ||dt
|d< | |d|d< | |d|d< d|d< d|d< | jdr| jdjni }dD ]	}||||< qtjjdfi |}|r||_|rt|t
r|n| |t
|_|r%t|tr|n| |t|_|r7t|tr0|n| |t|_|rIt|t	rB|n| |t	|_|  |D ]D}| j|ddid}t| scqO| |dpld|d< | |dpyd|d< |d s|d rtjjdfd |i| qO|D ]{}| j|d!d!id}| |d"|d"< | |d#|d#< | d$d }|rt|ttfrtjj|d%|d$< nt|trtjj|dd%|d$< n
t|tr||d$< |d"s|d#s|d$s|d!rtjjdfd |i| q|D ]>}| j|d&d&id}t| s(q| |d'|d'< | |d(|d(< |d' sF|d( rQtjjdfd |i| q|D ](}| j|d)d)id}t| r|| |d*|d*< t jjdfd |i| qU|D ]G}| |}t| sq|d+}|sqz	t!jj|d,}W n t!j"y   Y qw |j#|d-< | d+d  t$jjdfd |i| q|D ]Q}| |}t| sڐq|d.}|sqz	t
jj|d/}W n t
j"y   Y qw |j#|d0< | d.d  | |d1|d1< t%jjdfd |i| qg d2} d3d4 d }!i }"t&|	D ]\}# t tsJzt'(  W n t)yI   Y q,w t* fd5d6| D rYq,|  d7}$i d |dd8ddd|$d9 d:d; d<d= d>d? d@dA dAdB dBdC dDdE dEdF|  dFdG|  dGdH dHdI dIdJ dK dL dM dN dOp|j+| t dp|j| t dp|j| t	 dp|j dPp|j,dQ}%dR|# dS}&dR|# dT}'|&|v r||&|%dU< |'|v r*||'|%dV< tjjdfi |%| jdr>| jd j-nd t./ dW}(| 0  dg }t&|D ]J\})}t|ts`qT| |dpl|dX}*| |dpz|dY}+dR|# dZ|) d[},||,}-|*s|+s|-rtjj|(|*|+|-d\ qTt1jj|(|(j2j3|(j4d]t56t5j7t8d t9|(t:d^|(j;t./ d_ |!r dArt<jj|!|( dAd`  dBs dar dBp da}.t<jj|(|!|.db |(}!|(|"|#< q,|
D ]|}/t|/trzt'(|/}/W n t)y   Y qw t|/ts!q|/dc}0|/dd}1|/dA}2|/da}3|0d u s?|1d u rAq|"t|0}4|4sMq|"t|1}5|5soztjjt|1d%}5W n tj"yn   Y qw t<jj|4|5|2|3de q|S )gNc                 S   s&   t | tr| r	| nd } | dvr| S d S )Nr  )r?   r   r+   r(   r(   r)   unwrap  s   
z+FullClientSerializer.create.<locals>.unwraprd  r  r  r  r/  r  rF  r]  r\  ro  rg  rf  r  r^   r]   r_   rn  r  zPrimary Memberr   r"   r  r/   r  r  r   )r  r   rP   r   r   r   r   r   r   r   r   r   r   r   r   r*  )r'  rH  r   )r   ref_airline_idr   )rW  rY  r[  r  r  r_  c                 S   s4   | d u pt | tr|  dkpt | tot| dkS )NrP   r   )r?   r2   r   r   r|  r+   r(   r(   r)   is_blank_field*  s   4z3FullClientSerializer.create.<locals>.is_blank_fieldc                 3   s    | ]
}  |V  qd S r%   )r4   )r  r  r  r  r(   r)   r   6  s    z.FullClientSerializer.create.<locals>.<genexpr>rW  Family Memberr  rX  r  rY  r  rZ  r	  r[  r  r  r
  r_  r  r  rG  r  r  r  r`  ra  rb  rc  re  rh  )r  r  r  re  rg  rf  r  rh  r  z][aadhaarCard]z
][panCard]r  r  )rw   r  
passportNopassportExpiryDater  r  r   r   r   r   zCLIENT CREATED)cls)r   r   r   r   r   r   r   rR  rS  r  r  )rR  rS  rT  r  r  )rR  rS  r  rT  r(   )=r  r?   ra   r   rd   r4   rb   r  r   r
   r   r  r  r3   r   r   creater^   ro  rg  rf  r  saver  r  r  r  r   r   r2   r   r   r   r   r   r]   r   r	   r  r  r  r1   r   re  rh  userr   nowr  r   _metadb_tabler   jsonloadsdumpsr#   r$   r!   rw   r   )6r6   r  r  passports_data
visas_datainsurances_data	docs_datacompanies_datafrequent_flyers_datafamily_members_datar]  ry  r   r`   stater7  r^   country_code_instancer  r'   clientpdvdcountry_valueinsr  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_indexr  rT  rR  target_clientr(   r  r)   r  }  s  


0










	
















zFullClientSerializer.createc           #      C   s  g d}t t tttd}|D ]j}||v rx||}||}|d u r*d || d< qt|tr4|d}t||rB|j|| d< qt|t	t
frqz|jjt	|d}|j|| d< W q tt|jfyp   d || d< Y qw d || d< q| |d|d< | |d|d< | |d|d< d|v r| |d|d< | jd	r| jd	jni }	d
D ]&}
|
|	v rt||
|	|
  q|
|v r||
}|d u s|dv rt||
d  qdd }h d}| D ]\}}||v rqt||| q|  |dg }g }|D ]E}||rq| |d|d< |dd }|r8tjj||djd.i | || qtjjd.d|i|\}}||j qtjj|dj|d  |dg }g }|D ]}td| |dd }td| ||r}qd| |d|d< | |d|d< | |d|d< d|v r|dd }|d u s|dv rd |d< n3t|tr|d|d< n%t|t r|j|d< nzt	||d< W n ttfy   d |d< Y nw |r$z!td| d|j   t!jj||djd.i | || W qd t!jy#   td| d |j   Y qdw td!|j   t!jj||d|d|d"\}}||j qdt!jj|dj|d  |d#g }g }|D ]O}||rfq]| |d$|d$< | |d%|d%< |dd }|rt"jj||djd.i | || q]t"jjd.d|i|\}}||j q]t"jj|dj|d  |d&g }g }|D ];}||r͐q|dd }|rt#jj||djd.i | || qt#jjd.d|i|\}}||j qt#jj|dj|d  |d'g }g }|D ]~}||r q|d(d }|d u r0d |d)< n3t|tr>|d|d)< n%t|t$rJ|j|d)< nzt	||d)< W n ttfyb   d |d)< Y nw |dd }|rt%jj||djd.i | || qt%jjd.d|i|\}}||j qt%jj|dj|d  |d*g } g }| D ]}!||!rq|!d+d }"|"d u rd |!d,< n3t|"tr|"d|!d,< n%t|"tr|"j|!d,< nzt	|"|!d,< W n ttfy   d |!d,< Y nw | |!d-|!d-< |!dd }|r!t&jj||djd.i |! || qt&jjd.d|i|!\}}||j qt&jj|dj|d  |S )/N)r^   rg  rf  r  ro  _idr]   r_   r  r  rG  rn  r/   r  r  c                 S   s   t dd |  D  S )Nc                 s   s$    | ]}|d dg i fvr|V  qd S r   r(   r  r(   r(   r)   r   "  s   " z@FullClientSerializer.update.<locals>.is_empty.<locals>.<genexpr>)r  r  )r  r(   r(   r)   is_empty!  s   z-FullClientSerializer.update.<locals>.is_empty>   r  rd  r/  r  r  r  rd  r   )r]   r   r   r  )id__inr  z+here we are printing the client visa obj : z.here we are printing the client visa obj id : r   r   r   r   r   zUpdating ClientVisa id=z for client zClientVisa with id z not found for client z#Creating new ClientVisa for client )r   r   r   defaultsr  r   r   r  r/  r*  rH  r  r   r  r   r(   )'r   r   r
   r   r  r4   r?   ra   r]   rb   r2   rd   r   r   r   r  r   r  r3   r   setattrr{  r  r   re   updater  update_or_creater  deleter   r  r   r   r   r   r   r   r	   )#r6   rn   r  	fk_fields	fk_modelsfk_fieldfk_valuer  fk_instancefilesr  file_valr  r}  attrr,   r  keep_idsr  obj_idry   createdr  r  country_valr  r  r  r  r  compr*  r  ffairline_valr(   r(   r)   r"    sf  





 
	














zFullClientSerializer.updatec                 C   sT   t |tr|gS t |tr(g }|D ]}t |tr|| q|r%|| q|S g S )z
        Ensure the given value is always a list of dicts.
        Handles cases where DRF/multipart wraps in extra list.
        )r?   ra   r   r  r  )r6   r,   flatr   r(   r(   r)   r    s   



z FullClientSerializer.ensure_listc                    s  t  |}t|drt|j d| jdj|d< t|dr,t|j	 d| jdj|d< t|dr?t
|j d| jdj|d< t|drRt|j d| jdj|d< t|dret|j d| jdj|d< t|drxt|j d| jdj|d< | ||d	< |S )
Nrd  TrI  r  r  r/  r  r  r  )r@   r7   hasattrr   rd  r   r3   rC   r   r  r   r  r   r/  r   r  r   r  r  r   rD   r(   r)   r7     sN   





z&FullClientSerializer.to_representationr%   )?r9   r:   r;   r   r   r   rd   r   r^   rg  r   rf  r
   r  r   ro  r   r  r   r   rd  r   r  r   r  r   r/  r   r  r   r  rU  rF  rO  r\  rQ  r]  r   r  r   r  r  r   r  rG  rW   r2   r  r   r  r  r  r  r  r   r  r   atomicr  r"  r  r7   rG   r(   r(   rD   r)   r  i  st    


#   D
  C
  r  c                   @   sD   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 dZdS )	ClientDataSerializerz residential_country.country_nameTr   zresidential_state.state_namezresidential_city.city_namec                   @   rS   )zClientDataSerializer.MetarT   Nr  r(   r(   r(   r)   rW   H  rX   rW   N)	r9   r:   r;   r   r   rg  rf  r  rW   r(   r(   r(   r)   r7  H  s    r7  c                   @   s   e Zd Zejdd ZdS )FamilyMemberListSerializerc                 C   sX   | j d }| j d}g }|D ]}t|||dd}|jdd | }|| q|S )Nprimary_clientrw   )r9  rw   r  T)raise_exception)r3   r4   AddFamilyMemberSerializerr  r  r  )r6   r  r9  rw   rF  r  rL  rn   r(   r(   r)   r  LM  s   
z!FamilyMemberListSerializer.createN)r9   r:   r;   r   r6  r  r(   r(   r(   r)   r8  KM  s    r8  c                       s   e Zd ZeddddZejddddZejddddZej	ddddZ
e ZG dd dZdd	 Zd
d Zdd Zejdd Z fddZ  ZS )r;  TFrV  r   r   c                   @   s   e Zd ZeZeZg dZdS )zAddFamilyMemberSerializer.Meta)r  r  r  r  r	  r  r  r
  r  r  r  r  r  r  r  rd  rw   r  N)r9   r:   r;   r   rU   r8  list_serializer_classrV   r(   r(   r(   r)   rW   M  s    rW   c                 C   r   r%   )rw   usernamerx   r(   r(   r)   get_created_byM  r   z(AddFamilyMemberSerializer.get_created_byc                 C   r   )Nz*Invalid file format for aadhaar_card_file.r   rH   r(   r(   r)   validate_aadhaar_card_fileM  r   z4AddFamilyMemberSerializer.validate_aadhaar_card_filec                 C   r   )Nz&Invalid file format for pan_card_file.r   rH   r(   r(   r)   validate_pan_card_fileM  r   z0AddFamilyMemberSerializer.validate_pan_card_filec                 C   s  | j d}| j d}|d}|r|dv rd |d< nt|tr;zt|d |d< W n ty:   d |d< Y nw |dg }|dd }|dd }|d	rW|d
s^t	
ddii d|ddddd	|d	d
|d
d|ddd|ddd|ddd|ddd|ddd|ddd|ddd|dd|ddd|ddd|ddd||dd||d}ztjjd(i |}	W n ty }
 zt	
ddt|
 id }
~
ww |D ]m}|d p|d!}|d"}|d#p|d$}|s|s|sqt|tr7z
t|d }W n ty6   d }Y nw ztjj|	|rA|nd ||d% W q tya }
 zt	
dd&t|
 id }
~
ww |drstjj||	|d d' |drtjj|	||d d' |	S ))Nr9  rw   r  r   rK   rd  r  r  r  r  detailzIclient_code and client_first_name are required to create a family member.r   r   r  r  r"   r  rP   r	  r  r  r  r
  r  r  r  r  r  )r  r  rw   zFailed to create client: r   r  r   r   expiryr  zFailed to create passport: r  r(   )r3   r4   r?   r2   r   r   r   r   r  r   rg   r   rd   r  r1   r   r   )r6   r  r9  rw   	dob_valuer  aadhaar_filepan_filer  
fam_clienter  r   r   expiry_valuer(   r(   r)   r  WN  s   




	






z AddFamilyMemberSerializer.createc                    s"   t  |}|jr|jj|d< |S )Nrw   )r@   r7   rw   r=  )r6   rn   reprD   r(   r)   r7   N  s   z+AddFamilyMemberSerializer.to_representation)r9   r:   r;   r   rd  r   r   r  r  r   r  r   rw   rW   r>  r?  r@  r   r6  r  r7   rG   r(   r(   rD   r)   r;  M  s    f
]r;  c                   @   s*   e Zd Ze ZG dd dZdd ZdS )MenuSerializerc                   @   r   )zMenuSerializer.Meta)r]   	menu_namemenu_actionmenu_urlmenu_order_nomenu_defaultmenu_statussubmenusN)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW   Q  rq   rW   c                 C   s   t |j ddjS )NT)rJ  )rJ  rQ  r   rC   rx   r(   r(   r)   get_submenusQ  r{   zMenuSerializer.get_submenusN)r9   r:   r;   r   r   rQ  rW   rR  r(   r(   r(   r)   rJ  Q  s    rJ  c                   @   s*   e Zd ZG dd dZdd Zdd ZdS )EmailSetupSerializerc                   @   r   )zEmailSetupSerializer.Meta)r]   report_typeemailsN)r9   r:   r;   r   rU   rV   r(   r(   r(   r)   rW   Q  rq   rW   c                 C   s"   | dg }tjjdi |}|S )NrU  r(   )r  r   rd   r  )r6   r  emails_datasetupr(   r(   r)   r  Q  s   zEmailSetupSerializer.createc                 C   s(   | dg }|d|j|_|  |S )NrU  rT  )r  r4   rT  r  )r6   rn   r  rV  r(   r(   r)   r"  Q  s   zEmailSetupSerializer.updateN)r9   r:   r;   rW   r  r"  r(   r(   r(   r)   rS  Q  s    	rS  r%   )]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   r  r   django.utilsr   django.utils.dateparser   ior   django.core.files.uploadedfiler   r   base64	mimetypesdjango.db.modelsr    django.core.serializers.jsonr!   signalsr#   users.utilsr$   r*   r-   r   r.   r<   r   rI   ModelSerializerrR   r[   ro   rr   rs   ru   r   r   r   r   r   r   r   r   r   r   r   r   r   r;  rE  rN  
SerializerrO  rQ  rU  ri  r  r  r  r7  ListSerializerr8  r;  rJ  rS  r(   r(   r(   r)   <module>   s  \7 i7%(e.v02s iC6
              x                                                                                                                                P  jt4   C 