From 8989a6f1b1330410e4a4a4b0ffd26bf859bfc7b2 Mon Sep 17 00:00:00 2001 From: ebby Date: Sun, 27 Sep 2026 10:10:24 +0200 Subject: [PATCH] template --- .../__pycache__/__init__.cpython-314.pyc | Bin 177 -> 177 bytes .../backend/__pycache__/main.cpython-314.pyc | Bin 1262 -> 1282 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 186 -> 186 bytes .../authentication.cpython-314.pyc | Bin 3552 -> 3552 bytes .../__pycache__/database.cpython-314.pyc | Bin 1256 -> 1256 bytes .../__pycache__/mail_util.cpython-314.pyc | Bin 0 -> 2944 bytes .../__pycache__/rss_reader.cpython-314.pyc | Bin 1168 -> 1412 bytes .../__pycache__/user_code_gen.cpython-314.pyc | Bin 689 -> 689 bytes .../internal/jinja_templates/approval.jinja | 58 ++++++++++++++++++ .../internal/jinja_templates/output.html | 58 ++++++++++++++++++ backend/src/backend/internal/mail_util.py | 43 +++++++++++++ backend/src/backend/internal/rss_reader.py | 13 +++- backend/src/backend/main.py | 3 + .../__pycache__/__init__.cpython-314.pyc | Bin 260 -> 260 bytes .../__pycache__/comment.cpython-314.pyc | Bin 1840 -> 1840 bytes .../models/__pycache__/user.cpython-314.pyc | Bin 4022 -> 4022 bytes .../__pycache__/__init__.cpython-314.pyc | Bin 185 -> 185 bytes .../__pycache__/comments.cpython-314.pyc | Bin 579 -> 579 bytes .../routers/__pycache__/users.cpython-314.pyc | Bin 5506 -> 5506 bytes .../test_users.cpython-314-pytest-9.1.1.pyc | Bin 10528 -> 10528 bytes blog/src/pages/rss.xml.js | 2 +- 21 files changed, 173 insertions(+), 4 deletions(-) create mode 100644 backend/src/backend/internal/__pycache__/mail_util.cpython-314.pyc create mode 100644 backend/src/backend/internal/jinja_templates/approval.jinja create mode 100644 backend/src/backend/internal/jinja_templates/output.html create mode 100644 backend/src/backend/internal/mail_util.py diff --git a/backend/src/backend/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/__pycache__/__init__.cpython-314.pyc index c16a269f4d4ea55430f0a2c019674cca34115b44..eaeff76e05013028d1cff757a571a22252fea352 100644 GIT binary patch delta 19 acmdnUxRH@tn~#@^fq{V`ZSRhW+{*wdJOteU delta 19 bcmdnUxRH@tn~#@^fq{YH>6Pshxt9R|ETsi< diff --git a/backend/src/backend/__pycache__/main.cpython-314.pyc b/backend/src/backend/__pycache__/main.cpython-314.pyc index 5949f7a49694567cf05db7fbacc2af4f820aa4f1..1fffd0c040a9275c82a8e763f38790ad5ea1d6b9 100644 GIT binary patch delta 60 zcmaFI*~G=G&Bx2dz`($eb8tu2?uopTj4>P4eHqze85J2!7&hlHK4)T_F*$@~65kaD Q<%bMP*BDfa1Q{3@0NhRwf&c&j delta 47 zcmZqTddJDD&Bx2dz`($;@7DILDHC}m8T~e@`!a5BV!Y49IB9Yc%Os9#49Z1<3=9ka DK%5N| diff --git a/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/internal/__pycache__/__init__.cpython-314.pyc index f625a75c82362403ef02a15b2c51ed73c9542519..517dc27118023b980f0b0858550a11dff344fc7f 100644 GIT binary patch delta 19 acmdnRxQmfnn~#@^fq{V`ZSRhW-0J}6Pshxz_^#E%F78 diff --git a/backend/src/backend/internal/__pycache__/authentication.cpython-314.pyc b/backend/src/backend/internal/__pycache__/authentication.cpython-314.pyc index 0a11bdd83df804b4754d1c69f10a6ba12efb473e..cc0e7fccbfff5bd7a19a642fd4bf691de5ba6091 100644 GIT binary patch delta 20 bcmaDL{Xm*qn~#@^fq{V`ZSRha+*f%4Ii>~6 delta 20 ccmaDL{Xm*qn~#@^fq{YH>6Pspxv%m906nAzU;qFB diff --git a/backend/src/backend/internal/__pycache__/database.cpython-314.pyc b/backend/src/backend/internal/__pycache__/database.cpython-314.pyc index 8b01da788d6f2e549b6053ac59e1d7ceb6082ef7..b7c33d46a47ebc29991ab244b0d5aaaa6dbe4209 100644 GIT binary patch delta 20 bcmaFC`GS*Mn~#@^fq{V`ZSRha+;>?3I8_C< delta 20 ccmaFC`GS*Mn~#@^fq{YH>6Pspx$m+706bF$O8@`> diff --git a/backend/src/backend/internal/__pycache__/mail_util.cpython-314.pyc b/backend/src/backend/internal/__pycache__/mail_util.cpython-314.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2fbe88ffce0019776428c58cb30c5a7992f0ae9 GIT binary patch literal 2944 zcmb_eO>7&-6@Ih3T>g`?9Eo;Yi&Eq&-2@d?*QnfD2xL1^EICosbxNg(;=z&}St~Dh z+1a60^F*fw+!#icLl5btZH@+VEzo1zQ_z!A3pG1&(L+zURgnV)Jr!@rr5M>La_A#4 z`?xdv=DqK|_szVJ%ccMTe*c$0Y+f?}{)K-cF?z~=4FKA34Q#Rqmx&-n)U`zrntJL& zzXrCxXk3no*kx0gMHqnzu#E!Pv9ns&iiq200ql4IydjaW69ur7N>AFU0*I8YO@fvF z6c^to(s<2ry=6<2>6iVRE)V=V^MxE*a6NYQRw!8g)xfDSUX5Hu>1_o2X8^!~HoOgj z*yvO-h}pU@%jlXh306#|mf2S5F(DYQ#s*BIWgQ@~|2+l7 z>X6@`TpjmG^k;R(k9>gDd0&s-+b{|D$+Bh0m~e&1WFl-~x%!YX$g!VP?Bc&>lL zib*46-a1bM0MFo%#UTd(Av!gMBHt`+1a($omCCKs)#?UkZbi6Zb)(ea!6vJUuyoOD zvMon2Uh#tKrHWI%!Tee&;n80v_c7=yLK4A(RfJINF9EiB*j9Kk4+g)fDCI1$ING5cTKfp=gp2buisrM)~5vNr_z;oGn6 z9YcK>hDSa&p4mH&f1ZJK?)KtmBR~j04gi*Mn8|KpF~!SP0wMREI_{sMv>w!&9_krN zf6{ck-b|j-b(e?2bA9Fql=5Tf{jmY>*PDKoQaM6tC>-HdsUrk;D^0;dN^xZ$f-3Vo zN-e@qU|5)_c?AZ??5aVP9*5R zD!Shg{9-LCMpzr@%Co(){jUTY`t$qUrR>QwsA;- z=LscEt*KKu+na6}Wn%@a;E0s3Gv>jYaq*0JLVl zikVW-6pf~s-Vk+9lC9-d(eIP~e8qE`TTU1<{_VQc4Bc?L#$;x}bHeHd^BX}ZEKSB3 z@})GeFWpdj~ zcb9ff{a`n9ekVQG89w!X?YEo1-h6*;XXyD(cIS9$9_z(#Yr@4!?RyJ)R`5{)t&uxE}K6O0Q`LWdiK4 zKw#xQ*%d+EwDi`{+>c-XkxehGEYde#zw+|(ix!bF5!_(@vZZspL&+T8!UT63mpm8m zUj`P0rKy;uSyeC9VLH{Tn53#0EG9mW#e`uOyTy^sKg^E(H9NNR&Dq`Tx%NWGNZq+| z`^tO9-;9wi1cOl_A1nUGnry2Z6vvC|ec%@na6AaQMVePzRvb~?=x%%o0G`KL2|JDg1 n|A3R9!00EC{3pyDm?@ImgA~bqej-oI&!;pp`Zz&IQhD`XXJvQJ literal 0 HcmV?d00001 diff --git a/backend/src/backend/internal/__pycache__/rss_reader.cpython-314.pyc b/backend/src/backend/internal/__pycache__/rss_reader.cpython-314.pyc index b3c7d27fa0401aaa1a721c48131de1693cda3151..d240d6cc6a79210fb3fe0bb6699c3888e47f5897 100644 GIT binary patch delta 687 zcmYk3O=}ZT6o${8k7Ooatwa+|nlu%+6fDmm#sAWPSi&-?AV3=kGI(9NM%-l4H zixd$FxM>)~xYA|&4}!ly+_;?+5+;@j%p}%UQ2LD$1PX+q8hl4y5?vhFVwL#)eFS=m?n z|JApYI8OzDBARH+UyDxN>RPp0WX^rAc4_KwaMSF0SpNXPLmDJMA$0Fkx3V6KHLRet_VT*Ikj}n2LK-DVB5l4Q}t-WY}+gV*fa^GufV&XsRe;7 z#S1E`)37xQYo=j`NJg00j3Q&%Ay}DA#+{*G2Ic^OR5%CjJGv6M`ekwXD6xDTTyaCp zT&KH!5>NE+y)PXlbBFPKS3HTv_S*fO*PX-Yjqd7cG}Tx4pB+XYc2`eB3;V_6(CyI` zxR@Ccc!Bd0n{s1YHI$rYVAVEcJ=c^qz23r_{%>xZpiNjJM9q>w<~mpdJ4G(ZG5dq2 sskC%;#m)c#S%8xUfHN8)^aBb*cr=9c5K>>^!gv1WF87;>pu)KR53il2MF0Q* delta 485 zcmXX@O=}ZT6g_X=OukKN4NW>FA0?G`nxv`0RgLZn4UvGea4Do_up^lyy!VEp3)_WA zsR)hFMV8t27r5{bxGc0OGDdJC;!da=ck-flaXI(n+n#$rTe;vI)SVeUY<{T>eikRR#mSO$P9^S838 zw+>e>OZACazlz_RCgx9fMr-4>iMesUR61WMUnVNkRC*L1hbNi!i5%FDnHH delta 20 ccmdnUx{;Mzn~#@^fq{YH>6PspxtB2k05d5CoB#j- diff --git a/backend/src/backend/internal/jinja_templates/approval.jinja b/backend/src/backend/internal/jinja_templates/approval.jinja new file mode 100644 index 0000000..4e2d183 --- /dev/null +++ b/backend/src/backend/internal/jinja_templates/approval.jinja @@ -0,0 +1,58 @@ + + + + + Newsletter + + + +
+

Neuer Artikel:

+

{{data.title}}

+

{{data.subtitle}}

+

{{data.description}}

+ + + + + + Approve +
+ + + + \ No newline at end of file diff --git a/backend/src/backend/internal/jinja_templates/output.html b/backend/src/backend/internal/jinja_templates/output.html new file mode 100644 index 0000000..cb0e5c4 --- /dev/null +++ b/backend/src/backend/internal/jinja_templates/output.html @@ -0,0 +1,58 @@ + + + + + Newsletter + + + +
+

Neuer Artikel:

+

England

+

It's gettin' british, my dear!

+

Auf geht's nach Milano! Aber Moment mal...der Artikel heißt England?! Da kann irgendwas nicht stimmen. Ich frage mal in der Redaktion nach. Ihr lest währenddessen einfach schonmal weiter.

+ + + + + + Approve +
+ + + + \ No newline at end of file diff --git a/backend/src/backend/internal/mail_util.py b/backend/src/backend/internal/mail_util.py new file mode 100644 index 0000000..bbfca9f --- /dev/null +++ b/backend/src/backend/internal/mail_util.py @@ -0,0 +1,43 @@ +from mailtrap import Mail +import mailtrap as mt +import os +from jinja2 import Environment, FileSystemLoader + + +class Newsletter(): + def __init__(self, title, subtitle, description, link): + self.title=title + self.subtitle=subtitle + self.description=description + self.link=link + + title: str + subtitle: str + description: str + link: str + +def send_newsletter_admin_approval(data: Newsletter ): + env = Environment(loader = FileSystemLoader('src/backend/internal/jinja_templates')) + template = env.get_template('approval.jinja') + output = template.render(data=data) + + + with open("src/backend/internal/jinja_templates/output.html", "w") as f: + f.write(output) + + + mail = mt.Mail( + sender=mt.Address(email="newsletter@blauwasser-mausis.de", name="Flaschenpost"), + to=[mt.Address(email="blauwasser-mausis@proton.me")], + subject=f"[Approval] {data.title}", + text="Jinja2 Template", + ) + + + +def send_mail(mail: Mail): + client = mt.MailtrapClient(token="") + client.send(mail) + +def send_batch_mail(): + pass diff --git a/backend/src/backend/internal/rss_reader.py b/backend/src/backend/internal/rss_reader.py index ea7247c..7ae806f 100644 --- a/backend/src/backend/internal/rss_reader.py +++ b/backend/src/backend/internal/rss_reader.py @@ -1,9 +1,11 @@ +from backend.internal.mail_util import Newsletter +from backend.internal.mail_util import send_newsletter_admin_approval from datetime import timedelta from datetime import datetime import feedparser -FEED_URL="https://blauwasser-mausis.de/rss.xml" +FEED_URL="http://localhost:4321/rss.xml" def check_blog_rss_and_send_admin_mail(): feed = feedparser.parse(FEED_URL) @@ -11,11 +13,16 @@ def check_blog_rss_and_send_admin_mail(): date_string = str(article["published"]) date_object = datetime.strptime(date_string, '%a, %d %b %Y %H:%M:%S %Z') - if date_object > (datetime.now() - timedelta(days=1)): - print(f"Neu: {article["title"]}") + if date_object > (datetime.now() - timedelta(days=15)): title = str(article["title"]) description = str(article["summary"]) + subtitle = str(article["subtitle"]) + link = str(article["link"]) + data = Newsletter(title, subtitle, description, link) + + send_newsletter_admin_approval(data) + # TODO: create link # TODO: create Template with jinja2 # TODO: send mail to blauwasser-mausis@proton.me diff --git a/backend/src/backend/main.py b/backend/src/backend/main.py index 3c07be9..662bb37 100644 --- a/backend/src/backend/main.py +++ b/backend/src/backend/main.py @@ -28,3 +28,6 @@ router = APIRouter() app.include_router(users.router) app.include_router(comments.router) +check_blog_rss_and_send_admin_mail() + + diff --git a/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/models/__pycache__/__init__.cpython-314.pyc index c12a6ca89e2ea5d050d35d27cd55f4fc3f409fd9..3ce6b35ffea68ede4e1b64babe4193caac5f81aa 100644 GIT binary patch delta 19 acmZo+YGLBm=HumJU|?WK+q+{T_fG<?E(w delta 19 acmZo+YGLBm=HumJU|?W)dS&}W?w6PspxmDQ#GfD+8 diff --git a/backend/src/backend/models/__pycache__/user.cpython-314.pyc b/backend/src/backend/models/__pycache__/user.cpython-314.pyc index 3b19c912976b945ad1d5ebf11e9626924d100f16..0ad17ac832e8c8974e160458477fa899a873210a 100644 GIT binary patch delta 20 bcmdlczfGQ7n~#@^fq{V`ZSRha+^hKkGpGeu delta 20 ccmdlczfGQ7n~#@^fq{YH>6PspxmWW805_%u>;M1& diff --git a/backend/src/backend/routers/__pycache__/__init__.cpython-314.pyc b/backend/src/backend/routers/__pycache__/__init__.cpython-314.pyc index 767264a3cec1e094b52abd2b971b30f3c50b3bd2..f026e0672dc42b2c951e4f48c7de86581e20d43d 100644 GIT binary patch delta 19 acmdnVxRa4vn~#@^fq{V`ZSRhW-0J`;WCZm9 delta 19 bcmdnVxRa4vn~#@^fq{YH>6Pshxz_;zEzJdr diff --git a/backend/src/backend/routers/__pycache__/comments.cpython-314.pyc b/backend/src/backend/routers/__pycache__/comments.cpython-314.pyc index c33730d15d04bda228b1a0a53d5e0dc8b1f7f6ea..e3628b7e8ed8e529df6d9d4f1e5a5e3e5568e895 100644 GIT binary patch delta 20 bcmX@ia+rl%n~#@^fq{V`ZSRha+!jm#FxLdT delta 20 bcmX@ia+rl%n~#@^fq{YH>6Pspxh=FEn~#@^fq{V`ZSRha+@hKQHhu*a delta 20 bcmZ1wv>=FEn~#@^fq{YH>6PspxkWVrI(!AH diff --git a/blog/src/pages/rss.xml.js b/blog/src/pages/rss.xml.js index d08c979..12a8749 100644 --- a/blog/src/pages/rss.xml.js +++ b/blog/src/pages/rss.xml.js @@ -19,7 +19,7 @@ export async function GET(context) { customData: ` - + `,