B
    cPw                 @   sd  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 d dlmZmZmZmZmZ d dlmZmZmZmZmZmZm Z m!Z!m"Z" d dl#m$Z$ d dlm%Z%m&Z&m'Z'm(Z(m)Z)m*Z*m+Z+ d dl,m-Z- d dl.m/Z/ d dl0m1Z1 d dl2m3Z3 d dl4m5Z5 d dl6m7Z7 d dl6m8Z8 d dl9m:Z: d dl,m;Z; d dl<m=Z= dddddddd d!d"d#d$d%Z>d&d'd(d)d*d+d,d-d.d/d0d1d%Z?e%d2d3 Z@e%e5d4gd5d6 ZAe%e5d4gd7d8 ZBe%e5d4gd9d: ZCe%e5d4gd;d< ZDe%e5d4gd=d> ZEe%e5d4gd?d@ ZFe:e5d4gdAdB ZGe%e5d4gdCdD ZHG dEdF dFe-jIe=eZJG dGdH dHe-jIe=eZKG dIdJ dJee-jLe-jMZNG dKdL dLe-jIe=eZOG dMdN dNee-jIZPG dOdP dPe-jIe-jQe=eZRG dQdR dRe-jIe-jQe=eZSG dSdT dTe-jIe=eZTG dUdV dVe-jIe=eZUe&dWdX ZVdYdZ ZWe5d4gd[d\ ZXdS )]    N)MyUser)TempUser)Employee)Order)Terminal)
Membership)Company)AppList)CloudViewSet)!BackendDashboardCompanyListFilter BackendDashboardDeviceListFilter"BackendDashboardEmployeeListFilterBackendDashboardUserListFilterBackendDashboardAppListFilter)	!BackendDashboardCompanySerializer BackendDashboardDeviceSerializer"BackendDashboardEmployeeSerializerBackendDashboardUserSerializer!BackendDashboardAppListSerializer$BackendDashboardBaseVendorSerializer&BackendDashboardDeviceExportSerializer)BackendDashboardCompanyEmployeeSerializer/BackendDashboardCompanyEmployeeExportSerializer)NoneSerializer)admin_and_vendor_login_requiredadmin_or_vendor_login_requiredget_company_queryget_vendor_queryconvert_address2geolocationconvert_ip2geolocationcheck_ip_is_private)mixins)Response)JsonResponse)TemplateResponse)api_view)Count)Q)login_required)status)UtilGenericViewSetZJanuaryZFebruaryZMarchZAprilZMayZJuneZJulyZAugustZ	SeptemberZOctoberZNovemberZDecember)                        	   
         z#b87333z#212529z#1586c7z#7ac045z#c1455cz#5659c3z#5696c3z#56c3b4z#56c372z#8f56c3z#fbd935z#fb4735c             C   s   t | di S )Nzcloud/dashboard/index.html)r$   )request r8   +G:\easytimepro\master/mysite/cloud\views.pyget_backend_dashboard/   s    r:   GETc          	   C   s   t | }tjj|d}|}| jjr.tj }n&dd tjj|dD }tjj|d}t	jj|d}dd t
jjddD }|j|d}tjj|d}	d	d
| id| id| id| id| id|	 igi}
t|
S )N)company__inc             S   s   g | ]}|j jqS r8   )userid).0mr8   r8   r9   
<listcomp>@   s    z"get_total_data.<locals>.<listcomp>)id__in)department__company__inc             S   s   g | ]}|j jqS r8   )companyr>   )r?   or8   r8   r9   rA   E   s    r,   )payment_statusdatadevice_countcompany_count
user_countemployee_countZpaid_company_countZmobile_application_count)r   r   objectsfilterr=   is_super_adminr   allr   r   r   r	   countr#   )r7   all_companiesdevicesZ	companiesusersusers_id_listZ	employeespaid_orders_company_id_listZpaid_companyZmobile_applicationZ
total_datar8   r8   r9   get_total_data4   s&    




rV   c             C   sV   t | }tj }|  }|j|d }|| }dd|dd|dgi}t|S )N)Zsubscription_end_date__ltrG   zExpired License)zLicense StatusZQuantityzValid License)r   datetimenowrO   rP   rM   r#   )r7   rQ   rX   Ztotal_license_countZexpired_license_countZvalid_license_countZlicense_statusr8   r8   r9   get_license_statusY   s    
rY   c       
      C   s   t | }ttj d}g }xpt|d |d D ]Z}t|dd}t|dd}|j||fd }|j||fd }|	|||d q4W d	
|d ||d
}	t|	S )Nz%Yr-   r+   r6      )Zsubscription_start_date__range)Zsubscription_end_date__range)yearZsaleZexpirez0Sales data for the last four years from {} to {})titlerG   )r   intrW   rX   strftimerangedaterM   rP   appendformatr#   )
r7   rQ   current_yearvaluer[   Zyear_first_dayZyear_last_dayZ
sale_countZexpire_countrI   r8   r8   r9   get_company_counto   s    re   c          	   C   s4  t | }ttj d}| jdd }|s2|}t|tsDt|}g }xt	 D ]\}}t
||d }t||d}t|||}	dd tjj|ddD }
tjj|
d}|j||	fd }|||d	t| id
 qRW d|||||d|d |d d|d |d d|d |d dgd}t|S )Nz%Yr[   r+   c             S   s   g | ]}|j jqS r8   )r=   r>   )r?   r@   r8   r8   r9   rA      s    z"get_user_count.<locals>.<listcomp>)r<   role)rB   )Zdate_joined__rangecolor)monthrP   rf   zRate of growth of users in {})rd   r[   r,   r-   )r\   r[   rG   	year_list)r   r]   rW   rX   r^   r;   get
isinstanceMONTHitemscalendar
monthranger`   r   rL   rM   r   rP   ra   COLORrb   r#   )r7   rQ   rc   r[   rd   kv
month_days
start_dateend_daterT   rS   Zmonthly_user_countrJ   r8   r8   r9   get_user_count   s>    


rv   c          	   C   s  t | }tjj|d}ttj d}| j	dd }|s@|}t
|tsRt|}g }xnt D ]b\}}t||d }t||d}	t|||}
|j|	|
fd }|||dt| id q`W d|||||d	|d |d d	|d
 |d
 d	|d |d d	gd}t|S )N)rC   z%Yr[   r+   )Zhire_date__rangerg   )rh   rP   rf   z!Rate of growth of employees in {})rd   r[   r,   r-   )r\   r[   rG   ri   )r   r   rL   rM   r]   rW   rX   r^   r;   rj   rk   rl   rm   rn   ro   r`   rP   ra   rp   rb   r#   )r7   rQ   Zemployee_queryrc   r[   rd   rq   rr   rs   rt   ru   Zmonthly_employee_countrJ   r8   r8   r9   get_employee_count   s<    


rw   c             C   s  t | }tjj|d}|djtddjdd}dd |D }|t|d}g }x"|D ]}|j	}|r^t
|s^t }	|jd	d
 |	d< | }
|
dkrd|	d< d|	d< nd|	d< d|	d< |j|	d< |jr|jdd nd|	d< |jr|jnd|	d< |jr
|jnd|	d< |jr |jnd|	d< |jr6|jnd|	d< |jrL|jnd|	d< d|	d< |	t|j	| ||	 q^W x|D ]}|d }|rt
|st }	|j|d}dd |D |	d< dd |D |	d< d|	d< dd |D |	d< d d |D |	d< d!d |D |	d< d"d |D |	d< d#d |D |	d< d$d |D |	d< d%d |D |	d< |d |	d< |	t| ||	 qW | jjrd&nd'|d(}t|S ))u   
    get devices information
    include：
        device name
        device status
        device geolocation
        ......
    :param request:
    :return:
    )r<   
ip_address)rP   r+   )	count__gtc             S   s   g | ]}|d  qS )rx   r8   )r?   dr8   r8   r9   rA     s    z#get_device_info.<locals>.<listcomp>)ip_address__inN   alias)r+   r,   r.   r)   Onlinedevice_statusr   Offlinesn-push_versionrJ   finger_print_countfinger_vein_count
face_count
palm_countrP   )rx   c             S   s   g | ]}|j d d qS )Nr|   )r}   )r?   rz   r8   r8   r9   rA   8  s    c             S   s   g | ]
}|j qS r8   )r   )r?   rz   r8   r8   r9   rA   9  s    c             S   s    g | ]}|  d krdndqS ))r+   r,   r.   r~   Zoffline)getDynState)r?   rz   r8   r8   r9   rA   ;  s    c             S   s&   g | ]}|j r|j d d nd qS )r   r   )push_versplit)r?   rz   r8   r8   r9   rA   <  s    c             S   s   g | ]}|j r|j nd qS )r   )rJ   )r?   rz   r8   r8   r9   rA   =  s    c             S   s   g | ]}|j r|j nd qS )r   )fp_count)r?   rz   r8   r8   r9   rA   >  s    c             S   s   g | ]}|j r|j nd qS )r   )fv_count)r?   rz   r8   r8   r9   rA   ?  s    c             S   s   g | ]}|j r|j nd qS )r   )r   )r?   rz   r8   r8   r9   rA   @  s    c             S   s   g | ]}|j r|j nd qS )r   )r   )r?   rz   r8   r8   r9   rA   A  s    TF)adminrG   )r   r   rL   rM   valuesannotater&   excluder'   rx   r    dictr}   r   r   r   r   rJ   r   r   r   r   updater   ra   r=   rN   r#   )r7   rQ   rR   same_ip_address_devices_querysame_ip_address_listdifferent_ip_address_devicesdevice_info_listdevicedevice_ip_addressdevice_inforeal_statusdevice_ip_address_and_countdevice_querydevice_datar8   r8   r9   get_device_info   sd    


r   c             C   s  t jj| jjd}|djtddjdd}dd |D }|t	|d}g }x"|D ]}|j
}|rZt|sZt }|jd d	 |d
< | }	|	dkrd|d< d|d< nd|d< d|d< |j|d< |jr|jdd nd|d< |jr|jnd|d< |jr|jnd|d< |jr|jnd|d< |jr2|jnd|d< |jrH|jnd|d< d|d< |t|j
| || qZW x|D ]}
|
d }|rt|st }|j|d}dd |D |d
< dd |D |d< d|d< dd |D |d< dd |D |d< d d |D |d< d!d |D |d< d"d |D |d< d#d |D |d< d$d |D |d< |
d |d< |t| || qW d%|i}t|S )&N)Z
company_idrx   )rP   r+   )ry   c             S   s   g | ]}|d  qS )rx   r8   )r?   rz   r8   r8   r9   rA   U  s    z6get_device_info_for_main_dashboard.<locals>.<listcomp>)r{   r|   r}   )r+   r,   r.   r)   r~   r   r   r   r   r   r   rJ   r   r   r   r   rP   )rx   c             S   s   g | ]}|j d d qS )Nr|   )r}   )r?   rz   r8   r8   r9   rA   ~  s    c             S   s   g | ]
}|j qS r8   )r   )r?   rz   r8   r8   r9   rA     s    r   c             S   s    g | ]}|  d krdndqS ))r+   r,   r.   r~   r   )r   )r?   rz   r8   r8   r9   rA     s    c             S   s&   g | ]}|j r|j d d nd qS )r   r   )r   r   )r?   rz   r8   r8   r9   rA     s    c             S   s   g | ]}|j r|j nd qS )r   )rJ   )r?   rz   r8   r8   r9   rA     s    c             S   s   g | ]}|j r|j nd qS )r   )r   )r?   rz   r8   r8   r9   rA     s    c             S   s   g | ]}|j r|j nd qS )r   )r   )r?   rz   r8   r8   r9   rA     s    c             S   s   g | ]}|j r|j nd qS )r   )r   )r?   rz   r8   r8   r9   rA     s    c             S   s   g | ]}|j r|j nd qS )r   )r   )r?   rz   r8   r8   r9   rA     s    rG   )r   rL   rM   r=   Zcurrent_companyr   r   r&   r   r'   rx   r    r   r}   r   r   r   r   rJ   r   r   r   r   r   r   ra   r#   )r7   rR   r   r   r   r   r   r   r   r   r   r   r   r8   r8   r9   "get_device_info_for_main_dashboardP  sd    


r   c             C   s   t | }g }x|D ]}|j}|r|dkrt }|j|d< |j}|dkrPd|d< n"|dkrbd|d< n|dkrrd	|d< |jd
|d< |t|j| |	| qW | j
jrdnd|d}t|S )u   
    get company information
    include：
        company name
        company geolocation
        company payment type
        company license expire date
        ......
    :param request:
    :return:
    ZDefaultnamer+   ZPayTMpayment_typer,   ZPayPalr-   ZOthersz%Y-%m-%d %H:%Msubscription_end_dateTF)r   rG   )r   Z	address_1r   r   r   r   r^   r   r   ra   r=   rN   r#   )r7   rQ   Zcompany_info_listrD   Zcompany_addressZcompany_infoZcompany_payment_typeZcompany_datar8   r8   r9   get_company_info  s(    



r   c               @   s.   e Zd ZeZeZeedZdd Z	dd Z
dS )!BackendDashboardAllCompanyViewSet)listexportc             C   s   | j | jtS )N)serializer_dictrj   actionr   )selfr8   r8   r9   get_serializer_class  s    z6BackendDashboardAllCompanyViewSet.get_serializer_classc             C   s   t | j}|S )N)r   r7   )r   querysetr8   r8   r9   get_queryset  s    
z.BackendDashboardAllCompanyViewSet.get_querysetN)__name__
__module____qualname__r   modelr   filter_classr   r   r   r   r8   r8   r8   r9   r     s   r   c               @   s.   e Zd ZeZeZeedZ	dd Z
dd ZdS ))BackendDashboardAllCompanyEmployeeViewSet)r   r   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r     s    z>BackendDashboardAllCompanyEmployeeViewSet.get_serializer_classc             C   s   t | j}|S )N)r   r7   )r   r   r8   r8   r9   r     s    
z6BackendDashboardAllCompanyEmployeeViewSet.get_querysetN)r   r   r   r   r   r   r   r   r   r   r   r   r8   r8   r8   r9   r     s   r   c               @   s4   e Zd ZeZej ZeedZ	dd Z
dd ZdS )!BackendDashboardBaseVendorViewSet)Zretriever   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r     s    z6BackendDashboardBaseVendorViewSet.get_serializer_classc       	      O   s   | dd}|  }| j||j|d}|jdd |jrV|jj}tj|rVt	| |j
rz|j
j}tj|rzt	| | | t|jS )NpartialF)rG   r   T)Zraise_exception)pop
get_objectZget_serializerrG   Zis_validZparent_vendor_company_logopathosexistsremoveZparent_vendor_software_logoZperform_updater"   )	r   r7   argskwargsr   instanceZ
serializerZparent_vendor_company_logo_pathZ parent_vendor_software_logo_pathr8   r8   r9   r     s    


z(BackendDashboardBaseVendorViewSet.updateN)r   r   r   r   r   rL   rO   r   r   r   r   r   r8   r8   r8   r9   r     s   
r   c               @   s8   e Zd ZeZej ZeZ	e
e
dZdd Zdd ZdS )"BackendDashboardPaidCompanyViewSet)r   r   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r     s    z7BackendDashboardPaidCompanyViewSet.get_serializer_classc             C   s.   t | j}dd tjjddD }|j|dS )Nc             S   s   g | ]}|j jqS r8   )rD   r>   )r?   rE   r8   r8   r9   rA     s    zCBackendDashboardPaidCompanyViewSet.get_queryset.<locals>.<listcomp>r,   )rF   )rB   )r   r7   r   rL   rM   )r   r   rU   r8   r8   r9   r     s    
z/BackendDashboardPaidCompanyViewSet.get_querysetN)r   r   r   r   r   rL   rO   r   r   r   r   r   r   r   r8   r8   r8   r9   r     s   
r   c               @   s6   e Zd ZeZej ZeZ	de
iZdd Zdd ZdS )BackendDashboardVendorViewSetr   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r      s    z2BackendDashboardVendorViewSet.get_serializer_classc             C   s   t | j}|S )N)r   r7   )r   r   r8   r8   r9   r   #  s    
z*BackendDashboardVendorViewSet.get_querysetN)r   r   r   r   r   rL   rO   r   r   r   r   r   r   r   r8   r8   r8   r9   r     s   
r   c                   s@   e Zd ZeZej ZeZ	e
edZdd Z fddZ  ZS )BackendDashboardDeviceViewSet)r   r   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r   6  s    z2BackendDashboardDeviceViewSet.get_serializer_classc                s$   t | j}tt|  j|d}|S )N)r<   )r   r7   superr   r   rM   )r   rQ   r   )	__class__r8   r9   r   9  s    
z*BackendDashboardDeviceViewSet.get_queryset)r   r   r   r   r   rL   rO   r   r   r   r   r   r   r   r   __classcell__r8   r8   )r   r9   r   )  s   
r   c                   sH   e Zd ZeZej ZeZ	e
e
dZdd Z fddZdd Z  ZS )BackendDashboardUserViewSet)r   r   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r   M  s    z0BackendDashboardUserViewSet.get_serializer_classc                sR   | j jjrtj }n8t| j }dd tjj|dD }t	t
|  j|d}|S )Nc             S   s   g | ]}|j jqS r8   )r=   r>   )r?   r@   r8   r8   r9   rA   U  s    z<BackendDashboardUserViewSet.get_queryset.<locals>.<listcomp>)r<   )rB   )r7   r=   rN   r   rL   rO   r   r   rM   r   r   r   )r   r   rQ   rT   )r   r8   r9   r   P  s    

z(BackendDashboardUserViewSet.get_querysetc       	      O   s   |   }tjj|ddd }|j}|dkr<tdtdiS tjj|d}| j	j
jr~| rrtjj|d}|  | | n>|r| rtjj|d}|  | | ntdtdiS ttjS )	Nr   F)r=   rf   Zuser__emp_pin__isnullzadmin@zkteco.commsgz)This is Default user, you can not delete.)Zemail__iexactZ&admin_or_vendor_user_cannot_be_deleted)r   r   rL   rM   r   emailr#   _r   r7   r=   rN   rj   deleteZperform_destroyr"   r)   ZHTTP_202_ACCEPTED)	r   r7   r   r   r   Z
membershipZinstance_emailZtemp_user_filterZ	temp_userr8   r8   r9   destroyZ  s$    
z#BackendDashboardUserViewSet.destroy)r   r   r   r   r   rL   rO   r   r   r   r   r   r   r   r   r   r8   r8   )r   r9   r   @  s   

r   c                   s@   e Zd ZeZej ZeZ	e
e
dZdd Z fddZ  ZS )BackendDashboardEmployeeViewSet)r   r   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r     s    z4BackendDashboardEmployeeViewSet.get_serializer_classc                s$   t | j}tt|  j|d}|S )N)rC   )r   r7   r   r   r   rM   )r   rQ   r   )r   r8   r9   r     s    
z,BackendDashboardEmployeeViewSet.get_queryset)r   r   r   r   r   rL   rO   r   r   r   r   r   r   r   r   r8   r8   )r   r9   r   t  s   
r   c                   s@   e Zd ZeZej ZeZ	e
e
dZdd Z fddZ  ZS )BackendDashboardAppListViewSet)r   r   c             C   s   | j | jtS )N)r   rj   r   r   )r   r8   r8   r9   r     s    z3BackendDashboardAppListViewSet.get_serializer_classc                s$   t | j}tt|  j|d}|S )N)r<   )r   r7   r   r   r   rM   )r   rQ   r   )r   r8   r9   r     s    
z+BackendDashboardAppListViewSet.get_queryset)r   r   r   r	   r   rL   rO   r   r   r   r   r   r   r   r   r8   r8   )r   r9   r     s   
r   c             C   s   i }t | d|S )Nz2cloud/subscription/subscription_configuration.html)r$   )r7   contextr8   r8   r9   subscription_configuration  s    r   c             C   s   i }t | d|S )Nz@cloud/subscription/subscription_content_for_login_exception.html)r$   )r7   r   r8   r8   r9   (subscription_content_for_login_exception  s    r   c       !      C   s  ddl }ddl}ddl}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} dd	lm} |j|
d
}|	jj|dd }|r|	jj|dd}|jj}|j }ddd |D }|jj}|j}||j|d d }d |!d|!d}|j|j"d}t#|d}|$|% }W dQ R X |& ' }|j(|j)|j* |j|j+|j,|j-|j.|j/||j0|||j1|||j2||j3j4||jj5||d}|6d|}|j||!d}dd|j(d }|j||}|||} | 7 S | S dS )z?
    :param request:
    :param order_number:
    :return:
    r   N)loader)settings)HttpResponseServerError)r   )ADDITION_FILE_ROOT)	HTMLToPDF)get_price_with_currency_symbolZreportsr,   )numberrF   z, c             S   s   g | ]
}|j qS r8   )r   )r?   fr8   r8   r9   rA     s    z"invoice_export.<locals>.<listcomp>   )Zdaysz{} to {}z%d/%m/%Yz(cloud/static/images/invoice_pdf_logo.pngrb)order_numbercreate_timeZprice_strategy_typesubscription_durationrK   rH   transactions_countZmobile_app_countwhatsapp_push_countoriginal_pricediscount_pricepayment_priceZ
user_emailfeatures_stringZcompany_namesubscription_intervalslogo_image_base64z#cloud/billing/billing_template.htmlz%Y%mz&%(report_name)s_%(invoice_number)s.pdfZInvoice)Zreport_nameZinvoice_number)8r   timebase64rW   Zdjango.templater   Zdjango.confr   django.httpr   mysite.cloud.modelsr   Zmysite.settingsr   Zmysite.tools.html_to_pdfr   mysite.cloud.utilsr   r   joinrL   rM   r   rj   Zprice_strategyZcurrencyZfeaturerO   rD   r   r   Z	timedeltarb   r^   ZSTATIC_ROOTopenZ	b64encodereadstripdecoder   r   Zget_type_displayZemployees_countZdevices_countr   Zmobile_applications_countr   r   r   r   Zcreate_userr   r   Zrender_to_stringZreturn_response)!r7   r   r   r   r   rW   r   r   r   r   r   r   r   ZEXPORT_ROOTZorder_existorderZcurrency_alpha_3Zfeaturesr   Zcurrent_subscription_end_dater   Zexpire_dater   Zinvoice_logo_pathr   Zencoded_stringr   r   Zinvoice_html_templateZexport_path	file_name	file_pathZ	htmltopdfr8   r8   r9   invoice_export  sj    




r   )Yr   rn   rW   Zmysite.accounts.modelsr   Zmysite.base.modelsr   Zmysite.personnel.modelsr   r   r   Zmysite.iclock.modelsr   r   r   Zmysite.mobile.modelsr	   r   r
   Zmysite.cloud.filtersr   r   r   r   r   Zmysite.cloud.serializersr   r   r   r   r   r   r   r   r   Zmysite.cloud.util_serializersr   r   r   r   r   r   r   r    Zrest_frameworkr!   Zrest_framework.responser"   r   r#   Zdjango.template.responser$   Zrest_framework.decoratorsr%   Zdjango.db.modelsr&   r'   Zdjango.contrib.auth.decoratorsr(   r)   Z mysite.personnel.api.utils_classr*   rl   rp   r:   rV   rY   re   rv   rw   r   r   r   ZListModelMixinr   r   ZRetrieveModelMixinZUpdateModelMixinr   r   r   ZDestroyModelMixinr   r   r   r   r   r   r   r8   r8   r8   r9   <module>   s   ,$$98OG( 1