191 lines
6.7 KiB
Python
191 lines
6.7 KiB
Python
import os
|
|
|
|
import markdown2
|
|
|
|
from django.contrib.auth.decorators import login_required
|
|
from django.db import IntegrityError
|
|
from django.http import HttpResponse
|
|
from django.shortcuts import render, redirect
|
|
# from blog.factories import TopicFactory
|
|
from blog.models import Topic, Tag, Blogpost
|
|
from django.template import Template, Context
|
|
from django.views.decorators.csrf import csrf_exempt
|
|
from django_2fa.decorators import mfa_login_required
|
|
|
|
|
|
def render_md_file(path) -> Template:
|
|
with open(path, 'r') as mdfile:
|
|
md_file_content = mdfile.read()
|
|
mdfile.close()
|
|
|
|
html_form_md = markdown2.markdown(md_file_content,
|
|
extras=['footnotes', 'task_list', 'strike', 'break-on-newline', 'tables',
|
|
'fenced-code-blocks'])
|
|
|
|
rendered_html = Template('{% load video %} '
|
|
'{% autoescape off %}' +
|
|
html_form_md +
|
|
'{% endautoescape %}').render(Context({}))
|
|
|
|
return rendered_html
|
|
|
|
|
|
def viewblog(request, title) -> HttpResponse:
|
|
post = Blogpost.objects.get(title=title)
|
|
post.views += 1
|
|
post.save()
|
|
filepath = os.path.join(os.environ.get("MD_FILE_PATH"), title + ".md")
|
|
|
|
rendered_html = render_md_file(filepath)
|
|
|
|
context = {'post': post, 'html': rendered_html, 'roottopics': Topic.objects.all().filter(rootTopic=None),
|
|
'allposts': Blogpost.objects.all().order_by("title")}
|
|
|
|
return render(request, 'blog/viewpost.html', context)
|
|
|
|
|
|
def index(request) -> HttpResponse:
|
|
filepath = os.path.join(os.environ.get("MD_FILE_PATH"), 'indexpage/index.md')
|
|
|
|
rendered_html = render_md_file(filepath)
|
|
|
|
context = {'html': rendered_html, 'roottopics': Topic.objects.all().filter(rootTopic=None),
|
|
'allposts': Blogpost.objects.all().order_by("title")}
|
|
|
|
return render(request, 'blog/index.html', context)
|
|
|
|
|
|
@login_required
|
|
@mfa_login_required
|
|
def edit(request, id) -> HttpResponse:
|
|
blogpost = Blogpost.objects.get(pk=id)
|
|
mdfile_content = open(blogpost.mdfile, "r").read()
|
|
context = {'alltopics': Topic.objects.all().order_by('name').values(), 'markdown': mdfile_content,
|
|
'roottopics': Topic.objects.all().filter(rootTopic=None),
|
|
'allposts': Blogpost.objects.all().order_by("title"), 'post': Blogpost.objects.get(pk=id)}
|
|
|
|
if request.method == 'POST':
|
|
title = request.POST['title']
|
|
markdown = request.POST['markdown']
|
|
|
|
tags = []
|
|
|
|
if 'tags' in request.POST and request.POST['tags'] != '':
|
|
tags_str = request.POST['tags'].split(" ")
|
|
for tag in tags_str:
|
|
tagobj = Tag.objects.get_or_create(name=tag)[0]
|
|
tagobj.save()
|
|
tags.append(tagobj.id)
|
|
|
|
topicname = request.POST['topic']
|
|
topic = None if topicname == "No topic" else Topic.objects.get(name=topicname)
|
|
|
|
filepath = os.path.join(os.environ.get("MD_FILE_PATH"), title + ".md")
|
|
|
|
blogpost = Blogpost.objects.get(pk=id)
|
|
blogpost.topic = topic
|
|
blogpost.title = title
|
|
blogpost.tags.set(tags)
|
|
blogpost.mdfile = filepath
|
|
blogpost.save()
|
|
|
|
with open(filepath, "w") as mdfile:
|
|
mdfile.write(markdown)
|
|
mdfile.close()
|
|
context['error'] = "Post \"" + title + "\" edited."
|
|
return render(request, 'blog/edit.html', context)
|
|
|
|
|
|
@login_required
|
|
@csrf_exempt
|
|
@mfa_login_required
|
|
def order(request) -> HttpResponse:
|
|
if request.method == "POST":
|
|
root_id = int(request.POST['rootID']) if request.POST['rootID'] != 'root_list' else None
|
|
child_id = int(request.POST['childID'])
|
|
objtype = request.POST['relinkType']
|
|
|
|
if objtype == 'topic':
|
|
child_topic = Topic.objects.get(pk=child_id)
|
|
child_topic.rootTopic = Topic.objects.get(pk=root_id) if root_id is not None else None
|
|
child_topic.save()
|
|
elif objtype == 'post':
|
|
post = Blogpost.objects.get(pk=child_id)
|
|
post.topic = Topic.objects.get(pk=root_id) if root_id is not None else None
|
|
post.save()
|
|
|
|
context = {'roottopics': Topic.objects.all().filter(rootTopic=None),
|
|
'allposts': Blogpost.objects.all().order_by("title")}
|
|
return render(request, 'blog/order.html', context)
|
|
|
|
|
|
@login_required
|
|
@mfa_login_required
|
|
def addpost(request) -> HttpResponse:
|
|
context = {'alltopics': Topic.objects.all().order_by('name').values(), 'markdown': '',
|
|
'roottopics': Topic.objects.all().filter(rootTopic=None),
|
|
'allposts': Blogpost.objects.all().order_by("title")}
|
|
if request.method == 'POST':
|
|
title = request.POST['title']
|
|
markdown = request.POST['markdown']
|
|
|
|
tags = []
|
|
|
|
if 'tags' in request.POST and request.POST['tags'] != '':
|
|
tags_str = request.POST['tags'].split(" ")
|
|
for tag in tags_str:
|
|
tagobj = Tag.objects.get_or_create(name=tag)[0]
|
|
tagobj.save()
|
|
tags.append(tagobj.id)
|
|
|
|
topicid = request.POST['topic']
|
|
topic = None if topicid == "No topic" else Topic.objects.get(pk=topicid)
|
|
|
|
filepath = os.path.join(os.environ.get("MD_FILE_PATH"), title + ".md")
|
|
|
|
try:
|
|
new_post = Blogpost.objects.create(title=title, topic=topic, mdfile=filepath)
|
|
new_post.tags.set(tags)
|
|
except IntegrityError:
|
|
context = {'alltopics': Topic.objects.all().order_by('name').values(),
|
|
'error': 'Blogpost titles need to be unique. No post created.',
|
|
"markdown": markdown}
|
|
return render(request, 'blog/addpost.html', context)
|
|
|
|
with open(filepath, "w+") as mdfile:
|
|
mdfile.write(markdown)
|
|
mdfile.close()
|
|
context['error'] = "Post \"" + title + "\" created."
|
|
|
|
return render(request, 'blog/addpost.html', context)
|
|
|
|
|
|
# @login_required
|
|
# @mfa_login_required
|
|
# def createmocks(request, objtype, n) -> HttpResponse:
|
|
# topics = TopicFactory.create_batch(n)
|
|
#
|
|
# for topic in topics:
|
|
# topic.save()
|
|
#
|
|
# while len(topics) > 1:
|
|
# child = random.choice(topics)
|
|
# topics.remove(child)
|
|
# child.rootTopic = random.choice(topics)
|
|
# child.save()
|
|
#
|
|
# print('Created ' + str(n) + ' mock topics.')
|
|
# return redirect("index")
|
|
|
|
|
|
@login_required
|
|
@mfa_login_required
|
|
def addtopic(request):
|
|
context = {'roottopics': Topic.objects.all().filter(rootTopic=None),
|
|
'allposts': Blogpost.objects.all().order_by("title")}
|
|
|
|
if request.method == 'POST':
|
|
topictitle = request.POST['title']
|
|
Topic.objects.get_or_create(name=topictitle)
|
|
|
|
return render(request, 'blog/addtopic.html', context)
|