U
    jir                     @   s  d dl Z d dlZd dlZd dlmZmZ d dlmZmZmZ d dl	m
Z
 d dlmZmZ d dlmZ e jejejeje d dlmZ e Zeje
dgd	dgdgd
 ddddddZeded  ded  ded  ded  ded  
ZeedZeeZdd Zdd Zee dd d!Z!e"d"ed#d$d%ed#d&d%fe e e d'd(d)Z#e"d*d+d, Z$e"d-e d.d/d0Z%e&d1krd dl'Z'e'j(d2d3d4d	d5 dS )6    N)datetime	timedelta)FastAPIHTTPExceptionQuery)CORSMiddleware)create_enginetext)sessionmaker)ActivityAnalyzer*T)Zallow_originsZallow_credentialsZallow_methodsZallow_headersZ	localhosti8  Z	timesheetZtimesheet_userZTm7kL9pX3vN2qR8wE4)hostportdatabaseuserpasswordzpostgresql+psycopg2://r   :r   @r   r   /r   )Zbindc                 C   sh   | dkrdS t | d }t | d d }|dkrH|dkrH| d| dS |dkrZ| dS | dS dS )	z+Convert seconds to hours and minutes formatr   Z0m  <   h mhNint)total_secondshoursminutes r   ./dashboard_api.pyformat_duration%   s    
r!   c                 C   s4   | d }t |d }t |d d }| d| dS )z&Convert milliseconds to 'Xh Ym' formati  r   r   r   r   r   )Zmillisecondsr   r   r   r   r   r    format_ms_to_hours_minutes3   s    r"   )activityreturnc                    s   |  dpd  |  dpd ddddg}dd	d
ddg}dddddg}t fdd|D rfdS d krtfdd|D rdS tfdd|D rdS dS )Napp titlezcode.exeZcpanelZ	shareplexZ	filezillaZawsZgoogleZgcpZtermiusZazureZyoutubeZgmailZresearchZstackoverflowZgithubc                 3   s   | ]}| kV  qd S Nr   .0k)app_namer   r    	<genexpr>B   s     z&categorize_activity.<locals>.<genexpr>productivityz
chrome.exec                 3   s   | ]}| kV  qd S r(   r   r)   r'   r   r    r-   D   s     serverc                 3   s   | ]}| kV  qd S r(   r   r)   r/   r   r    r-   F   s     browserother)getlowerany)r#   Zproductivity_appsZserver_keywordsZbrowser_keywordsr   )r,   r'   r    categorize_activity:   s    r6   z!/api/activity-data/{developer_id}.zStart date in ISO format)descriptionzEnd date in ISO format)developer_id
start_dateend_datec                 C   s  z^t |dd}t |dd}td}t }||| ||d }|  g }d}	dddddd}
|D ]}|d }t|t	rt
|}|D ]f}t|}|
|  |dd7  < |	|dd7 }	||d	  |d
|d|dd|d qqrt|
 }|
D ]B}t|
| d d|dkrDt|
| | d dndd|
|< q||	|
dW S  tk
r } ztdt	|dW 5 d }~X Y nX d S )NZr&   z
            SELECT activity_data, created_at
            FROM activity_records
            WHERE developer_id = :dev
              AND created_at BETWEEN :start AND :end
            ORDER BY created_at ASC
        )Zdevstartendr   )r.   r0   r1   znon-workZuncategorizedZactivity_datadurationZ
created_atr%   r'   )Z	timestampr%   r'   r>   categoryr      d      )r   Z
percentage)dataZ
total_timecategory_breakdown  Zstatus_codeZdetail)r   Zfromisoformatreplacer	   SessionLocalexecutefetchallclose
isinstancestrjsonloadsr6   r3   appendZ	isoformatsumvaluesround	Exceptionr   )r8   r9   r:   r<   r=   querysessionresultZall_activitiesZtotal_time_secondsrD   row
activitiesZactr?   Ztotal_hourscater   r   r    get_activity_dataK   sR        



"r\   z/api/developersc               
   C   sp   z8t d} t }||  }|  dd |D }|W S  tk
rj } ztdt|dW 5 d }~X Y nX d S )Nz
            SELECT DISTINCT developer_id
            FROM activity_records
            WHERE developer_id IS NOT NULL AND developer_id != ''
            ORDER BY developer_id
        c                 S   s$   g | ]}|d  d|d   dqS )r   z
Developer )idnamer   )r*   rX   r   r   r    
<listcomp>   s     z"get_developers.<locals>.<listcomp>rE   rF   )r	   rH   rI   rJ   rK   rT   r   rM   )rU   rV   rW   Z
developersr[   r   r   r    get_developers   s    r`   z'/api/productivity/{developer_id}/weekly)r8   c           
   
   C   s   zt   }|tdd }g g  }}|}||krzt| ||\}}t||}||d || |tdd7 }q*||dW S  t	k
r }	 zt
dt|	dW 5 d }	~	X Y nX d S )N   )Zdaysz%arB   )datesscoresrE   rF   )r   Znowdater   analyzerZget_developer_activitiesZcalculate_productivity_scorerP   strftimerT   r   rM   )
r8   r:   r9   rb   rc   currentrY   Ztotal_durationZscorer[   r   r   r    get_weekly_productivity   s$    
  
rh   __main__zdashboard_api:appz0.0.0.0i@  )r   r   reload))sysosrN   r   r   Zfastapir   r   r   Zfastapi.middleware.corsr   Z
sqlalchemyr   r	   Zsqlalchemy.ormr
   pathrP   dirnameabspath__file__Zbackend.activity_analyzerr   r%   Zadd_middlewareZ	DB_CONFIGZenginerH   re   r!   r"   dictrM   r6   r3   r\   r`   rh   __name__Zuvicornrunr   r   r   r    <module>   sT   $
:


=

