
    {f                     ,   d dl mZmZmZmZmZmZmZmZm	Z	m
Z
 d dlmZmZ d dlmZ d dlmZ d dl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mZ d dlZd d
lm Z m!Z!m"Z" d dl#m$Z% d dl&m'Z' d dl(m)Z)  e)            *                                rd dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1m2Z2m3Z3m4Z4 d dl5m6Z6m7Z7m8Z8m9Z9 d dl:m;Z; d dl<m=Z=m>Z> d dl?m@Z@ d dlAmBZB d dlCmDZD d dlEmFZF d dlGmHZH d dlImJZJ d dlKZKd dlZd dlLZLd dlMZMdZN eKjO        eN          ZP eeQ          ZR e            ZSdZTdZUdeR_V        deRjW        d<    e@eR          ZXdeRjW        d <   d!eRjW        d"<    eeR          ZY e;eReY          ZZ G d# d$eYj[                  Z\ G d% d&e.          Z' G d' d(e.          Z]d) Z^e^eRj_        j`        d*<    G d+ d,eja                  Zb e)            Zcecd                    d-d.d/          d/k    Zed0 Zfd1 Zgecjh        ZieRjW        j                    eQ            eeR          Zkecjl        eRjW        d2<   ecjV        eR_V         eeRd34            eeR          ZY ejm                    Zneno                    eR           d5 Zpenjq        d6             ZqeRjr        d7             ZseRjr        d8             ZseRt                    d9          d:             ZueRjr        d;             ZseRjr        d<             ZseRjr        d=             ZseRjr        d>             ZseRjr        d?             ZseRv                    d@dAgB          dC             ZweRv                    dDdAgB          dE             ZxeRv                    dFdAgB          dG             ZydH ZzdI Z{dJ Z|dK Z}eRv                    dLdAgB          dM             Z~dN ZdO ZdP ZeRv                    dQdRgB          dS             ZeRv                    dTdAgB          dU             ZeRv                    dV          ejf        dW                         ZeRv                    dX          dY             ZdZ Zd[ Zd\ Zd] Zd^ ZeRv                    d_          ejf        dd`                        ZeRv                    dadRdAgB          db             ZeRv                    dcdRdAgB          ejf        dd                         ZeRv                    dedRgB          ejf        df                         ZeRv                    dgdRgB          ejf        dh                         ZeRv                    di          dj             ZeRv                    dk          ejf        ddl                        ZeRv                    dm          dn             ZeRv                    do          ejf        ddp                        ZeRv                    dq          ejf        ddr                        Zds Zdt ZeRv                    dudAgB          dv             ZeRv                    dw          ejf        dx                         ZeRv                    dy          dz             ZeRv                    d{          eRv                    d|          ejf        dd}                                    ZleRv                    d~          ejf        d                         ZeRv                    d          d             ZeRv                    d          d             ZeRv                    d          d             ZeRv                    d          d             Zd Z ej        ej                   d ZeRv                    ddAgB          d             Zd Zd Zd Zd Zd ZeQdk    r e             dS dS )    )
Flaskjsonifyredirectrequestsessionurl_forgabortsend_from_directory	send_file)setup_themesrender_theme_template)
run_simple)DispatcherMiddlewareN)
SQLAlchemy)flash)Babelgettext)Environment)upgraderjob	rq_worker)	LoginForm)QPanelConfig)queuelog_data_queue)	FlaskForm)StringFieldPasswordFieldSubmitFieldIntegerFieldSelectField)DataRequiredLengthEmailEqualTo)Migrate)check_password_hashgenerate_password_hash)CSRFProtect)make_transient)aliased)urlparse)
ForeignKeywrapsa  {"708": {"members": {"hint:1227@ext-local": {"Name": "Sandura Shumba", "StateInterface": "hint:1227@ext-local", "Membership": "dynamic", "Penalty": "0", "CallsTaken": "0", "LastCall": "0", "LastPause": "0", "InCall": "0", "Status": "5", "Paused": "0", "PausedReason": "", "LastCallAgo": "0 seconds", "LastPauseAgo": "0 seconds"}}, "entries": {}}, "709": {"members": {}, "entries": {}}}5432queuelogs   _5#y2L"F4Q8z
]/z1postgresql://devopsuser:devops@localhost/devopsdbSQLALCHEMY_DATABASE_URITCSRF_ENABLEDzmy super secret key
SECRET_KEYc                      e Zd ZdZe                    ej        d          Ze                    e                    d          d          Z	e                    e                    d          dd          Z
e                    e                    d          d          Ze                    ej        d	
          Zd Zd Zd ZdS )pbxUserpbx_userT)primary_keyx   F)nullable)uniquer:   <      )defaultc                 2    t          |d          | _        d S )Nsha256)method)r(   passwordselfrB   s     !/var/www/html/sassa/qpanel/app.pyset_passwordzpbxUser.set_passwordZ   s    .xIII    c                 b    t           j                            d| j                   | j        |k    S )NzStored Password Hash: %s)apploggerdebugrB   rC   s     rE   check_passwordzpbxUser.check_password]   s,    
3T]CCC }((rG   c                     d| j         z  S )Nz	<Name %r>)name)rD   s    rE   __repr__zpbxUser.__repr__f   s    TY&&rG   N)__name__
__module____qualname____tablename__dbColumnIntegeridStringrN   emailrB   accesslevelrF   rL   rO    rG   rE   r6   r6   O   s        M	2:4	0	0B99RYYs^^e944DIIbiinnTEIBBEyy2y77H))BJ)22KJ J J) ) )' ' ' ' 'rG   r6   c                       e Zd Z ed e             e            g          Z ed e             edd          g          Z	 e
d          Zd	S )
r   r$   label
validatorsPassword      minmaxLoginr^   N)rP   rQ   rR   r   r"   r$   rY   r   r#   rB   r   submitr[   rG   rE   r   r   h   su        Kg<<>>55772KLLLE}:<<>>66VW]_K`K`K`:abbbH[w'''FFFrG   r   c                   X   e Zd Z ed e             edd          g          Z ed e             e            g          Z e	d e             edd	          g          Z
 e	d
 e             ed          g          Z ed e            g          Z ed          ZdS )RegisterFormUsername      rc   r]   r$   r`   ra   rb   zConfirm PasswordrB   zSelect ManagerzSign Uprg   N)rP   rQ   rR   r   r"   r#   usernamer$   rY   r   rB   r%   confirm_passwordselected_managerr   rh   r[   rG   rE   rj   rj   m   s        {TU[]I^I^I^8_```HKg<<>>55772KLLLE}:<<>>66VW]_K`K`K`:abbbH$}+=<<>>[b[bcm[n[nJoppp"{)9||~~FVWWW[y)))FFFrG   rj   c                      t          |           S N)setvalues    rE   make_setrv   v   s    u::rG   rs   c                       e Zd ZdS )UserN)rP   rQ   rR   r[   rG   rE   rx   rx   z   s        DrG   rx   generalexternal_loginFc                 <     t                      fd            }|S )Nc                  ^    dt           vrt          t          d                    S  | i |S )Nuser_idloginr   r   r   )argskwargsfs     rE   decorated_functionz*login_required.<locals>.decorated_function   s9    G##GG,,---q$!&!!!rG   r.   )r   r   s   ` rE   login_requiredr      s4    
1XX" " " " X"
 rG   c                     	 t                      }| |_        t                              d|           |_        |S # t
          $ r Y d S w xY w)Nusers)rx   rW   cfggetrB   BaseException)rn   users     rE   get_user_config_by_namer      sS    vv22   tts   69 
AABABEL_DEFAULT_LOCALEqpanel)app_identifierc                     t           j        dk    rt          j                            d           t          j        dt           j                  }t          || fi |S )NoldzsThe old theme is deprecated from 0.16.0 and not keep maintained anymore.In the future will be removed by completelytheme)r   r   rI   rJ   warningr   r   r   )templatecontextr   s      rE   render_templater      s[    
yE
:	; 	; 	; K++E <<G<<<rG   c                 
   | j                             d          }t          |          }t                                          st                      }d|_        |S |d S t          |          }|| j         d         k    |_        |S )Nrn   withoutloginpw)	formr   r   r   	has_usersrx   rW   set_data_useris_authenticated)r   rn   user_configr   s       rE   request_loaderr      sz    |
++H)(33K==?? vv %%D'7<+==DKrG   c                  (    d } t          |           S )Nc                     	 t          |           } n	#  d} Y nxY wg d}dg}dg}| |v rt          d          S | |v rt          d          S | |v rt          d          S t          d          S )	Nr   )r         r=   
   unavailablefreein callbusy)intr   )ru   r   r   in_calls       rE   str_status_agentz+utility_processor.<locals>.str_status_agent   s    	JJEE	EEEiis$K=)))d]]6??"g9%%%6??"s    r   dictr   s    rE   utility_processorr      s%    # # #" !12222rG   c                  (    d } t          |           S )Nc                       t           j        dz  S )Ni  )r   intervalr[   rG   rE   request_intervalz+utility_processor.<locals>.request_interval   s    |d""rG   r   r   r   s    rE   r   r      s#    # # #!12222rG     c                 $    t          d          dfS )N404.htmlr   r   es    rE   page_not_foundr      s    :&&++rG   c                  (    d } t          |           S )Nc                      t           j        S rr   )r   check_upgrader[   rG   rE   r   z(utility_processor.<locals>.check_upgrade   s      rG   r   r   r   s    rE   r   r      s"    ! ! !m,,,,rG   c                  (    d } t          |           S )Nc                      t           j        S rr   )r   show_service_levelr[   rG   rE   r   z-utility_processor.<locals>.show_service_level   s    %%rG   r   r   r   s    rE   r   r      s#    & & &#56666rG   c                  (    d } t          |           S )Nc                  4    t                                           S rr   )r   r   r[   rG   rE   r   z$utility_processor.<locals>.has_users   s    }}rG   r   r   r   s    rE   r   r      s"      )$$$$rG   c                  (    d } t          |           S )Nc                 *    t          j        |           S rr   )uqpanelclean_str_to_div_idrt   s    rE   r   z.utility_processor.<locals>.clean_str_to_div_id   s    *5111rG   r   r   r   s    rE   r   r      s#    2 2 2$78888rG   c                  (    d } t          |           S )Nc                      t           S rr   )r   r[   rG   rE   configz!utility_processor.<locals>.config   s    
rG   r   r   r   s    rE   r   r      s"      vrG   z/queue_status_1GET)methodsc                      t           j                            d          } | st          ddi          dfS t	          |           }|st          dd|  i          dfS t          |          S NqueueerrorzQueue parameter is requiredi  zNo data found for queue r   )r   r   r   r   get_combined_queue_status)queue_paramstatuss     rE   queue_status_1r   
  s|    ,""7++K F!>?@@#EE&{33F Q!IK!I!IJKKSPP6??rG   z/all_statusc                  `    d} t          |           }t          |           t          |          S )N102)
match_dataprintr   )queue_numbermatched_datas     rE   fetch_all_statusr     s0    Ll++L	,<   rG   z/all_queue_statusc                  <    t                      } t          |           S rr   )get_all_queue_statusr   )all_queue_statuss    rE   fetch_all_queue_statusr     s    +--#$$$rG   c            	      x   d} d}t          d|             	 t          j        |           }|                                 t	          |d          5 }|                    |j                   d d d            n# 1 swxY w Y   n\# t          j        j        $ r}t          d|            Y d }~d S d }~wt          $ r }t          d| d|            Y d }~d S d }~ww xY wt          d|            	 t	          |d	          5 }|
                                }d d d            n# 1 swxY w Y   nL# t          $ r t          d
| d           Y d S t          $ r }t          d| d|            Y d }~d S d }~ww xY w|                    d          }i }d}|t          |          k     rdd||         v rZ||                             d          }	t          |	          dk    r
|	\  }
}|||
<   |dz  }|t          |          k     r
d||         v Zg }d }||d          D ]}|                                }|s|                    d          r/|d                                         r|r|                    |           |}|                    d          d         }
|                    |
d          }|
 d| d|t          |
          d                                           g d}|r|d                             |           |r|                    |           |st          d           d S d}t          d|            	 t	          |d          5 }t%          j        ||d           d d d            n# 1 swxY w Y   n-# t          $ r }t          d| d|            Y d }~d S d }~ww xY wt          d           d S !Nzqhttp://sassa.voiceflow.co.za/api.php?secret=9hHwZmOFaYGfQH9Ya1R5y47imD0itlOj&function=all_queues_agent_status_allzqpanel/downloaded_file.txtzDownloading file from wbzError fetching data from URL: zError saving file '': Reading data from rError: File '' not found.Error reading file '
r   - -    r=   Members:  ry   membersr   No valid queue data found.qpanel/extracted_data.jsonSaving extracted data to wr   indent Error: Unable to write data to ''Data processing completed successfully.Data processing completed.r   requestsr   raise_for_statusopenwritecontent
exceptionsRequestExceptionIOErrorreadFileNotFoundErrorsplitlenstrip
startswithisdigitappendjsondumpurl	file_pathresponsefiler   datalinesqueue_namesipartsr   
queue_name
queue_datacurrent_queuelinegeneral_infooutput_path	json_files                     rE   read_and_process_file_2r#  $  J   
}C,I	
(3
(
()))
<$$!!###)T"" 	)dJJx'(((	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	) 	)/   2q22333   5I55!55666
 

*y
*
*+++)S!! 	T99;;D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   5i555666   6Y66166777
 JJtE K	A
c%jj..SE!H__au%%u::??',$L*(2K%	Q c%jj..SE!H__ JM abb	 6 6zz|| 	??:&& 	7?? 	6 1!!-000L'--c2215L$r::J*ddZdd,s<GXGXGYGY:Z:`:`:b:bdd MM
  6i(//555 )-((( *+++ /K	
3k
3
3444+s## 	7yIj)A6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7   DDDDDEEE 

3444''   8B A7+B 7A;;B >A;?B CB//C<CC2D/ D#D/ #D''D/ *D'+D/ /E8	E8E33E8>M> M2&M> 2M66M> 9M6:M> >
N(N##N(c                  J    	 t                       t          j        d           #)NTr   )read_and_process_filetimesleepr[   rG   rE   periodic_taskr*    s%    
1rG   c            	      x   d} d}t          d|             	 t          j        |           }|                                 t	          |d          5 }|                    |j                   d d d            n# 1 swxY w Y   n\# t          j        j        $ r}t          d|            Y d }~d S d }~wt          $ r }t          d| d|            Y d }~d S d }~ww xY wt          d|            	 t	          |d	          5 }|
                                }d d d            n# 1 swxY w Y   nL# t          $ r t          d
| d           Y d S t          $ r }t          d| d|            Y d }~d S d }~ww xY w|                    d          }i }d}|t          |          k     rdd||         v rZ||                             d          }	t          |	          dk    r
|	\  }
}|||
<   |dz  }|t          |          k     r
d||         v Zg }d }||d          D ]}|                                }|s|                    d          r/|d                                         r|r|                    |           |}|                    d          d         }
|                    |
d          }|
 d| d|t          |
          d                                           g d}|r|d                             |           |r|                    |           |st          d           d S d}t          d|            	 t	          |d          5 }t%          j        ||d           d d d            n# 1 swxY w Y   n-# t          $ r }t          d| d|            Y d }~d S d }~ww xY wt          d           d S r   r   r  s                     rE   r'  r'    r$  r%  c            	         d} t          d|             	 t          | d          5 }|                                }d d d            n# 1 swxY w Y   nL# t          $ r t          d|  d           Y d S t          $ r }t          d|  d|            Y d }~d S d }~ww xY w|                    d          }i }d	}|t          |          k     rdd
||         v rZ||                             d          }t          |          dk    r
|\  }}	|	||<   |dz  }|t          |          k     r
d
||         v Zg }
d }||d          D ]}|                                }|s|                    d          r/|d	         	                                r|r|

                    |           |}|                    d          d	         }|                    |d          }	| d|	 d|t          |          d                                           g d}|r|d         
                    |           |r|

                    |           |
st          d           d S d}t          d|            	 t          |d          5 }t          j        |
|d           d d d            n# 1 swxY w Y   n-# t          $ r }t          d| d|            Y d }~d S d }~ww xY wt          d           dS )Nzqpanel/file1.unknownr   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  r  r  r   r  r  )r  r  r  r   r  r  r  r  r   r  r  r  r  r   r!  r"  s                   rE   read_and_process_file_dr-    s   &I 

*y
*
*+++)S!! 	T99;;D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	   5i555666   6Y66166777
 JJtE K	A
c%jj..SE!H__au%%u::??',$L*(2K%	Q c%jj..SE!H__ JM abb	 6 6zz|| 	??:&& 	7?? 	6 1!!-000L'--c2215L$r::J*ddZdd,s<GXGXGYGY:Z:`:`:b:bdd MM
  6i(//555 )-((( *+++ /K	
3k
3
3444+s## 	7yIj)A6666	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7 	7   DDDDDEEE 

3444''s{   A AA AA AA B3	B<BB"J" 2J
J" JJ" JJ" "
K,KKz/process_datac                      t           j                            d          } | st          ddi          dfS t	          |           }|st          dd|  i          dfS t          |          S r   )r   r   r   r   get_agent_data_for_queue)r   agents_datas     rE   process_datar1  0  s~    ,""7++K F!>?@@#EE*;77K Q!IK!I!IJKKSPP;rG   c                    t          dd          5 }t          j        |          }d d d            n# 1 swxY w Y   g }|D ]}}|                    dd          }|s|                                d         }|| k    r<|                    dg           }|D ](}t          |          }	|	r|                    |	           )~|S )Nr   r   ry   r   r   r   )r  r  loadr   r
  extract_agent_detailsr  )
r   r"  r  r0  entryr   r   members_listmemberagent_detailss
             rE   r/  r/  =  s-   	*C	0	0 $Iy##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ K  2 2yyB// 	#))++A. ;&& yyB// # 	2 	2F1&99M 2""=111	2
    266c                    t          j        d|           }t          j        d|           }t          j        d|           }t          j        d|           }t          j        d|           }|r'|                    d                                          nd}|r|                    d          nd}|r"t	          |                    d                    nd}|r"t	          |                    d                    nd}	|r"t	          |                    d                    nd }
d}d	| v rd
}n0d| v rd}n)d| v rd}n"d| v rd}nd| v rd}nd| v rd}nd| v rd}nd| v rd}||||	|
|dS )Nz	^(.*?) \(zSIP/\d+zhas taken (\d+) callszlast was (\d+) secs agozpaused was (\d+) secs agor=   r   r   	(in call)r   RingingringingOn Holdzon holdmIn usezin usemNot in user   mUnavailabler   r   paused)
Agent_NameAgent_ExtensionAgent_Calls_TakenAgent_Last_CallAgent_Paused_timeAgent_Status)researchgroupr  r   )r7  
name_match	ext_matchcalls_matchlast_call_matchpaused_matchrN   	extensioncalls_taken	last_callrB  r   s               rE   r4  r4  [  s   <00J	*f--I)4f==Ki :FCCO996BBL*4<:A$$&&&"D&/7	"""RI/:A#k''**+++K1@GO))!,,---aI+7AS##A&&'''TF Ff	f			f			f			&	 	 	6	!	!	6			V		 $($#  rG   c                 f    d| v rdS d| v rdS d| v rdS d| v rdS d| v rdS d| v rdS d| v rd	S d
| v rdS dS )Nr   zIn callr<  r>  In use
Not in useUnavailablerB  Pausedr   BusyUnknownr[   )r7  s    rE   extract_agent_statusr[    s    Fy	f		y	f		y	V		x			|	&	 	 }	V		x	6		v9rG   z/processPOSTc                      	 t          ddi          dfS # t          $ r*} t          dt          |           i          dfcY d } ~ S d } ~ ww xY w)NmessagezFile processed successfully   r   i  )r   	Exceptionstrr   s    rE   process_filerb    sl    /	#@ABBCGG / / /Q())3......./s    
A	AA	A	z/datac                  x   d} t          d|             t          j                            |           r`t	          | d          5 }t          j        |          }t          d|  d|            d d d            n# 1 swxY w Y   t          |          S d|  d}t          |           t          d|i          d	fS )
Nr   zAttempting to read data from r   zData read from z: zFile z
 not foundr   r   )r   ospathexistsr  r  r3  r   )r  r"  r  error_messages       rE   get_datarh    s   ,I	
5)
5
5666	w~~i   6)S!! 	9Y9Y''D7I7777888	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 	9 t}}5	555m/00#55s   *A::A>A>/homec                     t                      } t          j        d          }t          d           t          d           t	                      }t                      }t          |           t          |           t          d           t          d           t          |          }|t          d<   t          j        	                                }t          ||          }d}t          ||| ||          S )	Nr   zshould workzwhy not r   zall queues_agent_statusqueue_numbers
index.html)	queueDatar   r   r   )r   r   r   r   get_all_statusr   get_queue_numbersr6   queryallcombine_dictsr   )r   r   r   agentrk  queuesr   s          rE   homeru    s     {{F##mj !""$&&fe 	 !!!'((( *&11#0  !!##vu--   x6EY_````rG   z/index_datac                      t                      } t                      }t          d           t          | |          }t          |           t	          |          S )Nxrn  r   r   rr  r   )r   rs  rt  s      rE   get_queue_datary    sO    
 F ""E 
#JJJ 65))F	&MMM6??rG   c                 J   g }| D ]}|D ]}t          |t                    rt          |t                    rl|                    d          |                    d          k    r@|                                }|                    |           |                    |            n|S NQueue_Nr
isinstancer   r   copyupdater  dicts1dicts2combined_dictsdict1dict2combined_dicts         rE   rr  rr        N   	 	E%&& :eT+B+B uyyQ[G\G\`e`i`ijt`u`uGuGu %

$$U+++%%m444rG   c                     d | D             }|S )Nc                     g | ]
}|d          S )r|  r[   ).0items     rE   
<listcomp>z%get_queue_numbers.<locals>.<listcomp>   s    777$T*%777rG   r[   )r   rk  s     rE   ro  ro    s    77$777MrG   c                    	 |                      d          t                    dk    rfdt                    D             n| gg }D ]}|                    d          }|                     d          }i }|D ]F}|                     dd          \  }}|                    d          ||                    d          <   G|                    |           |S #  g cY S xY w)Nz}{r=   c                 r    g | ]3\  }}|d k    r|dz   n"|t                    dz
  k    rd|z   nd|z   dz   4S )r   }r=   {)r  )r  r  d	data_lists      rE   r  zparse_data.<locals>.<listcomp>  sm      H  H  HjnjkmnAFFS1IQR@R;R;RaX[^_X_beXe  H  H  HrG   z{},:")r
  r  	enumerater  r  )	data_strresult	data_itempairs	item_dictpairkeyru   r  s	           @rE   
parse_datar    s'   NN4((	y>>A H  H  H  Hr{  }F  sG  sG  H  H  HII!
I" 
	% 
	%I!--IOOC((EI = =!ZZQ//
U,1KK,<,<	#))C..))MM)$$$$			s   CC C#c                    d|  d|  d|  d}g }|                                 D ][}t          j        |          }|j        dk    r:|j        }t          |          }|                    |           t          |           \|S Nz}http://sassa.voiceflow.co.za/api.php?secret=9hHwZmOFaYGfQH9Ya1R5y47imD0itlOj&function=queue_agent_status&option=Paused&queue=z{http://sassa.voiceflow.co.za/api.php?secret=9hHwZmOFaYGfQH9Ya1R5y47imD0itlOj&function=queue_agent_status&option=Free&queue=z}http://sassa.voiceflow.co.za/api.php?secret=9hHwZmOFaYGfQH9Ya1R5y47imD0itlOj&function=queue_agent_status&option=InCall&queue=)rX  FreeInCallr_  )valuesr   r   status_codetextr  extendr   rN   urlscombined_datar  r  r  parsed_datas          rE   combine_statusr    s     Y  SW  Y  Y U  OS  U  U Y  SW  Y  Y D M {{}}  <$$3&&}H$X..K  ---+rG   c                     d|  d|  d|  d}g }|                                 D ]L}t          j        |          }|j        dk    r+|j        }t          |          }|                    |           M|S r  )r  r   r   r  r  r  r  r  s          rE   combine_status2r  3  s     Y  SW  Y  Y U  OS  U  U Y  SW  Y  Y D M {{}} . .<$$3&&}H$X..K  ---rG   z
/mainchartc                     d} t                      }t                      }t          d           t          ||          }t          |           t	          ||           S )NAllrw  )r   rN   rx  )rN   r   rs  rt  s       rE   	mainchartr  G  s]      !""$&& 	c


 vu--ff40000rG   /c                     t          d           t                      } |                                 r/| j        j        }| j        j        }t          d||           t          j                            |          	                                }|r|
                    |          rmt          dd           t          j                            d|           t          d           |j        t           d	<   |j        t           d
<   t#          d          S nOt          dd           t          j                            d|           t          d           t#          d          S t          d| j                   t)          dd|           S )NzLogin route accessedz
Form data:rY   zLogin successful!success)categoryzUser %s successfully logged in.zLogin successr}   rY   ri  z(User not found. Please check your email.r   zUser not found for email %s.User not foundzForm errors:z
login.htmlrf   )titler   )r   r   validate_on_submitrY   r  rB   r6   rp  	filter_byfirstrL   r   rI   rJ   inforW   r   r   r   errorsr   )r   input_emailinput_passwordr   s       rE   r~   r~   a  sp   	
 !!!;;D   %jo+lK888 }&&[&99??AA 	%"">22 	))I>>>>
 A;OOOo&&& &*W	"#': (((	) <wOOOOJ={KKK"###G$$$	.$+&&&<wTBBBBrG   z	/registerc                     d } t                      }t          j                            t          j                                                  }d }t          |           t          d           |                                rt          d           t          j                            |j        j	                  
                                }|t          |j        j	        |j        j	        |j        j	        d          }t          j                            |           t          j                                         |j        }	 t          j                                         t          d           t'          t)          d                    S # t*          $ rG}t          dt-          |                      t          j                                         Y d }~nd }~ww xY wt1          d           |j        j	        } d	|j        _	        d	|j        _	        t1          d
           t          j                            t          j                                                  }t'          t)          d                    S d S )N	somethingzForm is valid!r  r=   )rN   rY   rB   rZ   zUser added successfully.ru  z*Error committing changes to the database: r   zUser Added Successfully)rj   r6   rp  order_byrY   rq  r   r  r  r  r  rn   rB   rT   r   addflushrW   commitr   r   r`  ra  rollbackr   )rN   r   	our_usersr   r}   r   s         rE   registerr    s    D>>D&&w}5599;;ID	)	+   )}&&TZ_&==CCEE< 2$*/TXTaTftuvvvDJNN4   JgG&
!!###0111000 & & &K3q66KKLLL
##%%%%%%%%& ,---=%D!#DM DJO+,,,..w}==AACCI(((1) )s   AF 
G=GGz/delete_userc                     t                      } t          t          j                            d                    }	 t
          j                            |          }|r=t          d|            t          d           t          t          d                    S t          dd|           S # t          $ r.}t          d|            t          dd	|           cY d }~S d }~ww xY w)
N
selectUserzUser to delete: zUser deleted successfullyru  rl  r  rg  r   zError deleting user: zError deleting user)rj   r   r   r   r   r6   rp  r   r   r   r   r`  )r   user_id_to_deleteuser_to_deleter   s       rE   delete_userr    s    >>DGL,,\::;;] **+<== 		\ 5^55666-...GFOO,,,"<?OVZ[[[[ ] ] ])a))***|;PW[\\\\\\\\\]s$   AB, B, ,
C$6#CC$C$z
/edit_userc                  p   t          t          j                  } t          t          j                            d                    }t          j                            d          }t          j                            d          }t          j                            d          }t          j                            d          }t          |            t          |            t          |            t          |            t          |            t          j                            |          }t          d|            |r|dk    r||_        |dk    r||_	        |dk    r|
                    |           |dk    rt          |          |_        	 t          j                                         t          d           nG# t          $ r:}t          d	|            t          j                                         Y d }~nd }~ww xY wt#          t%          d
                    S t'          dd|           S )Nselected_userusernamenamerY   rB   access_levelzattempting to update r   zCommit successfulzError during commit: ru  r   z+User not found or insufficient access levelr  )rj   r   r   r   r   r   r6   rp  rN   rY   rF   rZ   rT   r   r  r`  r  r   r   r   )r   user_id_to_editnew_name	new_emailnew_passwordnew_access_leveluser_to_editr   s           rE   	edit_userr    s"    %%D ',**?;;<<O|//H  ))I<##J//L|''77	_
	X-	Y.	\
	
    =$$_55L	
0,
0
0111 sr>> (L??!*L2%%l333r!!'*+;'<'<L$	"J%&&&& 	" 	" 	"-!--...J!!!!!!!!	" ((( z9fmqrrrrs   -G 
H0HHz/get_updated_datac                  \    t                      g} t          |            t          |           S rr   ) calculate_agent_status_from_filer   r   )r  s    rE   get_updated_datar    s-     1223H 
(OOO8rG   z/queue/<name>c                    	 t          |            | t          d<   t          |           }d|  }t          j        |          }|j        }t          |          }t                      }t          d           t          d           t          d           t          d           t          |           t          |           }t          d           t          |           d}t          |||||| 	          S #  t          d
          cY S xY w)Nr  rhttp://sassa.voiceflow.co.za/api.php?secret=9hHwZmOFaYGfQH9Ya1R5y47imD0itlOj&function=queue_callers_waiting&queue=xxxxxxxxxxxxxxxxxxxxyyyyyyyyyyyyyyyyyyyycasllersstatusssssss#############z
queue.html)agentscallersr   r   rN   ri  )r   r   r/  r   r   r  r  r   r   r   r   )	rN   rr
caller_urlcallers_responser  callers_dictr   rt  r   s	            rE   r   r     s#   *	%$KKK$(GL!)$//B U  OS  U  UJ'|J77',G%g..L;;D ()))()))
 *.!!!"III /t44F/"""&MMM#H"8BTZaelpqqqq	%G$$$$$s   C3C6 6D	z/get_dashboard_datac                  X    t           } t          |           \  }}}}}t          |          S rr   )get_data_queuesfilter_agentsr   )data1filtered_agentspaused_countunique_state_interfaces_countunique_state_interfacesall_incoming_callss         rE   get_dashboard_datar  4  s?     Ep}  D  qE  qEmO\#@BY[m?###rG   z/queue/<name>.jsonc                    t           d         } t          |           }t          d           t          |           d|  }t          j        |          }|j        }t          |          }t          |           t          |           }t          d           t          |           t          |           }t          |           t          ||||           S )Nr  rN   r  r  )r  r  r   rN   )
r   r/  r   r   r   r  r  r   r   r   )rN   r  r  r  r  r  rt  r   s           rE   
queue_jsonr  >  s     |$%d++fb			 Q  KO  Q  Q
#<
33#(!'**l  +400of!$''lb,f4PPPPrG   z/queuegivenc                    t           d         } t          |           }d}d|  }t          j        |          }t          j        |          }|j        }|j        }t          d           t          d           t          |          }t          |          }	t          ||	          }
t          |
           t          ||
|           S )Nr  zghttp://sassa.voiceflow.co.za/api.php?secret=9hHwZmOFaYGfQH9Ya1R5y47imD0itlOj&function=all_queues_statuszthttp://sassa.voiceflow.co.za/api.php?secret=9hHwZmOFaYGfQH9Ya1R5y47imD0itlOj&function=all_queues_agent_status&queue=r  r  )r  r   rN   )	r   r  r   r   r  r   r  rr  r   )rN   r  
status_urlagent_status_urlstatus_responseagent_status_responserw  yr  r  rt  s              rE   queue_givenr  a  s     |$D!! @
 Y  SW  Y  Y",z22 (-= > > !&$%%%$%%% AAvv..fbT::::rG   c                 J   g }| D ]}|D ]}t          |t                    rt          |t                    rl|                    d          |                    d          k    r@|                                }|                    |           |                    |            n|S r{  r}  r  s         rE   combine_dicts2r  |  r  rG   c                 >   t          dd          5 }t          j        |          }d d d            n# 1 swxY w Y   t          dd          5 }t          j        |          }d d d            n# 1 swxY w Y   g }|                                D ]Y}|| k    rQ||         D ]H}|d         }|D ];}|d         |k    r-|d         |d         |d         d	}	|                    |	           <IZ|                    d
 d           t          |d          D ]
\  }
}|
|d<   |S )Nqpanel/output.jsonr   z&qpanel/json_files/extracted_calls.jsonbridgeBridgeIDCallerIDDurationrQ  )r  r  rQ  c                     | d         S )Nr  r[   )rw  s    rE   <lambda>zmatch_data.<locals>.<lambda>  s
    : rG   T)r  reverser=   )startPosition)r  r  r3  keysr  sortr  )r   r  output_dataextracted_datar  r   call	bridge_idextracted_callr  r  r5  s               rE   r   r     s   	"C	(	( &Dioo& & & & & & & & & & & & & & & 
6	<	< )4) ) ) ) ) ) ) ) ) ) ) ) ) ) ) I !!## / /L  #E* 	/ 	/ N	&4 / /N%j1Y>>(6z(B(6z(B)-k):   
 "((.../ NN..N=== iq111  5js   266A..A25A2z/extractc                  B   d} d}t           j                            |d          }	 t          | d          5 }|                                }d d d            n# 1 swxY w Y   |                                                    d          dd          }g }|D ]r}|                    d          r[|                                }t          |          dk    r4|d	         |d
         |d         |d         d}	|	                    |	           st          j
        |d           t          |d          5 }
t          j        ||
d           d d d            n# 1 swxY w Y   t          |          S # t          $ r(}t          dt          |          i          cY d }~S d }~ww xY w)Nqpanel/calls.txtzqpanel/json_fileszextracted_calls.jsonr   r   r=   z	SIP/SASSAr   r         )	Extensionr  r  r  T)exist_okr   r   r   r   )rd  re  joinr  r  r  r
  r  r  r  makedirsr  r  r   r`  ra  )r  json_dirjson_file_pathr  r  r  r  r  r  r5  r"  r   s               rE   extract_datar    s,    #I"HW\\(,BCCN*)S!! 	T99;;D	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 

""4((, 
	1 
	1D{++ 	1

u::##%*1X$)!H$)!H$)"I	 E #))%000 	Ht,,,, .#&& 	;)Ini::::	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; ~&&& * * *Q())))))))*se   E, AE, AE, ACE, .EE, EE, EE, ,
F6FFFz/queuesc                      d} t          | d          5 }|                                }d d d            n# 1 swxY w Y   t          }t          |          \  }}}}}t	          |          S )N0/qpanel/sassa/qpanel/static/index_queues.txt.txtr   )r  )r  r  r  r  r   )	re  r  r  r  r  r  r  r  r  s	            rE   rt  rt    s     B$__ 	"iikkG	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" 	" jwx|j}j}g|:<SUgG$$$$   488z
/dashboardc                       t          d          S )Nzindex_chart.htmlr   r[   rG   rE   	dashboardr!    s    -...rG   z/langz/lang/<language>c                 N    | t           d<   t          t          d                    S )Nlanguageru  r   )r#  s    rE   r#  r#    s"     #GJGFOO$$$rG   z/check_new_versionc                      d} 	 t          j                    rd} n#  Y nxY wt          | t          j                    t          j                              S )NF)require_upgradecurrent_versionlast_stable_version)r   r%  r   get_current_versionget_stable_version)need_upgrades    rE   check_new_versionr+    se     L#%% 	! L$ 466$799   s    z/get_text_filec                  (    d} t          | d          S )Nzstatic/index_queues.txt.txtT)as_attachment)r   )re  s    rE   get_text_filer.    s     )DT....rG   z/view_text_file_jsonc                      d} t          | d          5 }|                                }d d d            n# 1 swxY w Y   t          d|i          S )Nr  r   r  )r  r  r   )re  r  r  s      rE   view_text_file_jsonr0    s     >D	dC D))++               Iw'(((r  z/logoutc                  `    t          j                     t          t          d                    S )Nr~   )flask_loginlogout_userr   r   r[   rG   rE   logoutr4    s'    GG$$%%%rG   z/favicon.icoc                  v    t          t          j                            t          j        d          dd          S )Nstaticzfavicon.icozimage/vnd.microsoft.icon)mimetype)r   rd  re  r  rI   	root_pathr[   rG   rE   faviconr9    s7    rw||CM8DD,7QS S S SrG   c                     d} t          j        t                    }d|_        |                                 t
          j        r(dt          j        d<   t          j
        t                     t
                                          rEt          j                    rt          j                     nt!          d           t!          d           t
          j        dk    r?t                              t
          j        t
          j        | t
          j        g           d S t-          t/          d	          t          j        d
         t          i          }t1          t
          j        t
          j        || t
          j        g           d S )NF)targetTDEBUGz$Error: There not connection to Redisz!       Reset stats will not work
r  )hostportuse_reloaderextra_files	dummy_appAPPLICATION_ROOT)r?  r@  )	threadingThreadr*  daemonr  r   is_debugrI   r   r   add_debug_toolbarqueues_for_reset_statsr   check_connect_redisr   
start_jobsr   base_urlrun	host_bind	port_bindpath_config_filer   r   r   )reloaderthreadapplications      rE   mainrS    s]   
 H]333FFM
LLNNN
| '"
7!#&&&
!!## 8"$$ 	8 """"89996777
|sS]X 12 	 	4 	4 	4 	4 	4 +5+=+=J)*C@
   	3=#- (s7K6L	N 	N 	N 	N 	N 	NrG   )levelc           	         g }g }i }t          | d          5 }|D ]}|                    d          r|                                }t          |          dk    r]|d         }|d         }	|d         }
|d         }d|v r9|d	                                         }|||<   |                    ||	|
|d
           	 d d d            n# 1 swxY w Y   |D ]}|d         |v r||d                  |d<   i }|D ].}|d         }||vrg ||<   ||                             |           /t          |d          5 }t          j        ||d           d d d            n# 1 swxY w Y   |S )Nr   zSIP/   r   r  	   r  AppQueuer  )r   rQ  durationr  r  	caller_idr   r   r   r   )r  r  r
  r  r  r  r  r  )r  output_filecall_data_appqueuecall_data_queue
bridge_idsr  r  r  r   rQ  rY  r  rZ  r  grouped_calls_appqueuer"  s                   rE   process_call_datar`  >  s`   OJ	i		 G 	G 	GDv&& G

u::##!!HE %aI$QxH %b	I!T))$)!HNN$4$4	 1:
9- +11EPYgo  |E  3F  3F  G  G  G!	GG G G G G G G G G G G G G G G( # ; ;>Z'' *4> :D  " 3 3W...,."5)u%,,T2222 
k3		 ?9	()A>>>>? ? ? ? ? ? ? ? ? ? ? ? ? ? ? "!s$   BCC
C1EEEz/get_call_datac                  H    d} d}t          | |          }t          |          S )Nr  r   )r`  r   )r  r[  processed_datas      rE   get_call_datarc  i  s)    "I&K&y+>>N>"""rG   c                     t          dd          5 } t          j        |           }d d d            n# 1 swxY w Y   g }|D ]}|                    dd          }|r|                                }t          |          dk    r	 |d         }|dk    rT|d         }t          d	 |D             d           }|r|                    d
          }	nd}	|d         }|d         }|d         }	|d                             d          }
|d                             d          }t          |d                             d                    }t          |d                             d                    }|dk    r||z  dz  nd}|d                             d                              d          }|d         }|||	|
||||||d
}|
                    |           # t          $ r%}t          j        d| d|            Y d }~d }~ww xY w|S )Nr   r   ry   r      r   107r=   c              3   D   K   | ]}|                     d           |V  dS )W:N)endswith)r  parts     rE   	<genexpr>z!get_all_status.<locals>.<genexpr>  s4      .].]W[I\I\.]t.].].].].].]rG   rh  0rl   r   ()      C:,rb   A:,d   SL:%   )
r|  
Queue_NameCalls_WaitingAvg_Hold_TimeAvg_Talk_TimeCalls_Taken	AbandonedAbandon_RateService_Level_PercentageService_LevelIndexError:  for entry: )r  r  r3  r   r
  r  nextrstripr  r   r  
IndexErrorloggingr   )r"  r  
all_statusr5  r   r  queue_nrr  calls_waiting_partcalls_waitingavg_hold_timeavg_talk_timerR  	abandonedabandon_rateservice_level_percentageservice_levelr   r   s                      rE   rn  rn  q  s   	*C	0	0 $Iy##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ J . .yyB// ,	 &&((E5zzR)$QxH  5(( !&qJ *..].].].].]_c)d)d&) ,(:(A(A$(G(G(+$QxH!&qJ$)!HM$)"IOOD$9$9M$)"IOOD$9$9M"%eBiooe&<&<"="=K #E"IOOE$:$: ; ;IFQUVFVFVI$;s#B#B\]L/4Ryu/E/E/K/KC/P/P,$)"IM %-&0)6)6)6'2%.(44L)6 F %%f----!   M"N"N"N"N"NOOOHHHH s+   266GEG
H#HHc                 R    	 t          |           S # t          t          f$ r Y dS w xY w)Nr   )r   
ValueError	TypeErrorrt   s    rE   safe_intr    s:    5zz	"   qqs    &&c                  "   t          dd          5 } t          j        |           }d d d            n# 1 swxY w Y   g }|D ]}|                    dd          }|r|                                }t          |          dk    r	 |d         }|d         }t                      }t                      }	t                      }
t                      }t                      }t                      }t                      }t                      }|                    dg           }|D ]}|                    d	          d                                         }d
|v r|                    |           Jd|v r|
                    |           dd|v r|                    |           ~d|v r|                    |           d|v r|                    |           d|v r|	                    |           d|v r|                    |           d|v r|                    |           d|v r|                    |           t          |          }t          |
          }t          |	          }t          |          }t          |          }t          |          }t          |          }||z   |z   |z   |z   |z   |z   }||||||||||d
}|	                    |           # t          $ r%}t          j        d| d|            Y d }~d }~ww xY w|S )Nr   r   ry   r   re  r   r=   r   (r;  r<  r>  r?  rA  rB  has taken no calls yetr@  r   )
r|  rv  Total_AgentsAgents_In_CallAgents_RingingAgents_PausedAgents_InUseAgents_BusyAgents_UnavailableAgents_Freer  r  )r  r  r3  r   r
  r  rs   r  r  r  r  r  r   )r"  r  r   r5  r   r  r  r  unique_in_call_agentsunique_paused_agentsunique_ringing_agentsunique_on_hold_agentsunique_in_use_agentsunique_not_in_use_agentsunique_unavailable_agentsunique_busy_agentsr6  r7  
agent_nameagents_in_callagents_ringingagents_pausedagents_in_useagents_unavailableagents_freeagents_busytotal_agentsqueue_statusr   s                                rE   r   r     s   	*C	0	0 $Iy##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $  J JyyB// H	 &&((E5zzRE$QxH!&qJ -0EE)+.55(,/EE),/EE)+.55(/2uu,03-),& $)99Y#;#;L #/ ? ?%+\\#%6%6q%9%?%?%A%A
&&00155jAAAA&&00155jAAAA&&00155jAAAA&&00044Z@@@@+v55599*EEEE%//044Z@@@@5??599*EEEE*f44488DDDD#v--.22:>>>%()>%?%?N%()>%?%?N$'(<$=$=M$'(<$=$=M),-F)G)G&"%&>"?"?K"%&8"9"9K '7-G%&(346HIKVW ! %-&0(4*8*8)6(5'4.@'2$ $L %++L9999!   M"N"N"N"N"NOOOHHHH s%   266IK
L
%LL
c                    t          dd          5 }t          j        |          }d d d            n# 1 swxY w Y   g }|D ]}|                    dd          }|r|                                }t          |          dk    ru	 |d         }|| k    rT|d         }|d         }	|d	                             d
          }
|d                             d
          }t          |d                             d                    }t          |d                             d                    }|dk    r||z  dz  nd}|d                             d                              d          }|d         }t                      }t                      }t                      }t                      }t                      }t                      }t                      }t                      }|                    dg           }|D ]}|                    d          d                                         }d|v r|	                    |           Id|v r|	                    |           cd|v r|	                    |           }d|v r|	                    |           d|v r|	                    |           d|v r|	                    |           d|v r|	                    |           d|v r|	                    |           t          |          }t          |          }t          |          }t          |          }t          |          } t          |          }!t          |          }"||z   |z   |z   |"z   | z   |!z   }#|
                    i d|d|d |	d!|
d"|d#|d$|d%|d&d'| dd(|d)|#d*|d+|d,|d-|d.|"d/| d0|!i           # t          $ r%}$t          j        d1|$ d2|            Y d }$~$d }$~$ww xY w|S )3Nr   r   ry   r   re  r   r=   rl   r   rm  rn  ro  rp  rb   rq  rr     rs  rt  r   r  r;  r<  r>  rU  rV  rW  rB  r   r|  rv  rw  rx  ry  rz  r{  r|  z.20fr}  r~  r  r  r  r  r  r  r  r  r  r  )r  r  r3  r   r
  r  r  r   rs   r  r  r  r  r   )%r   r"  r  combined_statusr5  r   r  r  r  r  r  r  rR  r  r  r  r  r  r  r  r  r  r  r  r  r6  r7  r  r  r  r  r  r  r  r  r  r   s%                                        rE   r   r     sO   	*C	0	0 $Iy##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $ O Z ZyyB// X	 &&((E5zzRU$QxH<// !&qJ$)!HM$)"IOOD$9$9M$)"IOOD$9$9M"%eBiooe&<&<"="=K #E"IOOE$:$: ; ;IFQUVFVFVI$;s#B#B\]L/4Ryu/E/E/K/KC/P/P,$)"IM -0EE)+.55(,/EE),/EE)+.55(/2uu,03-),& $)99Y#;#;L #/ ? ?%+\\#%6%6q%9%?%?%A%A
&&00155jAAAA&&00155jAAAA&&00155jAAAA%//044Z@@@@)V33488DDDD*f44599*EEEE%//044Z@@@@#v--.22:>>>%()>%?%?N%()>%?%?N$'(<$=$=M$'(<$=$=M),-F)G)G&"%&>"?"?K"%&8"9"9K '7-G%&(346HIKVW !
 $** ,"H,$j, (, (	,
 (, &{, $Y, '<(>(>, 37O4R4R4R, (, ', )., )., (, ',  &{!," -.@#,$ &{%, ,    ( "   M"N"N"N"N"NOOOHHHH s+   266OL1O
O7O22O7c                  |   t          dd          5 } t          j        |           }d d d            n# 1 swxY w Y   t                      }t                      }t                      }t                      }t                      }t                      }t                      }t                      }	|D ]K}
|
                    dg           }|D ]}|                    d          d                                         }d|v r|                    |           Id|v r|                    |           cd|v r|                    |           }d	|v r|                    |           d
|v r|                    |           d|v r|                    |           d|v r|                    |           |D ]H}|                    d          d                                         }d|v r|	                    |           IMt          t          |                    t          t          |                    t          t          |                    t          t          |                    t          t          |	                    t          t          |                    t          t          |                    d}|S )Nr   r   r   r  r   r;  r<  r>  r?  r@  rW  rB  r  )In_Callr<  rX  InUserY  
Unavailaber  )
r  r  r3  rs   r   r
  r  r  ra  r  )r"  r  r  r  r  r  r  r  r  r  r5  r6  r7  r  agent_statuss                  rE   r  r  i  s   	*C	0	0 $Iy##$ $ $ $ $ $ $ $ $ $ $ $ $ $ $  EE55EEEE55"uu #  3 3yyB// # 	5 	5Fc**1-3355Jf$$%))*5555f$$%))*5555f$$%))*5555f$$$((4444&(((,,Z8888&(()--j9999V##$((444" 	3 	3Fc**1-3355J'611"&&z222	3 s01122s01122c.//00S-..//C*++,,#78899C01122 L r9  __main__rr   )flaskr   r   r   r   r   r   r	   r
   r   r   flask_themesr   r   werkzeug.servingr   werkzeug.middleware.dispatcherr   r  flask_sqlalchemyr   r   flask_babelr   r   r2  r   rd  jinja2r   rI  r   r   r   r   qpanel.utilsutilsr   qpanel.loginr   qpanel.configr   has_queuelog_configqpanel.modelr   	flask_wtfr   wtformsr   r   r   r    r!   wtforms.validatorsr"   r#   r$   r%   flask_migrater&   werkzeug.securityr'   r(   flask_wtf.csrfr)   sqlalchemy.orm.sessionr*   sqlalchemy.ormr+   urllib.parser,   
sqlalchemyr-   	functoolsr/   r  rC  r(  get_data_queues1loadsr  rP   rI   envr>  
table_name
secret_keyr   csrfrT   migrateModelr6   rj   rv   	jinja_envfilters	UserMixinrx   r   get_value_set_defaultEXTERNAL_LOGINr   r   rK  rB  from_objectbabelr#  LoginManagerlogin_managerinit_appr   r   context_processorr   errorhandlerr   router   r   r   r#  r*  r'  r-  r1  r/  r4  r[  rb  rh  ru  ry  rr  ro  r  r  r  r  r~   r  r  r  r  r   r  r  r  r  r   r  rt  r!  r+  r.  r0  r4  r9  rS  basicConfigr<  r`  rc  rn  r  r   r   r  r[   rG   rE   <module>r     sG   p o o o o o o o o o o o o o o o o o o o o o o o < < < < < < < < ' ' ' ' ' ' ? ? ? ? ? ?  ' ' ' ' ' '       & & & & & & & &      				       				 + + + + + + + + + +       # " " " " " & & & & & &<>>%%'' 1000000        V V V V V V V V V V V V V V C C C C C C C C C C C C ! ! ! ! ! ! I I I I I I I I & & & & & & 1 1 1 1 1 1 " " " " " " ! ! ! ! ! ! ! ! ! ! ! !              W  $*-..eHookmm
 )([
$ %{3!
> .
< Z__
'#r


' ' ' ' 'bh ' ' '2( ( ( ( (	 ( ( (
* * * * *9 * * *    ( e 	 	 	 	 	;  	 	 	 lnn**96FNNRWW     <  
  x      c

%(\
! " S * * * *Z__((**   s   = = =   ( 3 3 3( 3 3 3
 #, , , - - -
 7 7 7
 % % %
 9 9 9    ug..	 	 /.	 =5'**! ! +*! 00% % 10%
Z( Z( Z(x  
Z( Z( Z(zK( K( K(\ ?UG,,
  
  -,
   <' ' 'R  ( :x((/ / )(/ 7UG$$6 6 %$6 7*a *a  *aX =  *	 	 	    2  .  ( <1 1 1  10 3(( C  C )( CD ;00!) !)  10!)F >F8,,] ]  -,]. <&**.s .s  +*.sb     ?+% +% +%  +%Z  !!$ $ "!$   Q Q Q  ! QB =; ; ;  ;2	 	 	     F :w''%* %* ('%*P 9	% 	%  	% </ / / 7% % %   %      !  / / / !"") ) #") 9& & &
 >S S SN N NB  '- ( ( ( ()" )" )"V eW--# # .-#5 5 5v  Q Q Qfa a aH9 9 9x zDFFFFF rG   