B
    b=                 @   s.  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	 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 d dlmZ d dlmZ d dlmZm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#ej$Z%G dd dej$e Z&dS )    N)viewsets)filters)mixins)PageNumberPagination)status)Response)action)DjangoFilterBackend)gettext_lazy)ContentType   )APPJSONWebTokenAuthentication)models_choices)Employee)NodeInstance)WorkflowNode)
user_photodatetime2stampc               @   s   e Zd ZdZdZdZdS )DefaultPagination
   	page_sizepageN)__name__
__module____qualname__r   Zpage_size_query_paramZpage_query_param r   r   8G:\easytimepro\master/mysite/mobile\api_rest\viewsets.pyr      s   r   c               @   s$   e Zd ZeZefZeej	ej
fZdS )GenericViewSetN)r   r   r   r   Zpagination_classr   Zauthentication_classesr	   r   ZSearchFilterZOrderingFilterZfilter_backendsr   r   r   r   r      s   r   c               @   s^   e Zd ZdZdZdd Zedgdddd	 Zedgddd
d Zedgdddd Z	dS )ApproveFlowMixinz)
    offer approve and revoke method
    Nc             C   sj   ddl m} |j}|jj|d}| r^|d j}|tjtj	fkr^d
td}t|tjdS |  d S )Nr   )AbstractException)idz{0}Zapp_application_remove_rejected)r   )mysite.workflow.modelsr   r    objectsfilterexistsaudit_statusr   AUDIT_SUCCESSREFUSEformat_r   r   HTTP_406_NOT_ACCEPTABLEdelete)selfinstancer   r    Zwf_objr%   messager   r   r   perform_destroy,   s    
z ApproveFlowMixin.perform_destroyZpostT)methodsdetailc          
   O   s  | j |jd}|jdd |j}d}|j}|d }|d }	|d}
| jjj|d	 }|rԐy&|	t
jkr*|
|_t| d	 |_|  |j||
 |j}tjj|d
 d}|rfxFt|D ]:\}}|}d}|j}|j}|rP |rd|_|  d}P qW |rf||d  }d|_|  n<|	t
jkrf|
|_t| d	 |_|  |j||j ddtdgi}t|tj dS  t!k
r } z*d	d l"}|#  td|j$d	 gitj%dS d }~X Y nX ntd}td|gitj&dS d S )N)dataT)Zraise_exceptionFpkapprove_statusremark)r    r   )Zworkflow_instance__exceptionorderr   r.   z{0}OK)r   Zobject_not_found)'get_serializerr2   Zis_validZvalidated_datausergetmodelr"   r#   firstr   r&   audit_reasonstrsplitapproversaveZworkflowinstanceZapprove_current_node_byZabstractexception_ptr_idr   allorder_by	enumerateis_next_nodeis_last_noder'   Zreject_current_node_byr(   r)   r   r   HTTP_200_OK	Exception	traceback	print_excargsZ&HTTP_451_UNAVAILABLE_FOR_LEGAL_REASONSr*   )r,   requestrK   kwargs
serializerZdatasZset_next_noder@   Zobj_idr4   r5   objcodeZnodesinodeindexZcurrent_noderF   Z	next_noder2   erI   msgr   r   r   approve7   s`    

*zApproveFlowMixin.approvec             O   s   |d }| j jj|d }|r|jtjkr|j}d|j	|_
tj|_|j	|_tj |_||_|  tddtdgitjdS td}td|gitjdS ntd	}td|gitjdS d S )
Nr3   )r    zrevoke by->{0}r.   z{0}r7   )r   Z$only_approved_records_can_be_revoked!workflow_instance_does_not_exists)r;   r"   r#   r<   r%   r   r&   r9   r(   namer=   ZCANCEL_AUDIT_SUCCESSr@   datetimenow
audit_timeZ_approve_userrA   r   r)   r   rG   r*   )r,   rL   rK   rM   manuallog_idrO   r9   describer   r   r   revokem   s     zApproveFlowMixin.revokec             O   s   |d }| j jj|d }|r|jtjkrpd|_tj|_t	j	
 |_|  ddtdgi}t|tjdS td}td|gitjdS ntd	}td|gitjdS d S )
Nr3   )r    zwithdraw by selfr.   z{0}r7   )r   Z%only_approved_records_can_be_withdrawrW   )r;   r"   r#   r<   r%   r   r&   r=   ZWITHDRAW_AUDIT_SUCCESSrY   rZ   r[   rA   r(   r)   r   r   rG   r*   )r,   rL   rK   rM   r\   rO   r2   r]   r   r   r   withdraw   s    zApproveFlowMixin.withdraw)
r   r   r   __doc__r;   r/   r   rV   r^   r_   r   r   r   r   r   &   s   6r   c               @   s"   e Zd Zedgdddd ZdS )NotificationMixinr:   T)r0   r1   c       &      O   s  g }dg i}|j j}|j j}|  }|jj}	tjd|	}
|j	|j
j|j
j|j
j|jd|jt|jd}ttj}|d |d p|d t|d ||d d||d d|d	 |d
 d}|d | tjj|
j|j	ddd	dddddddd
d}g }|rx|D ]}|d }|rddlm} |jj|d}|rb|d }|j }}|j }nd } }}t|d |d ||t||d|d d||d  dg}P q|d }|tj!tj"gkrJ|d }|d  }t#jj|d}|jd!d"d#$ }|jd$d"d#}|d% }|slt%jj|d |d&jd'd"d#$ }|rt%jj||d(d)d*$ j&|d d+}n&t%jj|d,d)d*$ j&|d d+}|r g }g } x*|D ]"}!|!\}}|| | | qW t'|dkrd-(|}t'| dkrtd | }"d-(|"}#d.}$n|}|}#t||}$n(d/|}d0d1(d2d3 |D }#d.}$n|d4 }|d5 }#t|d4 |}$t|d |d|| |#||$|d d6}%||% qW |d )| t*|d7d8S )9NitemsZattz{0})rP   pinrX   
departmentr4   r5   action_timerc   rX   r4   ZApplyr5   re   )rc   rX   photor4   approve_describer5   re   )Z0workflow_instance__workflow_engine__content_typeZworkflow_instance__exception_idstate
apply_timeZapprover_employee__first_nameZapprover_employee__emp_codeZapprover_adminrF   Znode_engine__id node_engine__approver_by_overallZnode_engine__node_codeZnode_engine__order_id   r   )MyUser)r    Zadmin   r   )re   r4   rX   rc   rf   r5   rg      r@   T)flatZapprover__role_name   )emp_code
company_idrd   )flow_role__inZdepartment__inrr   
first_name)rr   )rt   / znode:{0}zapprove_role:{0},c             s   s   | ]
}|V  qd S )Nr   ).0rr   r   r   	<genexpr>  s    z2NotificationMixin.approve_flows.<locals>.<genexpr>      )re   r4   rg   rX   rc   rf   r5      )r   )+r9   rs   companyZ
get_objectZ_meta
model_namer   r"   Zget_by_natural_keyr3   employeerr   ru   rd   r%   r(   apply_reasonr   ri   dictr   ZALL_AUDIT_STATUSr   r:   appendr   r#   r    values_listrC   Zmysite.accounts.modelsrl   emp_pinZAPPLICATIONZAUDITINGr   distinctr   excludelenjoinextendr   )&r,   rL   rK   rM   Zempsr2   rs   Zemp_companyr-   r   Zct_objZprofiler   itemZapprove_nodesZ
flow_itemsrR   Zadmin_approverrl   r9   rc   rX   r   Znode_statusZnode_idZ	node_codeZnode_objZ
flow_rolesZ	flow_nameZ
by_overallZdeptsZpinsnamesempZac_nameZemp_nameZ	emp_photoZ	flow_itemr   r   r   approve_flows   s    














zNotificationMixin.approve_flowsN)r   r   r   r   r   r   r   r   r   ra      s   ra   c               @   s0   e Zd ZdZdZdZdd Zdd Zdd ZdS )	GenericApprovalListViewzK
    use for approval_list: admin user get approval list in mobile app
    Nc             C   s   | j jj}| jjj|d}|S )N)r   )rL   r9   rs   r;   r"   r#   )r,   rs   querysetr   r   r   get_queryset#  s    
z$GenericApprovalListView.get_querysetc             K   s^   | j d kr|jS |d|jj}tjj|d}| sRtd}t	d|git
jdS | S d S )NZemployee_pk)r    Zemployee_id_doesnt_existr.   )r   )team_member_typer9   r:   r3   r   r"   r#   r$   r)   r   r   r*   r<   )r,   rL   rM   r   r9   r]   r   r   r   _get_traget_user(  s    
z(GenericApprovalListView._get_traget_userc          
   O   s  yddl m} | j|f|}|j }|j}tjjddd |d d}tjjdd||d d}	| 	| 
 }
|
||jdddd||	jddddB d	d
 }
W n4 tk
r } z| jjj|jd}
W d d }~X Y nX | |
}|d k	r| j|dd}| |jS | j|
dd}t|jS )Nr   )Qr   T)rE   rj   ZdepartmentsZnode_engine__approver__inZapprover_admin_idr    )rp   )Z"workflowinstance__nodeinstance__inr   r=   )r   )Zmany)Zdjango.db.modelsr   r   Z	flow_rolerB   rd   r   r"   r#   Zfilter_querysetr   r   Zdeferr   rH   r;   r   r9   Zpaginate_querysetr8   Zget_paginated_responser2   r   )r,   rL   rK   rM   r   r9   Zemp_flow_roleZemp_deptZNodeInstance_obj_with_departZNodeInstance_obj_without_departr   rT   r   rN   r   r   r   list4  s>    
 $

zGenericApprovalListView.list)	r   r   r   r`   r;   r   r   r   r   r   r   r   r   r     s   r   )'rY   Zrest_frameworkr   r   r   Zrest_framework.paginationr   r   Zrest_framework.responser   Zrest_framework.decoratorsr   Zdjango_filters.rest_frameworkr	   Zdjango.utils.translationr
   r)   Z"django.contrib.contenttypes.modelsr   Zauthenticationr   Z
mysite.attr   Zmysite.personnel.modelsr   r!   r   r   Zmysite.mobile.utilsr   r   r   r   ZDestroyModelMixinr   ZRetrieveModelMixinZListModelMixinra   r   r   r   r   r   <module>   s.   r 