From 2cc2a31ab26b72eda09d78d4adce946a2b26ac5c Mon Sep 17 00:00:00 2001 From: retoor Date: Sun, 16 Nov 2025 01:48:39 +0100 Subject: [PATCH] Update. --- mywebdav/legal.py | 171 ++++++++++++++++++++++++++++++++-------------- mywebdav/main.py | 42 +++++++++++- pyproject.toml | 1 + requirements.txt | 1 + 4 files changed, 160 insertions(+), 55 deletions(-) diff --git a/mywebdav/legal.py b/mywebdav/legal.py index ea7afad..1eda6cb 100644 --- a/mywebdav/legal.py +++ b/mywebdav/legal.py @@ -53,48 +53,122 @@ class LegalDocument(ABC): return self.get_header() + self.get_content() + self.get_footer() def to_html(self) -> str: - """Generate the complete document in HTML format.""" - # Content is already HTML, just wrap in basic HTML structure + """Generate the complete document as Jinja2 template extending base.html.""" html_content = self.get_content() - html_content = f""" - - {self.title} - - - -

{self.title}

-

Last Updated: {self.last_updated}

+ template_content = f"""{{% extends "base.html" %}} + +{{% block title %}}{self.title} - MyWebdav{{% endblock %}} + +{{% block description %}}{self.title} for MyWebdav cloud storage service.{{% endblock %}} + +{{% block extra_css %}} + +{{% endblock %}} + +{{% block content %}} + +{{% endblock %}} +""" + return template_content class PrivacyPolicy(LegalDocument): @@ -867,28 +941,21 @@ def get_all_legal_documents() -> Dict[str, LegalDocument]: } -def generate_legal_documents(output_dir: str = "static/legal"): - """Generate all legal documents as Markdown and HTML files.""" +def generate_legal_documents(template_dir: str = "templates/legal"): + """Generate all legal documents as Jinja2 templates.""" import os - os.makedirs(output_dir, exist_ok=True) + os.makedirs(template_dir, exist_ok=True) documents = get_all_legal_documents() for doc_name, doc in documents.items(): - # Generate Markdown - md_filename = f"{doc_name}.md" - md_path = os.path.join(output_dir, md_filename) - with open(md_path, "w") as f: - f.write(doc.to_markdown()) - - # Generate HTML html_filename = f"{doc_name}.html" - html_path = os.path.join(output_dir, html_filename) + html_path = os.path.join(template_dir, html_filename) with open(html_path, "w") as f: f.write(doc.to_html()) - print(f"Generated {md_filename} and {html_filename}") + print(f"Generated {html_filename}") if __name__ == "__main__": diff --git a/mywebdav/main.py b/mywebdav/main.py index c2648fc..fda3e17 100644 --- a/mywebdav/main.py +++ b/mywebdav/main.py @@ -4,7 +4,8 @@ import logging from contextlib import asynccontextmanager from fastapi import FastAPI, Request, HTTPException, status from fastapi.staticfiles import StaticFiles -from fastapi.responses import HTMLResponse, JSONResponse, Response +from fastapi.responses import HTMLResponse, JSONResponse, Response, RedirectResponse +from fastapi.templating import Jinja2Templates from tortoise.contrib.fastapi import register_tortoise from .settings import settings from .routers import ( @@ -101,6 +102,8 @@ app = FastAPI( lifespan=lifespan, ) +templates = Jinja2Templates(directory="templates") + app.include_router(auth.router) app.include_router(users.router) app.include_router(folders.router) @@ -150,8 +153,41 @@ async def http_exception_handler(request: Request, exc: HTTPException): ) -@app.get("/", response_class=HTMLResponse) # Change response_class to HTMLResponse -async def read_root(): +@app.get("/", response_class=HTMLResponse) +async def splash_page(request: Request): + return templates.TemplateResponse("splash.html", {"request": request}) + + +@app.get("/features", response_class=HTMLResponse) +async def features_page(request: Request): + return templates.TemplateResponse("features.html", {"request": request}) + + +@app.get("/pricing", response_class=HTMLResponse) +async def pricing_page(request: Request): + return templates.TemplateResponse("pricing.html", {"request": request}) + + +@app.get("/support", response_class=HTMLResponse) +async def support_page(request: Request): + return templates.TemplateResponse("support.html", {"request": request}) + + +@app.get("/legal/{document_name}", response_class=HTMLResponse) +async def legal_document(request: Request, document_name: str): + try: + return templates.TemplateResponse(f"legal/{document_name}.html", {"request": request}) + except Exception: + raise HTTPException(status_code=404, detail="Legal document not found") + + +@app.get("/login") +async def login_redirect(): + return RedirectResponse(url="/app", status_code=302) + + +@app.get("/app", response_class=HTMLResponse) +async def web_app(): with open("static/index.html", "r") as f: return f.read() diff --git a/pyproject.toml b/pyproject.toml index 4e25a27..868022b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -32,6 +32,7 @@ ffmpeg-python = "*" gunicorn = "*" aiosmtplib = "*" stripe = "*" +jinja2 = "*" [tool.poetry.group.dev.dependencies] black = "*" diff --git a/requirements.txt b/requirements.txt index 7235046..bd8d625 100644 --- a/requirements.txt +++ b/requirements.txt @@ -118,3 +118,4 @@ websockets==15.0.1 yarl==1.22.0 zstandard==0.25.0 aiosmtplib==5.0.0 +jinja2