o
    sg                     @   s  d dl mZ d dlmZ d dlmZmZ d dlmZm	Z	 d dl
mZ d dl mZ d dlmZmZ d dlZd dlZ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& d dl'm(Z( d dl)m*Z* d dl+m,Z, d dl-Z-d dl.Z.e-j/0e.j/1e.j/2e3 d dl4Z4e45 Z6dZ7dZ8ee7de8fdZ9e dZ:e dZ;e dZ<e dZ=e dZ>e dZ?e dZ@e$ed d!G d"d# d#e&ZAG d$d% d%e&ZBe$ed d!G d&d' d'e&ZCd(d) ZDd*d+ ZEd,d- ZFd.d/ ZGed0d1 ZHed2d3 ZIed4d5 ZJed6d7 ZKed8d9 ZLd:d; ZMdYd=d>ZNd?d@ ZOdAdB ZPedCdD ZQedEdF ZRedGdH ZSedIdJ ZTedKdL ZUedMdN ZVedOdP ZWedQdR ZXdSdT ZYedUdV ZZedWdX Z[dS )Z    )render)Elasticsearch)NotFoundErrorAuthenticationException)JsonResponseHttpResponse)csrf_exempt)redirect)authenticateloginN)MIMEMultipart)MIMEText)
formataddr)datetime)relativedelta)config)	send_mail)method_decorator)View)timezone)now)require_POSTzSCIC_ElasticSearch:dXMtY2VudHJhbDEuZ2NwLmNsb3VkLmVzLmlvOjQ0MyRmYWQyOTUwYTllNDE0MTE2YjIwN2QzYTE0MzQyMzcyMSRjZDI5OTY4MTQ1ODA0MDU4OWU4ZmVmMWQ2NDViYzNjMw==8oKIqy312EBsAPzWT64NUzjielastic)cloud_id
basic_authorg_auth_indexes_index_nameremove_indexes_index_archiverieanotfyindexriea_token_indexriea_org_indexdispatch)namec                   @      e Zd Zdd ZdS )
NotifyViewc              
   C   sn  zt |j}td| |d}|d}|d}|r"|r"|s,tddddd	W S td
t td| td| ddddd|iidd|iigiii}tjt	|d}td| d }|d d d dkrotddddd	W S |d d d d }|dd }ddddd|iidd|iigiii}	tjt|	d}
|
d d d dkrg }|
d d D ]}|
|d dd  qd|v rd}nd}|dkrtddddd	W S |dkr||t d d!d|d"}tjt|d# tdd$ddd	W S tdd%ddd	W S ||t d d!d|d"}tjt|d# tdd$ddd	W S  ty6 } ztdt|dd&d	W  Y d }~S d }~ww )'Nzreceived data newmessageusernamemailiderrorzMissing datastatusr'     r,   r    	user_mailqueryboolmustmatchmailtermindexbodyuser_check_responsehitstotalvaluer   zUser not found  _sourcerequest   successz,Request already raised, waiting for approval   z%Y-%m-%dT%H:%M:%SF)r(   r'   
created_atreadr?   r4   )r7   documentz-Your request has been submitted successfully!zInvalid notification status  )jsonloadsr8   printgetr   r    essearchr!   appendr   strftimer7   	Exceptionstr)selfr?   datar'   r(   r/   user_check_queryr9   user_documentsearch_queryresponsesta_reqinotification_statusdoce r\   4/var/www/html/AlliBotV5_Admin/corporate_app/views.pypost9   s   













"zNotifyView.postN__name__
__module____qualname__r^   r\   r\   r\   r]   r&   7       r&   c                   @   r%   )NotificationListViewc           	   
   C   s   z5di idddiigdd}t jt|d}|d d }d	d
 |D }dd
 |D }||t|d}t|W S  tyR } ztdt|dddW  Y d }~S d }~ww )N	match_allrC   orderdescd   )r0   sortsizer6   r:   c                 S   sh   g | ]0}|d  d s|d |d  d |d  d |d  d |d  d |d   dd|d   dd	d
qS r>   rD   _idr'   rC   r(   r?   r   r4   N)idr'   rC   rD   r(   r?   r4   rJ   .0hitr\   r\   r]   
<listcomp>       



z,NotificationListView.get.<locals>.<listcomp>c                 S   sh   g | ]0}|d  d r|d |d  d |d  d |d  d |d  d |d   dd|d   dd	d
qS rk   rn   ro   r\   r\   r]   rr      rs   )unreadrD   unread_countr*   r+   rF   r.   )rK   rL   r    lenr   rO   rP   )	rQ   r?   r0   rV   r:   unread_data	read_dataresponse_datar[   r\   r\   r]   rJ      s,   
"zNotificationListView.getN)r`   ra   rb   rJ   r\   r\   r\   r]   rd      s    rd   c                   @   r%   )MarkNotificationReadViewc              
   C   s   z.t |jd}|d}|stdddddW S tjt|dd	d
iid tdddW S  t j	yA   tddddd Y S  t
y] } ztdt|dddW  Y d }~S d }~ww )Nzutf-8rm   r*   zNotification ID is requiredr+   r-   r.   rZ   rD   Tr7   rm   r8   rA   zNotification marked as readzInvalid JSON bodyrF   )rG   rH   r8   decoderJ   r   rK   updater    JSONDecodeErrorrO   rP   )rQ   r?   rR   notification_idr[   r\   r\   r]   r^      s"   

"zMarkNotificationReadView.postNr_   r\   r\   r\   r]   rz      rc   rz   c                 C   <   d| j v r| j d}| j d}t| d||dS tdS )Nr$   	unique_idzcorporate_dashbord.html	user_nameuniqueIdcorporate_loginsessionrJ   r   r	   r?   r$   uidr\   r\   r]   corporate_dashboard   s
   
r   c                 C   r   )Nr$   r   zcorporate_user.htmlr   r   r   r   r\   r\   r]   corporate_user
  
   
r   c                 C   r   )Nr$   r   zcorporate_request.htmlr   r   r   r   r\   r\   r]   corporate_request  r   r   c                 C   r   )Nr$   r   zcorporate_status.htmlr   r   r   r   r\   r\   r]   corporate_status  r   r   c              
   C   s.  | j dkrt| j}|d}|d}td|  z]tjt	ddddd	|iidd
|iigiiid}g }|d d d dkrs|d d D ],}|d }|dddkrWd}nd}|d|d|d|d|d}	|
|	 qFtd|iW S  ty }
 ztd|
 W  Y d }
~
S d }
~
ww tdS )NPOSTr(   companyCodeusername%s r0   r1   r2   r5   username.keywordcompanyCode.keywordr6   r:   r;   r<   r   r>   r?   r@   ApprovedPendingr'   rC   )r$   user_idr'   rC   r?   userlistAn error occurred: zInvalid method)methodrG   rH   r8   rJ   loggerinforK   rL   corp_notifyrM   r   rO   r   )r?   rR   r(   r   rV   r   rq   sourcerequest_staformatted_docr[   r\   r\   r]   status_corporate&  sL   




r   c              
   C   s^  | j dkr| jd }| jd }td|  zztjddddd	d
|iigiiid}|d d d dkr|d d D ]K}|d }d|v rz|d |kro|| jd< d|v rZ|d | jd< nd | jd< td| d td  W S t| dddi  W S t| dddi  W S n	t| dddiW S W n t	y } zt
d| W  Y d }~S d }~ww t| dS )Nr   r(   passwordr   allibotv5_user_detailsr0   r1   r2   r5   r   r6   r:   r;   r<   r   r>   r$   Riea_companyzUser z2 authenticated successfully. Redirecting to index.r   zcorporate_login.htmlr*   zInvalid credentialsr   )r   r   r   r   rK   rL   r   r	   r   rO   r   )r?   r(   r   rV   rq   r   r[   r\   r\   r]   corporate_login_viewc  sJ   






r   c                 C   s   | j   tdS )Nr   )r   flushr	   )r?   r\   r\   r]   logout_view  s   
r   c              
   C   s
  | j dkr| jd}z[tjdddddd|iigiiid	}|d
 d d dkr^|d
 d
 d d }|d}|rUd}|| d7 }td|d|gdd t| dddiW S t| dddiW S t| dddiW S  ty } zt	d| W  Y d }~S d }~ww t| dS )Nr   r(   r   r0   r1   r2   r5   r   r6   r:   r;   r<   r   r>   r4   z.Click the link below to reset your password:

z/corporate-reset-password/zPassword Reset Requesttna@scic.comF)subjectr'   
from_emailrecipient_listfail_silentlyzcorporate_forgot_password.htmlr'   z'Password reset link sent to your email.r*   zEmail not found for this user.User not found.r   )
r   r   rJ   rK   rL   build_absolute_urir   r   rO   r   )r?   r(   rV   	user_data
user_emailr'   r[   r\   r\   r]   forgot_password_view  sF   



r   c              
   C   s   | j dkrk| jd}| jd}z@tjdddddd	|iigiiid
}|d d d dkrM|d d d d }tjd|dd|iid t| dddiW S tdW S  tyj } ztd| W  Y d }~S d }~ww t| dS )Nr   r(   new_passwordr   r0   r1   r2   r5   r   r6   r:   r;   r<   r   rl   rZ   r   r{   zcorporate_reset_password.htmlr'   z%Password has been reset successfully.r   r   )	r   r   rJ   rK   rL   r}   r   r   rO   )r?   r(   r   rV   r   r[   r\   r\   r]   reset_password_view  s@   

	

r   c              
   C   s   z*dt  d}tj|d| d}|jdkr td|  | W S td|j|j W dS  tyB } ztd	| W Y d}~dS d}~ww )
a  
    Post data to Elasticsearch.

    :param url: str - The Elasticsearch endpoint.
    :param auth: tuple - A tuple containing the username and password for authentication.
    :param user_data: dict - The data to be posted.
    :return: dict - The response from Elasticsearch.
    z>https://scic-elasticsearch.es.us-central1.gcp.cloud.es.io:443/z/_doc)r   r   )authrG   rB   zData posted successfully:zError posting data:NzAn error occurred:)organ_user_indrequestsr^   status_coderI   rG   textrO   )r   urlrV   r[   r\   r\   r]   post_to_elasticsearch  s   	


r      c                    s(   t jt j  d fddt| D S )N c                 3   s    | ]}t  V  qd S )N)randomchoice)rp   _
charactersr\   r]   	<genexpr>!  s    z)generate_random_string.<locals>.<genexpr>)stringascii_lettersdigitsjoinrange)lengthr\   r   r]   generate_random_string  s   r   c              
   C   s   zud}d}d}d}	|  | | | | | d}
t |
 t }td|f|d< d| g|d	< d
|d< d| d|  d| d}|t|d t||}|  |	||	 |
| td W d    W d S 1 snw   Y  W d S  ty } ztd|  W Y d }~d S d }~ww )Nzsmtp.office365.comiK  r   z
G!vv38Os5#)r(   r   r4   r   r   r   z
AlliBot2.0Fromz, TozReg: AlliBot user credentialsSubjectzl
        <html>
        <body>
            <p> User credentials</p>
            <p><strong>UserId:</strong> z/</p>
            <p><strong>Username:</strong> z/</p>
            <p><strong>Password:</strong> z-</p>
        </body>
        </html>
        htmlzEmail sent successfully.zError sending email: )r   r   r   r   attachr   smtplibSMTPstarttlsr   send_messagerI   rO   )r(   r   r)   useridr   r   smtp_server	smtp_portemail_usernameemail_passwordr   msgr8   clientexr\   r\   r]   
send_email'  sF   	


&r   c           
   
   C   s   z`| j dkrX| jd}| jd}| jd}tj|dd|iiddd	}|d
 d
 }|s5tddiW S g }|d
 d
 D ]}|d }d|v rN||d  q=td||v iW S tddiddW S  tyz }	 zt	d|	  W Y d }	~	d S d }	~	ww )Nr   userId	indexnamer   r5   r     r0   rj   r6   r:   existsFr>   r   r*   zcompanyCode is required.r-   r.   zcheck user id error%s)
r   r   rJ   rK   rL   r   rM   rO   r   r   )
r?   r   
index_namer   rV   matched_userunique_idlistrq   rE   r[   r\   r\   r]   check_userid_existsW  s4   

r   c              
   C   s,  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}td| td| td	| ztj|d
dddd|iidd|iigiiid}|d d d dkr|d d d d }|d d d d d  t||d d d d d  }	|	dkrd}
nd}
tj||dt|||
did td |rtjt|dddiid n:tjtd
dddd|iidd|iigiiid}|d d d dkr|d d D ]}|d }tjt|dddiid qt	d|d W S t
d!W S  ty } zt
d"| W  Y d }~S d }~ww t	d#d$id%d&S )'Nr   r   r(   token_valuelimits_tokenr   r4   r   notification_docidr0   r1   r2   r3   r6   r:   r;   r<   r   rl   r>   overall_tokensrh   )user had less than or equal to 100 tokensr   rZ   )assigned_tokensr   Notesr{   zupdated datar?   r@   rA   messagesr   z3No documents found matching username '${username}'.r   r*   Invalid requestr-   r.   )r   r   rJ   rI   rK   rL   intr}   r    r   r   rO   )r?   r   r(   token_countlimits_token_flagr   mail_idrV   r   	token_comcommandsrq   r[   r\   r\   r]   update_assigned_tokenz  s   




 


r   c                 C   s   | j dkrU| jd}| jd}| jd}| jd}| jd}| jd}| jd}|t||||d	|d
}tj||d}	t }
t||
|||| t	d|dS t	ddiddS )Nr   r   r$   r4   assignedtokensr   r   r   r@   )r(   r   r4   r   r   r   r   r6   rA   r   r*   r   r-   r.   )
r   r   rJ   r   r   rK   r7   r   r   r   )r?   r   r(   r   tokensr   r   r   rE   rV   r   r\   r\   r]   create_new_user  s*   
r   c              
   C   s  zu| j dkrs| jd}| jd}| jd}| jd}tj|dd|iidd	d
}g }g }|d d D ]}|d }	|	dd}
|	dd}||
 || q6||v r_tdddW S ||v rktdddW S tdddW S W d S  ty } ztddt| iddW  Y d }~S d }~w t	y } ztddt| iddW  Y d }~S d }~w t
y } ztdt|iddW  Y d }~S d }~ww )Nr   r(   r   r   r4   r5   r   r   r   r6   r:   r>   r   Fuser)r'   r,   TrA   r*   Not Found: r=   r.   Authentication Error:   rF   )r   r   rJ   rK   rL   rM   r   r   rP   r   rO   )r?   	addeduserind_namer   r4   rV   userNamemail_addrq   rE   assigned_tokenr   r[   r\   r\   r]   check_user_exists  sP   


&$$ r  c              
   C   s  z| j dkrt| j}|d}|d}|d}tj|ddddd	|iigiiid
}|d d }|sBtdddddiddW S |D ]}|d }|dd}	qDtj|ddi iid
}g }
|d d D ]}|d }|dd}|
| qd|	t	|
t
t	|
|	 d d}td|iW S W d S  ty } ztddt| iddW  Y d }~S d }~w ty } ztddt| iddW  Y d }~S d }~w ty } ztdt|iddW  Y d }~S d }~ww )Nr   organization_namer7   sumassignindexr0   r1   r2   r5   organization_name.keywordr6   r:   r   zNot Availabler   )Overall_tokensr   
percentager=   r.   r>   r   re   rh   )r   r   r  r*   r   r   r   rF   )r   rG   rH   r8   rJ   rK   rL   r   rM   sumroundr   rP   r   rO   )r?   rR   corporateNameassignindexsumofassignindexrV   
org_tokensrq   rE   overall_assignassignedTokr   r   r[   r\   r\   r]   organization_overalltokensI  sz   




	G$$ r  c              
   C   s<  zG| j dkrEt| j}|d}|d}tj|ddi iidd d }|s0tdd	d
iiW S |d
 d }d	|d	d
i}td|iW S W d S  tye } ztddt	| iddW  Y d }~S d }~w t
y } ztddt	| iddW  Y d }~S d }~w ty } ztdt	|iddW  Y d }~S d }~ww )Nr   r(   r7   r0   re   r6   r:   r   r   r   r>   r*   r   r=   r.   r   r   rF   )r   rG   rH   r8   rJ   rK   rL   r   r   rP   r   rO   )r?   rR   r	  r   r  
doc_sourcer   r[   r\   r\   r]   add_progress  s>   


!$$ r  c              
   C   s  z| j dkr| jd}| jd}| jd}tj|ddddd	|iigiiid
}|d d }|s5d}nN|D ]}|d }|dd}q7tj|ddi iid
}g }	|d d D ]}|d }|dd}
|	|
 qWg }|d d D ]}|d }|dd}
||
 qqz|	rtt|t|	 d }nd}W n ty } zd}W Y d }~nd }~ww z|rtt|| d }nd}W n ty } zd}W Y d }~nd }~ww t	dt|	|t|||diW S W d S  t
y } zt	ddt| iddW  Y d }~S d }~w ty! } zt	ddt| iddW  Y d }~S d }~w tyB } ztd| t	dt|iddW  Y d }~S d }~ww )Nr   r7   r  r  r0   r1   r2   r5   r  r6   r:   r   r>   r   re   r   rh   r;   )overallAssignedmainAssignedoverallUsedtoken_percen	used_percr*   r   r=   r.   r   r   zget user assignrF   )r   r   rJ   rK   rL   rM   r  r  rO   r   r   rP   r   rI   )r?   r
  usedtokindexr	  rV   r  r  rq   rE   r  r   userTokpercr[   r  r\   r\   r]   get_users_assigntoken  s   

"I$$
 r  c              
   C   s  | j dkr| jd}| jd}td| td| z|rtd dddd	d
|iigiii}tj||dd}td| g }|d d D ]5}|d }|dd|dd }|dkr]d}	nd}	|d|d|dd|d|	d}
||
 qDtd|iW S ddi ii}tj||dd}g }|d d D ]5}|d }|dd|dd }|dkrd}	nd}	|d|d|dd|d|	d}
||
 qtd|iW S  ty } ztdt	|iddW  Y d }~S d }~ww tddiddS )Nr   r   r4   emailzfirst ifr0   r1   r2   r5   zmail.keyword  r7   r8   rj   zfirst if responser:   r>   r   r   r   rh   r   r   r(   )r$   r4   r  r   notesr   re   r*   rF   r.   Invalid request method.  )
r   r   rJ   rI   rK   rL   rM   r   rO   rP   )r?   r   r  r0   rV   outputrq   r   r   r   r   r[   r\   r\   r]   get_user_list  sx   






 r"  c           	   
   C   s   | j dkro| jd}zGddd|iii}tjt|dd}g }|d d D ]'}|d	 }|d
|d|d|dd|d|dd}|| q$td|iW S  tyn } ztdt	|iddW  Y d }~S d }~ww tddiddS )Nr   r   r0   r5   r   r  r  r:   r>   r(   r   r4   r   r   r   removedDate)r(   r   r)   usertok
assignetokr#  r   r*   rF   r.   r  r   )
r   r   rJ   rK   rL   r   rM   r   rO   rP   )	r?   r   r0   rV   r!  rq   r   r   r[   r\   r\   r]   get_removeduser  s0   

	 r&  c                    s   t | } t |}i }t| |d}|tdd jdd}t | d t | d  t}t}	 fdd}
|
|}|
|	}|| }|||d< |S )Nr@   )months)dayr  c                    sL   ddd diidd diigiidd	}t j| |d
}|d d S )Nr1   r2   r5   z.keywordr   rC   )gtelti'  r   r6   r:   )rK   rL   )r   r0   rV   	end_epoch
field_name
model_namestart_epochr\   r]   fetch_records  s"   z*get_monthly_records.<locals>.fetch_recordsz%B %Y)r   r   r   replace	timestampr   r   rN   )yearmonthr.  r   r-  monthly_results
start_dateend_datees_index_name_1es_index_name_2r0  hits_1hits_2all_hitsr\   r+  r]   get_monthly_records  s   r=  c              
   C   s  | j dkr| jd}| jd}| jd}z_t||d|d}dgd }| D ]E\}}|D ]>}|d	 d
}	|	ro|	d }
t|
}|jd }d|d	 v r]||  |d	 d 7  < q1d|d	 v ro||  |d	 d 7  < q1q+|dv r||d d }n#|dkr|d dkr|d dks|d dkr|d d }n|d d }t||d|d}dgd }| D ]D\}}|D ]=}|d	 d
}	|	r|	d }
t|
}|jd }d|d	 v r||  |d	 d 7  < d|d	 v r||  |d	 d 7  < qq|dv r|d d }n'|dkr(|d dkr|d dks|d dkr"|d d }n|d d }t||d|d}dgd }| D ]S\}}td| d |D ]C}|d	 d
}	|	r|	d }
t|
}|jd }d|d	 v rv||  |d	 d 7  < qGd|d	 v r||  |d	 d 7  < qGq9|dv r|d d }n'|dkr|d dkr|d dks|d dkr|d d }n|d d }t||d|d}dgd }| D ]K\}}|D ]C}|d	 d
}	|	r|	d }
t|
}|jd }d|d	 v r||  |d	 d 7  < qd|d	 v r||  |d	 d 7  < qאq|dv r)|d d }n'|dkrP|d dkr<|d dksC|d dkrJ|d d }n|d d }dd  |D dd  |D d!d  |D d!d  |D t	|| | | d"}t
|W S  ty } zj|dv rd}n"|dkr|d dkr|d dks|d dkrd}nd}nd}dg| }dg| }dg| }dg| }d#d  |D d#d  |D d$d  |D d$d  |D dd"}t
d%t|id&d'W  Y d }~S d }~ww d S )(Nr   r3  r4  r   zgpt-4-turbo	modelnamer      r>   rC   g     @@r@   zhuman tokenzassistant token)      	            r@  rh   r-         zgpt-3.5-turbo-1106gpt35_modelnameinput_token_accuoutput_token_accuzgpt-4-0125-previewzRecords for :zgpt-4oc                 S      g | ]
}|d kr
dn|qS r   Nr\   rp   xr\   r\   r]   rr   Y      zchart_view.<locals>.<listcomp>c                 S   rL  rM  r\   rN  r\   r\   r]   rr   Z  rP  )model_gpt4turbomodel_gpt35model_preview
model_gpt4total_tokenc                 S   rL  rM  r\   rN  r\   r\   r]   rr   p  rP  c                 S   rL  rM  r\   rN  r\   r\   r]   rr   q  rP  r*   rF   r.   )r   r   rJ   r=  itemsr   fromtimestampr(  rI   r  r   rO   rP   )r?   
input_yearinput_monthr   resultsmodel_turbolistr4  recordsrecordtimestamp_mstimestamp_sdater(  model_gpt35listmodel_previewlistmodel_gpt4olistcontextr[   days_in_monthrQ  rR  rS  rT  r\   r\   r]   
chart_view  s   


$




*




*




*


*



 rf  c              
   C   s>  | j dkr| jd}| jd}| jd}| jd}| jd}| jd}| jd}| jd	}||||||t d
}	tjt|	d}
tj|ddddd|iidd|iidd|iigiiid}
d|
v rl|
d nd}tj|ddddd|iidd|iidd|iigiiid}d|v r|d nd}t	d|dddS d S )Nr   r(   r   r7   userdetailindr   r4   used_tok
assign_tok)r   r(   r   r4   r   r   r#  r6   r0   r1   r2   r5   zuser_id.keywordr   r   deletedr   zUser removed)r,   deleted_count   r.   )
r   r   rJ   r   r   rK   r7   r   delete_by_queryr   )r?   r(   r   r   rg  r   r)   
used_tokenassign_tokenrE   rV   delete_result	response1delete_result1r\   r\   r]   remove_useru  sd   







rs  )r   )\django.shortcutsr   elasticsearchr   elasticsearch.exceptionsr   r   django.httpr   r   django.views.decorators.csrfr   r	   django.contrib.authr
   r   r   r   rG   r   r   hashlibemail.mime.multipartr   email.mime.textr   email.utilsr   r   dateutil.relativedeltar   decoupler   django.core.mailr   django.utils.decoratorsr   django.viewsr   django.utilsr   django.utils.timezoner   django.views.decorators.httpr   sysospathrM   r   dirname__file__LogUtilsgetRootLoggerr   CLOUD_IDELASTIC_PASSWORDrK   r   r   r   r   r    r!   r"   r&   rd   rz   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r"  r&  r=  rf  rs  r\   r\   r\   r]   <module>   s    
m
@
		

<
6

2
.
0#
z
!
1
Q
+
T
g
)=
 
