
    wi
#              	          d dl Z d dlZ	 d dlmZ n# e$ r	 d dlmZ Y nw xY w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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 d dlmZ d d	lmZ d d
l m!Z! d dl"m#a#m$Z$m%Z%m&Z& d dl'm(Z(  ej)        e*          Z+ ej)        d          Z,e,-                    ej.                    ee*          Z/da0 e1 ed          dz  dz  d          5 Z2e23                                Z4ddd           n# 1 swxY w Y   da5da6da7 e!            Z8e/9                    d          de:fd            Z;e/9                    d          de:fd            Z<e/9                    d          de:fd            Z= e>dd          fdedee:ee?e:f         f         fdZ@e jA        d%d            ZBd&de?deeeCe:f                  ddfd ZDd!ed"e?d#eeeef         ddfd$ZEdS )'    N)files)datetime)EventProcess)	BaseProxy)DictOptionalSequenceTupleUnion)Flaskjsonifyrender_templaterequestescape)make_server)DashboardStartedEvent)$DASHBOARD_MANAGER_CONNECTION_DETAILSget_manager_client_dictsshutdown_manager_serverstart_manager_server)get_two_available_portswerkzeugzmpire.dashboard	templateszprogress_bar.htmlr/returnc                      	 t          j                    } n# t          $ r d} Y nw xY wt          d| t	          j                    t          j        pdt          j                  S )z2
    Obtain the index HTML

    :return: HTML
    zn/az
index.html	localhost)usernamehostnamemanager_hostmanager_port_nr)	getpassgetuserKeyErrorr   socketgethostnamer   hostport)users    q/var/www/development/aibuddy-work/election-extract/venv/lib/python3.11/site-packages/mpire/dashboard/dashboard.pyindexr.   (   sv         <$ASAUAU(L(Q(`U`+O+TV V V Vs    %%z/_progress_bar_updatec                  J   t          j                    } g }t          t                                                    D ]}t                              |          }|d         d|d<   |d         r|d         |d         k    rt          | |d         z
                                dd          d	         |d
<   |d         >|d         | k    r2t          |d         | z
                                dd          d	         nd|d<   |                    |           t          |          S )z
    Obtain progress bar updates (should be called through AJAX)

    :return: JSON string containing progress bar updates
    totalN?successnstarted_raw.   r   durationfinished_raw-	remainingresult)
r   nowsorted_DASHBOARD_TQDM_DICTkeysgetstrrsplitappendr   )r=   r<   pb_idprogresss       r-   progress_bar_updaterG   :   s7    ,..CF,113344 	  	 '++E22G$ #HWI 	/8C=HW4E#E#E#&sXm-D'D#E#E#L#LSRS#T#TUV#WHZ (0(@(LQYZhQiloQoQo &).)AC)G%H%H%O%OPSUV%W%WXY%Z%Z*- [! 	h&!!!!    z/_progress_bar_newc                     t          t          j        d                   } t          j        d         dk    }t                              |           }|d         t          j                     dt          j                     k    rd|d<   nd	                    |d                   |d<   g }|rUt          |d                   D ]?}|                    d	| d
|  d| d|  d| d|  d| d|  d| d|  d| d|  d| d           @d                    |          }t          t          j	        d| ||rdnddd |                                D                       S )z
    Obtain a piece of HTML for a new progress bar (should be called through AJAX)

    :return: JSON string containing new progress bar HTML
    rE   has_insightstruer,   @ z{}:n_jobsz<tr><td>z</td><td id='pb__insights_worker_z"_tasks_completed'></td><td id='pb_z _start_up_time'></td><td id='pb_z_init_time'></td><td id='pb_z_waiting_time'></td><td id='pb_z_working_time'></td><td id='pb_z_exit_time'></td></tr>
blocknone)idinsights_workersrJ   c                 4    i | ]\  }}|t          |          S  r   ).0kvs      r-   
<dictcomp>z$progress_bar_new.<locals>.<dictcomp>u   s$    6m6m6m1q&))6m6m6mrH   r;   rV   )intr   args_DASHBOARD_TQDM_DETAILS_DICTrA   r%   r&   r(   r)   formatrangerD   joinr   _progress_bar_htmlitems)rE   rJ   progress_bar_detailsrT   	worker_ids        r-   progress_bar_newre   S   s1    W%&&E</69L 8;;EBBF#'/*;*;'T'Tf>P>R>R'T'TTT')V$$',||4H4P'Q'QV$  	.3H=>> 	. 	.I## %-y %- %-27%- %-JS%- %-27%- %-JS%- %- 38%- %- KT%- %- 38	%- %- KT	%- %-
 38%- %-
 KT%- %- 38%- %- KT%- %- %- . . . . yy!122,3 ouO_LXAd^do o6m6mPdPjPjPlPl6m6m6mo o p p p prH   i  i  
port_rangec                 >   t                                           st                                            t          |           \  }}t	          |          at          j        d                              t          j	                   t          t          t           |t                      fdd          at                                           t                                            |t           j        pt%          j                    t           j        dS t+          d          )z
    Starts a new MPIRE dashboard

    :param port_range: Port range to try.
    :return: A dictionary containing the dashboard port number and manager host and port number being used
    r   Tzdashboard-process)targetr\   daemonname)dashboard_port_nrr#   r$   z$You already have a running dashboard)DASHBOARD_STARTED_EVENTis_setinitr   r   _DASHBOARD_MANAGERlogging	getLoggersetLevelWARNr   _runr   _server_processstartwaitr   r*   r(   r)   r+   RuntimeError)rf   rk   r$   s      r-   start_dashboardry   x   s    #))++ C$$&&&-DZ-P-P*? 2/BB 	*%%..w|<<<!5LN_8P8R8R5T+/6IK K K 	$$&&& &7 D I aVM_MaMa#G#LN N 	N
 ABBBrH   c                  4   t                                           r~t          Bt          j        t          j        t          j                   t                                           t          t                     da
dadat                                            dS dS )z Shuts down the dashboard N)rl   rm   ru   oskillpidsignalSIGINTr`   r   ro   r?   r]   resetrV   rH   r-   shutdown_dashboardr      s     %%'' 
(&GO'777  """ 2333!#'+$%%'''''
( 
(rH   r$   r#   c                 J   t                                           rt          d          |pd}|t          _        | t          _        	 t                       n5# t          $ r( t          d|                                 d|            w xY wt           	                                 dS )z
    Connects to an existing MPIRE dashboard

    :param manager_port_nr: Port to use when connecting to a manager
    :param manager_host: Host to use when connecting to a manager. If ``None`` it will use localhost
    z/You're already connected to a running dashboardz	127.0.0.1z*Could not connect to dashboard manager at :N)
rl   rm   rx   r   r*   r+   r   ConnectionRefusedErrordecodeset)r$   r#   s     r-   connect_to_dashboardr      s     %%'' NLMMM  .;L0<(-0?(-S """"! S S S$ &R(4(;(;(=(=&R &R@O&R &R S S 	SS !!!!!s   A 2Bstartedrk   manager_client_dictsc                     |\  a a}t          d|t                    }|                                  t
                              d|            |                                 dS )a
  
    Starts a dashboard server

    :param started: Event that signals the dashboard server has started
    :param manager_host: Dashboard manager host
    :param manager_port_nr: Dashboard manager port number
    :param dashboard_port_nr: Dashboard port number
    z0.0.0.0zServer started on 0.0.0.0:N)r?   r]   r   appr   loggerinfoserve_forever)r   rk   r   _servers        r-   rt   rt      sh     =Q96 $5s;;FKKMMM
KK@->@@AAA
rH   )r   N)N)Fatexitr%   importlib.resourcesr   resourceImportErrorimportlib_resourcesrp   r{   r~   r(   r   multiprocessingr   r   multiprocessing.managersr   typingr   r	   r
   r   r   flaskr   r   r   r   
markupsafer   werkzeug.servingr   "mpire.dashboard.connection_classesr   mpire.dashboard.managerr   r   r   r   mpire.dashboard.utilsr   rq   __name__r   logger_werkzeugrr   ERRORr   ru   openfpreadra   ro   r?   r]   rl   routerB   r.   rG   re   r_   r[   ry   registerr   bytesr   rt   rV   rH   r-   <module>r      s@    65555555 6 6 6555555556  				         * * * * * * * * . . . . . . 9 9 9 9 9 9 9 9 9 9 9 9 9 9 : : : : : : : : : : : :       ( ( ( ( ( ( D D D D D Dn n n n n n n n n n n n 9 9 9 9 9 9		8	$	$#'#J//    ' ' 'eHoo	T(($
%
%
36I
I3OO #SU# # # # # # # # # # # # # # #   # //11  3Vs V V V V" "##"S " " " $#"0   !p# !p !p !p ! !pH ,15t+<+<  C  C  Cc5QTVYQY?FZA[  C  C  C  CF ( ( ( (" "# "XeESVJFW=X "dh " " " "6% C uYXaclMlGm rv      s    &DDD