o
    mi                     @   sj  d dl mZ d dlmZmZ d dlmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZ d dlmZ G dd	 d	eZG d
d deZG dd deZG dd dejZG dd deZG dd dejZG dd deZG dd dejZG dd dejZG dd deZG dd dejZG dd dejZG d d! d!ejZG d"d# d#ejZ G d$d% d%ejZ!d&S )'    )serializers)ModelSerializerValidationError)timedelta_to_custom_formatduration_string_to_timedeltaformat_amount_with_currency)Project)Vendor
VendorType)
Consultant)
Contractorc                       sf   e Zd Ze Ze Ze Ze Z	ej
ddZe ZG dd dZdd Z fddZ  ZS )	ProjectListSerializerT)
allow_nullc                   @      e Zd ZeZdZeZdS )zProjectListSerializer.Meta)	idnameclient_nametotal_vendorstotal_consultantstotal_contractorstotal_working_duration
deleted_attotal_amountN)__name__
__module____qualname__r   modelfieldsread_only_fields r   r   R/var/www/html/kuke-dev/django-kuke/apps/project/serializers/project_serializers.pyMeta       r!   c                 C   sH   | j d jdd}|j }|r|j|d}tdd |D }t|S )z
        Calculate the total cost for the project by summing
        (duration in hours * pay_per_hour) across all activities.
        requestemployee_idN)user_idc                 s   s4    | ]}|j r|jr|j  d  |j ndV  qdS )i  r   N)total_durationpay_per_hourtotal_seconds).0activityr   r   r    	<genexpr>'   s   2 z9ProjectListSerializer.get_total_amount.<locals>.<genexpr>)contextquery_paramsgetactivity_setallfiltersumr   )selfinstancer$   
activitiesr   r   r   r    get_total_amount   s   
z&ProjectListSerializer.get_total_amountc                    s$   t  |}tt|d |d< |S )Nr   )superto_representationr   r   )r3   r4   res	__class__r   r    r8   +   s   z'ProjectListSerializer.to_representation)r   r   r   r   ReadOnlyFieldr   IntegerFieldr   r   r   DurationFieldr   SerializerMethodFieldr   r!   r6   r8   __classcell__r   r   r:   r    r      s    r   c                       sd   e Zd ZejdddZejdddZe ZejdddZ	G dd dZ
 fddZd	d
 Z  ZS )ProjectAddSerializerFT)requiredr   r   rB   c                   @      e Zd ZeZdZdS )zProjectAddSerializer.Metar   r   clientaddressnotebudgetdescriptionNr   r   r   r   r   r   r   r   r   r    r!   8       r!   c                    s*   | dd dkr|d tt| |S )NrI    )r.   popr7   rA   to_internal_value)r3   datar:   r   r    rO   <   s   
z&ProjectAddSerializer.to_internal_valuec                 C   s2   | j d}tjj|dj|d rtd|S )N
project_id)r   )r   z(A project with this name already exists.)r,   r.   r   objectsexcluder1   existsr   )r3   valuerQ   r   r   r    validate_nameA   s   z"ProjectAddSerializer.validate_name)r   r   r   r   
FloatFieldrI   	CharFieldrJ   r   rG   r!   rO   rV   r@   r   r   r:   r    rA   2   s    rA   c                   @   &   e Zd ZejddZG dd dZdS )VendorListSerializer	type.namesourcec                   @   r   )zVendorListSerializer.Metar   r   typephone_noN)r   r   r   r	   r   r   r   r   r   r   r    r!   K   r"   r!   Nr   r   r   r   rX   r_   r!   r   r   r   r    rZ   H       rZ   c                   @   6   e Zd ZejdddZejdddZG dd dZdS )	VendorSerializerr[   Tr]   r   get_full_namer]   	read_onlyc                   @   rD   )zVendorSerializer.Metar   r   r_   r`   added_byN)r   r   r   r	   r   r   r   r   r   r    r!   U   rL   r!   Nr   r   r   r   rX   r_   rj   r!   r   r   r   r    rd   Q       rd   c                   @   rY   )ConsultantListSerializerr[   r\   c                   @   r   )zConsultantListSerializer.Metar^   N)r   r   r   r   r   r   r   r   r   r   r    r!   ]   r"   r!   Nra   r   r   r   r    rm   Z   rb   rm   c                   @   rc   )	ConsultantSerializerr[   Tre   get_created_by_full_namerg   c                   @   rD   )zConsultantSerializer.Metari   N)r   r   r   r   r   r   r   r   r   r    r!   g   rL   r!   Nrk   r   r   r   r    rn   c   rl   rn   c                   @   rY   )ContractorListSerializerr[   r\   c                   @   r   )zContractorListSerializer.Metar^   N)r   r   r   r   r   r   r   r   r   r   r    r!   o   r"   r!   Nra   r   r   r   r    rp   l   rb   rp   c                   @   rc   )	ContractorSerializerr[   Tre   ro   rg   c                   @   rD   )zContractorSerializer.Metari   N)r   r   r   r   r   r   r   r   r   r    r!   y   rL   r!   Nrk   r   r   r   r    rq   u   rl   rq   c                   @   sL   e Zd ZejddZejddZejddZejdddZ	G dd	 d	Z
d
S )ProjectDetailSerializerzclient.namer\   zclient.phone_nozclient.addressTFrC   c                   @   rD   )zProjectDetailSerializer.Meta)r   r   rF   r   client_phone_noclient_addressrG   rH   rI   rJ   r   minutes_of_meetingNrK   r   r   r   r    r!      rL   r!   N)r   r   r   r   r<   r   rs   rt   rX   rJ   r!   r   r   r   r    rr   ~   s    rr   c                   @      e Zd ZG dd dZdS )!ProjectMinutesOfMeetingSerializerc                   @   rD   )z&ProjectMinutesOfMeetingSerializer.Meta)ru   NrK   r   r   r   r    r!      rL   r!   Nr   r   r   r!   r   r   r   r    rw          rw   c                   @   rv   )ProjectDeleteAPISerializerc                   @   rD   )zProjectDeleteAPISerializer.MetarE   NrK   r   r   r   r    r!      rL   r!   Nrx   r   r   r   r    rz      ry   rz   c                   @   $   e Zd Zeje dZdd ZdS )ProjectConsultantSerializerchildc                 C   >   |st d|D ]}t|tr|dkrt d|q	|S )Nz,At least one consultant ID must be provided.r   zInvalid consultant ID: {}r   r   
isinstanceintformat)r3   rU   consultant_idr   r   r    validate_consultant_id      
z2ProjectConsultantSerializer.validate_consultant_idN)r   r   r   r   	ListFieldr=   r   r   r   r   r   r    r|          r|   c                   @   r{   )ProjectContractorSerializerr}   c                 C   r   )Nz,At least one contractor ID must be provided.r   zInvalid contractor ID: {}r   )r3   rU   contractor_idr   r   r    validate_contractor_id   r   z2ProjectContractorSerializer.validate_contractor_idN)r   r   r   r   r   r=   r   r   r   r   r   r    r      r   r   c                   @   r{   )ProjectVendorSerializerr}   c                 C   r   )Nz(At least one vendor ID must be provided.r   zInvalid vendor ID: {}r   )r3   rU   	vendor_idr   r   r    validate_vendor_id   r   z*ProjectVendorSerializer.validate_vendor_idN)r   r   r   r   r   r=   r   r   r   r   r   r    r      r   r   c                   @   r{   )"ProjectAssignEmployeeAPISerializerr}   c                 C   r   )Nz*At least one employee ID must be provided.r   zInvalid Employee ID: {}r   )r3   rU   r$   r   r   r    validate_employee_ids   r   z8ProjectAssignEmployeeAPISerializer.validate_employee_idsN)r   r   r   r   r   r=   employee_idsr   r   r   r   r    r      r   r   N)"rest_frameworkr   rest_framework.serializersr   r   core.utils.helperr   r   r   apps.project.modelsr   apps.vendor.modelsr	   r
   apps.consultant.modelsr   apps.contractor.modelsr   r   rA   rZ   rd   rm   rn   rp   rq   rr   rw   rz   
Serializerr|   r   r   r   r   r   r   r    <module>   s,    %						