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)