wedding-site-backend/wedding_site/primary/views.py
2024-02-17 18:34:27 +00:00

114 lines
2.8 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
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 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)
if user is not None:
login(request, user)
return redirect("landing")
else:
return redirect("index")
@login_required(login_url="/")
def landing(request):
return get_page("Landing")
def get_page_header(site: Site):
pages = site.page_set.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 = markdown.markdown(page.content)
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:
img["src"] = db_images[0].content.url
return HttpResponse(soup.prettify())
@login_required(login_url="/")
def schedule(request, name):
return get_page(name)
@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")