From 17e0781b1472112ac1bc3a7c1f823388c94b4088 Mon Sep 17 00:00:00 2001 From: Kobe Date: Mon, 2 Jun 2025 08:52:45 +0200 Subject: [PATCH] add defaults templates --- __pycache__/app.cpython-313.pyc | Bin 5492 -> 5717 bytes .../create_default_templates.cpython-313.pyc | Bin 0 -> 6424 bytes app.py | 5 + routes/__init__.py | 2 + routes/__pycache__/__init__.cpython-313.pyc | Bin 2057 -> 2170 bytes .../email_templates.cpython-313.pyc | Bin 0 -> 5048 bytes routes/__pycache__/main.cpython-313.pyc | Bin 65102 -> 65067 bytes routes/main.py | 4 +- utils/__init__.py | 12 ++ utils/__pycache__/__init__.cpython-313.pyc | Bin 999 -> 1852 bytes .../email_templates.cpython-313.pyc | Bin 0 -> 5900 bytes utils/email_templates.py | 139 ++++++++++++++++++ 12 files changed, 159 insertions(+), 3 deletions(-) create mode 100644 __pycache__/create_default_templates.cpython-313.pyc create mode 100644 routes/__pycache__/email_templates.cpython-313.pyc create mode 100644 utils/__pycache__/email_templates.cpython-313.pyc create mode 100644 utils/email_templates.py diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index af63a5105d8d9604e75da09506d25cbadcb81d8c..fcbc680e18c4806b6cf41f4cc4ec2c0a6ddce96f 100644 GIT binary patch delta 955 zcmYjPO=uHA6rM@iWH-qsF=fi+DwF_1rIH&!pU zf|nMdl%W^#sz*U1f)`I7>_r6I%TkZt6s;`^o_v!;&A@)_d++PhmvGL za1N(qw-VBp-Gk#>1Fu&TC}E%T&HAX1prkp7qMQSVpoGJVs6XldpQ9v67B4jFt(b5| zaU)I~^Zs+7!Q}CT>+E%eQci?GIn%0X@+EhoV;mEd!#N!4WH<3nB!qQOnkp$xkuyp* zRV`?;rW7j$NT}&n3ljuJcn+V|;)Yn8Vet%mZ}VO?z};_*|0TBcgP>OwH8d&&EtyZC z01BhQCN%>+WDNxQLEosxjDD2GwN=wIjQiP$;K77l7Or`GprCyKa8+ZfQc*#P)@Xpe z5~6sBeGz(qD2R`7fISh1@hSFE3}RCIDcZ2r&$Wa@fJxR%feCn3y8zbEkqL=i4;}l0 zv}xI}d~gr%2_ux$RBPOT$Jk4$(mMn^UCibSnnLB}yLx*zPgRXZxZPb4iM_4d``L`%cWFNk!9UbR&`TO(Uj6{+Q&2p!J};3v7Ohg(2krgmo(*$ zMqOMh=;mTRM`8Lj$PEWLjBps`z~@W(W@$fwDgcniiPHcCx}~{GFs4aJbaL9a+I{C+ zeEz!$S)@(>x_?jf?h9mB2>vo6OAn-NjawVUpDG;Ps&OPcSTna-f zrt&3OUIKM{Mp>@rLVfJHdjik1ukLjmVJjUcr}=2=?bO@W+iAH91L9V6j=LCXwM1KX wU3Z==mNV6Ya*nDH@_$C%V4pk2T%S0ng&WJ$doqvDQDpnFO>0@7sOfeBZn`^S+(?b4EJ~hZR9F z*UxRg4()4kSlZ9LpDB$dMV5IAOBA&UArqybu^X^sbcw-qo3qxHoGV#wNr%TCV zbmg89m530ey}{b>iDK*`SfUPfunla&m+|V*J48QyytIyTy=~8BpC=`H(b0DRY5W+7 zgNfe*oAD{i%M^hPuD8-|JAC?{v~Vq$1sk6PCrNk^d;=CPE3+_%H6;mV@3|5JHNjq! z!NRxdDy-m7)ug09l=r|gUf0@FHf7!5R-?IFljR4GUH?`?I=ga#O^f(d%Te8kz6g0N z=m+YcmPR>y5`XEZAcZ3l3+6Esd9`T=+|ivzT~?^lG}~twW*O!gmKfF;(gaR`z#2wg zTC{PMs;rT@OijxBL>RQ3elH#U49X8x+gl&Bf~R92(s9;@+OkC#ua(=4s$=`5k4U+} zaEswKszzemqF+}%rj%u3N|-m!)7&~noO*a^T!Ibk8!uo1?~I+j#)l6s>H1}>%Y$KJ zohx}|_mMm{R^|e^oz}x{vvx&xXv@#zJi||87xcps0imbi-@XEXes~kZCksBF;9qby Bj7tCj diff --git a/__pycache__/create_default_templates.cpython-313.pyc b/__pycache__/create_default_templates.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c92cfcf66b3ced8e1c831f72ae8860a1c14b26a8 GIT binary patch literal 6424 zcmd5=OKcm*86G|*QIt%}@`Iu!j#T+U#in38PApqeYRh(QsWx1#6(^7YV#FPaYb|%# z*`+KoHBhuYxVa=bq)AZ}?a@Vh@Uh1fXnZDNCt??Ba%e8S$yERsDGKzTeQ-%x8>@zl zb_H?%nf+(}=l9RfY;<%)5IhgAjOBej2>p$BoX2ky8`D61hy*0~rqCo}Xwt`gnD_lt z{>cCfOa@ud><6YolVKJHI@p6)%Ur7vI{Owvq!ppLmH~9yUJ#>&@IpA%@^{`(`HcW6 z77f2R4`j!s0+HmKv{00ZPL1GdM6)HvsG?^|(9hb-m`w-#2H=0=NAUY0nytT^ zcGRzrAmpmxM;OfpombOghjQELHkWoN!6*1feADet-)$Y!6f}d5+QZ^rgl4&Z<|717 z`z#8hKJGmDJ8kO-4gr@5At5ZZqys{$&?ZDos$GZ*9VXQ&>=I%owOi;C_Lx++uvge; zQu~DiLfoW!goJR=qwB3L(Wm+i5F=wrll_U%(-lB=kSW_P|V_ zZad`6>@G)=vjVgOd?jeVW435I=J2>JczJLnqy%TXoU!R{hjQEL{VwfLGeOtK4W2*b z$nQj_{4U3}cbnpK*n{iW2(?4D^r7eI6L++5TPG_Z*W5ff;%e}07WAW8fT8uYAo2!8 zEc6_?y$-+IZYlTZY|`PF2{}46dn5@tsf5mlu3xj-oG*vQ0!ftf^`m2MUPB(|{1_#{ zD?D>8j#TRUO+ad^q-BU$kd*T4*Hvs%n1dGQ)RH2m@eP?0jp8h$fNxBcCKicldb+&p zd^QWrI-W3@#PZ%-RL-geigguVRI{ZUC0V2WCl56lH#oCPZt z^$wQR1uTKViikCxFdZaH%7SZA+DqWo9A1HS@??p7Yz6R`63+RdkZoG1pZq6^km!(n=p4v{ZauV z$USDXXr=kvG^-oIc~x8~citeHc1L9*o~9br%ln%9Flw4XYF<&?nt$iQc#DF$St>12 z5fdOyb-3#o*Oz;o;i7Fr8c)blb`k5~6IoIgA>=Yd6qq?H!3w=o=RLcnn?{S{qXg#} z&5aE}vY9e6=2Ca>4vd>F!j8qG!(`lR5jz(|N#qf)Yn_+eWRMmVl|d4~7^ZwX#VV`k zgOdwVLry`iWFhUf9nTFH$``3jbt;yRnBb{{7&}nE0x-J3VPrFspL(T*Gs9#A5a0<_ z$w{n0I3ji~J2vV0?Qj<@>o6E$M}&%=&b&pBKy);fu@x(UsEO_cHI41yX7fZ@Fh?1N zN-7>R8F(3S%BGocj!pzJ5UPSM6{x4s7e%)l!I`26rDYotv>6F~UIZ=1|A+XMEZaQ2 z*9^J>S>)(~DuJy?xzO{fx>za{s3?I0z^I9JD>I!zpZr1r_$8@_u*FjDqumh}#UC zGhv4dp&2PlBM6k^(`RF3hSmHWVwOdoL9-zR`=~@ATg}Z1_A97ylrfdnzib>t)n%HW zl#-@1qN~hv`4UX_m1zrVe>xs*#&~>=mR&E(@psQ;ZS*HBdLw(}&N+RpTn# z!dK&jO*m_G(M!QwqEUifEFH9zlh3|v#^3G#GPKUhFCB-CE`7P^Ym)SmQP|xSk85zQ zA`7&fxDEx`?(maTBa`=Ouwl~9MZb3x9^KQbL z?ZTGWZKFjb+BICD; za2STz!+`|uHbv10!|g>u(v7xD%UN3F2Nk20sj@szvWrFl_Oevi2$_&FcH8D;>Pi_M z4w->3aANE>%?G{fEJmxtVfd)VwY4rqjB^ub=lBh(HaDft)47XOTh!I!T>bbpXZa`d zjLdX##W>*gk_~_aZm#xksER*EYi-f@lJ6!zYwP(c*8NfBgUD)Zuo@e@FIHlMmDs7( z*hn=t@+fxhUg(Qm-D}a^m9DAB(eKxyT~FIlBvEPWS?@;ip<3ePx<4H6e$o=@=v+U5 z;;CBV)VjZgkF>)`kI8efnFnTV8aZ4`oNJzyt|eY=o&_Tl%{;Hw5~IyL!?nbj2A&mv z-q#zcw8l5y44}T@d)LWUTUoTh)oTDtN4d-(JO;D$YE@q!R7@ zV$a}O;%F^?__s^dc)E5lbw5=-_-ehM9Q@7lFPCe515et+2fN;H{kjwF-ou^vQRfGp zA1^aWrZA{p#cBOI45DE4UincV{+Hmv&w_pH0Tk?E{0jR&Qc<^; literal 0 HcmV?d00001 diff --git a/app.py b/app.py index e9d58fa..14980b1 100644 --- a/app.py +++ b/app.py @@ -13,6 +13,7 @@ from tasks import cleanup_trash import click from utils import timeago from extensions import db, login_manager, csrf +from utils.email_templates import create_default_templates # Load environment variables load_dotenv() @@ -85,6 +86,10 @@ def create_app(): # Register custom filters app.jinja_env.filters['timeago'] = timeago + # Create default email templates if they don't exist + with app.app_context(): + create_default_templates() + return app app = create_app() diff --git a/routes/__init__.py b/routes/__init__.py index f9eea3f..539d15b 100644 --- a/routes/__init__.py +++ b/routes/__init__.py @@ -15,6 +15,7 @@ def init_app(app: Flask): from .rooms import rooms_bp as rooms_routes from .conversations import conversations_bp as conversations_routes from .admin import admin as admin_routes + from .email_templates import email_templates as email_templates_routes # Initialize routes init_main_routes(main_bp) @@ -33,6 +34,7 @@ def init_app(app: Flask): app.register_blueprint(contacts_routes) app.register_blueprint(conversations_routes) app.register_blueprint(admin_routes) + app.register_blueprint(email_templates_routes) @app.route('/rooms//trash') @login_required diff --git a/routes/__pycache__/__init__.cpython-313.pyc b/routes/__pycache__/__init__.cpython-313.pyc index 64feb4a8f08e60ce740d62c2852ab9156b00acd0..7c496fc744705e624bc4208415fcef0f67d51c05 100644 GIT binary patch delta 426 zcmeAa_$9#inU|M~0SM-L+GhB$P2@Ywq{TGx@+z)iwqPD_9xt9euF2Jms*F;TCo+i$ zNHLg#)B-^scPK-U?Bt`2ij1<8pMyzGCJAou)m2ajnprFWBpMjLurUb8UywJv%x`po!>C9OD5xnoIh-|s zsYqn<5>|6Y-pO}ZoBeKyp_v?ClwS(8phyO&p-2&A9xsqkKn6w9K#^MnPr?~oyd2X=?~+?%c~}LGAgS|fFw{sFpm_2DO4zrE0iHf zdh$g^MMe-QJeiG&56aSjv%KJ}95}0wNzovf*OU=rPP81%ieNs3;c!d1Lm5;UH2Ehp zGM7&7WS+$+I$4FKno(l%0+v;bQj@(|brn>B`iljCL<7SYHU(k!P|JTeE4AG*Gli0Z0_{00{*oP$UHuxW$o~mst{@SWr-80OYcQ z6uz4LnazH(DSPweMYqxMh^@SAPo?p)**0us(Y$^X>uvxzo2k~9>mH3iG>5Fs4u=zkuL>$==Tk|OKP>0 z(?>c0=kd+=n4SH7kL8}O{^`=YU-$_5J1&go>`eAP<_P(OC`94rNrIzXf~S1K zK^;+~@$*8$Nu3FiifrwecO~4^o$yc(TMP382`}|VNtzociZksy$G7!Tf7+iMGmLdd zMO0i8-PB!F{aIDjDluLkER?V3 zOBp2OshZP$D^*I>QYBN>R0{k4*-B2%W);nHq| zr?Tt$DMpQ(RNe8$>>^0JifZNEa!y<6zEDC2Vc~$^-UkdxOXgm(g9VcSlca&W9-_i2 z`~@!Q>LGQe#=9wzC6BS2A|diNr}0xn<3nWb1|cOb#U&Zi4W9N0R6xD80ToYdX+V`N zBv=A9c#xVLI!H543KEfnyU&mqIVb^ojvk~cj!E}5{>@(!;w4dd{t|Z%?i||*ShXpu zBql82%kt#4Om?M`|G9eCt@HVuE|juGRd;FC<@eN;iY_ddbDR3W3RM9fxlFdA4^-E4 z=G>q!Z&C>i#0IGw2Hgqpqno;CHD9QxG_$;^JF66-L#OIPr=A8pLn5=ai?;TN$2Z<09_RQ!z9z8NL^$&w zuW(mhb>BE?=blrSAVyp?E-#bMy|&VU1qdQmIu3gIKXlL(F<@5WmP|JVh~kY}8c@F# zS4<+LEUm}s5Nnq93<(=Ig|pkZqQXtOjpsi>V*CQdND=chf1oI!4E z9R+ra58UN-Z_m4w*^Jj;WNxE3r~ASPG{?F@i^^yJUb#ex)H zt?ovoW2w{jEetj7q=MNWGMB1p`Em&|PA;d5E9GJ_UupZBP13P*HK>XN$Z*+%J|?x( zotZJ{Bv?ENKkW{@XeoWNuAZh&~vw@ zx2AVJPFbwYJsl)Y*N2Js6CW!UB=O**cn7VT5SA0Y62LjL_4ZeNNx)I)o`olo&ej1-opU_ED3xf$OUDXw5z=%axL z4K`I?kA`j=6v@LSFtJ%0=&`xM-iQOyMzls7 zR#~=_bf}x8DOzV?hQ?r~J0R9rqY@?tif@H}2fLTB6R=~I?GVoPC-9hqP9PO?HjP84 z;g?V}8f|B8sa;Taqsn(-cLv%12_1_n{gQW2tobTDa%*mD?$ft#|M>Us{O+Bd@R{1& z2X8iqM{jLxZQS&QM-Wn9&r2=xzJL7Ks1jWXD`c|KAPSj zyUB%ESa+@#vf3KOr)`6lrBpAYX4roP6vHOP$ft|NG8{!~KLpFJ&T1tO1gxBNcP4}1 zikS?>@T@!8XBPX0V&x}Gjuf#>@%(oQJ3|}t?n|J#T2No3)3C+CPdf#D%fWHnBNDHZ z_#<-m5jpWCiT*7(x_vBuXJaRLz9xOe$qg=2=OWv~@q5nCf3XcSZo0`yyS$eh-*XUN z#_lrL5@6jrO89`mKYjm&`@@X?tq#A-24A&BY s*m}9I9VQp%x~7;M*b{-+dTF2Bi}#N*dy9rWfeY=om*RFsAhL`67mdX?B>(^b literal 0 HcmV?d00001 diff --git a/routes/__pycache__/main.cpython-313.pyc b/routes/__pycache__/main.cpython-313.pyc index 82be0124e3845ba75b1dee71b9d29517a1914308..9c60ea4663e24334fb38f1c2634af5b72cb348ed 100644 GIT binary patch delta 536 zcmX^2hk5lMX5P=dyj%=GFwxUCLvbVTfhkN1?2{AL=Wn)~n#??T;|ybVzF>Y!#vtp- z3$3Ikv(8jx6xggjGo6W1aB~0bWI-WIZWV@NCIukQ<4$AH6rRjHr*-noIXQy2_)~Ke zGjrlgQgaJ(5=&BxH*?J`X5`glWMC-L2NIgRMFx|*=BY6nPTn|Ah0$m-&s*uqALr>Z z?%gauKbukI3mb#9#&s#(i&DDRrOYo%nIBNOAZ30*%Kf^O_eCl1%Tm4_{G0bI&|&0P zWe|;LEM^0G;<$jAANS_(3xinMAofi5U%m#$WL)t8#&p=FKACT&7>uj6(vN*569Yr> zS;ol<^F=1tt&`ZidZjN5O#a{6RQ5X{`85n6`OS6fX7aFq00{&$!!>yAKFrA&Fq!Y@ zI!3?EdyjH4G6rovacnswWBBBP6T2BhH|v}%gqyhdtQySl^JnKWI&RKAXUwB$2nri7 z5TOeqv_YZ7Sp*L;V0az8B>@btTemjAbWgbL1{An{+mWq>8R(v*$@23>HyhvC!p?Yl z^NYu&oQxkg$Gv6ZU^LmB_%)eT#FEwEGcyC52#8SlzyjocDBFDFS1vQBry!$okufj~ E0SL3I^Z)<= delta 574 zcmZ4ehxyzeX5P=dyj%=GP_ox1qhKTNfhkM|?2{dulqR2lz_Iz~loiYZ`V4tIp$x%% zRuK#giP{VdlNZh~X6FwUuw)Ffo?K`wJ^9-V1xCTm;xp5k7=Jei)tvnfYhcWK%OAj)vb)qLzg{5*xV_(h0z)*aa zakArEkstM5L{$rv>G^^tXq0h?zX z4eP&ATN546p6CHo$b}-gW~DY`N{o*2WBUPZBu%1nz8MXFR+4=;KmO#?PCr v-!gG9nr*iGn#?L<&1&$OnSo6NL@0b<0dhZ7ZQlATmzmRBkkPov7#L~*%&oYI diff --git a/routes/main.py b/routes/main.py index 32575f3..bf8534d 100644 --- a/routes/main.py +++ b/routes/main.py @@ -651,9 +651,7 @@ def init_routes(main_bp): users = {user.id: user for user in User.query.filter(User.id.in_(user_ids)).all()} # Get email templates for the email templates tab - email_templates = [] - if active_tab == 'email_templates': - email_templates = EmailTemplate.query.filter_by(is_active=True).all() + email_templates = EmailTemplate.query.filter_by(is_active=True).all() if request.method == 'GET': company_form.company_name.data = site_settings.company_name diff --git a/utils/__init__.py b/utils/__init__.py index abae6e6..a80b752 100644 --- a/utils/__init__.py +++ b/utils/__init__.py @@ -4,6 +4,18 @@ from .event_logger import log_event, get_user_events, get_room_events, get_recen from .notification import create_notification, get_user_notifications, mark_notification_read, mark_all_notifications_read, get_unread_count, delete_notification, delete_old_notifications from .path_utils import clean_path, secure_file_path from .time_utils import timeago, format_datetime, parse_datetime +from functools import wraps +from flask import flash, redirect, url_for +from flask_login import current_user + +def admin_required(f): + @wraps(f) + def decorated_function(*args, **kwargs): + if not current_user.is_authenticated or not current_user.is_admin: + flash('You do not have permission to access this page.', 'error') + return redirect(url_for('main.dashboard')) + return f(*args, **kwargs) + return decorated_function __all__ = [ 'user_has_permission', diff --git a/utils/__pycache__/__init__.cpython-313.pyc b/utils/__pycache__/__init__.cpython-313.pyc index 7b7779a55ed68d425e1214406195456c0d1a991c..0005d16bb44ccde904ca301a79adbb90f71f89a9 100644 GIT binary patch delta 990 zcmZWo&1(};5Pxs;*(6PBYoX0YyQ#4?LDDKoPc;Y%rKuJ)4JrlKb$9b&H`zKbu~3jy zym+((!GmY9;6Xt=_28e7Qbk-^ya?j0G#)%UZ<_=^9=pH!G5dS-=FQB0ckTH7?f!lb z!L_q+p%iv*`A6vct*M8ZoHOTI9L)wHC=%rE#ZWd3;cNsV*)bTie0_`KSrJ6!o*;qf zG|73dQJ5(D;{9*mG-=}p54%lG$2!PsEN(L$1zlz((+!$h22H7%t~%&a!GJh5eM%ib ztJb7C(?FqoYiHTe^0z&MaGN|ME4{DFB;Db8lA<{pB=_9u&bDfU=4p(?g(aoqv5W(8 z9N+dUgbc-KmYc(Mp+|ez%jtQn%LC>mp8 ztyE^>nq1V9s_D=G4A}5jUMpeI%ZgmnRMX8pYNcF- zAPOMFA&h{nv&&FqrgL@Ovb4Z>M?`V6Dce$wK~+->;31?!y{gnOBQs$Il0ds($6l++ zIo(iXon?~$Yke4sT}1e`NxlU_p95#{d3WV=Y5|{p--*`Xr4Khg`mXK|gXv%N=cF5CS6zaRE+qK83(|`R|A@iN^H*ofjm~$y>pq z2$;aW!}H|azB9Hs9Q~osS%l&{vY!C5ZzPJF>gz*wNsyS9s*I_WlN$YUJYp delta 112 zcmdnP_ne*YGcPX}0}vGMwaIW~naC%>*fLSQmPel3d#?KxfpO}*qAHR~}Gf3m)FcuRL4x8Nkl+v73yCMak5F-#5n@xVpX2kP}MUg1gwjKM=?#kAbgG_BzZnW^B(4z_cHIikNGf? zyuFC|Q@)u0UmP6sS#7f!qNs~BlU0dHE&q~1ndOz&63$@a5r+Rh_}dM`|Ig8K}P0j(g(G`@f7jO&VH4mmOJ#`IcK;tmGT@*fK^bzZ8&~q-H5N?2}rg zkkl%qu+%2C3+aT^A$1Drq;yI;Eu=2#j1&=4x6~u`3aL+uN@s<1PU@F1mquDN&ywd9 zn)?DF&ATl8%;$Yo8<)J&d2YHiaEPV8C11tTI9S?hTZfQ40zBX1Bf;~6c%nFuz@8uY z^x}9x^Dno%AL1RZRDH%zRb^LN@>e}t!^Ypm*>a*cIvE@D&u@rFUtoJ}alKfiW zRsgb3Jd>Uzy5Z|bNl$F3aCMqdU=EgPlH^nqQ_d%BI)pN?lEh}3=CQ16gYflZ#W05# zV;(E07^_6iC|cqAf{ulRb3i_v)N`6VjPI$G7!)V$(TP?EQ5cM}P&jcbkpQ%bZ5`x7 z*8{31^bEzOj%V~l?p{tc=y~!G2o%CKzsdA_Qw^b$Bk-jjnw^@VgyBy<5$X+d9W??| zY;Ine9Leqj|5DE}OdP$^#K3EmYS_pn64Wq~IaSR&Hi3!~j5OJx&@+!e%2C5qbj`Sev$p?ix2LJ0m^@10mxQjFBw=E% zr;*EMb(qVfB-3z$4`4jZXo@h|xH7rMrWVt*suNy>e*5%-s_N$+vYL(D+C!Q!E&rM> z=L_xkh+#a^nT+Gqpl0Dr{X4V@^~qO_qSYAt`r&#&!Mp@jHmHmVh(ZPKCdPH--eoxJ z=sk?5RVA^`^BJp(whp0HA#wobP=Yo3sDho?=a$Lr)Fi=aMw2%NAeqGYt74eV&4DT5 z66{(zIYOoy4dBFER%A}5ineK`8gM10=?nr5Z4MW8R*AVAZy;qQZy+BMkkZDn#lK3+ z8LCo~%7sBlbXJo#E^X(49v^UeI6$)ADD*B`fFQZ?w5}x;mLWXTUq1u(==S5(m2HbK zDDHTl$_*X&fDS?w44tvOogh?rJf#m~Cy0qO(Ndz7VJL(06#?Moz^!>ApcHtr&2`k z^S;~-2i4Cb1?E)Mu@n}mj1Fr>AyRD=-gZBbU%WzST<|d!FA)t}3kZhmyZvzxp%dE? zW?RuPFb+LnZBr;@pjb#?ErGg38Pi#1XW_D=GN0JP!S;?3Q)dl_KAQWX+;323*akZM zxOgBxYSHA^je=2&u=)0r@P+VIxnfvDe;vw^+7S-rN-cN~XKGz?tla6V9oZ>vZuS@Y z_kXPCQvCl2pF8Rs<5aEt-W-$aW_d%5I$h`YyKpWcDO%`Tfa2-A@RLX_h$I_DqNc;^ zd;Q?W2G$^Vcb&0y;;xa&A6!-8-ek9ov{@k=1aZ(?GB zJq=dK-X+SbYk8}MpQRHf9AXM5ouhE&1U`WaJ?`}uCMq1K<-C0iH{jFgEmf@?-K&Ro zaiA0{g)>Xt0rq^Mca|>&_C}STQY$?taIBsAL18NZCn*N1B^A}AjB6QyO}k-Qfh7S_ze#n6(O>)ows~MmaQf@!)FxJYMK2wL9=|DZv~mIs%s>%Zuww^i8WaP zK@O|axp!Ets9?3Z;wtQEiPb6Y96-wo#0t6y%R`MOnBTq{u*Rk*R`>;=vGSq5MptI2 zv2N$~k?0B1bODnYW3e3;yG0~~}3-g7Too4VUSoBN?1wVmL; zd$RC&;kRSY!xy&0oyF6ao^Jm2era&BcceF1|BUJURO! zeEVe|=(ck%5E$JKhMt5Thqi(}rC`tVV4raJ?B9a7|GnLMdKY|#%MmNOw>yFsW1p0a+bld0q#y>hc<@;tT0P;dC zU^QiQI5-+2=LI`N(u>si6WWE&i19mXD>wWelcome to DocuPulse! +

Dear {{ user.username }},

+

Your account has been successfully created. You can now log in and start using DocuPulse.

+

If you have any questions, please don't hesitate to contact our support team.

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Password Reset', + 'subject': 'Password Reset Request', + 'body': ''' +

Password Reset Request

+

Dear {{ user.username }},

+

We received a request to reset your password. Click the link below to set a new password:

+

Reset Password

+

If you didn't request this, please ignore this email or contact support if you have concerns.

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Account Deleted', + 'subject': 'Your DocuPulse Account Has Been Deleted', + 'body': ''' +

Account Deletion Confirmation

+

Dear {{ user.username }},

+

Your DocuPulse account has been successfully deleted as requested.

+

We're sorry to see you go. If you change your mind, you can create a new account at any time.

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Account Updated', + 'subject': 'Your DocuPulse Account Has Been Updated', + 'body': ''' +

Account Update Confirmation

+

Dear {{ user.username }},

+

Your DocuPulse account has been successfully updated.

+

If you didn't make these changes, please contact our support team immediately.

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Room Invite', + 'subject': 'You\'ve Been Invited to a Room', + 'body': ''' +

Room Invitation

+

Dear {{ user.username }},

+

{{ sender.username }} has invited you to join the room "{{ room_name }}".

+

Click the link below to view the room:

+

View Room

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Room Invite Removed', + 'subject': 'Room Invitation Removed', + 'body': ''' +

Room Invitation Removed

+

Dear {{ user.username }},

+

Your invitation to the room "{{ room_name }}" has been removed.

+

If you believe this is an error, please contact the room administrator.

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Conversation Invite', + 'subject': 'You\'ve Been Invited to a Conversation', + 'body': ''' +

Conversation Invitation

+

Dear {{ user.username }},

+

{{ sender.username }} has invited you to join a conversation.

+

Click the link below to view the conversation:

+

View Conversation

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Conversation Invite Removed', + 'subject': 'Conversation Invitation Removed', + 'body': ''' +

Conversation Invitation Removed

+

Dear {{ user.username }},

+

Your invitation to the conversation has been removed.

+

If you believe this is an error, please contact the conversation administrator.

+

Best regards,
The DocuPulse Team

+ ''' + }, + { + 'name': 'Conversation Message', + 'subject': 'New Message in Conversation', + 'body': ''' +

New Message

+

Dear {{ user.username }},

+

{{ sender.username }} has sent a new message in your conversation.

+

Click the link below to view the message:

+

View Message

+

Best regards,
The DocuPulse Team

+ ''' + } + ] + + # Create templates if they don't exist + for template_data in default_templates: + existing_template = EmailTemplate.query.filter_by(name=template_data['name']).first() + if not existing_template: + template = EmailTemplate( + name=template_data['name'], + subject=template_data['subject'], + body=template_data['body'], + created_by=admin.id, + is_active=True + ) + db.session.add(template) + print(f"Created template: {template_data['name']}") + else: + print(f"Template already exists: {template_data['name']}") + + try: + db.session.commit() + print("All default templates have been created successfully!") + except Exception as e: + db.session.rollback() + print(f"Error creating templates: {str(e)}") \ No newline at end of file