wedding-site-backend/wedding_site/primary/views.py
2024-02-18 22:11:28 +00:00

131 lines
3.5 KiB
Python

from django.shortcuts import render, redirect
from django.http import HttpResponse
from django.template import Template
from django.template import Context
from django.contrib.auth import authenticate, login
from django.contrib.auth.decorators import login_required
from django.views.defaults import page_not_found
import markdown
from bs4 import BeautifulSoup
from .models import Site, Page, Image
_TEMPLATE = """
<!DOCTYPE html>
<html>
<head>
{{site_header | safe}}
</head>
<body>
{{page_body | safe}}
</body>
</html>
"""
def handler404(request, exception, template_name="404.html"):
page_names = ["home", "schedule", "thingstodo", "afters"]
working_path = request.path.lower()
if working_path and working_path[0] == "/":
working_path = working_path[1:]
if working_path and working_path[-1] == "/":
working_path = working_path[:-1]
if working_path in page_names:
return redirect(working_path)
return page_not_found(request, exception, template_name)
def get_site_header(site):
template = Template(site.header)
context = Context({"site": site})
return template.render(context)
def get_index_body(site):
template = Template(site.index)
context = Context({"site": site})
return template.render(context)
def index(request):
site = Site.objects.get(pk=1)
template = Template(_TEMPLATE)
context = Context({"site": site,
"site_header" : get_site_header(site),
"page_body" : get_index_body(site)})
soup = BeautifulSoup(template.render(context))
return HttpResponse(soup.prettify())
def login_view(request):
token = request.POST["token"]
user = authenticate(request, username="guest", password=token.lower())
if user is not None:
login(request, user)
return redirect("home")
else:
return redirect("index")
@login_required(login_url="/")
def home(request):
return get_page("Home")
@login_required(login_url="/")
def afters(request):
return get_page("Afters")
def get_page_header(site: Site):
pages = site.page_set.order_by("priority").filter(navigable=True)
template = Template(site.page_header)
context = Context({"pages" : pages})
return template.render(context)
def get_page_body(site: Site, page: Page):
header = get_page_header(site)
body = f"<div class=article-content>{markdown.markdown(page.content)}</div>"
return header + body
def get_page(name:str):
site = Site.objects.get(pk=1)
page = Page.objects.get(name__iexact=name)
template = Template(_TEMPLATE)
context = Context({"site": site,
"site_header" : get_site_header(site),
"page_body" : get_page_body(site, page)})
content = template.render(context)
soup = BeautifulSoup(content, features="html.parser")
for img in soup.find_all('img'):
img_name = img["src"]
db_images = Image.objects.filter(name=img_name)
if db_images:
url = db_images[0].content.url.replace("uploads/","")
img["src"] = url
return HttpResponse(soup.prettify())
@login_required(login_url="/")
def schedule(request):
return get_page("Schedule")
@login_required(login_url="/")
def things_to_do(request):
return get_page("ThingsToDo")
@login_required(login_url="/")
def travel(request):
return get_page("Travel")
@login_required(login_url="/")
def faq(request):
return get_page("FAQ")
@login_required(login_url="/")
def accommodation(request):
return get_page("Accommodation")