secret creation
This commit is contained in:
parent
c51908ffeb
commit
91c13307aa
12 changed files with 98 additions and 29 deletions
1
.vscode/settings.json
vendored
1
.vscode/settings.json
vendored
|
|
@ -3,6 +3,7 @@
|
|||
"cSpell.words": [
|
||||
"Chiara",
|
||||
"Hobbithöhle",
|
||||
"mailtrap",
|
||||
"Masala",
|
||||
"Pomorie",
|
||||
"Reinke"
|
||||
|
|
|
|||
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -8,15 +8,17 @@
|
|||
<body>
|
||||
<div>
|
||||
<h1>Neuer Artikel:</h1>
|
||||
<h3>England</h3>
|
||||
<h4>It's gettin' british, my dear!</h4>
|
||||
<p>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.</p>
|
||||
<h3>{{data.title}}</h3>
|
||||
<h4>{{data.subtitle}}</h4>
|
||||
<p>{{data.description}}</p>
|
||||
|
||||
<a href=https://blauwasser-mausis.de/blog/bootsuche-england/>
|
||||
<a href={{data.link}}>
|
||||
<button>Zum Artikel</button>
|
||||
</a>
|
||||
|
||||
<a id="admin" href="https://blauwasser-mausis.de">Approve</a>
|
||||
<a href="https://blauwasser-mausis.de/blog/bootsuche-england">
|
||||
<span>Abbestellen</span>
|
||||
</a>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
|
|
@ -51,9 +53,4 @@
|
|||
border-radius: 3px;
|
||||
border: none;
|
||||
}
|
||||
|
||||
#admin {
|
||||
margin-top: 64px;
|
||||
color: red;
|
||||
}
|
||||
</style>
|
||||
38
backend/src/backend/internal/jinja_templates/welcome.jinja
Normal file
38
backend/src/backend/internal/jinja_templates/welcome.jinja
Normal file
|
|
@ -0,0 +1,38 @@
|
|||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<title>Newsletter</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div>
|
||||
<h1>Willkommen, {{user.name}}</h1>
|
||||
<p>Du hast dich bei Blauwasser-Mausis.de angemeldet. Solltest du das nicht gewesen sein, dann lösche die Daten einfach über den untenstehenden Link.</p>
|
||||
|
||||
<a href="https://blauwasser-mausis.de/blog/bootsuche-england">
|
||||
<span>Daten löschen</span>
|
||||
</a>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
<style>
|
||||
* {
|
||||
font-family: Arial, Helvetica, sans-serif;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 32px;
|
||||
|
||||
}
|
||||
|
||||
div {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-direction: column;
|
||||
background-color: lightgrey;
|
||||
padding: 32px 64px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
</style>
|
||||
|
|
@ -1,10 +1,9 @@
|
|||
from mailtrap import Mail
|
||||
import mailtrap as mt
|
||||
import os
|
||||
from jinja2 import Environment, FileSystemLoader
|
||||
|
||||
|
||||
class Newsletter():
|
||||
class ArticleData():
|
||||
def __init__(self, title, subtitle, description, link):
|
||||
self.title=title
|
||||
self.subtitle=subtitle
|
||||
|
|
@ -16,23 +15,28 @@ class Newsletter():
|
|||
description: str
|
||||
link: str
|
||||
|
||||
def send_newsletter_admin_approval(data: Newsletter ):
|
||||
class AdminApprovalData(ArticleData):
|
||||
def __init__(self,title, subtitle, description, link, secret):
|
||||
ArticleData.__init__(self, title, subtitle, description, link)
|
||||
self.secret = secret
|
||||
|
||||
secret: str
|
||||
|
||||
def send_newsletter_admin_approval(data: ArticleData ):
|
||||
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)
|
||||
|
||||
# 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",
|
||||
text=output,
|
||||
)
|
||||
|
||||
send_mail(mail)
|
||||
|
||||
|
||||
def send_mail(mail: Mail):
|
||||
|
|
|
|||
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
from backend.internal.mail_util import Newsletter
|
||||
from backend.internal.authentication import create_access_token
|
||||
from backend.internal.mail_util import AdminApprovalData
|
||||
from backend.internal.mail_util import send_newsletter_admin_approval
|
||||
from datetime import timedelta
|
||||
from datetime import datetime
|
||||
|
|
@ -13,13 +14,15 @@ 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=15)):
|
||||
if date_object > (datetime.now() - timedelta(days=1)):
|
||||
title = str(article["title"])
|
||||
description = str(article["summary"])
|
||||
subtitle = str(article["subtitle"])
|
||||
link = str(article["link"])
|
||||
|
||||
data = Newsletter(title, subtitle, description, link)
|
||||
secret = create_access_token({"sub": title})
|
||||
|
||||
data = AdminApprovalData(title, subtitle, description, link, secret)
|
||||
|
||||
send_newsletter_admin_approval(data)
|
||||
|
||||
|
|
|
|||
|
|
@ -27,7 +27,3 @@ router = APIRouter()
|
|||
|
||||
app.include_router(users.router)
|
||||
app.include_router(comments.router)
|
||||
|
||||
check_blog_rss_and_send_admin_mail()
|
||||
|
||||
|
||||
|
|
|
|||
Binary file not shown.
17
backend/src/backend/routers/newsletter.py
Normal file
17
backend/src/backend/routers/newsletter.py
Normal file
|
|
@ -0,0 +1,17 @@
|
|||
from fastapi import Form
|
||||
from fastapi import Depends
|
||||
from fastapi import APIRouter
|
||||
|
||||
router = APIRouter(
|
||||
prefix="newsletter",
|
||||
tags=[""],
|
||||
dependencies=[],
|
||||
responses={404: {"description": "Not found"}},
|
||||
)
|
||||
|
||||
@router.post(
|
||||
"/approve",
|
||||
status_code=201
|
||||
)
|
||||
def approve_newsletter(secret: str = Form()):
|
||||
pass
|
||||
|
|
@ -24,7 +24,11 @@ router = APIRouter(
|
|||
responses={404: {"description": "Not found"}},
|
||||
)
|
||||
|
||||
@router.post("/users", status_code=201)
|
||||
@router.post(
|
||||
"/users",
|
||||
status_code=201,
|
||||
dependencies=[Depends(RateLimiter(limiter=Limiter(Rate(1, Duration.MINUTE))))]
|
||||
)
|
||||
def register_user(new_user: NewUser, session: Session = Depends(get_session)) -> str:
|
||||
user = User.model_validate(new_user)
|
||||
|
||||
|
|
@ -69,6 +73,14 @@ def delete(current_user: User = Depends(get_current_user), session: Session = De
|
|||
session.delete(current_user)
|
||||
session.commit()
|
||||
|
||||
@router.delete("/me", status_code=201)
|
||||
def delete(user_code: str = Form(), session: Session = Depends(get_session)) :
|
||||
user = session.exec(select(User).where(User.user_code == user_code)).first()
|
||||
|
||||
if user is not None:
|
||||
session.delete(user)
|
||||
session.commit()
|
||||
|
||||
@router.put("me/subscribe", status_code=201)
|
||||
def change_subscription(subscription: bool = Form(), current_user: User = Depends(get_current_user), session: Session = Depends(get_session)):
|
||||
current_user.subscription = subscription
|
||||
|
|
@ -77,5 +89,6 @@ def change_subscription(subscription: bool = Form(), current_user: User = Depend
|
|||
|
||||
|
||||
# TODO:
|
||||
# Template für Willkommen mit delete link
|
||||
# change mail <- token, new mail
|
||||
# delete all deactivated users after 48h
|
||||
Loading…
Add table
Reference in a new issue