blog/tblog/views/templates.py

126 lines
3.7 KiB
Python
Raw Normal View History

2024-12-31 19:56:46 -05:00
import math
import time
from urllib.parse import quote as escape_url
from django.core.handlers.wsgi import WSGIRequest
from django.db import IntegrityError
from django.http import HttpResponse, HttpResponseRedirect
from tblog.models import tBPost
from .helper import get_user_object, get_username, render_template
def auth(request: WSGIRequest) -> HttpResponseRedirect:
resp = HttpResponseRedirect("/")
if "remove" in request.GET:
resp.set_cookie("session_id", "", max_age=0)
else:
resp.set_cookie("session_id", request.GET.get("sessionid") or "")
return resp
def index(request: WSGIRequest) -> HttpResponse:
username = get_username(request)
if username:
user = get_user_object(username, i_promise_this_user_exists=True)
return render_template(
request, "index.html",
username=username,
blog_count=user.posts.count() # type: ignore
)
return render_template(
request, "noauth/index.html"
)
def write(request: WSGIRequest) -> HttpResponse:
username = get_username(request)
if username:
repopulate = {}
error = None
if request.method == "POST":
url = (request.POST.get("url") or "").strip().replace(" ", "-").lower()
title = (request.POST.get("title") or "").strip()
content = (request.POST.get("raw") or "").strip()
fmt = request.POST.get("format")
repopulate = {
"url": url,
"title": title,
"content": content,
"format": fmt
}
if not (url and title and content) or fmt not in ["plain", "mono", "markdown", "html"] or len(url) > 250 or len(title) > 1_000 or len(content) > 500_000:
error = "Invalid input(s)"
else:
try:
tBPost.objects.create(
u_by=get_user_object(username, i_promise_this_user_exists=True),
url=request.POST.get("url"),
title=request.POST.get("title"),
content=request.POST.get("raw"),
timestamp=math.floor(time.time()),
text_format=request.POST.get("format")
)
except IntegrityError:
error = f"Url '{url}' already in use"
else:
return HttpResponseRedirect(f"/blog/{username}/{escape_url(url)}/")
return render_template(
request, "write.html",
title="Writing",
username=username,
error=error,
repopulate=repopulate
)
return render_template(
request, "noauth/index.html"
)
def view_blog(request: WSGIRequest, username: str, url: str) -> HttpResponse:
try:
blog = tBPost.objects.get(
u_by=get_user_object(username),
url=url
)
except tBPost.DoesNotExist:
return render_template(
request, "404.html"
)
self_username = get_username(request)
if request.method == "POST" and username == self_username:
blog.delete()
return HttpResponseRedirect("/")
return render_template(
request, "blog.html",
blog=blog,
title=blog.title + " by " + blog.u_by.username,
username=self_username
)
def user(request: WSGIRequest, username: str) -> HttpResponse:
user = get_user_object(username)
if user:
return render_template(
request, "user.html",
username=user.username,
self_username=get_username(request),
posts=user.posts.all() # type: ignore
)
return render_template(
request, "404.html"
)