B
    ?cS                 @   s  d dl m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Z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  d dl!m"Z"m#Z# d dl$m%Z% e&e	G dd dej'Z(G dd deZ)dS )    )gettext_lazy)HttpResponse)adminconfig)AttSchedule)AddAttScheduleN)cache)db_constactions)ActionHandleError)
ImportData)AdminRuntimeWarning)Employee)AttShift)Q)
C_ATT_RULE)STATUS_VALIDSTATUS_RESIGN_PENDING)settingsc                   s   e Zd ZdZejd Zeje	gZdddZ
dd Zdd	 Zed
e_dd Zede_dd Zede_dd Zede_dd Zede_d  fdd	Z fddZdd Zdd Z  ZS )!AttScheduleAdmin)idemp_code
first_name	last_nameshift_alias
start_dateend_date)shiftNc             C   s   dS )NF )selfrequestobjr   r   ;G:\easytimepro\master/mysite/att\admin\attschedule_admin.pyhas_change_permission"   s    z&AttScheduleAdmin.has_change_permissionc             C   s   dS )NFr   )r   r    r   r   r"   has_add_permission%   s    z#AttScheduleAdmin.has_add_permissionc             C   s   |j jS )N)r   Zpk)r   r!   r   r   r"   shift_no(   s    zAttScheduleAdmin.shift_noZattShift_field_codec             C   s   |j jS )N)r   alias)r   r!   r   r   r"   r   -   s    zAttScheduleAdmin.shift_aliasZattShift_field_aliasc             C   s   |j jS )N)employeer   )r   r!   r   r   r"   r   2   s    zAttScheduleAdmin.emp_codeZemp_field_employeeCodec             C   s   |j jS )N)r'   r   )r   r!   r   r   r"   r   7   s    zAttScheduleAdmin.first_nameZemp_field_firstNamec             C   s   |j jS )N)r'   r   )r   r!   r   r   r"   r   <   s    zAttScheduleAdmin.last_nameZemp_field_lastNamec                s6   i }|dkr| j |d< || tt| j||f|S )z7
        Use special form during user creation
        NZform)Zadd_formupdatesuperr   get_form)r   r    r!   kwargsdefaults)	__class__r   r"   r*   A   s
    

zAttScheduleAdmin.get_formc                s   |j j}tt| |j|d}|j js|j j}|j j}|j j	}|
 rX|j| d}|
 rt|j| d }|
 r|j| d}tt|d}|dkr|ttdtd dB ttdB }|S )N)employee__company_id)Zemployee__department__in)Zemployee__area__in)Zemployee__position__in
resign_emp0)Zemployee__status)usercurrent_companyr)   r   get_querysetfilterZis_superuserZget_auth_deptZget_auth_areaZget_auth_posexistsallZdistinctstrr   getr   r   r   )r   r    
company_idZqsZ	auth_deptZ	auth_areaZauth_posr/   )r-   r   r"   r3   K   s$     zAttScheduleAdmin.get_querysetc             C   s<   t |d| jj| jjd}|  |j}|r8td|d S )Nimport_data)req
input_name	app_label
model_name;)ImportAttAcheduleDataoptsr=   r>   Zexe_import_data
error_infor   join)r   r    Z
obj_importZ	ret_errorr   r   r"   
dataimport_   s    zAttScheduleAdmin.dataimportc             C   s  ddl }yddlm} W n   ddlm} Y nX ddlm} t|d| j	j
 | j	j g }g }x|D ]}|d| qlW | }||}	|	d}
xBt|D ]6\}}d|}|
d|| |
d|t|d	  qW |	  |d t| d
d}d|d< |S )z
        Response for 'Download Template' in import page'
        :param request:
        :return: return import template
        r   N)StringIO)BytesIO)r   z{0}_{1}_TEMPLATEz{0}ZTemplate   zAapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet)Zcontent_typez+attachment; filename=Employee Schedule.xlsxzContent-Disposition)
xlsxwriterZ	cStringIOrE   iorF   Zmysite.personnelr   getattrformatrA   r=   upperr>   appendZWorkbookZadd_worksheet	enumeratewriteZ
set_columnlencloseseekr   read)r   r    rH   rE   r   ZfieldsZverbose_namefoutputwbZsheetivheadZresponser   r   r"   import_templateg   s0    




z AttScheduleAdmin.import_template)N)N)__name__
__module____qualname__Zlist_displayr   ZEMPLOYEE_LIST_FILTERZlist_filterr
   ZImportr   r#   r$   r%   _Zshort_descriptionr   r   r   r   r*   r3   rD   rZ   __classcell__r   r   )r-   r"   r      s&   








r   c                   s   e Zd Zd fdd	Zdd Zdd Zd	d
 Zdd Zxee	dg D ]Z
ee
 qDW dd Zdd Zdd Zdd Zdd Zdd Z  ZS )r@   r:   Nc       	         s   ddl m} |j}tj}|d|}|r0|| tt| |||| d | _	|jj
| _td| j	| jf tj d g | _dtd dtd dtd	 dtd
 g| _g | _d | _d | _d | _d | _d S )Nr   )activateZlanguagezattschedule_import_%s_%s   z%sschedule_field_employeeschedule_field_shiftschedule_field_startDateschedule_field_endDate)django.utils.translationr`   r1   r   ZLANGUAGE_CODEZget_preferencesr)   r@   __init__stampr2   r9   r   setdatetimenowZcalculate_fields_verboser^   Zmust_fieldsexist_codeseCodesNamesDateeDate)	r   r;   r<   r=   r>   r`   ZprofileZdefault_language_codeZlng)r-   r   r"   rg      s(    
 


zImportAttAcheduleData.__init__c       	      C   s   |g}x|r|  }|d| xx|D ]p}y|| j }W n   d}Y nX |rV| pXd}|| j }|rp| prd}|r&||kr&||krdS || q&W qW dS )uK   判断是否设置了一个部门的上级部门为其自身或其子部门r    FT)popinsertrp   striprm   rM   )	r   elemrecordsstoreZ
check_listZ
check_itemeZe_Datee_coder   r   r"   is_valid_record   s"    


z%ImportAttAcheduleData.is_valid_recordc       #   	      s  dd l }dd l}t j}d jp&d j}dd|dddd}t||	|d d	d
ddgdd  j
D }tfdd|D }|sttdxxtt j
D ]f} j
| }	|	dtd kr| _|	dtd kr| _|	dtd kr| _|	dtd kr| _qW t j j j j}
| j}tjj jddd
dd} fdd|D }dd |D  _xt jD ]~\}}||kr|| }dg|
d  }|d | j< |d pd| j< |d pd| j< |d pd| j< || qW i }xt jD ]\}}|d7 }| j }y| j }W n tk
rX   d}Y nX y| j }W n tk
r   d}Y nX y| j }W n tk
r   d}Y nX |s̈ jtdd |i  |rtjj| jd! }|s4 jtd"d |i  n,t|t j!kr4 jtd#|t j!d$  |sR jtd%d |i  |rt"jj| jd& }|s jtd'd |i  n,t|t j#kr jtd(|t j#d$  |s؈ jtd)d |i  |d k	r(yt$j$%|d*}|| j< W n(    jtd+d |i  wY nX |sF jtd,d |i  |d k	ryt$j$%|d*}|| j< W n(    jtd-d |i  wY nX |rt$j$%|d*}t$j$%|d*}|& |& k r jtd.d |i  g } '|||s jtd/||d0  d1S xFt|D ]:\}}d| }|(|g }||krN|| |||< qW ||d2< t)|t)| |d3< d4* jd d5 |d6< t||	|d qW |+ } t,j-rdd7l.m/}! t0| |!d8d9 d:}"n| 1d;d9 }"|" _d<S )=Nr   z$attschedule_import_processor_{0}_{1}rq   z{0}zValidating...   )statustotalfinishtpfpi,  zemployee idr   z
start datezend datec             S   s   g | ]}|  qS r   )lower).0itemr   r   r"   
<listcomp>   s    z7ImportAttAcheduleData.before_insert.<locals>.<listcomp>c             3   s   | ]}| kV  qd S )Nr   )r   ru   )valid_headersr   r"   	<genexpr>   s    z6ImportAttAcheduleData.before_insert.<locals>.<genexpr>z9Invalid import data,Please check the headers or file dataz%srb   rc   rd   re   )r.   r'   r   r   c                s   g | ]}| j  qS r   )rm   )r   rx   )r   r   r"   r      s    c             S   s   g | ]}|d  qS )r   r   )r   rx   r   r   r"   r      s       rG   z3error_data_on_row(%(index)s)_employee_code_is_emptyindex)r   r9   z5error_data_on_row(%(index)s)_employee_code_is_invalidzNerror_data_on_row(%(index)s)_the_length_of_employee_code_maximum_is_%(length)s)r   lengthz;error_data_on_row(%(index)s_the_shift_name_can_not_be_empty)r&   r9   z5error_data_on_row(%(index)s_the_shift_name_is_invalidzKerror_data_on_row(%(index)s)_the_length_of_shift_name_maximum_is_%(length)sz;error_data_on_row(%(index)s_the_start_date_can_not_be_emptyz%Y-%m-%dz5error_data_on_row(%(index)s_the_start_date_is_invalidz9error_data_on_row(%(index)s_the_end_date_can_not_be_emptyz3error_data_on_row(%(index)s_the_end_date_is_invalidzAerror_data_on_row(%(index)s_end_date_can_not_less_than_start_dateznthe_%(index)s_rows_of_data_can_not_be_set_higher_authorities_to_%(index_name)s_sector_or_sub-sector_of_its_own)r   Z
index_nameFr~   r   r?      rB   )
cmp_to_keyc             S   s   t | d t |d  S )Nr   )int)x1x2r   r   r"   <lambda>M      z5ImportAttAcheduleData.before_insert.<locals>.<lambda>)keyc             S   s   t | d t |d  S )Nr   )r   )r   r   r   r   r"   r   O  r   T)2jsoncopyrP   rv   rK   rh   r9   r   ri   dumpsrY   r6   r   r^   rangerm   rn   ro   rp   maxZdeepcopyr   objectsr4   Zvalues_listrl   rN   rM   
IndexErrorrB   r   r5   r	   ZMAX_EMPLOYEE_CODEr   ZMAX_SHIFT_NAMErj   strptimedaterz   r8   floatrC   itemssixZPY3	functoolsr   sortedsort)#r   r   r   _lenprocessor_keyprocessor_dataZheadersresultr   rx   Zmax_lenZall_recordsZ
exist_dataZ	new_codesrW   cZdb_datadataZd_levelru   ry   Zs_nameZs_dateZe_dateZvalidate_employeeZvalidate_shiftZ_validate_s_dateZ_validate_e_daterw   rX   r   Zscheduler   r   Z
list_itemsr   )r   r   r"   before_insert   s   













z#ImportAttAcheduleData.before_insertc             C   s   d S )Nr   )r   Zinsert_deptr   r   r"   records_analysisS  s    z&ImportAttAcheduleData.records_analysisc       %         s  dd l }t| j}d| jpd| j}dd|dddd}t|||d t| j	}i }| j
}d}x| jD ]\}	}
x|
D ]}t|d	kr|d td
| j| jf d }tj }|r||k rt||  dkrP nP |d7 }i }|| j }|| j }|| j }|| j }|| jks.|rxt|D ]}x.| j D ] \}}||krH|| ||< qHW || jkr8||  | j|}| j| }|jr fdd|jD }|r|d  |j}| | }|||< q8W | ||}y.t j!j"|| j#j$j%d}|r|d j&|d< W n& t'k
r@   dd l(}|)  Y nX t*j!j"|| j#j$j%d}|rl|d j&|d< yt+j!j"|| j#j$j%||d}|r|rt*j!j|d d} t j!j|d d}!t+j!j,| |!|d |d d}"|"-  n4|j.r | j/t0d||d  t+f |}#|#-  nt+f |}#|#-  W q t'k
rP }$ z|$W d d }$~$X Y qX qW ||d< t1|t1| |d< t|||d qrW d S )Nr   z$attschedule_import_processor_{0}_{1}rq   z{0}zProcessing...r{   )r|   r}   r~   r   r   i,  r   zattschedule_import_%s_%s
   c                s    g | ]}|d   kr|d qS )r{   r   r   )r   rx   )	tmp_valuer   r"   r     s    z5ImportAttAcheduleData.data_insert.<locals>.<listcomp>)r&   r9   shift_id)r   r9   employee_id)Zemployee__emp_coder.   Zstart_date__lteZend_date__gte)r   r   r   )r'   r   r   r   zgInvalid import data,Please check the start date %(start_date)s  or end date %(end_date)s  already Exist)r   r   r~   r   )2r   rP   rv   rK   rh   r9   r   ri   r   rY   Zneed_update_old_recordrM   r8   rj   rk   absZtotal_secondsrm   rn   ro   rp   rl   r   Zcalculate_fields_indexr   Zvalid_head_indexsr   Zvalid_model_fieldschoicesZattnameZget_db_valueprocess_rowr   r   r4   r    r1   r2   r   	Exception	traceback	print_excr   r   createZsaver5   rB   r^   r   )%r   r   r   r   r   Zhead_lencalculate_dictZ	overwritecountlevelZdsdZimport_heartrk   Zrow_fields_selectcodeZ
shift_namer   r   r   krX   Zf_indexZ	tmp_fieldZtvr   valuerow_datar   r   emp_idZobjsZempr   Zemp_scheduler!   rx   r   )r   r"   data_insertV  s    














z!ImportAttAcheduleData.data_insertZ
cache_keysc             C   s   |    d S )N)r   )r   r   r   r"   sqlserver_insert  s    z&ImportAttAcheduleData.sqlserver_insertc             C   s   |    d S )N)r   )r   r   r   r"   mysql_insert  s    z"ImportAttAcheduleData.mysql_insertc             C   s   |    d S )N)r   )r   r   r   r"   oracle_insert  s    z#ImportAttAcheduleData.oracle_insertc             C   s   |    d S )N)r   )r   r   r   r"   postgresql_insert  s    z'ImportAttAcheduleData.postgresql_insertc             C   s   t d| j| jf  d S )Nzattschedule_import_%s_%s)r   deleterh   r9   )r   r   r   r"   after_insert  s    z"ImportAttAcheduleData.after_insertc             C   sP   ddl m} dtd }||d}|rL|jj|| jjjdd }|j	|d< |S )Nr   )r   z%src   rq   )r   r9   r   )
&mysite.personnel.models.model_employeer   r^   r8   r   r4   r    r1   r2   r   )r   r   r   r   r   rm   r   r   r   r"   r     s    
z!ImportAttAcheduleData.process_row)r:   NN)r[   r\   r]   rg   rz   r   r   r   rJ   r   r   r   r   r   r   r   r   r   r   r_   r   r   )r-   r"   r@      s    rr@   )*rf   r   r^   Zdjango.httpr   mysiter   r   Zmysite.att.modelsr   Zmysite.att.actionsr   r   rj   Zdjango.core.cacher   Z
mysite.attr	   r
   Zmysite.admin.actionr   Zmysite.personnel.import_datar   Zmysite.admin.exceptionsr   r   r   Z mysite.att.models.model_attshiftr   Zdjango.db.modelsr   Zmysite.att.global_cacher   Zmysite.admin.modelsr   r   Zdjango.confr   registerZZKModelAdminr   r@   r   r   r   r"   <module>   s(   
m