feat: add parent PIN setup functionality and email notifications
All checks were successful
Gitea Actions Demo / build-and-push (push) Successful in 23s
All checks were successful
Gitea Actions Demo / build-and-push (push) Successful in 23s
- Implemented User model updates to include PIN and related fields. - Created email sender utility for sending verification and reset emails. - Developed ParentPinSetup component for setting up a parent PIN with verification code. - Enhanced UserProfile and EntityEditForm components to support new features. - Updated routing to include PIN setup and authentication checks. - Added styles for new components and improved existing styles for consistency. - Introduced loading states and error handling in various components.
This commit is contained in:
65
backend/utils/email_sender.py
Normal file
65
backend/utils/email_sender.py
Normal file
@@ -0,0 +1,65 @@
|
||||
import os
|
||||
from flask import current_app
|
||||
from flask_mail import Mail, Message
|
||||
import smtplib
|
||||
from email.mime.text import MIMEText
|
||||
|
||||
class EmailSender:
|
||||
def __init__(self, app=None):
|
||||
self.mail = None
|
||||
if app is not None:
|
||||
self.init_app(app)
|
||||
|
||||
def init_app(self, app):
|
||||
self.mail = Mail(app)
|
||||
|
||||
def send_verification_email(self, to_email, token):
|
||||
verify_url = f"{current_app.config['FRONTEND_URL']}/auth/verify?token={token}"
|
||||
html_body = f'Click <a href="{verify_url}">here</a> to verify your account.'
|
||||
msg = Message(
|
||||
subject="Verify your account",
|
||||
recipients=[to_email],
|
||||
html=html_body,
|
||||
sender=current_app.config.get('MAIL_DEFAULT_SENDER', 'no-reply@reward-app.local')
|
||||
)
|
||||
if self.mail:
|
||||
self.mail.send(msg)
|
||||
else:
|
||||
print(f"[EMAIL to {to_email}] Verification: {verify_url}")
|
||||
|
||||
def send_reset_password_email(self, to_email, token):
|
||||
reset_url = f"{current_app.config['FRONTEND_URL']}/auth/reset-password?token={token}"
|
||||
html_body = f'Click <a href="{reset_url}">here</a> to reset your password.'
|
||||
msg = Message(
|
||||
subject="Reset your password",
|
||||
recipients=[to_email],
|
||||
html=html_body,
|
||||
sender=current_app.config.get('MAIL_DEFAULT_SENDER', 'no-reply@reward-app.local')
|
||||
)
|
||||
if self.mail:
|
||||
self.mail.send(msg)
|
||||
else:
|
||||
print(f"[EMAIL to {to_email}] Reset password: {reset_url}")
|
||||
|
||||
def send_pin_setup_email(self, to_email, code):
|
||||
html_body = f"""
|
||||
<div style='font-family:sans-serif;'>
|
||||
<h2>Set up your Parent PIN</h2>
|
||||
<p>To set your Parent PIN, enter the following code in the app:</p>
|
||||
<div style='font-size:2rem; font-weight:bold; letter-spacing:0.2em; margin:1.5rem 0;'>{code}</div>
|
||||
<p>This code is valid for 10 minutes.</p>
|
||||
<p>If you did not request this, you can ignore this email.</p>
|
||||
<hr>
|
||||
<div style='color:#888;font-size:0.95rem;'>Reward App</div>
|
||||
</div>
|
||||
"""
|
||||
msg = Message(
|
||||
subject="Set up your Parent PIN",
|
||||
recipients=[to_email],
|
||||
html=html_body,
|
||||
sender=current_app.config.get('MAIL_DEFAULT_SENDER', 'no-reply@reward-app.local')
|
||||
)
|
||||
if self.mail:
|
||||
self.mail.send(msg)
|
||||
else:
|
||||
print(f"[EMAIL to {to_email}] Parent PIN setup code: {code}")
|
||||
Reference in New Issue
Block a user