B
    O|c                 @   s  d dl Z d dlZd dlZ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mZ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% d dlm&Z& d dl'm(Z( d dl)m*Z* ee+Z,ej-Z.ej/ddddd Z0ej/dddbddZ1dd Z2ej/d dd!d" Z3ej/d#dd$d% Z4ej/dd&d'd(d)dcd*d+Z5ej/dd&d'd,d)d-d. Z6ej/dd&d'd/d)d0d1 Z7ej/dd&d'd2d)d3d4 Z8ej/dd&d'd5d)d6d7 Z9ej/d8dd9d: Z:ed;d<d=d>d? Z;ej/d@ddAdB Z<ed;dCd=dDdE Z=ed;dFd=edGdH Z>eedIdJdKdLd=dMdN Z?ed;dOd=dPdQ Z@ej/dRddSdT ZAej/dUddddVdWZBdXdY ZCeedZd[d\d=d]d^ ZDed;d_d=d`da ZEdS )e    N)cache)settings)gettext_lazy)periodic_task)get_task_logger)crontab)
celery_app)close_db_connection)sending_mail_attach_imagesending_mailsend_notifications)!read_line_notify_transaction_file)send_line_notify)short_date_formatshort_time_formatshort_date_format_for_celery)loader)SystemSetting)tempFile)UUIDEncoder)INTELLIGENTTIME)get_software_type_without_loadTzbase.tasks.dashboard_request)bindnamec                s  ddl m}m} ddlm}m}m}m} ddlm	}	 t
j
 }
t
j }|t
jdd }|jr|	jj||f|jjjdjd d}|j|d}nd|	jj||f|jdjd d}|jsi }|j r|j |d	< |j r|j |d
< |jf |}|j|d|dd}|ddj|dddd}g g d}| rt

|j |j!|j"fddt#d|
j$d |
j% D }dd |D   fdd|D }||d< ||d< t&'||
|dd d S )Nr   )ExtractHourExtractMinute)CountFExpressionWrapperValue)Transaction   )days)Zpunch_time__rangeZemp__company_id)empZemp__department__inZterminal__area__in
punch_time)hhmmr%   r&   pk)num)headspayloadc                s$   g | ]}d j  tj|d dqS )z{d.hour:0>2d}:{d.minute:0>2d})Zminutes)d)formatdatetime	timedelta).0x)start *G:\easytimepro\master/mysite/base\tasks.py
<listcomp>E   s   z%dashboard_request.<locals>.<listcomp><   c             S   s   i | ]}|d  dj f |qS )r(   z{hh:0>2d}:{mm:0>2d})r,   )r/   rr2   r2   r3   
<dictcomp>G   s    z%dashboard_request.<locals>.<dictcomp>c                s   g | ]}  |d qS )r   )get)r/   h)exist_punchr2   r3   r4   K   s    r)   r*   )stampdataset   )(Zdjango.db.models.functionsr   r   Zdjango.db.modelsr   r   r   r   Zmysite.iclock.modelsr    r-   nowdatetodayr.   Zis_employeeobjectsfilterZ
departmentcompanyidexcludecurrent_companyZis_superuserZget_auth_deptexistsallZget_auth_areaZannotatevaluesZorder_bycountyearmonthdayrangehourminuter   set)taskuserZ	cache_keyr   r   r   r   r   r   r    r>   r@   end_dayZquerysetfiltersr<   r)   r*   r2   )r:   r1   r3   dashboard_request$   sB    



 


rV   zbase.tasks.log_recorder)r    c	                s  dd l }	yddlm}
 W n  tk
r8   ddlm}
 Y nX dd l}ddlm} ddlm	} ddl
m} ddlm} ddlm} dd	lm} y.t |jr|  t|tttfr|	|}nt||jrnttd
t|r|d  | }W d Q R X nLt||jr>t||kr8|d|d |d | }n|}nttd fdd}t||jr| s|dd}d}|}g }nt|ttfs|g}xrt |D ]f\}}t||j!r|||| n@t||jr| r|||t"| nd|kr|||| qW t|
dd |}|	jdd |D t#d}d$dd |D }|| |||| j%|t|rr|d n j&||||d
}y|'  dS  t(k
r } z|S d }~X Y nX W n$ t(k
r } z|S d }~X Y nX d S )Nr   )filterfalse)ifilterfalse)override)get_content_type_for_model)AdminLog)cprint)MAX_ACTION_NAME)zk_sitez@messages_is_either_one_of_stringtypes_or_json-encode-able_formatz_[WARNING] action_name shall not exceed the maximum length({}). Otherwise, it will be truncated.ZredzIaction_name_is_either_one_of_string_types_or_non-argument_callable_objectc                s.    d krt td jj|d | |< d S )Nz;if_obj_is_integer_key, then_caller_must_provide_model_class)r'   )
ValueError_rA   rB   first)rA   ir'   )modelr2   r3   
_handle_pk|   s    z log_recorder.<locals>._handle_pk|rW   -c             S   s   | d kS )Nr2   )r0   r2   r2   r3   <lambda>       zlog_recorder.<locals>.<lambda>c             S   s   g | ]}t |d dqS )r'   rW   )getattr)r/   objr2   r2   r3   r4      s    z log_recorder.<locals>.<listcomp>)cls,c             S   s   g | ]}d j |dqS )z{obj})rk   )r,   )r/   rk   r2   r2   r3   r4      s    )
rS   actionZ
ip_addresscan_routable
company_idZcontent_type_iddescriptiontargetstargets_repraction_statussuccess))json	itertoolsrX   ImportErrorrY   sixdjango.utils.translationrZ   Zdjango.contrib.admin.optionsr[   mysite.base.modelsr\   Zmysite._utilsr]   Zmysite.base.db_constr^   Zmysite.adminr_   
isinstanceZstring_typesZget_model_adminlisttupledictdumps	TypeErrorra   callablelenr,   isdigitreplace	enumerateZinteger_typesintr   joinrF   r'   save	Exception)rS   Zipro   rA   rn   statusZmessagesrd   rt   rv   rY   ry   Ztranslation_overrider[   r\   r]   r^   r_   Zaction_namere   rr   rs   rc   rk   loger2   )rd   r3   log_recorderQ   sz    




r   c             C   sb   dd l }i }xP| D ]H}t|d dd}|| }|  ||d |  i qW |S )Nr   
image_pathzutf-8rbcid)	base64openencodeZ	b64encodereadcloseupdatestripdecode)srcr   resultimgfpZencoded_stringr2   r2   r3   encode_images   s    
r   z#base.tasks.delivery_exception_emailc       $      C   s  dd l }ddlm} d}d}	d}
d}||kr6td}n"||	krHtd}n||
krXtd	}g }|jj|d
j}tjd d d t	| d }t
j|r||dd tjd t	|dd d |d  d }t
j|r||dd tjjd|d }d}d}d}d}|rRt|j}|dd}|dd}|dd}|dd}|d}|r|g}d}|d }|d } t||}t||}|d }|d  }|d! }|}|}|}|}td"|j  d# d$|j  d%d&||d f f  t d' tkr|d} |rt|} td( }!|| |||||||||t	|d| krFdn| d d| krZdn| d d)}"t||"||!||d* n8td+|| ||||||||||d,}#t ||#|||d* d S )-Nr   )Company      r!   rW   Zfrequency_option_dailyZfrequency_option_weeklyZfrequency_option_monthly)rD   z/company_logo/logora   z.jpglogo_cid)r   r   zphoto/rg   /emp_codeuser_cidcompany_setting)r   rp   company_nameemail_signatureemail_signature1email_signature2emailzAttendance Exception
first_name
late_timesearly_leave_timesabsent_timesz
job_%s.txtz%Y%mz%s %sz%Y%m%d%H%M%Szexception email send to %s(%s)software_typeZcloud_attendance_exception)enor#   start_date1	end_date1lateearly_leaveabsentcompany_name1r   r   r   r   r   r   )imageszmail/mails.html)r   r#   r   r   r   r   r   r   r   r   r   r   )!r-   mysite.cloud.modelsr   ra   rA   r8   rD   r   ADDITION_FILE_ROOTstrospathrG   appendr   r   rB   rb   rv   loadsvaluer   r   r>   strftimer   r   r   all_template_idr   r   render_to_stringr
   )$r#   item
start_dateend_daterp   	frequencyr-   r   ZDAILYZWEEKLYZMONTHLYtempr   rC   	logo_pathr   r   r   r   r   r   company_paramsr   tosubjectr   r   r   r   r   r   r   attachmentstemplate_idcontextbodyr2   r2   r3   delivery_exception_email   s    	

*



r   z6base.tasks.delivery_exception_email_to_depament_managec             C   s   | j r| j g}g }d}|| x@|D ]8}dj|d p<|d |d |d |d d}|| q&W d	}	d
j| j|d|dd|d d}
t d tkrtd }d|
i}t	|	|||| nt
|	|
|| dS )a9  
    Delivery email after attendance calculation(it depends on alert setting)
    :param dept: Department
    :param items: [{'emp_code':'***', late_times': 0, 'early_leave_times': 0, 'absent_times': 0 ...}]
    :param start_date: Calculation Start Date
    :param end_date: Calculation End Date
    :return:
    z
            <table border="1" cellspacing="0" cellpadding="10"><thead><tr>
                <th>Name</th>
                <th>Late</th>
                <th>Early Leave</th>
                <th>Absent</th>
            </tr></thead><tbody>
        z
                <tr>
                <td>{emp}</td>
                <td>{late}</td>
                <td>{early_leave}</td>
                <td>{absent}</td>
                </tr>
            r   r   r   r   r   )r#   r   r   r   zAttendance Exceptionz
            Dear {manager},<br>
                There are some attendance exceptions from {start_date} to {end_date}:
                    {body_detail}
        z%Y-%m-%d %H:%M:%SrW   z</tbody></table>)managerr   r   body_detailr   dynamic_contentbodyContentN)r   r   r,   usernamer   r   r   r   r   r   r   )r   itemsr   r   rp   r   Zbody_detail_listr   r   r   r   r   r   r2   r2   r3   +delivery_exception_email_to_depament_manage  s&    


r   r      zbase.tasks.join_company_email)r   Zmax_retriesZdefault_retry_delayr   c             C   sn  ddl m} y
|j}W n tk
r.   d}Y nX g }|jd }ddddd	d
dddg	}x8|D ]0}|| }tj|rZ|||dd d qZW d}|rt	|}d
|}|dkrtd }|||||||	|
ddd|d |d |d |d |d |d |d |d d }nNtd! }|||||d"dd|d |d |d |d |d |d |d |d d#}t||||||d$ dS )%z
    :param email:
    :param admin_email:
    :param company_name:
    :param company_id:
    :param url_approval:
    :param url_reject:
    :param role: 2:vendor
    :param vendor_name:
    :param vendor_phone:
    :param vendor_cnr:
    :return:
    r   )r   zIntelligent Timez/cloud/static/images/email/zandroid_app.pngzenvelop_logo.pngzfacebook_icon.pngzintelligentTime_logo.pngzios_app.pngzlinkedin_icon.pngzstrip_logo.pngztwitter_icon.pngzyoutube_icon.pngN)r   r   rW   z"Approval User Notification From {}r   Zjoin_as_vendorZvendorzmailto:support@zkteco.inzsupport@zkteco.inandroid_appfacebook_iconintelligentTime_logoios_applinkedin_icon
strip_logotwitter_iconyoutube_icon)cloud_software_namer   r   url_approval
url_rejectvendor_namevendor_phone
vendor_cnrrolesupport_emailsupport_email_idr   r   r   r   r   r   r   r   Zjoin_as_companyZ	associate)r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   )django.confr   CLOUD_SOFTWARE_NAMEr   STATIC_ROOTr   r   rG   r   r   r,   r   r   )rR   r   Zadmin_emailr   rp   r   r   r   r   r   r   r   r   r   email_pic_pathimages_namer   img_pathr   r   r   r   r2   r2   r3   join_company_emailS  sr    





r   zbase.tasks.reset_pwd_link_emailc             C   s  ddl m} y
|j}W n tk
r.   d}Y nX g }|jd }ddddd	d
dddg	}x8|D ]0}	||	 }
tj|
rZ||
|	d d d qZW d}|rt	|}d
|}td }||dd|d |d |d |d |d |d |d |d d}t|||g|||d d S )Nr   )r   zIntelligent Timez/cloud/static/images/email/zandroid_app.pngzenvelop_logo.pngzfacebook_icon.pngzintelligentTime_logo.pngzios_app.pngzlinkedin_icon.pngzstrip_logo.pngztwitter_icon.pngzyoutube_icon.pngr   )r   r   rW   z#Reset Password Notification From {}Zreset_passwordzmailto:support@zkteco.inzsupport@zkteco.inr   r   r   r   r   r   r   r   )r   link_urlr   r   r   r   r   r   r   r   r   r   )r   )r   r   r   r   r   r   r   rG   r   r   r,   r   r   )rR   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   r2   r2   r3   reset_pwd_link_email  s@    




r   zbase.tasks.send_register_emailc             C   s  ddl m} y
|j}W n tk
r.   d}Y nX g }|jd }ddddd	d
dddg	}x8|D ]0}|| }	tj|	rZ||	|d d d qZW d}
|rt	|}
d
|}td }||dd|
d |
d |
d |
d |
d |
d |
d |
d d}t|||g||d d S )Nr   )r   zIntelligent Timez/cloud/static/images/email/zandroid_app.pngzenvelop_logo.pngzfacebook_icon.pngzintelligentTime_logo.pngzios_app.pngzlinkedin_icon.pngzstrip_logo.pngztwitter_icon.pngzyoutube_icon.pngr   )r   r   rW   z$Account Confirm Notification From {}Zactivate_accountzmailto:support@zkteco.inzsupport@zkteco.inr   r   r   r   r   r   r   r   )r   Zlink_registerr   r   r   r   r   r   r   r   r   r   )r   )r   r   r   r   r   r   r   rG   r   r   r,   r   r   )rR   r   r   r   r   r   r   r   r   r   r   r   r   r   r2   r2   r3   send_register_email  s@    




r   zbase.tasks.status_join_companyc             C   s  ddl m} y
|j}W n tk
r.   d}Y nX g }|jd }ddddd	d
dddg	}	x8|	D ]0}
||
 }tj|rZ|||
dd d qZW d}|rt	|}d| d
| }td }||||dd|d |d |d |d |d |d |d |d d}t|||g|||d  dS )!z
    :param email:
    :param admin_email:
    :param company_name:
    :param url_approval:
    :param url_reject:
    :return:
    r   )r   zIntelligent Timez/cloud/static/images/email/zandroid_app.pngzenvelop_logo.pngzfacebook_icon.pngzintelligentTime_logo.pngzios_app.pngzlinkedin_icon.pngzstrip_logo.pngztwitter_icon.pngzyoutube_icon.pngNr   )r   r   rW   zJoin company zNotification From {}Zjoin_responsezmailto:support@zkteco.inzsupport@zkteco.inr   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   )r   )r   r   r   r   r   r   r   rG   r   r   r,   r   r   )rR   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   r2   r2   r3   status_join_company  sD    




r   z base.tasks.status_company_joinedc             C   s  ddl m} y
|j}W n tk
r.   d}Y nX g }|jd }ddddd	d
dddg	}x8|D ]0}	||	 }
tj|
rZ||
|	dd d qZW d}|rt	|}d| d
| }td }|||ddd|d |d |d |d |d |d |d |d d }t|||g|||d! dS )"zi
    :param vendor_email:
    :param vendor_company_name:
    :param vendor_company_id:
    :return:
    r   )r   zIntelligent Timez/cloud/static/images/email/zandroid_app.pngzenvelop_logo.pngzfacebook_icon.pngzintelligentTime_logo.pngzios_app.pngzlinkedin_icon.pngzstrip_logo.pngztwitter_icon.pngzyoutube_icon.pngNr   )r   r   rW   zThe z; has joined and treats you as a vendor Notification From {}Ztreat_as_vendorzcompany joinedzmailto:support@zkteco.inzsupport@zkteco.inr   r   r   r   r   r   r   r   )r   r   vendor_company_nameZcompany_joined_statusr   r   r   r   r   r   r   r   r   r   )r   )r   r   r   r   r   r   r   rG   r   r   r,   r   r   )rR   Zvendor_emailr   Zvendor_company_idr   r   r   r   r   r   r   r   r   r   r   r2   r2   r3   status_company_joined-  sD    



r   zbase.tasks.migrate_taskc       
   	   C   s   ddl m} d}d}d}t| j}|d }td}|r||kszjytd| || W n8 tk
r   dd l	}|
  td| ||d< Y nX ||d< td| W d d|d< t|}	|	| _|   td td X d S )	Nr   )
to_migrater!   r   r   Zexc_migrateZis_migrated
   )Zmysite.base.views.db_migrater   rv   r   r   r   r8   rQ   r   	traceback	print_excr   r   timesleepdelete)
instancer   Z
PROCESSINGSUCCESSZ	EXCEPTIONZmigrate_valuesZ
is_migrateZis_processingr   paramsr2   r2   r3   migrate_task_  s0    


r  r5   zbase.tasks.database_backup)Z	run_everyr   c              C   sz  ddl m}  ddlm} ddlm} | jjdd }|s>dS t	j	
 }t|j}d}|d	|d
 dd krt|d }|d dkr|j|krd}n.|d dkr| |krd}n|d dkrd}|rvy\|dd}||d |\}	}
tj|d |
}|tjtjd||ttddjdd W nJ tk
rt } z*|tjtjdd|dt|djdd W dd}~X Y nX dS )z]
    Database backup automatically, checking every minute.
    :param task:
    :return:
    r   )r   )backup)DBBackupLog	db_backup)r   NFz%H:%MZ
point_time   Z	point_dayr   1T23is_backup_photo	file_pathZSystemZdbBackupLog_action_dbBackupAuto)db_typedb_nameoperatorbackup_filebackup_timeremark)Zforce_insertrW   r!   )r  r  r  r  r  Zbackup_statusr  )mysite.base.models.sys_settingr   Zmysite.base.database_backupr  r{   r  rA   rB   rb   r-   r>   rv   r   r   r   r   rM   weekdayr8   r   r   r   r   ZDATABASE_ENGINEZDATABASE_NAMEr   ra   r   r   )r   r  r  r  r>   r  Zwhether_backuprM   r  r;   	file_nameZcomplete_pathr   r2   r2   r3   database_backup}  s<    

r  z"base.tasks.auto_export_transactionc             C   sL  dd l }ddlm} ddlm} d\}}}t| j}t|	drL|	dnd}	t
d |	ddd}
d	d
 |
D }
|	dd }t|	dd}|	dkr2|st|j|j|j}ntj|d}||  t|	d krH|||||  |d|d< t|| _|jj
| jd }|rH| jdd n|d|
krHt|	dd}||kr$|r|sz|tjdd }ntj|d}|||||  nHt|j|j|j}|s|tjdd }ntj|d}|||||  |d|d< t|| _|jj
| jd }|rH| jdd n$||krt|	dd}|| krH|r|sj|tjdd }ntj|d}|||||  nHt|j|j|j}|s|tjdd }ntj|d}|||||  |d|d< t|| _|jj
| jd }|rH| jdd n4||krHt|	dd}||j|jd }t||}|j|krH|tj|jd }|j}t|j|jt||}|r|s|tj| |  jd }ntj|d}|||||  n6t|j|j|j}|rtj|d}|||||  |d|d< t|| _|jj
| jd }|rH| jdd d S )Nr   )transaction_auto_export)AutoExportTask)r   r!   r   export_intervalexport_timerW   ;c             S   s6   g | ].}d j t|dd t|dd dqS )z{hour:02}:{minute:02}:r   r!   )rO   rP   )r,   r   split)r/   r   r2   r2   r3   r4     s   z+auto_export_transaction.<locals>.<listcomp>execute_timerT   r!   z%Y%m%d%H%M%Sr5   )rD   )r  )Zupdate_fieldsz%H:%Mr   )r"   week_day   	month_day)calendarZmysite.iclock.auto_exportr  r{   r  rv   r   r  r   r8   rB   r  r-   rK   rL   rM   strptimeZtotal_secondsr   r   rA   rD   rG   r   r.   r  Z
monthrangeminr?   r"   )rR   ntr#  r  r  ZdailyZweeklyZmonthlyr  r  Zexport_timesr  Zinclude_todayr  Zexists_taskr   r1   endr   r"  Zdays_numZtrigger_dayZ
last_monthZlast_month_days_numr2   r2   r3   auto_export_transaction  s    





 r(  z%base.tasks.auto_export_task_executivec              C   sn   ddl m}  | j }tj }xH|D ]@}yt|| W q& tk
rd } zt	| W d d }~X Y q&X q&W d S )Nr   )r  )
r{   r  rA   rH   r-   r>   r(  ZdelayWarningprint)r  Zqsr&  rR   r   r2   r2   r3   auto_export_task_executive  s    


r+  z"base.tasks.middleware_data_migratec           
   C   s   ddl m}  ddlm}m}m}m} | jr|tj	 }y$|| || || || W n" t
k
rz } zW d d }~X Y nX d S )Nr   )r   )employee_migrationarea_migrationposition_migrationdepartment_migration)r   r   Z(mysite.base.views.middletable_migrationsr,  r-  r.  r/  ZENABLE_MIDDLE_TABLEr-   r>   r   )r   r,  r-  r.  r/  Ztrigger_timer   r2   r2   r3   middleware_data_migrate  s    
r0        )rO   rP   zbase.tasks.report_files_cleanc           	   C   s   dd l } tjtjd}tj|rt|}g }x4|D ],}y|t	| W q8 t
k
rb   Y q8X q8W t|dkr|  |  xV|dd  D ]F}tdtj|t| y| tj|t| W q   Y qX qW d S )Nr   Zreportsr   z[*]Remove Folder:)shutilr   r   r   r   r   rG   listdirr   r   r   r   sortreverser*  r   rmtree)r3  Zreport_pathdirsZfoldersr+   r2   r2   r3   report_files_clean/  s&    


r9  z base.tasks.real_time_line_notifyc           
   C   s  t  \} }|r
tj }x|D ]}yttj| |}| }W d Q R X |r|d}tj	|d d}|
 |
 k rttj| | w || jdk rw t|d |d |d |d |d |d d	d
 ttj| | W q  tk
r   dd l}Y q X q W d S )N	r!   z%Y-%m-%d %H:%M:%Sr  r   r      r   d   )r$   Zverify_typeZpunch_stateZterminal_snr   Zterminal_aliasZmessage_type)r   r-   r>   r   r   r   r   r   r  r$  r?   removesecondsr   r   r   )r   filesr>   filefZtransactionZpunch_time_datetimer   r2   r2   r3   real_time_line_notifyF  s4    



rB  z(base.tasks.delivery_passwordchange_emailc             C   s  g }t jd d d t| d }tj|r>||dd d}|rNt|}tj	j
d|d	 }d}|rt|j}|d
d }|}| d }	| d g}
d}t d tkrtd }||	d|krdn|d d}t|||
|||d n$td||	d}t|||
||d d S )Nz/company_logo/r   ra   z.jpgr   )r   r   rW   r   )r   rp   r   rS   Zmail_idzPassword Changed Notificationr   Z#cloud_password_changed_notification)r   rS   r   )r   z%mail/passwordchangednotification.html)r   rS   )r   r   r   r   r   rG   r   r   r   rA   rB   rb   rv   r   r   r8   r   r   r   r   r   r   r
   )Zto_emailrp   r   r   r   r   r   r   r   rS   r   r   r   r   r   r2   r2   r3   delivery_passwordchange_emailf  s2    
rC  z8base.tasks.delivery_email_alert_for_temp_and_mask_statusc             C   sz   d}|dkrdj |||d}n|dkr8dj ||||d}t d tkrhtd	 }	d
|i}
t| |
||	| nt| ||| d S )NrW   Z
mask_alertz
                Dear admin,<br>
                <br>
                    We have detected Employee with name: {first_name}, Id: {emp_code} without mask on {punch_time}. 
            )r   r   r$   Zabnormal_temperature_alertz
                    Dear admin,<br>
                    <br>
                        We have detected  Employee with name: {first_name}, Id: {emp_code} with abnormal temperature of {temp} on {punch_time}.
                    )r   r   r   r$   r   r   r   )r,   r   r   r   r   r   )r   r   r   rp   r   Z
alert_namer$   r   r   r   r   r2   r2   r3   -delivery_email_alert_for_temp_and_mask_status  s    rD  c          	   C   sr  ddl m} ddlm} ddlm} ddlm} ddlm	} ddl
m} ddlm}m}	 dd	lm}
 |}|jsrd S t|j}|d
}|sd S | |	tjd d }i }|jj| |djdd}xj|D ]b}|d|j }|rq|jd|j ddd y||j |j W q   |jg||j< Y qX qW d}x| D ]\}}|}|jj|d}|j  }dj!d"||j#| d}x`|D ]X}t$ d t%krt&d }d|i}t'|||j(j)g|| d n||||j(j)g|j*d qW q>W t$ d t%krn|rng }x| D ]\}}|| }q
W |
jjdd}x>|D ]6}dj!||j+j,| d}||||j(j)g|j*d q4W d S ) Nr   )Terminal)Area)send_one_mail)MyUser)r   )r   )r-   r.   )
MembershipZdeviceoffline_alertx   )r>  )rp   Zlast_activity__ltT)Zarea__is_defaultzoffline_flag_%sr!   i:	 )timeoutzDevice Offline Notification!)rD   z
        Dear,<br>
        <br>
        We have detected a device with Serial Number: {sn_num} in the Area: {area} went offline!,Time:{send_time}.
        <br>Have a good day.
        rm   )sn_numarea	send_timer   r   r   )rp   )r   z
                Dear,<br>
                <br>
                We have detected a device with Serial Number: {sn_num} in the Company: {company} went offline!,Time:{send_time}.
                <br>Have a good day.
                )rL  rC   rN  )-Z#mysite.iclock.models.model_terminalrE  Z"mysite.personnel.models.model_arearF  Z*mysite.admin.services.email.email_servicesrG  Zmysite.accounts.models.my_userrH  r  r   django.core.cacher   r-   r.   r{   rI  r   rv   r   r8   r>   r   ZMAX_DEVICES_STATErA   rB   rE   ZsnrQ   area_idr   r   Zmembership_setrH   r,   r   Z	area_namer   r   r   r   rS   r   rp   rC   r   )rp   alertrE  rF  rG  rH  r   r   r-   r.   rI  Zalert_settingsZis_device_offline_alert_enableddtr+   Zdevice_serialZdevicecr   kvrP  rM  Zmshipr   mr   r   Zall_devicesZ
superusersr2   r2   r3   device_offline_notification  s`    



$
rW  z*/5)rP   zbase.tasks.check_alert_settingc              C   s4   t jjdd} x | D ]}t|j}t|| qW d S )NZalert_setting)r   )r   rA   rB   r   rp   rW  )Zalert_queryrQ  rp   r2   r2   r3   check_alert_setting  s    

rX  zbase.tasks.ad_server_data_syncc              C   s   ddl m}  ddlm} ddlm} |jjddd}xH|D ]@}|d|}|d	|}|r:|s\q:|d
d}|snq:| ||| q:W d S )Nr   )sync_ad_server_data)r   )get_system_settingrD   T)Zflatad_server_settingad_field_settingZenable_syncF)	Zmysite.base.views.intergrationrY  r   r   mysite.utilsrZ  rA   Zvalues_listr8   )rY  r   rZ  Z	companiesrp   r[  r\  Zsync_enabledr2   r2   r3   ad_server_data_sync  s    


r^  )r   rW   Nr   )r   NNN)N)Fr-   r   rv   r   rO  r   r   r   rz   r   ra   Zcelery.taskr   Zcelery.utils.logr   Zcelery.schedulesr   mysiter   r]  r	   Zmysite.base.utilsr
   r   r   Zmysite.base.line.line_utilsr   Zmysite.base.line.line_notifyr   Zmysite.att.utilsr   r   r   Zdjango.templater   r  r   r   r   Zmysite.admin.constr   Zmysite.admin.utilsr   __name__loggerZNOTIFICATION_TEMPLATE_IDr   rR   rV   r   r   r   r   r   r   r   r   r   r  r  r(  r+  r0  r9  rB  rC  rD  rW  rX  r^  r2   r2   r2   r3   <module>   sd   -
Rn6 R)*32*h
 +
L