From 047ad6ef100a68a1b97cf859c28a74ccb2fdd558 Mon Sep 17 00:00:00 2001 From: Kobe Date: Sun, 1 Jun 2025 20:09:42 +0200 Subject: [PATCH] Add email template table --- __pycache__/app.cpython-313.pyc | Bin 5477 -> 5492 bytes __pycache__/forms.cpython-313.pyc | Bin 6574 -> 6574 bytes __pycache__/models.cpython-313.pyc | Bin 22802 -> 24214 bytes app.py | 2 +- ..._add_email_templates_table.cpython-313.pyc | Bin 0 -> 5131 bytes .../c770e08966b4_add_email_templates_table.py | 70 +++++++++++++ models.py | 19 +++- routes/email_templates.py | 97 ++++++++++++++++++ 8 files changed, 186 insertions(+), 2 deletions(-) create mode 100644 migrations/versions/__pycache__/c770e08966b4_add_email_templates_table.cpython-313.pyc create mode 100644 migrations/versions/c770e08966b4_add_email_templates_table.py create mode 100644 routes/email_templates.py diff --git a/__pycache__/app.cpython-313.pyc b/__pycache__/app.cpython-313.pyc index b8a910aa5c25b5b65f21987c38c6000e79cce9d7..ae8638e593cc48825906a3edd8eabb33c6d5eeaa 100644 GIT binary patch delta 493 zcmYL`&r2IY6vyZ7X0w|gvu?6$(!^ge)QBEJN-VUYhf0;&d76XqP|8XP8j?$tzP2D< zycBxsL58+}M6j2oNB;s(LQm;QXa#SA{R5nxOW)x;pZ9%lzA((+<$ufkj`K8A^9dPjd=$B2RhEY3%wUpg=bnoD>BrXa+1&QH5vmfhbW)dmPJRil)Rg zO^X?tsj$$lvd8gbRH+TO%xE^8{qNCSIJdnjS505$ppcsntDRiyHDg_mF*SJ^PyBqx ze+m`WhdwL?H*r*3?!uGk8=PCvlson%EXbO34omWna}D+AB6R}LiZJuV;A3ZR&^_q) zhP~s)nym1WG~5w9mp|M=qV>zEMdgV{02^}CTeRM&=pZ`sMn(n|(pD^OS@#>(TZN(A z^IxSNj+4|q*gqV~GrtKaul%3I_#!PR8C!Jt@k5W|brSL{s7}69s6LRr|E%QJ1c2X+ I%d6niJs3i1ZvX%Q delta 460 zcmYL`Jxe1|6o&7a%uFVkOui;2nrMh$s6j%Pt7|1H5w^Px11c_k6(Nyj7p8&a30ZnT-3Z+2;AB)72UU z#;%#iJm3t005#GoVXpBA>ZB`G|Rc2cME9NvXRDq@LB*iGFP=9_(N zCOkrh>_`?F_4qv>9+my_dR>?>lBxK;US@8CvE4Ld(p?mvp%m8}`bh3iI4<^~2CKn0 zxHDiv_|ac5AjYjb7#9Dm-!K+D#99EefoET6$n-{7Z5Nfob0((6ehInBtG|0OMi*UiC&`aXV&klYid>b-t zFct2XwGkjLOa5y(EhCK(7oU)3@I*E!yetItO(uv(E|Cy?h%}mzqI+1ml7c2j64a0T z7I5wN^Fdq&;n4n{vY?a@c;hbcZK{KV`+6WXV1ky->y;G&8CAoV20IX^ffsp^5zxK4 z1_p+jlqzV9;+&1f3b}|X6NK%i3v7_< zMa>bTpNLu}w1|R@qgGKzZO8TQs*+~+nUU1#Nb=11>5++K%EKBi2}$H)6MxA}glh3) zIvDJs2XVQCun_^rM)e3L1|{<-`veooMC@M*)t|%}dKf1r2%Z1c14qxMcGG{9FBYT8 zaT<$tuvRkFENPZo(>rp;Th;|@PJO$zAb1Pwyx^&F!fIrr_LEI_g z>BKo$2vpZTWm`IikVe2E(J;a~gmJWvS;QG3;JatgHkY|IqYJv5&CJM_X02{2HJO@| z&8u#xa&jG7<3;Ugw(p06D1CGbHiq2{y6Yi2 z{J38FWhCQE9+zw_Iae~PWH1qSL~APJOvG+3b3dPmE)x59P9O)!cc(yn(>=4nncxpb H{3-AoCEq5= delta 406 zcmbQXmvPc2M!wIyyj%=Gz-4KZ@x^o^p9G`UMs;l#mUKN${ml(5+`5dKi+c>28Fx<> z6qeY$)TEJ>?Ho{f(YeVwR<{_>O+Kh2xmm&bJtO0#$pW@25V>oct!(WX881(+veRd~ z1X6uz@_M`TKqVm6Gwh|A7;jGA;%EwyySMqhqaGvUt;urEvTQd&s&7tqbUw#;bF+ZU z9Tv8yAd#n&KY8q9e7bp~=Lu#;?a5WXvWz;DXZZTDsW1X%RVKgjy~3!n`Jmq?MmA%R zi1Fl|0iI08jFTJeB{s_h<})#>Pwojmsi*~#GzXff$$X0|FTW%+Exx3(Ahk#UWQh(? zaAfX~RpyVxf>8GhY z`B?OEd2rx>{S5XB*!5sXg5Bjld1H($S0qq95HS=l+k7KtF(da^27bl}#v&u25CFRP Bc*6hy diff --git a/app.py b/app.py index 536c857..e9d58fa 100644 --- a/app.py +++ b/app.py @@ -77,7 +77,7 @@ def create_app(): is_admin=True, is_active=True ) - admin.set_password('q]H488h[8?.A') + admin.set_password('changeme') db.session.add(admin) db.session.commit() click.echo("Default administrator user created successfully.") diff --git a/migrations/versions/__pycache__/c770e08966b4_add_email_templates_table.cpython-313.pyc b/migrations/versions/__pycache__/c770e08966b4_add_email_templates_table.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..228118fcfed10eb4bdf230bfaea1a1426f3eeee3 GIT binary patch literal 5131 zcmb_gUrZax8DHCLdu?#Sf5P7w5=wmu#83z^AtVsU1(QJPC6^^cp3 zit=)OJds?(K_sfGQpp=?D-~T&I-aVuPc}|VG)ECf+=1@|&^QP1}}H z3ud8aN3DJvwt>uw?Ys?hyahYp-^tr+8C=A3P!@+R9>-l(5JfkN3R1+aqG&uKs7P_E z!b}7?odI-PQlyyd9vSL&hkAOv$a~6n^5jfcrUxm#Zq$RiW@kHkI%azW=Xs1^xO)hS zUU#Rrv%AfEvd!B8&0eps*L$kn+u=KPs>|toNf+WV5pyg)29+}&Q`9g<$|n(0Y@CM_ z8}UQgzFJ?mUccw~L;5(qe$VkW`Z&FYsI2|zr|o9K zOcQgQ`Ek}{5zclN;`w354S!+gjO8#hYx2~Nk%L;G4(0+iF-zhF2%wyth(u`2Caf$( z(Mu7Ko|uR&g51VW06EuCiW3oMPY=AjaM;PMA!*1lyEe4O#n2p55{5)V zLJT7*ERUl3^D$Xbu^`DRsknlrsDS5pN}VE(#j~@O&IoE~E+|A)Fezg|aponYnSg0J zB33^?J~l{LT9M3fNfyx^Vw#2h<1!erxI%Bco7_0xJADX3+EyQf{fS`1DXL zl(>?JC}=t=g|T)n%Jgkeg9B2gjrlYP$v(Kthcd>s$LEPX5r^R-!akU-9R8JuFz-F) zTh{jJ`2F!@Mav6ljocskrTB30k$=Je;L>V$itW&)vkzw;Nej}il~mQSHI!oe^bYB9 z*-Fh)&FYaRs+zJDOs90AY)*+hpq&rx(XoCs#+)Y;RsRlxCY=R~A`quMaU+`=^)h zU;eE98Qb*2QMBb~*mN{3&aJAOj;?j?Iajj9HKe$PMd?LD>sCYCW<%Ro&0n{E+4^Ts zs$u9wW%Z+L3)db@K5uGyWoI0X-!T?P>no0Nlx}f#DXwnu;)?$Zf3medU4Ql&cTR&d z%Fm?h`=4=V-;$qB*Y`c+&b&FuIJ>tTUH@=&eXqFSbpFydcxdjcDB`Vwqvi+PBXHxKBA>0lTzcyh;OJj)CNH4P0Trh*bu} z!WLG)mxYH6cmxJJ!5E#9D)mh1Xn{UGr|dW_{Lt4QEL2 zfBgxQ!KVv<6E);+Ya@I?3I1Xklp&Yy}8$irm<&P z_SH0o>4m^Gw4mlfy3DW*O2BLhS^6Y_@DbYK$dMCFcZ)bRDx+~2OsO=cemjAwZ{TWL z&{*X$6PJ)sW0DM{B?_Dh)7=4*B&iYf^1oD#27O`&-lGU%V0x53z3kLvK+}Nfh?oW= z!bT+dmc+oP1g4jq)EEg{Fl%&h_7KR+fMbo1Um6}5 zBaVrY%ftM{z~w8rjgD%k#R*!Rgd#(J@F{2#hZy^XoFOUW@J zylRbIPo&skT}}y9?NaS>{o2)yt0{I=mxmwXM|T(Qu9l~&+t#l>g)Uz2qC={es+Vil zS~h@OUDV~2a@}0GxoQTIw%+{|Skq7SF5@f{Db}ycBai)C_1?{TZ@Rv7qa_*mD8*jW z`*b)$b9({8Rwo2nXG-Lm2u-#v3`CF;e@3wnf#2yTau~0Bb>_P-ZXQWVu z_dDT-Bq2gSN9HyEB;|QQyC{KfNL4ZfoWt4QxQL6o7F?suPhP||g9RA~JbYH6hyvUk z#gQy3!I-SkV@%!e39}6)lW|S1FB%gQ5!8>bgNzb(h2D}^7L&>Jo!Mq$|8sybRsWNz q{ulGXD;rZ>dyjiw(s' \ No newline at end of file + return f'' + +class EmailTemplate(db.Model): + __tablename__ = 'email_templates' + id = db.Column(db.Integer, primary_key=True) + name = db.Column(db.String(100), nullable=False) + subject = db.Column(db.String(200), nullable=False) + body = db.Column(db.Text, nullable=False) + created_at = db.Column(db.DateTime, default=datetime.utcnow) + updated_at = db.Column(db.DateTime, default=datetime.utcnow, onupdate=datetime.utcnow) + created_by = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) + is_active = db.Column(db.Boolean, default=True) + + # Relationships + creator = db.relationship('User', backref='created_email_templates', foreign_keys=[created_by]) + + def __repr__(self): + return f'' \ No newline at end of file diff --git a/routes/email_templates.py b/routes/email_templates.py new file mode 100644 index 0000000..11f3753 --- /dev/null +++ b/routes/email_templates.py @@ -0,0 +1,97 @@ +from flask import Blueprint, jsonify, request +from flask_login import login_required, current_user +from models import EmailTemplate, db +from utils import admin_required + +email_templates = Blueprint('email_templates', __name__) + +@email_templates.route('/api/email-templates', methods=['GET']) +@login_required +def get_templates(): + templates = EmailTemplate.query.filter_by(is_active=True).all() + return jsonify([{ + 'id': template.id, + 'name': template.name, + 'subject': template.subject, + 'body': template.body, + 'created_at': template.created_at.isoformat(), + 'updated_at': template.updated_at.isoformat(), + 'created_by': template.created_by, + 'is_active': template.is_active + } for template in templates]) + +@email_templates.route('/api/email-templates/', methods=['GET']) +@login_required +def get_template(template_id): + template = EmailTemplate.query.get_or_404(template_id) + return jsonify({ + 'id': template.id, + 'name': template.name, + 'subject': template.subject, + 'body': template.body, + 'created_at': template.created_at.isoformat(), + 'updated_at': template.updated_at.isoformat(), + 'created_by': template.created_by, + 'is_active': template.is_active + }) + +@email_templates.route('/api/email-templates', methods=['POST']) +@login_required +@admin_required +def create_template(): + data = request.get_json() + + template = EmailTemplate( + name=data['name'], + subject=data['subject'], + body=data['body'], + created_by=current_user.id + ) + + db.session.add(template) + db.session.commit() + + return jsonify({ + 'id': template.id, + 'name': template.name, + 'subject': template.subject, + 'body': template.body, + 'created_at': template.created_at.isoformat(), + 'updated_at': template.updated_at.isoformat(), + 'created_by': template.created_by, + 'is_active': template.is_active + }), 201 + +@email_templates.route('/api/email-templates/', methods=['PUT']) +@login_required +@admin_required +def update_template(template_id): + template = EmailTemplate.query.get_or_404(template_id) + data = request.get_json() + + template.name = data.get('name', template.name) + template.subject = data.get('subject', template.subject) + template.body = data.get('body', template.body) + template.is_active = data.get('is_active', template.is_active) + + db.session.commit() + + return jsonify({ + 'id': template.id, + 'name': template.name, + 'subject': template.subject, + 'body': template.body, + 'created_at': template.created_at.isoformat(), + 'updated_at': template.updated_at.isoformat(), + 'created_by': template.created_by, + 'is_active': template.is_active + }) + +@email_templates.route('/api/email-templates/', methods=['DELETE']) +@login_required +@admin_required +def delete_template(template_id): + template = EmailTemplate.query.get_or_404(template_id) + template.is_active = False + db.session.commit() + return '', 204 \ No newline at end of file