"""Script to render template and send it. Useful for local debugging.""" import argparse import json import logging import os import smtplib from email.mime.multipart import MIMEMultipart from email.mime.text import MIMEText from pathlib import Path from typing import Any from jinja2 import Environment, FileSystemLoader logging.basicConfig(level=logging.INFO, format='[%(asctime)s][%(levelname)s] %(message)s') logger = logging.getLogger() BASE_TEMPLATE_PATH = Path('templates') BASE_PAYLOAD_PATH = Path('example_template_payloads') env = Environment( loader=FileSystemLoader(BASE_TEMPLATE_PATH), extensions=[ 'jinja2.ext.do', ], autoescape=True, ) def get_payload(payload_path: Path) -> dict[str, Any]: if not payload_path.exists() or not payload_path.is_file(): logger.warning(f'No payload file found at {payload_path}') return {} return json.loads(payload_path.read_text()) def render_template(template_path: Path, payload: dict[str, Any]) -> str: return env.get_template(str(template_path)).render(payload) def send_email(recipient: str, message: str) -> None: logger.info(f'Sending email to {recipient}') # Load environment variables smtp_server = os.environ['TEST_SMTP_SERVER_HOST'] smtp_port = int(os.environ['TEST_SMTP_SERVER_PORT']) smtp_user = os.environ['TEST_SMTP_USER'] smtp_password = os.environ['TEST_SMTP_PASSWORD'] email_from = os.environ['TEST_EMAIL_FROM'] # Create the email msg = MIMEMultipart() msg['From'] = email_from msg['To'] = recipient msg['Subject'] = 'Test email subject' # Email body msg.attach(MIMEText(message, 'plain')) # Send the email try: with smtplib.SMTP(smtp_server, smtp_port) as server: server.starttls() server.login(smtp_user, smtp_password) text = msg.as_string() server.sendmail(email_from, recipient, text) logger.info(f'Email sent to {args.email}') except Exception: logger.exception(f'Email sent to {args.email}') if __name__ == '__main__': parser = argparse.ArgumentParser() parser.add_argument('template', type=Path, help='Path to template') parser.add_argument('-o', '--output', type=Path, help='Path to output file') parser.add_argument('-e', '--email', help='E-mail address to send rendered template') args = parser.parse_args() template_path_ = args.template # Check if the path starts with 'templates/' and strip it if template_path_.parts[0] == 'templates': template_path_ = Path(*template_path_.parts[1:]) payload_path_ = BASE_PAYLOAD_PATH / template_path_.with_suffix('.json') payload_ = get_payload(payload_path_) result = render_template(template_path_, payload_).strip('\r\n ') if args.output: output_path_ = args.output else: output_path_ = Path(template_path_.parts[-1]).with_suffix('.html') logger.info(f'Saving output to {output_path_}') output_path_.write_text(result) logger.info(f'Wrote output to {output_path_}') if args.email: send_email(args.email, result)