B
    bS                 @   sh   d dl Z 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 G dd deZdS )    N)gettext_lazy)ladonize)SUCCESS_CODEMESSAGE_CODEinterface_responserequest_validonline_employee_newstamp2datetimedatetime2stampSYSTEM_EXCEPTIONDATA_EXCEPTION
user_photopagingc               @   s   e Zd ZdZeeeeeeeddd Zeeeeeeeeeeed	dd Z	eeeeeeeeeddd Z
eeeeeeeeeedd	d
 Zeeeeeeeeeeddd Zeeeeeeeeeddd ZdS )BioTimeAppTrainingu   
    【Training】
    )Zrtypec          
   C   s   ddl m} y0t|}|jjj}||}ttt	
|ddS  tk
rz }	 z ddl}
|
  ttdd|	tS d}	~	X Y nX dS )u@  
        Training Type
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:
            {"code": 1, "error": "", "describe": "", "message": "", "data":["code": ID, "name":""]}
        r   )CACHE_TRAINING_TYPE 
successfulN)Zmysite.att.global_cacher   r   
departmentZcompanyidgetr   r   jsondumps	Exception	traceback	print_excr   r   )selfsourcedevice_tokenlanguagetokenr   empZ
company_idchoiceser    r#   <G:\easytimepro\master/mysite/mobile\services\app_training.pycategory   s    

zBioTimeAppTraining.categoryc	             C   s  ddl m}	 ddlm}
 ddlm} ddlm} t|}t|}||krtd	t
d}d	t
d}ttdd||S t|}y|jj|d	}|sd	t
d
}ttddd|S |
j|
jg}|jj|jd|	|d|	|dB j|d}|r$t
d}d	t
d}d	t
d}ttd|||S |d }| }|j|_||_||_||_||_d|_|  dd	t
di}ttt|ddS  tk
r } z&ddl}|   ttdd|d	|S d}~X Y nX dS )u  
        Apply Training
        @param training_type:       Training Type（　BioTimeAppTraining --> category）
        @param start:               Training StartTime
        @param end:                 Training EndTIme
        @param remark:
        @param source:              data source(1: IOS， 2：Android)
        @param device_token:        push message Token
        @param language:
        @param token:
        @rtype:
            Success
                {"code":1,"error":"","describe":"","message":"","data":["code": ID, "name":""]}
            Exception
                {"code": -10001, "error": "", "describe": "error describe", "message": "Pop info", "data":""}
        r   )Q)models_choices)Training)TrainingCategoryz{0}Zleave_time_invalid_ranger   )ZpkzPlease try again)employee_id)Zstart_time__gt)Zend_time__lt)Zaudit_status__inZapp_manuallog_wrong_dataZtrainig_time_overlap   messageZrequest_already_processingr   N)!django.db.modelsr&   
mysite.attr'   Z mysite.att.models.model_trainingr(   Z(mysite.att.models.model_trainingcategoryr)   r	   format_r   r   r   objectsfilterREFUSECANCEL_AUDIT_SUCCESSr   excluder*   
start_timeend_timer%   apply_reasonaudit_statussaver   r   r   r   r   r   )r   Ztraining_typestartendremarkr   r   r   r   r&   r'   r(   r)   r6   r7   describer,   applierZtraining_categoryZselect_statusZtmp_trainingerrorobjdatar"   r   r#   r#   r$   apply&   sN    zBioTimeAppTraining.applyc          
      sP  ddl m}m} ddlm}	 ddlm}
 |dkr2t|}|sDd}nd| }dd	t|j	 d	 |d
 }d}|dkrxd}|p~d}yn|dddd|id}t
|||}||}|
g d}|rt|	j  fdd|D }||d< ttt|ddS  tk
r. } z ddl}|  ttdd|tS d}~X Y nX nd|}ttdd|tS dS )u  
        get self apply record(pending, approve, reject)
        @param approve_status:    0:approved&rejected, 1:pending, 2:approved，3：rejected
        @param page_num:        page number(１５items/page)
        @param source:          data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            success
                {"code":1,"error":"","describe":"","message":"","data":{"category":1,"
                items":{"code": ID,"pin":"emp_code","name":"first_name","photo":"photo address","start":
                "start time(stamp)","end":"end time(stamp)","remark":"apply reason","category":"","apply_time":"",
                "approve_status":"int value","approve_describe":"status describe","approved_remark":"approve reason",
                 "approved_time":"approve time"},]}}
            fail
                {"code":-10001,"error":"","describe":"","message":"Pop-up message","data":""}
        r   )get_sqlp_query)r'   )CATEGORY_TRAINING)r   r+         z audit_status in (2, 3) z audit_status in (%s) z0 u.employee = %(applier)s and %(audit_status)s  ")r?   r9   Zchange_time)r+   
apply_timer+   sqlZtraining_applicationmobilewhere)ZsqlidZappZparams)r%   itemsc                s   g | ]}|d  |d |d t |d t|d t|d d|d |d t|d |d	 d |d	 |d	 d|d
 t|d dqS )r   r+   rG   rH      z{0}            
   )codepinnamephotor;   r<   r=   r%   rJ   approve_statusapprove_describeapproved_remarkZapproved_time)r   r
   r/   r   ).0r)statusr#   r$   
<listcomp>   s   z5BioTimeAppTraining.my_application.<locals>.<listcomp>rN   r   r   Nz"parameter approve_status={0} error)Zmysite.sql_utilsrD   rE   r.   r'   Zmysite.mobile.choicesrF   r   strr   r   dictALL_AUDIT_STATUSr   r   r   r   r   r   r   r   r   r/   r   )r   rY   page_numr   r   r   r   rD   rE   r'   rF   r    _approve_statusrM   Z	sort_namerK   ZrowsrB   rN   r"   r   r>   r#   )r^   r$   my_applicationd   s@    


 
z!BioTimeAppTraining.my_applicationc              C   s$  ddl m} ddlm}	 ddlm}
 ddlm} ddlm	} |dkrt
|
j}|s^dd	g}n ||
jfkrx|
j|
jg}n|g}t|}|j }g }y.|rt|jd
d}|dgkr|	jj|j||d|jd}n|	jj|j||ddd}|	jj|jdd||ddd}|	jj|jd|j||ddd}|	j||jdddd||jddddB ||jddddB dddddd j|jd}|rtg }x|D ]}|d }|jj|ddddd dd!d"d#}|r|d }|d |d$ |d% t|d$ d&t|d' d&t|d d&|d	 d&|d t|d( |d d&||d |d |d	 t|d) d*}|| qW g }|d'krt|d+d, dd-}n|dkrt|d.d, dd-}tt t!"|d/d0S  t#k
r } z ddl$}|%  tt&d/d/t'|S d}~X Y nX nt(d1}tt&d/d/|t)S dS )2u  
         get training approval list
        @param approve_status:  ·（required）0:approved&rejected, 1:pending, 2:approved，3：rejected
        @param page_num:        page number(１５items/page)
        @param order_by:        sort(1: apply time，２：approve time), application page default１，approve page default２
        @param source:           data source(1: IOS， 2：Android)
        @param device_token:    Token for push message
        @param language:
        @param token:
        @rtype:
            {"code": 1, "error": "", "describe": "", "message": "", "data":[{"id": ID, "pin": "emp_code", "name":"first_name",
            "photo":"photo address", "start": "", "end": "", "remark":"apply reason", "approve_status": ""},]}
        r   )ContentType)NodeInstance)r'   )r(   )r&   )r   r+   rG   rH   rO   rP   rQ   rG   rH   ZattZtrainingN)0workflow_instance__workflow_engine__content_typenode_engine__approver__in	state__inapprover_admin_idZapprover_employee_idT)rh   ri   rj   rk   is_next_node)rh   Z node_engine__approver_by_overallZdepartmentsri   rj   rl   rk   Fr   )Zflat)Zid__inZworkflow_instance__exception_idZworkflow_instance__employeestater=   rJ   is_last_node)Zworkflow_instance__employee_id)r   Zcategory__category_namer6   r7   r8   Zemployee__emp_codeZemployee__first_name
audit_timerP   rQ   z{0}r+   rO   rR   )rU   rV   rW   rX   r;   r<   r=   r%   rJ   rY   rZ   r[   approval_timec             S   s   | d S )Nrp   r#   )kr#   r#   r$   <lambda>      z2BioTimeAppTraining.approval_list.<locals>.<lambda>)keyreversec             S   s   | d S )NrJ   r#   )rq   r#   r#   r$   rr     rs   r   r   zapprove_status_not_in (0,1,2,3))*Z"django.contrib.contenttypes.modelsrf   mysite.workflow.modelsrg   r.   r'   mysite.att.modelsr(   r-   r&   ra   rb   ZAPPLICATIONZAUDITINGr   Z	flow_roleallr1   Zget_by_natural_keyr2   r   r   Zvalues_listZdistinctr5   r   r/   r
   r   appendsortedr   r   r   r   r   r   r   r   r   r0   r   ) r   rY   rc   order_byr   r   r   r   rf   rg   r'   r(   r&   r^   rd   r    Z	emp_rolesrB   Zct_otZNodeInstance_objZNodeInstance_obj_without_departZNodeInstance_obj_with_departZapprove_nodesZprv_exceptionr]   Zexception_idZ	apply_objZres_dataZdata_filtered_listr"   r   r>   r#   r#   r$   approval_list   s    




&






 z BioTimeAppTraining.approval_listc           
   C   s  ddl m} ddlm}	 ddlm}
 ddlm} dd l}|r||	j	|	j
fkrftd}ttdd|tS t|}|jj|d}|rv|d }y|j }||	j	krf||_t| d	 |_||_|  |j|| |
jj|d
 d}|rxLt|D ]@\}}|}d}|j}|j}|r$P |r d|_|  d}P q W |r||d	  }d|_|  n||	j
kr||_t| d	 |_|  |j ||j d}|jj|j!d" }|j# d}xB|D ]:}|j$dkr|j$}|dkr|
jj|j%dj&|d qW dd'tdi}tt(t)*|ddS  t+k
rr } z dd l,}|-  ttddt.|S d }~X Y nX nd'td}ttdd|tS nd'td}ttdd|tS d S )Nr   )r(   )r'   )rg   )WorkflowInstanceZ!param_approve_status_out_of_ranger   )abstractexception_ptr_idr+   )Zworkflow_instance__exceptionorderFT)Z	exceptionrH   )r   )rm   r,   z{0}OKr   Zobject_not_foundZobject_id_not_found)/rw   r(   r.   r'   rv   rg   Z(mysite.workflow.models.workflow_instancer}   datetimeAUDIT_SUCCESSr3   r0   r   r   r   r   r1   r2   nowaudit_reasonr`   splitapproverro   r:   ZworkflowinstanceZapprove_current_node_byrx   r{   	enumeraterl   rn   Zreject_current_node_byr~   firstZnodeinstance_setrm   r   updater/   r   r   r   r   r   r   r   ) r   rU   rY   r=   r   r   r   r   r(   r'   rg   r}   r   r>   r   ZobjsrA   ro   ZnodesiZnodeindexZset_next_nodeZcurrent_nodern   Z	next_nodeZstate_Zworkflow_instanceZnode_setrB   r"   r   r#   r#   r$   approve  s~    



 zBioTimeAppTraining.approvec             C   s   ddl }ddlm} ddlm}	m}
 |jj|d }|r|j	|	krt
|}d|j||_|
|_	|j|_|j  |_||_|  ddtd	i}td
}ttt|dd|S td}ntd}|rttddt|S ttddt|S )u*  
        revoke approve
        @param code:            Obj ID
        @param remark:          audit_reason
        @param source:          data source (1: IOS， 2：Android)
        @param device_token:    Push message Token
        @param language:
        @param token:
        @rtype:
        r   N)r(   )r   r4   )r   zRevoke by {0} and Remark is {1}r,   z{0}r   Zrevoked_successfulr   Z$only_approved_records_can_be_revokedZ!workflow_instance_does_not_exists)r   rw   r(   Zmysite.att.models_choicesr   r4   r1   r2   r   r9   r   r/   rW   r   r   r   ro   Z_approve_userr:   r0   r   r   r   r   r   r   )r   rU   r=   r   r   r   r   r   r(   r   r4   rA   userrB   r,   r>   r#   r#   r$   revokeg  s*    

zBioTimeAppTraining.revokeN)__name__
__module____qualname____doc__r   r   intr`   r%   rC   re   r|   r   r   r#   r#   r#   r$   r   
   s   $= >"{"Gr   )r   Zdjango.utils.translationr   r0   Zmysite.ladon.ladonizerr   Zmysite.mobile.utilsr   r   r   r   r   r	   r
   r   r   r   r   objectr   r#   r#   r#   r$   <module>   s   4