mdblog/markdownblog/blog/views.py

172 lines
6.2 KiB
Python

import os
import random
import re
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 markdownblog import settings
def viewblog(request, title) -> HttpResponse:
post = Blogpost.objects.get(title=title)
filepath = os.path.join(os.environ.get("MD_FILE_PATH"), title + ".md")
with open(filepath, '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({}))
context = {'post': post, 'html': rendered_html, 'roottopics': Topic.objects.all().filter(rootTopic=None),
'allposts': Blogpost.objects.all()}
return render(request, 'blog/viewpost.html', context)
def index(request) -> HttpResponse:
context = {'roottopics': Topic.objects.all().filter(rootTopic=None), 'allposts': Blogpost.objects.all(),
'debug': settings.DEBUG}
return render(request, 'blog/index.html', context)
@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(), '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
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()}
return render(request, 'blog/order.html', context)
@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()}
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
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
def addtopic(request):
context = {'roottopics': Topic.objects.all().filter(rootTopic=None), 'allposts': Blogpost.objects.all()}
if request.method == 'POST':
topictitle = request.POST['title']
Topic.objects.get_or_create(name=topictitle)
return render(request, 'blog/addtopic.html', context)