o
    HiL:                     @   s   d dl Z d dlmZ d dlmZ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 d	d
lmZ d	dlmZmZmZ d	dlmZ d dlmZ d dlmZmZ G dd dejZdS )    N)StringIO)viewsetsstatus)action)Response)IsAuthenticated)HttpResponse)Q   )CPDConfiguration)CPDConfigurationSerializerCPDExportRequestSerializerBulkLookupRequestSerializer)MembershipAPIService)Event)RegisteredMemberAttendanceRecordc                   @   s   e Zd Zej ZeZe	gZ
eddgddd Zeddgddd Zeddgddd	 Zeddgdd
d Zeddgddd ZdS )CPDConfigurationViewSetFpost)detailmethodsc                 C   s   |j d}|j dd}z'tjj|d}tjj|d|id\}}|s*||_|  | |}t	|j W S  tj
yG   t	dditjd Y S w )	zSet CPD points for an eventevent_id
cpd_points        ideventdefaultserrorEvent not foundr   )datagetr   objectsr   get_or_creater   saveget_serializerr   DoesNotExistr   HTTP_404_NOT_FOUND)selfrequestr   r   r   configcreated
serializer r/   5/var/www/html/smartRegister/backend/apps/cpd/views.pyset_cpd_points   s&   


z&CPDConfigurationViewSet.set_cpd_pointsc                 C   sR  t |jd}|jdd |jd }|jd}|jdd}ztjj|d}|d	ur9tjj|d|id
 t	|}nztjj|d}t	|j
}W n tjyS   d}Y nw tjj|ddjddd }	tjj|	dd}
t|
}t|}|dkrdd |D }n|dkrdd |D }g }|D ]*}||d |d |d |d |d |d |d |d |d kr|nd!|d" d#
 qt }tj|g d$d%}|d&d'd(d)d*d+d,d-d.d$	 |D ]#}||d |d |d |d |d |d |d |d |d d$	 qt| d/d0}d1|jd2d3 d4|d5< |W S  tjy(   td6d7itj d8 Y S w )9zP
        Export CPD data for an event with membership system enrichment
        r"   Traise_exceptionr   r   source_filterallr   Nr   r   r   CHECK_INr   	scan_type	member_idflatid__inevent_category
membershipc                 S      g | ]
}|d  dkr|qS )sourcemembership_systemr/   .0mr/   r/   r0   
<listcomp>a       z6CPDConfigurationViewSet.export_cpd.<locals>.<listcomp>
attendancec                 S   rB   )rC   attendance_listr/   rE   r/   r/   r0   rH   c   rI   membership_numbernational_id_typenational_id_number
first_namemiddle_name	last_nameemailmobiler    rC   )
rL   rM   rN   rO   rP   rQ   rR   rS   r   rC   )	rL   rM   rN   rO   rP   rQ   rR   rS   r   )
fieldnamesMembership NumberNational ID TypeNational ID Number
First NameMiddle Name	Last NameEmailMobile
CPD Pointstext/csvcontent_typez!attachment; filename="cpd_export_ _z.csv"Content-Dispositionr   r    r!   )!r   r"   is_validvalidated_datar#   r   r$   r   update_or_createfloatr   r(   r   filtervalues_listdistinctr   select_relatedlistr   bulk_enrich_membersappendr   csv
DictWriterwriterowr   getvaluenamereplacer   r   r)   )r*   r+   r.   r   r   r5   r   event_cpd_pointsr,   attended_member_idsmembersmembers_listenriched_listcsv_dataenriched_dataoutputwriterrowresponser/   r/   r0   
export_cpd.   s   

	



z"CPDConfigurationViewSet.export_cpdc                 C   sr  t |jd}|jdd |jd }|jd}ztjj|d}|dur(t|}nztjj|d}t|j	}W n tj
yB   d	}Y nw tjj|d
djddd }tjj|dd}	t|	}
t|
}g }t|
|D ](\}}||j|d |d |d |d |d |d |d |d ||d d qlt|j|jd|	 ||dW S  tj
y   tdditjd Y S w )zA
        Preview CPD data before export (for UI display)
        r2   Tr3   r   r   r   Nr7   r   r8   r9   r;   r<   r>   r@   rL   rM   rN   rO   rP   rQ   rR   rS   rC   )registration_coderL   rM   rN   rO   rP   rQ   rR   rS   r   rC   )r   rt   )r   total_membersr   preview_datar   r    r!   )r   r"   re   rf   r#   r   r$   rh   r   r   r(   r   ri   rj   rk   r   rl   rm   r   rn   zipro   r   r   r   rt   countr   r)   )r*   r+   r.   r   r   r   rv   r,   rw   rx   preview_membersrz   r   memberr|   r/   r/   r0   preview_cpd_data   st   






z(CPDConfigurationViewSet.preview_cpd_datac                 C   st  ddl m} t|jd}|jdd |jd }|jdd}||\}}|s3|r3td	|d
t	j
dS g }|D ]}	||	}
||	|
d q7g }d}d}|D ]]}|d }	|d }
t|
|	}|r|d7 }||	|
d|dd|dd|dd|dd|dd|dd|r|nddd qO|d7 }||	|
ddddddd|r|nddd qOtdt|||||dS )za
        Upload CSV/Excel file with NRC/Passport numbers and lookup in membership system
        r
   )BulkLookupProcessorr2   Tr3   filer   r   zFailed to parse file)r   detailsr!   )document_numberid_typer   r   r   rL   rT   rO   rP   rQ   rR   rS   rD   )r   r   foundrL   rO   rP   rQ   rR   rS   r   rC   F	not_found)successtotal_uploadedr   r   parse_errorsresults)bulk_lookupr   r   r"   re   rf   r#   
parse_filer   r   HTTP_400_BAD_REQUESTdetect_id_typero   r   lookup_memberlen)r*   r+   r   r.   uploaded_filer   document_numbersr   lookup_datadoc_numr   r   found_countnot_found_countitemmember_datar/   r/   r0   r      s|   












z#CPDConfigurationViewSet.bulk_lookupc                 C   s   |j dg }|j dd}|stdditjdS tdd}d	|d
< t|}|g d |D ]<}||dd|dd|dd|dd|dd|dd|dd|dd|r`|nd|drhdndg
 q0|S )z3
        Export bulk lookup results as CSV
        r   r   rT   r   zNo results to exportr!   r_   r`   z.attachment; filename="bulk_lookup_results.csv"rd   )
rV   rW   rX   rY   rZ   r[   r\   r]   r^   StatusrL   r   r   rO   rP   rQ   rR   rS   r   Foundz	Not Found)	r"   r#   r   r   r   r   rp   r~   rr   )r*   r+   r   r   r   r~   resultr/   r/   r0   export_bulk_lookupC  s2   










z*CPDConfigurationViewSet.export_bulk_lookupN)__name__
__module____qualname__r   r$   r6   querysetr   serializer_classr   permission_classesr   r1   r   r   r   r   r/   r/   r/   r0   r      s    


{
E
Rr   )rp   ior   rest_frameworkr   r   rest_framework.decoratorsr   rest_framework.responser   rest_framework.permissionsr   django.httpr   django.db.modelsr	   modelsr   serializersr   r   r   servicesr   apps.events.modelsr   apps.attendance.modelsr   r   ModelViewSetr   r/   r/   r/   r0   <module>   s    