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 "", max_age=60 * 60 * 24 * 365) 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 not username: return render_template( request, "noauth/index.html" ) 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=url, title=title, content=content, timestamp=math.floor(time.time()), text_format=fmt ) 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 ) 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 edit_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 username != self_username: return render_template( request, "404.html" ) error = None repopulate = { "url": blog.url, "title": blog.title, "content": blog.content, "format": blog.text_format } if request.method == "POST": url = (request.POST.get("url") or "").strip().replace(" ", "-").lower() or blog.url title = (request.POST.get("title") or "").strip() or blog.title content = (request.POST.get("raw") or "").strip() or blog.content fmt = request.POST.get("format") or blog.text_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: blog.url = url blog.title = title blog.content = content blog.edited_at = math.floor(time.time()) blog.text_format = fmt blog.save() 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="Editing", editing=True, username=username, error=error, repopulate=repopulate ) 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.order_by("-id") # type: ignore ) return render_template( request, "404.html" )