wedding-site-backend/wedding_site/primary/views.py

127 lines
3.4 KiB
Python
Raw Normal View History

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