
    eg                     0   d dl Zd dlmZmZmZ d dlmZmZm	Z	m
Z
mZmZmZmZ d dlmZmZ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Zd dlmZ 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' d d
l(m)Z)m*Z*m+Z+m,Z,m-Z- dZ. e/dd          5 Z0 e!j1        e0          Z.ddd           n# 1 swxY w Y    ee2          Z3de3j.        d<   e.d         4                                e3_5         e            Z6de6_7        e68                    e3           dZ9d Z:dldZ;d Z<dldZ= G d de)          Z> G d de          Z? G d de          Z@e6jA        de#de@f         fd            ZB G d  d!e          ZC G d" d#          ZD G d$ d%          ZE G d& d'          ZF G d( d)          ZG G d* d+e          ZH G d, d-e          ZI G d. d/e          ZJ G d0 d1          ZK G d2 d3          ZLe3jM        d4             ZNe3O                    d5          d6             ZPe3O                    d7          d8             ZQe3O                    d9          d:             ZRd; ZSe3O                    d<          ed=                         ZTe3O                    d>          ed?                         ZUe3O                    d@dAgB          edC                         ZVe3O                    dDdAgB          edE                         ZWe3O                    dFdAgB          edG                         ZXe3O                    dH          edI                         ZYe3O                    dJdddKL          e3O                    dMdNdiL          e3O                    dO          edP                                                 ZZe3O                    dQdReKj[        iL          e3O                    dS          edT                                     Z\e3O                    dU          edV                         Z]e3O                    dW          dX             Z^e3O                    dWdAgB          dY             Z_e3O                    dZ          d[             Z`e3O                    d\          ed]                         Zae3O                    d^          ed_                         Zbe3O                    d`dAgB          da             Zce3O                    dbdAgB          dc             Zde3O                    dd          ede                         Zee3O                    df          edg                         Zfe3O                    dh          edi                         Zge3O                    dj          edk                         ZhdS )m    N)EnumautoStrEnum)Flaskgsend_from_directoryrender_templateredirectrequesturl_forflash)LoginManager	UserMixin
login_userlogin_requiredlogout_usercurrent_userwraps)Gravatar)pprint)UnionList)generate_password_hashcheck_password_hash)FormStringFieldPasswordFieldBooleanField
validatorszconfig.tomlrbTTEMPLATES_AUTO_RELOAD
secret_keyloginzdashboard.dbc                      t          t          dd           } | 't          j        t          d           x} t          _        | S )N	_database)isolation_level)getattrr   sqlite3connectDATABASEr&   )dbs    ,C:\Users\robin\code\tanuki-dashboard\main.pyget_dbr.   !   s8    	K	&	&B	z"?8TJJJJQ[I     Fc                     t                                          | |          }|                                }|                                 |r|r|d         nd n|S Nr   )r.   executefetchallclosequeryargsonecurrvs        r-   query_dbr<   '   sQ    
((

5$
'
'C	BIIKKK&)1R!BqEETTr1r/   c                     t          t          dd           } | d k    r	 t          j        t          d         t          d         t          d         t          d                   }t
          j                            |           t
          j                            d           |x} t          _        n;# t          j	        $ r)}t
          j        
                    |           Y d }~nd }~ww xY w| S )N_web_databaseweb_db_hostweb_db_userweb_db_passweb_db_name)hostuserpassworddatabasetest)r(   r   	mysql_conr*   configapploggerinfor>   Errorerror)r,   
connectiones      r-   connect_web_dbrQ   .   s    $+A$E$EB	Tzz	 #+M*M*..	  J JOOJ'''JOOF####--B 	  	  	 JQ	 
 Is   BB/ /C'>C""C'c                     t                                                      }|                    | |           |                                }|r|r|d         nd n|S r2   )rQ   cursorr3   r4   r6   s        r-   query_web_dbrT   B   sV    



!
!
#
#CKKt	B&)1R!BqEETTr1r/   c                       e Zd Z ed ej                    g          Z ed ej                    g          Z e	d          Z
dS )	LoginFormzE-mailadres)r    
WachtwoordzIngelogd blijvenN)__name__
__module____qualname__r   r    input_requiredemailr   rE   r   rememberr0   r/   r-   rV   rV   J   sd        K3L:3L3N3N2OPPPE}\7Pz7P7R7R6STTTH|.//HHHr/   rV   c                   6    e Zd Z e            Z e            ZdS )PermissionsN)rX   rY   rZ   r   
VIEW_USERSMANAGE_USERSr0   r/   r-   r_   r_   P   s$        J466LLLr/   r_   c            
       N   e Zd Zd ZdefdZdee         fdZde	fdZ
ddefdZdefdZdded	ee         f         fd
Zddedee         ee         f         fdZd Zd dZd dZd!dZde	fdZdefdZdefdZed             ZdefdZed"dedede	dd fd            ZdS )#Userc                 V    t          d|fd          st                      || _        d S )NzSELECT id FROM users WHERE id=?Tr9   )r<   
ValueErroridselfrg   s     r-   __init__zUser.__init__\   s3    
 9B5dKKK 	,,r/   returnc                     | j         S Nrg   ri   s    r-   get_idzUser.get_ido   	    wr/   c                     d S rm   r0   ro   s    r-   get_permissionszUser.get_permissionsr       r/   c                     d S rm   r0   )ri   requireds     r-   check_permissionzUser.check_permissionu   rt   r/   Fc                 |    t          d| j        fd          d         }|r|                    d          d         }|S )Nz!SELECT name FROM users WHERE id=?Tre   r    )r<   rg   split)ri   
first_onlynames      r-   get_namezUser.get_namex   sC    @47*RVWWWXYZ 	&::c??1%Dr/   c                 J    t          d| j        fd          d         }|r|ndS )Nz"SELECT email FROM users WHERE id=?Tre   r    r<   rg   ri   r\   s     r-   	get_emailzUser.get_email   s0    =ztTTTUVW%uu2%r/   Groupc                 (   |rt          d| j        f          }nt          d| j        f          }d |D             }|r"t          t          t          |                    S |rd |D             S |s|n!t          t          t          |                    S )NzlSELECT group_id, name FROM group_membership, groups WHERE user_id=? AND groups.id=group_id ORDER BY name ASCz5SELECT group_id FROM group_membership WHERE user_id=?c                 8    g | ]}t          |d                    S r   r   .0rows     r-   
<listcomp>z#User.get_groups.<locals>.<listcomp>   s"    000C%A--000r/   c                 ,    g | ]} |j                     S r0   rp   )r   r   s     r-   r   z#User.get_groups.<locals>.<listcomp>   s     ///1HAHJJ///r/   )r<   rg   listmapstr)ri   sort_by_nameas_nameas_idrowsgroupss         r-   
get_groupszUser.get_groups   s     	a  K  NR  NU  MW  X  XDDSVZV]U_``D004000 	*C(())) 	0//////$@vv$s3/?/?*@*@@r/   Rolec                     d t          d| j        f          D             }|rd |D             }|rd |D             }|r|d         n|S )Nc                 8    g | ]}t          |d                    S r   r   r   s     r-   r   z"User.get_roles.<locals>.<listcomp>   s4      `  `  `#c!f  `  `  `r/   zSELECT roles.id, roles.priority, user_roles.role_id, user_roles.user_id, users.id FROM roles, user_roles, users WHERE users.id=? AND user_roles.user_id=users.id AND roles.id=user_roles.role_id ORDER BY roles.priority ASC;c                 6    g | ]}|                                 S r0   r}   r   rs     r-   r   z"User.get_roles.<locals>.<listcomp>   s     111aQZZ\\111r/   c                 6    g | ]}|                                 S r0   r   r   s     r-   r   z"User.get_roles.<locals>.<listcomp>   s     ///AQXXZZ///r/   r   r   )ri   highestr   r   roless        r-   	get_roleszUser.get_roles   s     `  `  3R  UY  U\  T^  *_  *_  `  `  ` 	2115111E 	0/////E"-uQxx-r/   c                 p    |                                  }t          |                              d          S Nz6http://tanuki.nl/wp-content/uploads/2023/06/tanuki.png)defaultr   r   	get_imager   s     r-   get_gravatarzUser.get_gravatar   /    ^^%%((1i(jjjr/   groupc                     d S rm   r0   r   s    r-   	add_groupzUser.add_group   rt   r/   c                     d S rm   r0   r   s    r-   remove_groupzUser.remove_group   rt   r/   Nc                 6    |d k    r                                  }|d k    r                                 }d k    r                     d          d k    r                     d          t	          d||                                 f            fdD             }fd                     d          D             }|D ]&}t	          d                                 |f           '|D ]&}t	          d                                 |f           ' fdD             }fd	                     d          D             }	|D ]&}
t	          d
|
                                 f           '|	D ]&}
t	          d|
                                 f           'd S )NTr   z+UPDATE users SET name=?, email=? WHERE id=?c                 D    g | ]}|                     d           v|S Tr   )r   r   rg   ri   s     r-   r   zUser.update.<locals>.<listcomp>   s1    PPPB2T^^$^5O5O+O+OR+O+O+Or/   c                     g | ]}|v|	S r0   r0   )r   rg   r   s     r-   r   zUser.update.<locals>.<listcomp>   s    TTTBeOOOOOr/   z8INSERT INTO user_roles (user_id, role_id) VALUES (?, ?);z5DELETE FROM user_roles WHERE user_id=? AND role_id=?;c                 D    g | ]}|                     d           v|S r   )r   r   s     r-   r   zUser.update.<locals>.<listcomp>   s1    SSSRRtT7R7R-R-Rb-R-R-Rr/   c                     g | ]}|v|	S r0   r0   )r   rg   r   s     r-   r   zUser.update.<locals>.<listcomp>   s$    WWWbPVFVFV"FVFVFVr/   z?INSERT INTO group_membership (group_id, user_id) VALUES (?, ?);z<DELETE FROM group_membership WHERE group_id=? AND user_id=?;)r}   r   r   r   r<   rp   )ri   r|   r\   r   r   	new_rolesremoved_rolesrole
new_groupsremoved_groupsr   s   `  ``      r-   updatezUser.update   s   4<<==??DD==NN$$ED==NNN..ET>>__4_00F 	>udkkmm@\]]]PPPP%PPP	TTTTdnn4n&@&@TTT  	h 	hDORVR]R]R_R_aeQfgggg! 	e 	eDLt{{}}^bNcddddSSSS6SSS
WWWWtT'B'BWWW
   	p 	pEVY^`d`k`k`m`mXnoooo# 	m 	mESV[]a]h]h]j]jUkllll	m 	mr/   c                 ^    t          d| j        fd          d         }t          ||          S )Nz%SELECT passhash FROM users WHERE id=?Tre   r   )r<   rg   r   )ri   rE   passhashs      r-   check_passwordzUser.check_password   s2    CdgZUYZZZ[\]"8X666r/   c                 j    d}|                      d          D ]}||                                z  }|S Nr   Tr   )r   render_tasksri   htmlr   s      r-   render_tasklistzUser.render_tasklist   sA    __$_77 	+ 	+EU''))*DDr/   c                 j    d}|                      d          D ]}||                                z  }|S r   )r   render_meetingsr   s      r-   render_meetinglistzUser.render_meetinglist   sA    __$_77 	. 	.EU**,,-DDr/   c                  ~    g } t          d          D ]*}|                     t          |d                              +| S )NzSELECT id FROM usersr   )r<   appendrc   )users	user_infos     r-   get_all_userszUser.get_all_users   sE    !"899 	- 	-ILLil++,,,,r/   c                 $    t          d|           S )Nzuser_table_row.html)rD   r	   ro   s    r-   render_table_rowzUser.render_table_row   s    44@@@@r/   r   Tr|   group_idexact_matchc                     |rd}nd}|r1d| d}t          t          |d|  d|fd          d                   S d	| }t          t          || fd          d                   S )
Nzname=?zname LIKE ?zFSELECT id, name, group_id, user_id FROM users, group_membership WHERE z AND id=user_id AND group_id=?%Tre   r   z!SELECT id, name FROM users WHERE )rc   r<   )r|   r   r   
match_condr7   s        r-   search_userzUser.search_user   s     	'!JJ&J 	? H]g  H  H  HETh(?TJJJ1MNNND
DDET:::1=>>>r/   F)FFF)r   r   )NNNN)r   T)rX   rY   rZ   rj   intrp   r   r_   rs   boolrw   r   r}   r   r   r   r   r   r   r   r   r   r   r   staticmethodr   r   r   r0   r/   r-   rc   rc   [   sF         &    k!2    D     C    &3 & & & &A AERY[_`c[dRdLe A A A A. .eFTXY\T]_cdg_hLhFi . . . .k k k       m  m  m  mF7$ 7 7 7 7    C       \A# A A A A ? ?# ? ?d ?f ? ? ? \? ? ?r/   rc   rk   c                 v    t          d| fd          }|r#t          |d                   x}t          _        |S d S )NzSELECT * FROM users WHERE id=?Tre   r   )r<   rc   r   rD   )user_iddatarD   s      r-   	load_userr      sA    4wjdKKKD T!W%qv4r/   c                   R    e Zd ZdZdZdZdZdZede	de
d e	f         fd            Zd	S )

TaskStatusr               	target_idrk   c                     |                      d          d         }|xdk    r t          j        S xdk    r t          j        S xdk    r t          j        S xdk    r t          j        S dk    rdS d S )	N-todobusydonenotdonearchiveARCHIVE)rz   r   TODOBUSYDONENOTDONE)r   status_names     r-   target_id_to_statuszTaskStatus.target_id_to_status  s{    ooc**2.!&!&!&!)) y r/   N)rX   rY   rZ   r   r   r   r   ALLr   r   r   r   r0   r/   r-   r   r     sc        DDDG
C!s !u\35F/G ! ! ! \! ! !r/   r   c                      e Zd Zd Zd ZdefdZdefdZdefdZ	d Z
d	 Zddeee         ed         f         fdZd Zd ZddefdZeddedededed          fd            Zeg dddfdededee         dedededd fd            ZdS )Taskc                     || _         d S rm   rn   rh   s     r-   rj   zTask.__init__      r/   c                     |                                  }|r7dd                    d |                      d          D                       z   }nd}d| j         d| d	|                                  S )
Nry   , c                 :    g | ]}|                     d           S )T)r{   r   )r   xs     r-   r   z Task.__str__.<locals>.<listcomp>"  s&    $l$l$lQQZZ4Z%@%@$l$l$lr/   Tr   r   [z] ACTIEz: )	get_usersjoinrg   get_content)ri   r   namess      r-   __str__zTask.__str__  s       	$))$l$l$..fj.JkJk$l$l$lmmmEEE@47@@5@@D,<,<,>,>@@@r/   rk   c                 >    t          d| j        fd          d         S )Nz%SELECT content FROM tasks WHERE id=?;Tre   r   r   ro   s    r-   r  zTask.get_content'  #    ?$'QUVVVWXYYr/   c                 X    t          t          d| j        fd          d                   S )Nz$SELECT status FROM tasks WHERE id=?;Tre   r   )r   r<   rg   ro   s    r-   
get_statuszTask.get_status*  s+    (#IDG:[_```abcdddr/   
new_statusc                 >    t          d|j        | j        f           d S )Nz%UPDATE tasks SET status=? WHERE id=?;)r<   valuerg   )ri   r
  s     r-   
set_statuszTask.set_status-  s#    8:;KTW:UVVVVVr/   c                 2    t          d| j        f           d S )Nz*UPDATE tasks SET archived=TRUE WHERE id=?;r   ro   s    r-   r   zTask.archive0  s    =zJJJJJr/   c                 2    t          d| j        f           d S )Nz+UPDATE tasks SET archived=FALSE WHERE id=?;r   ro   s    r-   	unarchivezTask.unarchive3  s    >
KKKKKr/   FNc                 r    t          d| j        f          }d |D             }|rt          |d           }|S )Nz/SELECT user_id FROM task_users WHERE task_id=?;c                 8    g | ]}t          |d                    S r   rc   r   s     r-   r   z"Task.get_users.<locals>.<listcomp>9  s"    ...#c!f...r/   c                 *    |                                  S rm   r   )us    r-   <lambda>z Task.get_users.<locals>.<lambda><  s    

 r/   )key)r<   rg   sorted)ri   r   r   r   s       r-   r  zTask.get_users6  sL    IDG:VV..... 	>5&<&<===Er/   c                     d S rm   r0   ro   s    r-   get_deadlinezTask.get_deadline@  rt   r/   c                     d S rm   r0   ro   s    r-   get_meetingzTask.get_meetingC  rt   r/   c                 8    t          |sdnd| t                    S )Nztask_item.htmlztask_item_archive.html)taskr   )r	   r   )ri   r   s     r-   render_htmlzTask.render_htmlF  s%    w\//D\cgt~r/   r   textr   
meeting_idc                    d}g }t          j        |          }|                    |           }|                                 D ]}|                    |          }|r|                    d          r1|                    d          r|                    d                              d          }	|                    d          r^|	D ]Z}
|                    t          	                    |                    d          ||
|                    d          d|                     [|                    t          	                    |                    d          ||	|                    d          d|                     ;d	 t          |                                          D             }	|                    t          	                    |                    d          ||	|                    d          d|                     |S )
Nz(?:(?P<action>[\+\*\-\!\@])?(?P<id>\[[0-9]+\])?\s)?ACTIE(?P<separate>S)?(?:(?:\s(?P<names>[A-Za-z]+(?:,\s[A-Za-z]+)*))?(?:\s-\s(?P<deadline>\d{2}-\d{2}-\d{4}(?:\s\d{2}:\d{2})?)?)?)?:\s(?P<content>.+)actionr  r   separatecontentdeadliner   c                 6    g | ]}|                                 S r0   r   )r   r  s     r-   r   z$Task.parse_tasks.<locals>.<listcomp>^  s      U U U! U U Ur/   )recompilefindall
splitlinesmatchr   rz   r   r   insert_taskr   get_members)r   r   r!  task_retasksp
substringslinemr  r|   s              r-   parse_taskszTask.parse_tasksI  s    ]JwYYt__
OO%% 	@ 	@DA @778$$ @www'' 	@ ! 0 0 6 6t < <77:.. D(- G G %T-=-=aggi>P>PRZ\`bcbibijtbubuwx  {E  .F  .F  !G  !G  !G  !GG "LL)9)9!''):L:LhX]_`_f_fgq_r_rtu  xB  *C  *C  D  D  D  D U UuX7R7R7T7T U U UT%5%5aggi6H6H(TY[\[b[bcm[n[npqs}%~%~r/   r   r%  r  r&  statusc                     t          d| ||||f           t          dd          d         }|D ]5}t                              ||d          }t          d||j        f           6t	          |          S )Nz[INSERT INTO tasks (content, deadline, status, meeting_id, group_id) VALUES (?, ?, ?, ?, ?);zSELECT last_insert_rowid()Tre   r   Fz$INSERT INTO task_users VALUES (?, ?))r<   rc   r   rg   r   )	r%  r   r  r&  r6  r!  task_idr|   rD   s	            r-   r-  zTask.insert_taskc  s    nqx  {C  EK  MW  Ya  qb  	c  	c  	c7TBBB1E 	Q 	QD##D(E::D;gtw=OPPPPG}}r/   r   r   )rX   rY   rZ   rj   r  r   r  r   r	  r  r   r  r   r   rc   r  r  r  r  r   r   r5  r-  r0   r/   r-   r   r     s         A A AZS Z Z Z ZeJ e e e eWZ W W W WK K KL L L uT$Zd5K/L        @ @C @ @ @ @  #  # d6l    \2 DFXZjk  @A  S C S	 RU dg y|   FL    \  r/   r   c                       e Zd Zd Zd Zd ZdefdZd Zd Z	e
j        dfd	edeee         ef         fd
ZddZdefdZdefdZddedefdZed             ZdS )r   c                     || _         d S rm   rn   rh   s     r-   rj   zGroup.__init__n  r   r/   c                 *    |                                  S rm   r   ro   s    r-   r  zGroup.__str__q  s    }}r/   c                     | j         S rm   rn   ro   s    r-   rp   zGroup.get_idt  rq   r/   rk   c                 >    t          d| j        fd          d         S )Nz"SELECT name FROM groups WHERE id=?Tre   r   r   ro   s    r-   r}   zGroup.get_namew  s"    <twjdSSSTUVVr/   c                 B    d t          d| j        f          D             S )Nc                 8    g | ]}t          |d                    S r   r  r   s     r-   r   z%Group.get_members.<locals>.<listcomp>{  s4      A  A  ASV  A  A  Ar/   z?SELECT user_id, group_id FROM group_membership WHERE group_id=?r   ro   s    r-   r.  zGroup.get_membersz  s:     A  A1ruyu|t~((  A  A  A  	Ar/   c                     d S rm   r0   ro   s    r-   get_meetingszGroup.get_meetings}  rt   r/   r   archivedc                     |t           j        u rt          d| j        |f          }nt          d| j        |j        |f          }d |D             S )Nz4SELECT id FROM tasks WHERE group_id=? AND archived=?zASELECT id FROM tasks WHERE group_id=? AND status=? AND archived=?c                 8    g | ]}t          |d                    S r   )r   r   s     r-   r   z#Group.get_tasks.<locals>.<listcomp>  s"    ---SV---r/   )r   r   r<   rg   r  )ri   r6  rB  r   s       r-   	get_taskszGroup.get_tasks  sm    Z^##RUYU\^fTghhDD_bfbikqkw  zB  bC  D  DD------r/   Tc                     d S rm   r0   )ri   r   s     r-   get_meeting_categorieszGroup.get_meeting_categories  rt   r/   c                 <    t          d| t          t                    S )Nztask_group.html)r   r   r   )r	   r   r   ro   s    r-   r   zGroup.render_tasks  s    0Y\]]]]r/   c                 $    t          d|           S )Nzmeeting_group.htmlr   r   ro   s    r-   r   zGroup.render_meetings  s    34@@@@r/   r|   r   c                     d S rm   r0   )r|   r   s     r-   r   zGroup.search_user  rt   r/   c                  4    d t          d          D             S )Nc                 8    g | ]}t          |d                    S r   r   r   s     r-   r   z(Group.get_all_groups.<locals>.<listcomp>  s"    LLL#c!fLLLr/   zSELECT id FROM groups;r<   r0   r/   r-   get_all_groupszGroup.get_all_groups  s    LL2J)K)KLLLLr/   N)T)rX   rY   rZ   rj   r  rp   r   r}   r.  rA  r   r   r   r   r   r   rE  rG  r   r   r   r   r   rN  r0   r/   r-   r   r   m  s\             W# W W W WA A A    *~Q . . .5dUYIYCZ . . . .   ^c ^ ^ ^ ^A A A A A # 4     M M \M M Mr/   r   c                       e Zd Zd Zd ZdS )Meetingc                     || _         d S rm   rn   rh   s     r-   rj   zMeeting.__init__  r   r/   c                     d S rm   r0   ro   s    r-   get_attedeeszMeeting.get_attedees  rt   r/   N)rX   rY   rZ   rj   rS  r0   r/   r-   rP  rP    s2              r/   rP  c                   N    e Zd Zd Zd Zd Zd Zeded          fd            Z	dS )r   c                     || _         d S rm   rn   rh   s     r-   rj   zRole.__init__  r   r/   c                     | j         S rm   rn   ro   s    r-   rp   zRole.get_id  rq   r/   c                 >    t          d| j        fd          d         S )Nz%SELECT name, id FROM roles WHERE id=?Tre   r   r   ro   s    r-   r}   zRole.get_name  r  r/   c                 >    t          d| j        fd          d         S )Nz)SELECT priority, id FROM roles WHERE id=?Tre   r   r   ro   s    r-   get_priorityzRole.get_priority  #    CdgZUYZZZ[\]]r/   rk   c                  4    d t          d          D             S )Nc                 8    g | ]}t          |d                    S r   r   r   s     r-   r   z&Role.get_all_roles.<locals>.<listcomp>  s"    JJJSVJJJr/   zSELECT id FROM roles;rM  r0   r/   r-   get_all_roleszRole.get_all_roles  s    JJ1H(I(IJJJJr/   N)
rX   rY   rZ   rj   rp   r}   rY  r   r   r]  r0   r/   r-   r   r     s            Z Z Z^ ^ ^ K4< K K K \K K Kr/   r   c                       e Zd ZdZdZdS )EventCategoryr   r   N)rX   rY   rZ   INTERNALEXTERNALr0   r/   r-   r_  r_    s        HHHHr/   r_  c                       e Zd ZdZdZdS )EventOrganisorTyper   r   NrX   rY   rZ   GROUPra  r0   r/   r-   rc  rc    s        EHHHr/   rc  c                       e Zd ZdZdZdZdS )EventStatusr   r   r   NrX   rY   rZ   CONCEPT
DEFINITIVE	CANCELLEDr0   r/   r-   rg  rg    s        GJIIIr/   rg  c                   ^   e Zd Z G d de          Z G d de          Z G d de          Z ej        ddd	           ej        d
dd          f ej        d
dd           ej        ddd          fdZ	dZ
dZd Zd Zd"dZd#dZd Zd Zd Zd Zd Zd Zd Zedefd             Zd!S )$Eventc                       e Zd ZdZdZdZdZdS )Event.Categoryr   r   r   r   N)rX   rY   rZ   r`  ra  MEETING	PROMOTIONr0   r/   r-   Categoryro    s"        			r/   rr  c                       e Zd ZdZdZdZdS )Event.Statusr   r   r   Nrh  r0   r/   r-   Statusrt    s        
			r/   ru  c                       e Zd ZdZdZdS )Event.OrganisorTyper   r   Nrd  r0   r/   r-   OrganisorTyperw    s        r/   rx  i  	      i  r   i  r   )z	2022-2023	2023-2024z%Y-%m-%d %H-%mr{  c                     || _         d S rm   rn   rh   s     r-   rj   zEvent.__init__  r   r/   c                 >    t          d| j        fd          d         S )Nz'SELECT name, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   r}   zEvent.get_name  s#    ADG:SWXXXYZ[[r/   rk   ro  c                 >    t          d| j        fd          d         S )Nz+SELECT category, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   get_categoryzEvent.get_category  #    EzW[\\\]^__r/   rt  c                 >    t          d| j        fd          d         S )Nz)SELECT status, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   r	  zEvent.get_status  rZ  r/   c                 >    t          d| j        fd          d         S )Nz1SELECT organisor_type, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   get_organisor_typezEvent.get_organisor_type  s#    KdgZ]abbbcdeer/   c                 >    t          d| j        fd          d         S )Nz/SELECT organisor_id, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   get_organisor_idzEvent.get_organisor_id  s#    IDG:[_```abccr/   c                     |                                  | j        j        j        k    rt	          d| j        fd          d         S d S )Nz1SELECT organisor_name, id FROM events WHERE id=?;Tre   r   )r  rx  ra  r  r<   rg   ro   s    r-   get_organisor_namezEvent.get_organisor_name  sK    ""$$(:(C(IIIORVRYQ[aefffghiiDr/   c                 >    t          d| j        fd          d         S )Nz+SELECT location, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   get_locationzEvent.get_location  r  r/   c                 >    t          d| j        fd          d         S )Nz(SELECT start, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   	get_startzEvent.get_start  s#    BTWJTXYYYZ[\\r/   c                 >    t          d| j        fd          d         S )Nz&SELECT end, id FROM events WHERE id=?;Tre   r   r   ro   s    r-   get_endzEvent.get_end  s#    @47*RVWWWXYZZr/   c                 0    t          d| t                    S )Nzevent-table-row.html)eventrm  )r	   rm  ro   s    r-   r   zEvent.render_table_row  s    5TOOOOr/   Fc                 D   | rt           j        |         d                             t           j                  }t           j        |         d                             t           j                  }d t	          d||f          D             S d t	          d          D             S )Nr   r   c                 8    g | ]}t          |d                    S r   rm  r   s     r-   r   z$Event.get_events.<locals>.<listcomp>  s4      B  B  BcE#a&MM  B  B  Br/   z9SELECT id, start FROM events WHERE start BETWEEN ? AND ?;c                 8    g | ]}t          |d                    S r   r  r   s     r-   r   z$Event.get_events.<locals>.<listcomp>  s"    PPPcE#a&MMPPPr/   zSELECT id FROM events;)rm  yearsstrftimedt_fmtr<   )one_yearyearstartends       r-   
get_eventszEvent.get_events  s     	QK%a(11%,??E+d#A&//==C B  BX6qty{~s  .A  .A  B  B  B  BPPX6N-O-OPPPPr/   N)rk   ro  )rk   rt  )rX   rY   rZ   r   rr  ru  rx  dtdatetimer  r  std_yearrj   r}   r  r	  r  r  r  r  r  r  r   r   r  r0   r/   r-   rm  rm    s           4          
       
 "bk$1--{r{4A/F/FG!bk$1--{r{4A/F/FG E
 FH  \ \ \` ` ` `^ ^ ^ ^f f fd d d  ` ` `] ] ][ [ [P P P ! Q Q Q \Q Q Qr/   rm  c                        e Zd Zi Zd Zed             Z fdZd Zd Z	d Z
d Zed             Zeg fd	ee         fd
            Z xZS )Memberc                 `    | j                             |          rd S | | j         |<   || _        d S rm   )cachegetrg   rh   s     r-   rj   zMember.__init__  s5    :>>" 	F
2 r/   c                 6    | j                             |          S rm   )r  r  rh   s     r-   __get_cachezMember.__get_cache  s    z~~b!!!r/   c                     |                      |          }|r|S t          t          |                               |           }|S rm   )_Member__get_cachesuperr  __new__)ri   rg   r8   kwargsexistingmember	__class__s         r-   r  zMember.__new__  sE    ##B'' 	Ovt$$,,T22r/   c                     | j         S rm   rn   ro   s    r-   rp   zMember.get_id   rq   r/   c                 >    t          d| j        fd          d         S )Nz2SELECT display_name, ID FROM wp_users WHERE ID=%s;Tre   r   rT   rg   ro   s    r-   r}   zMember.get_name#  s&    PSWSZR\bfggghijjr/   c                 >    t          d| j        fd          d         S )Nz0SELECT user_email, ID FROM wp_users WHERE ID=%s;Tre   r   r  ro   s    r-   r   zMember.get_email&  s&    NQUQXPZ`deeefghhr/   c                 p    |                                  }t          |                              d          S r   r   r   s     r-   r   zMember.get_gravatar)  r   r/   c                      t           j                            d           t          d          } t           j                            d           d | D             S )Nz
fetch id'szSELECT ID FROM wp_users;zconstruct membersc                 8    g | ]}t          |d                    S r   )r  r   s     r-   r   z*Member.get_all_members.<locals>.<listcomp>3  s"    ///3s1v///r/   )rJ   rK   rL   rT   )r   s    r-   get_all_memberszMember.get_all_members-  sM    
&&&677
+,,,//$////r/   meta_fieldsc                      t          d          S )Nz2SELECT display_name, user_email, ID FROM wp_users;)rT   )r  s    r-   get_bulk_datazMember.get_bulk_data5  s    PQQQr/   )rX   rY   rZ   r  rj   classmethodr  r  rp   r}   r   r   r   r  r   r   r  __classcell__)r  s   @r-   r  r  	  s       E   " " ["      k k ki i ik k k 0 0 \0 -/ R R49 R R R \R R R R Rr/   r  c                 b    t          t          dd           }||                                 d S d S )Nr&   )r(   r   r5   )	exceptionr,   s     r-   close_connectionr  <  s0    	K	&	&B	~





 ~r/   z/assets/<path:path>c                 "    t          d|           S Nassetsr   paths    r-   r  r  C      x...r/   z/dist/assets/<path:path>c                 "    t          d|           S r  r  r  s    r-   assets_distr  G  r  r/   z/dist/<path:path>c                 "    t          d|           S )Ndistr  r  s    r-   r  r  K  s    vt,,,r/   c                 <     t                      fd            }|S )Nc                       | i |S rm   r0   )r8   r  funcs     r-   decorated_viewz+permission_required.<locals>.decorated_viewQ  s    tT$V$$$r/   r   )r  r  s   ` r-   permission_requiredr  P  s4    
4[[% % % % [% r/   /c                  $    t          dd          S )Nz	main.htmlHometitler   r0   r/   r-   homer  X  s     ;f5555r/   z/tasksc                  $    t          dd          S )Nz
tasks.htmlActiepuntenr  r   r0   r/   r-   r0  r0  b  s     <}====r/   z/tasks-parsePOST)methodsc                      t           j        d         } t           j        d         }t                              | |           dS Nr   r   success)r   formr   r5  r   r   s     r-   tasks_parser  g  s7     <D|J'HT8$$$9r/   z
/task-movec                     t          t          j        d                   } t          j        d         }t          j        d         }t                              |          }t                              |          }|dk    r|                                  |dk    r|                                  n|                     |           dS )Nr8  r   	source_idr   r  )r   r   r  r   r   r  r   r  )r  r   r  
old_statusr
  s        r-   	task_mover  r  s     Y'((D[)I[)I//	::J//	::JYY
###9r/   z/tasks-archivec                  N    t           j        d         } t           j        d         }dS r  )r   r  r  s     r-   tasks_archiver    s!     <D|J'H9r/   z/meeting/<int:id>c                  $    t          dd          S )Nzmeeting.htmlVergaderingr  r   r0   r/   r-   meetingr    s     >????r/   z	/meetingsr   category_id)defaultsz/meetings/<int:group_id>r  z*/meetings/<int:group_id>/<int:category_id>c                 $    t          dd          S )Nzmeetings.htmlVergaderingenr  r   r  s     r-   meetingsr    s    
 ?/BBBBr/   z/annual-planningr  z/annual-planning/<string:year>c                     | t          t          j                                                  vrt          j        } t          ddt          |           S )Nzannual-planning.htmlJaarplanning)r  rm  r  )r   rm  r  keysr  r	   )r  s    r-   annual_planningr    sE     4((**++++~1u[_````r/   z
/event-addc                      d S rm   r0   r0   r/   r-   	event_addr    s	     	Dr/   z/loginc                  $    t          dd          S )N
login.htmlLoginr  r   r0   r/   r-   r$   r$     s    <w7777r/   c                  $   t          t          j                  } |                                 rt	          d| j        j        fd          }|st          d           t          d          S t          |d                   }|
                    | j        j                  st          d          S t          || j        j                   t          d           t          t          d	                    S t          d
           t          d          S )Nz#SELECT id FROM users WHERE email=?;Tre   zOngelding e-mailadres.r  r   )r]   zLogged in successfully.r  zOngeldige invoer)rV   r   r  validater<   r\   r   r   r	   rc   r   rE   r   r]   r
   r   )r  r   rD   s      r-   
login_postr    s     W\""D}} )BTZ_DV\`aaa	 	1*+++"<000IaL!!""4=#566 	1"<000 	4$-"45555'((( (((	
<(((r/   z/logoutc                  V    t                       t          t          d                    S )Nr$   )r   r
   r   r0   r/   r-   logoutr    s!    MMMGG$$%%%r/   z/userc                      t          j                    dk    rt          t          d                    S t	          ddt           t
          t                    S Nr   r  z	user.html	Gebruiker)r  rD   r   r   )r   rp   r
   r   r	   r   r   r0   r/   r-   rD   rD     sG     !!(((;kTY`deeeer/   z/user/<int:user_id>c                 .   t          j                    dk    rt          t          d                    S 	 | rt	          |           nt           }t          dd|t          t                    S # t          $ r t          t          d                    cY S w xY wr  )	r   rp   r
   r   rc   r	   r   r   rf   )r   r  s     r-   user_specificr    s     !!((()$6DMMM,{+AUY]^^^^ ) ) )((((()s   5A+ +&BBz/user-updatec                  d   t          j                    dk    rt          t          d                    S t          j        } t          | d                   }|                     d          r|                     d          nd}|                     d          r|                     d          nd}t          t          t          |                     d                              }t          t          t          |                     d                              }|                    ||||	           d
S )Nr   r  rg   z
input-namer   zinput-emailzinput-roleszinput-groups)r|   r\   r   r   r  )r   rp   r
   r   r   r  rc   r  r   r   r   getlistr   )r   rD   r|   r\   r   r   s         r-   user_updater    s    !!(((<DT
D%)XXl%;%;C488L!!!D'+xx'>'>FDHH]###BES$,,}556677E#c4<<778899FKKTeFKCCC9r/   z/user-set-passwordc                      d S rm   r0   r0   r/   r-   user_set_passwordr    s    Dr/   z/usersc                      t          j                    dk    rt          t          d                    S t	          ddt
          t          t                    S )Nr   r  z
users.html
Gebruikers)r  rc   r   r   )r   rp   r
   r   r	   rc   r   r   r0   r/   r-   r   r      sF     !!(((<|$eZ^____r/   z/membersc                      t          j                    dk    rt          t          d                    S t	          ddt
          t                    S )Nr   r  zmembers.htmlLeden)r  r  rJ   )r   rp   r
   r   r	   r  rJ   r0   r/   r-   membersr	    sC     !!(((>SQQQQr/   z/member/<int:id>c                    t          j                    dk    rt          t          d                    S 	 t	          |           }t          dd|          S # t          $ r t          t          d                    cY S w xY w)Nr   r  zmember.htmlLid)r  r  )r   rp   r
   r   r  r	   rf   )rg   r4  s     r-   member_pager    s     !!((()2JJ}E!DDDD ) ) )((((()s    A &A?>A?z/api/membersc                     t          j                    dk    rt          t          d                    S g } t          j                            d           t                                          }t          j                            d           t          	                                D ]1}| 
                    |d         |d         d|d          dd	           2t          j                            d
           d| iS )Nr   r  zget membersloopr   z<a href="/member/r   zk"><button type="button" class="btn rounded-pill btn-outline-primary"><i class="bi bi-eye"></i></button></a>)naamr\   viewzloop finishedr   )r   rp   r
   r   rJ   rK   rL   r  r  r  r   )r   r	  r  s      r-   api_membersr    s     !!(((DJOOM"""$$&&GJOOF&&((  1IAY a  a  a  a
 
 	 	 	 	
 JOOO$$$D>r/   )r0   F)ir  r  enumr   r   r   flaskr   r   r   r	   r
   r   r   r   flask_loginr   r   r   r   r   r   	functoolsr   libgravatarr   mysql.connector	connectorrH   r)   r   r(  systomllibtypingr   r   werkzeug.securityr   r   wtformsr   r   r   r   r    rI   openfloadrX   rJ   encoder#   login_manager
login_viewinit_appr+   r.   r<   rQ   rT   rV   r_   rc   user_loaderr   r   r   r   rP  r   r_  rc  rg  rm  r  teardown_appcontextr  router  r  r  r  r  r0  r  r  r  r  r  r  r  r  r$   r  r  rD   r  r  r  r   r	  r  r  r0   r/   r-   <module>r(     s
       $ $ $ $ $ $ $ $ $ $ c c c c c c c c c c c c c c c c c c c c f f f f f f f f f f f f f f f f                   # # # # # #        				 



          I I I I I I I I N N N N N N N N N N N N N N		T- !W\!__F               eHoo&*
" #%,,.."    s      2 2 2 2  (2 2 2 20 0 0 0 0 0 0 0    '   ^? ^? ^? ^? ^?9 ^? ^? ^?B %d
+    ! ! ! ! ! ! ! !.O O O O O O O Od(M (M (M (M (M (M (M (MV       K K K K K K K K$    D   
       
    $   DQ DQ DQ DQ DQ DQ DQ DQN.R .R .R .R .R .R .R .Rf     !!/ / "!/ %&&/ / '&/ - -  -   36 6  6 8> >  > >F8,,   -, <&**   +*$ fX..   /.
 @ @   @ ;d4!H!HII%0EFF788C C  98 GF JIC (@AA+,,a a  -, BAa
 <	 	  	 88 8 8 8fX&& )  ) '& )D 9& & &
 7f f  f  !!) )  "!) >F8,,  -,$ &22	 	 32	 8` `  ` :R R  R
 ) )  ) >     s   B$$B(+B(