B
    "fc.[                 @   s  d dl mZ d dlZd dlmZmZ d dlZd dlmZm	Z	 ej
Z
dZdZdZdZed	Zed
ZdZdZedZddddZdd dddddgZedededededededdZdZdZd\ZZZZd d! Zdkd#d$Zd%d& Zd'd( Z dld)d*Z!dmd,d-Z"d.d/ Z#dnd1d2Z$d3d4 Z%d5d6 Z&d7d8 Z'dod9d:Z(d;d< Z)d=d> Z*d?d@ Z+dAdB Z,dpdCdDZ-dEdF Z.dqdHdIZ/dJdK Z0dLdM Z1dNdO Z2dPdQ Z3dRdS Z4dTdU Z5dVdW Z6dXdY Z7drdZd[Z8d\d] Z9d^d_ Z:d`Z;dadb Z<dcdd Z=da>dedf Z?dgdh Z@didj ZAdS )s    )settingsN)activategettext_lazy)date	timedelta   i   zSystem ExceptionzData Exceptionzrobin.chen@zkteco.comzhttps://www.zkteco.in/u4   Copyright ©2019 ZKTECO CO.,LTD.All rights reserved.ZLoginzSign OutzRest Password)ZloginZsign_outZreset_password               Zweekday_option_mondayZweekday_option_tuesdayZweekday_option_wednesdayZweekday_option_thursdayZweekday_option_fridayZweekday_option_saturdayZweekday_option_sunday)r   r   r   r   r   r   r
   )r   r   r   r   c             C   s    ddl m} ddlm}m} dS )zP
    :param service: ladon service
    :return: service information by json
    r   )_interfaces)type_to_jsontypePORTABLE_STRING_TYPESN)Zmysite.ladon.interfacesr   Zmysite.ladon.compatr   r   )Zservicer   r   r    r   ,G:\easytimepro\master/mysite/mobile\utils.pyget_json_service*   s    r   UTF-8c             C   sj   dd l }yH|d|j}|| d }t|r6|d S | d dd dd S  tk
rd   |S X d S )Nr   zcharset\s*=\s*([-_.a-zA-Z0-9]+)CONTENT_TYPEZHTTP_ACCEPT_CHARSET;,)recompileIfindalllensplit	Exception)envdefaultr   Zrx_ctype_charsetresr   r   r   get_charset4   s    r#   c       
      C   s   dd l }|d|j}|d|j}d  }}d| kr|| d }|dd}||}t|r||d }||}	t|	r||	d }||fS )Nr   zmultipart/([^; ]+)zboundary=([^; ]+)r   
 )r   r   r   replacer   r   )
environr   Zrx_detect_multi_partZrx_detect_boundaryZ
multi_partboundaryZcontent_typeZmulti_part_matchZ	multipartZboundary_matchr   r   r   parse_environ@   s    

r)   c             C   s\   | t fkr$|r| d| S t|S | tfkr>|r:t|S dS | tfkrTttdS dS d S )Nz- r%   Zatt_model_manualLog)DEVICEstrMOBILEMANUAL_PUNCH_)Z	data_fromZsnlocationr   r   r   get_describeQ   s    


r0   c             C   s   ddl m} ddlm} | d }ddd}|rl|jj|ddd	dd	}|rl|d d	 pf|d d |d
< |d
 dkr| d }|jj|ddd	dd	}|r|d d	 p|d d |d
< t|d d |d|d< |S )Nr   )MyUser)Employeesystem_senderr%   )namephoto)usernamer6   Z
first_namer4   sender)idemp_code)emp_companyr5   )	Zmysite.accounts.models.my_userr1   &mysite.personnel.models.model_employeer2   objectsfilterZonlyvalues
user_photo)objr:   r1   r2   r3   r7   ZsendersZ
emp_senderr   r   r   
get_sender\   s"    
rA   r%   c             C   s|   ddl }ddlm} |j  }| jd }	| jdd}
| }|
pB|	|_||_||_	||_
||_||_||_|	|_|  dS )z
    mobile operation log
    r   N)AppActionLogZREMOTE_ADDRemployee)datetimeZ'mysite.mobile.models.model_appactionlogrB   nowr'   sessiongetuserclientactionparamsdescribeZrequest_statusZaction_timeZ	remote_ipsave)ZrequestrJ   rI   rK   rL   statusrD   rB   rE   Zipemp_idlogr   r   r   save_logp   s    


rQ   c       
      C   s`   ddl }ddlm} | j}| j}|j  }| }	||	_||	_||	_||	_	||	_
||	_|	  dS )z!
    mobile announcement log
    r   N)AppNotification)rD   Z'mysite.mobile.models.model_notificationrR   ZpkZPINrE   Zreceiver_idr7   categorycontentZnotification_timesourcerM   )
ZapplierrS   rT   rU   rD   rR   Zreceiverr7   rE   Znfcr   r   r   save_notification   s    
rV   
successfulc             C   sT   t s"| dkr"dtd|   }}| d|d|d|d|d}t|S )zQ
    return of mobile interface
    @:param describe  Pop-up message on app.
    )r   z{0}zRequest Exception, code:%s)codedataerrorrL   message)DEBUGformatr.   jsondumps)rX   rY   rZ   rL   r[   Zresponser   r   r   interface_response   s    r`   c                s    fdd}|S )z"
    interface request filter
    c                s  ddl m} ddlm} ddlm} ddlm} dd l}dd l	}| }	t
jrbtd| td j |j }
ytdd	 |D }W n* tk
r } ztd
 W d d }~X Y nX y|d }|d pd}|d pd}|sd}td}ttdd||S dd l}ddlm} ddlm} |d| }|s2|d |jj|dd|d}|r|d }|j}ddlm } |jj||d||dB ||dB |d}|st!t
dddks|j" # dkr|jj|d}t$| |r|d }|j%sd &td!}d &td!}ttdd||S |j'|	j(d"< ||	j(d#< |
|_)|*  t+|	 j|j,|d$ y | f||S  tk
r } z8dd l-}|.  t+|	 j|j,||dd% tt/dd|t0S d }~X Y nX nZd &td&}t+|	 j|j,||dd% d &td'}d &td(}td)}ttd|||S n d}d*}td+}ttd|||S W nd tk
r } zDdd l-}|.  d,&t1|}t+|	 jd||dd% tt/dd|t0S d }~X Y nX d S )-Nr   )r1   )get_current_request)cache)CompanyzParams:z[*]Function Name:c             S   s    g | ]}t t|d k r|qS )2   )r   r+   ).0argr   r   r   
<listcomp>   s    z2request_valid.<locals>.wrapper.<locals>.<listcomp>wrapperr   Zenr%   zToken missingzIllegal requestrZ   )r2   )AppListZmobile_company_id_g      ?T)device_tokenZactiveZenable
company_id)Q)Zemail)mobile)r9   )rm   ZSUPPORT_MUL_COMPANYr   z{0}zAccount have been blocked.rC   Zdjango_languagerW   )rN   zLogin user not foundz
Wrong DatazUser no existszAccount have been deletedzLogin information not found.zForced offlinez	error {0})2Zmysite.accounts.modelsr1   mysite.base.threadlocalsra   django.core.cacherb   Zmysite.cloud.modelsrc   rD   r   r   r\   print__name__rE   r^   r_   r   r.   r`   FORCED_OFFLINEtimer;   r2   Z"mysite.mobile.models.model_applistrk   rG   sleepr<   r=   r6   Zdjango.db.modelsrn   getattrallcountr   Z
app_statusr]   r8   rF   Zlast_activerM   rQ   Z	client_id	traceback	print_excMESSAGE_CODESYSTEM_EXCEPTIONr+   )selfargskwargsr1   ra   rb   rc   rD   r   reqrE   rK   etokenZlngrl   rL   r[   ru   r2   rk   rm   ZappsZapppinrn   Zempsemprz   rZ   )functionr   r   rh      s    


"
 zrequest_valid.<locals>.wrapperr   )r   rh   r   )r   r   request_valid   s    Wr   c              C   sB   ddl m}  ddlm}m} |  }|jd }|jj|d }|S )Nr   )ra   )r2   
DepartmentrC   )r8   )	rp   ra   mysite.personnel.modelsr2   r   rF   r<   r=   first)ra   r2   r   r   Zemp_sessionr   r   r   r   online_employee  s    
r   c             C   s8   ddl m} ddlm} |d|  }|jj|d}|S )Nr   )rb   )r2   Zmobile_employee_id_)r8   )rq   rb   r   r2   rG   r<   )rl   rb   r2   rO   r   r   r   r   online_employee_new  s
    r   c             C   s(   dd l }| r$t| } |j j| |dS dS )Nr   )tzr%   )rD   floatZfromtimestamp)stampr   rD   r   r   r   stamp2datetime  s
    r   c             C   s   dd l }dd l}| rt| |jst| |js| ddkr|y|j| d} W q tk
rx   |j| dd d} Y qX n|j| d} || 	 }t
|S dS )Nr   -r   z%Y-%m-%d %H:%M:%S.z%Y%m%d%H%M%Sr%   )ru   rD   
isinstancer   findstrptime
ValueErrorr   mktimeZ	timetupleint)dtru   rD   r   r   r   r   datetime2stamp"  s     r   c             C   sv   ddl m} dd l}||t| d }ttt|d }t|d tt|d  }|t|d }d||S )Nr   )Decimal<   z{0}:{1})Zdecimalr   mathr+   r   r   Zceilr]   )valr   r   ZminsZhoursZminutesr   r   r   
get_hr_min3  s    r   c             C   s"   dd l }|d|| }t|S )Nr   z%H:%M:%S)ru   strftimegmtimer+   )r   ru   Ztime_hours_min_secr   r   r   get_hr_min_sec=  s    r   c             C   sZ   ddl }ddlm} |j|j }g }x*t|| k rN||}|dkr&|| q&W d|S )z!
    Generate a new password
    r   N)choice)"'r%   )stringZrandomr   digitsascii_lettersr   appendjoin)Z
pwd_lengthr   r   Zpassword_seedZpassworditemr   r   r   generate_passwordC  s    r   c       	      C   sx   dd l }|d kr"t }t|jj}tj}|j|d}|j||}|j|d	| }d}|j
|rtd	|| }|S )Nr   r5   z{0}.jpgr%   z/files/photo/{0}/{1}.jpg)osr   r+   companyZhex_idr   ADDITION_FILE_ROOTpathr   r]   exists)	r   r:   r   r   	file_pathZphoto_folder_initialZphoto_folder_finalZ
photo_pathZ	photo_urlr   r   r   r?   R  s    r?   c          	   C   s   dd l }dd l}ddlm} dd l}yddlm} W n   ddlm} Y nX d	|
ddd	t| d	d | }tj}	|j|	|}
|j|
}|j|d s||d  ||}||}||}d
|jkr||jd
 }|jj|d kr|d |jj}||}|dkr8||j}n|dkrN|d}n|dkrl|d|j}nv|dkr|jddd|j}nT|dkr|jddd}n:|dkr|jddd|j}n|dkr|jddd}|j|
|d n
||
 d S )Nr   )Image)StringIO)BytesIOzfiles/upload/{0}/{1}/{2}.jpgz%Y%mZAppz{0}-{1}r   exifZ0thr   r      r   r   iT)expandr
      Z      )r   ) r   base64ZPILr   piexifZ	cStringIOr   ior   r]   r   r+   Z	timestampr   r   ZFILEPATHr   r   r   makedirsZ	b64decodeopeninfoloadZImageIFDZOrientationpopdumpZ	transposeZFLIP_LEFT_RIGHTrotaterM   )r   Z
punch_timeZcapturer   r   r   r   r   Zf_nameZcur_pathr   fnZbinary_dataZimg_dataZimgZ	exif_dictZorientationZ
exif_bytesr   r   r   save_capturea  sN    *









r   descc             C   s&   |d t  }|t  }t| ||||t S )z
    sql paging
    r   )	PAGE_SIZE_paging)sqlZpage_num	sort_name
sort_orderZ_beginZ_endr   r   r   paging  s    r   c       	      C   s   ddl m} |dkr@d|  } | dd||f }d|||f }n|dkrnd	|  } d
| ||f }d|||f }n`|dkrd	|  } d
| ||f }d|||f }n2|dkrd	|  } d| ||f }d|||f }n| }|S )Nr   )curr_db_engine_name	sqlserverzselect * target_from (%s) a target_fromz-,row_number() over (order by %s %s) as r fromz-select * from (%s) t where t.r>%s and t.r<=%smysqlzselect * from  (%s) az %s  order by %s %s z %s LIMIT  %s,%soraclezQSELECT * FROM (SELECT t.*, ROWNUM RN FROM (%s) t WHERE ROWNUM <= %s)WHERE RN > %s
postgresqlz %s  order by "%s" %s z %s limit  %s  offset  %s)mysite.sql_utilsr   r&   )	r   r   r   ZbeginendZ	page_sizer   Z	sql_ordersql_datar   r   r   r     s*    

r   c             C   s
   |  dS )Nz%Y-%m-%d)r   )Zcur_dater   r   r   format_date  s    r   c             C   sd   | dkrt |S | dkr t|S | dkr0t|S | dkr@t|S | dkrPt|S | dkr`t|S d S )N)r   )r   )r   )r   )r
   )r   )today_periodyesterday_periodthis_week_periodlast_week_periodthis_month_periodlast_month_period)rS   rE   r   r   r   date_period  s    r   c             C   s   | }| t jdd }||fS )Nr   )days)rD   r   )rE   startr   r   r   r   r     s    r   c             C   s   | t jdd }| }||fS )Nr   )r   )rD   r   )rE   r   r   r   r   r   r     s    r   c             C   s8   t |  }| tj| d }| tjdd }||fS )N)r   r   )WEEKDAY_LISTindexweekdayrD   r   )rE   r   r   r   r   r   r   r     s    r   c             C   s>   t |  }| tjd|  d }| tj| d }||fS )Nr   )r   )r   r   r   rD   r   )rE   r   r   r   r   r   r   r     s    r   c             C   s0   | t j| jd  d }| t jdd }||fS )Nr   )r   )rD   r   day)rE   r   r   r   r   r   r     s    r   c             C   s<   | j | | j|  }}t|d d\}}t|| |d dS )Nr      )ZyearZmonthdivmodr   )r   Zd_yearsZd_monthsymar   r   r   get_first_day  s    r   c             C   s   t | ddtd S )Nr   r   r   )r   r   )r   r   r   r   get_last_day  s    r   c             C   sD   | t j| j d }|t j|jd  d }|t jdd }||fS )N)r   r   )rD   r   r   )rE   Zlast_endr   r   r   r   r   r     s    r   zgps_setting_{hash}c             C   s\   ddl m} ddlm} |d}|r4| j|kr4dS |tj| jd}|sX|j	|  |S )Nr   )rb   )taskswithout_gpsi'  )hash)
rq   rb   mysite.mobiler   rG   r8   	CACHE_KEYr]   Zupdate_personnel_gpsdelay)r   rb   r   r   gpsr   r   r   setting_check	  s    
r   c          
   C   s  ddl m} ddlm} ddlm} ddl}ddlm} ddl	m
}m}	 |jsRdS t| }
|
s4|j }|jj| jjj| j||dd	d
dd}|s|	jj| j||dd	d
dd}|s|j| jdd dS |d }|jdt|d dd}||  }|d |d
 f|d	 |d}
|tj| jd|
| |
dkrBdS |
dd}|
d	d}|rf|s|j| j djt ddS dt!|dt!|f}y2t!|}|||j"}||krdjt ddS W n, t#k
r } zdj|dS d}~X Y nX dS )zg
    37.352110, 127.106018
    :param emp:
    :param longitude:
    :param latitude:
    :return:
    r   )r   )rb   )vincentyN)r   )GPSForEmployeeGPSForDepartment)Z employee__department__company_idZemployee__emp_codestart_date__lteend_date__gtedistance	longitudelatitudeZend_date)Zdepartment_idr   r   T)deletez{0} {1}z23:59:59z%Y-%m-%d %H:%M:%S)r   r   valid)r   i'  r   z{error}Z!appClockIn_error_networkNotStable)rZ   z{0:.6f}ZappClockIn_error_outOfLocation)$django.confr   rq   rb   Zgeopy.distancer   rD   r   r   Zmysite.mobile.modelsr   r   ZACTIVE_APP_LOCATIONr   rE   r<   r=   Z
departmentr   r8   r9   r>   Zupdate_without_gpsr   r]   r+   Ztotal_secondssetr   rG   Zupload_gps_operater   r.   r   Zmetersr   )r   r   r   r   rb   r   rD   r   r   r   r   rE   Zemp_gpsZend_timer   ZpointZallow_distanceZclock_inr   r   r   r   r   valid_distance_check  sZ    


r  c              C   sl   ddl m}  ddlm} dd l}ddlm} tsh|j	|j
d}|j	|d}||ddd	}| |}|atS )
Nr   )APNs)r   )
APNsClientZapp_certzproduction.pemZpush_productionF)Zuse_alternative_port)Z
apnsclientr  r   r   r   Zapns2.clientr  APNr   r   r   )r  r   r   r  ZctfcZpemZconZsrvr   r   r   get_apn_connectionR  s    r  c             C   s   ddl m} |dkr2d|  } | dd||f }nd|dkrRd|  } d	| ||f }nD|d
krrd|  } d	| ||f }n$|dkrd|  } d| ||f }n| }|S )Nr   )r   r   zselect * target_from (%s) a r   z-,row_number() over (order by %s %s) as r fromr   zselect * from  (%s) az %s  order by %s %s r   r   z %s  order by "%s" %s )r   r   r&   )r   r   r   r   r   r   r   r   employee_transaction_paginga  s     
r  c             C   s   t | tkrzi }xd|  D ]X\}}|d ksr|dkr4qt |tksLt |tkrZt|||< q|sft|rt|||< qW |S t | tkrdd | D S | S d S )Nr%   c             S   sD   g | ]<}t | s$t t| r|d ks8t|d krt|qS )N)r+   stripremove_empty_from_dict)re   vr   r   r   rg     s    z*remove_empty_from_dict.<locals>.<listcomp>)typedictitemsr   r   r  list)dZ_tempkr	  r   r   r   r  u  s    r  )r   )N)r%   r%   r%   r   )rW   r%   )N)N)r   )r   r   )Br   r   r^   Zdjango.utils.translationr   r   r.   rD   r   r   r\   ZSUCCESS_CODErt   r|   r   r}   ZDATA_EXCEPTIONZSUPPORT_CONTACTZWEBSITEZ	COPYRIGHTZ	FUNCTIONSr   ZWEEKDAYZROLE_EMPLOYEEZ
ROLE_ADMINr*   r-   r,   ZUSB_COPYr   r#   r)   r0   rA   rQ   rV   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  r  r   r   r   r   <module>   s   




_		


,
	!
: