began adding addpost function
This commit is contained in:
parent
81c455f014
commit
c50d047233
15 changed files with 106 additions and 21 deletions
2
.idea/jsLibraryMappings.xml
generated
2
.idea/jsLibraryMappings.xml
generated
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
<project version="4">
|
<project version="4">
|
||||||
<component name="JavaScriptLibraryMappings">
|
<component name="JavaScriptLibraryMappings">
|
||||||
<file url="file://$PROJECT_DIR$" libraries="{jquery-3.6.0, jquery-3.6.0.slim, simplemde}" />
|
<file url="file://$PROJECT_DIR$" libraries="{jquery-3.6.0, jquery-3.6.0.slim, js-cookie, simplemde}" />
|
||||||
</component>
|
</component>
|
||||||
</project>
|
</project>
|
||||||
1
.idea/mdblog.iml
generated
1
.idea/mdblog.iml
generated
|
|
@ -23,6 +23,7 @@
|
||||||
<orderEntry type="library" name="jquery-3.6.0.slim" level="application" />
|
<orderEntry type="library" name="jquery-3.6.0.slim" level="application" />
|
||||||
<orderEntry type="library" name="jquery-3.6.0" level="application" />
|
<orderEntry type="library" name="jquery-3.6.0" level="application" />
|
||||||
<orderEntry type="library" name="simplemde" level="application" />
|
<orderEntry type="library" name="simplemde" level="application" />
|
||||||
|
<orderEntry type="library" name="js-cookie" level="application" />
|
||||||
</component>
|
</component>
|
||||||
<component name="PyDocumentationSettings">
|
<component name="PyDocumentationSettings">
|
||||||
<option name="format" value="PLAIN" />
|
<option name="format" value="PLAIN" />
|
||||||
|
|
|
||||||
6
.idea/sqldialects.xml
generated
6
.idea/sqldialects.xml
generated
|
|
@ -1,6 +0,0 @@
|
||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<project version="4">
|
|
||||||
<component name="SqlDialectMappings">
|
|
||||||
<file url="file://$PROJECT_DIR$/markdownblog/db_scripts/init_user_db.sql" dialect="PostgreSQL" />
|
|
||||||
</component>
|
|
||||||
</project>
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
import factory
|
import factory
|
||||||
|
|
||||||
from blog.models import Topic
|
from blog.models import Topic, Blogpost, Tag
|
||||||
|
|
||||||
|
|
||||||
class TopicFactory(factory.Factory):
|
class TopicFactory(factory.Factory):
|
||||||
|
|
@ -9,3 +9,16 @@ class TopicFactory(factory.Factory):
|
||||||
|
|
||||||
name = factory.Faker("word")
|
name = factory.Faker("word")
|
||||||
numbered = False
|
numbered = False
|
||||||
|
|
||||||
|
|
||||||
|
class PostFactory(factory.Factory):
|
||||||
|
class Meta:
|
||||||
|
model = Blogpost
|
||||||
|
|
||||||
|
title = factory.Faker("word")
|
||||||
|
tags = Tag.objects.all()[0] if len(Tag.objects.all()) != 0 else None
|
||||||
|
if len(Topic.objects.all()) == 0:
|
||||||
|
TopicFactory.create_batch(10)
|
||||||
|
topics = Topic.objects.all()[0]
|
||||||
|
|
||||||
|
mdfile = "/tmp/test.md"
|
||||||
|
|
|
||||||
19
markdownblog/blog/migrations/0003_blogpost_mdfile.py
Normal file
19
markdownblog/blog/migrations/0003_blogpost_mdfile.py
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-06-01 19:13
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('blog', '0002_alter_blogpost_topics_alter_topic_roottopic'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AddField(
|
||||||
|
model_name='blogpost',
|
||||||
|
name='mdfile',
|
||||||
|
field=models.CharField(default='/tmp/test.md', max_length=255),
|
||||||
|
preserve_default=False,
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,18 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-06-01 19:19
|
||||||
|
|
||||||
|
from django.db import migrations
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('blog', '0003_blogpost_mdfile'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.RenameField(
|
||||||
|
model_name='blogpost',
|
||||||
|
old_name='topics',
|
||||||
|
new_name='topic',
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -16,8 +16,13 @@ class Topic(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Blogpost(models.Model):
|
class Blogpost(models.Model):
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return str(self.title)
|
||||||
|
|
||||||
created = models.DateTimeField(auto_now_add=True)
|
created = models.DateTimeField(auto_now_add=True)
|
||||||
last_modified = models.DateTimeField(auto_now=True)
|
last_modified = models.DateTimeField(auto_now=True)
|
||||||
title = models.CharField(max_length=255)
|
title = models.CharField(max_length=255)
|
||||||
tags = models.ManyToManyField(Tag)
|
tags = models.ManyToManyField(Tag)
|
||||||
topics = models.ForeignKey(Topic, blank=True, null=True, on_delete=models.CASCADE)
|
topic = models.ForeignKey(Topic, blank=True, null=True, on_delete=models.CASCADE)
|
||||||
|
mdfile = models.CharField(max_length=255)
|
||||||
|
|
|
||||||
|
|
@ -5,5 +5,5 @@ urlpatterns = [
|
||||||
path('', viewblog, name="index"),
|
path('', viewblog, name="index"),
|
||||||
path('manage/addpost', addpost, name='addpost'),
|
path('manage/addpost', addpost, name='addpost'),
|
||||||
path('manage/order', order, name='order'),
|
path('manage/order', order, name='order'),
|
||||||
path('mock/topic/<int:n>/', createmocks, name='mock'),
|
path('mock/<str:object>/<int:n>/', createmocks, name='mock'),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,7 @@ from django.contrib.auth.decorators import login_required
|
||||||
from django.http import HttpResponse
|
from django.http import HttpResponse
|
||||||
from django.shortcuts import render, redirect
|
from django.shortcuts import render, redirect
|
||||||
from blog.factories import TopicFactory
|
from blog.factories import TopicFactory
|
||||||
from blog.models import Topic
|
from blog.models import Topic, Tag, Blogpost
|
||||||
|
|
||||||
from markdownblog import settings
|
from markdownblog import settings
|
||||||
|
|
||||||
|
|
@ -15,16 +15,34 @@ def viewblog(request) -> HttpResponse:
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def order(request):
|
def order(request):
|
||||||
return None
|
return render(request, 'blog/order.html')
|
||||||
|
|
||||||
|
|
||||||
@login_required
|
@login_required
|
||||||
def addpost(request) -> HttpResponse:
|
def addpost(request) -> HttpResponse:
|
||||||
|
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:
|
||||||
|
tags.append(Tag.objects.filter(name=tag)[0])
|
||||||
|
|
||||||
|
topicstr = request.POST['topic']
|
||||||
|
topics = None if topicstr == "No topic" else Topic.objects.filter(name=topicstr)[0]
|
||||||
|
|
||||||
|
new_post = Blogpost.objects.create(title=title, topics=topics)
|
||||||
|
new_post.tags.set(tags)
|
||||||
|
|
||||||
context = {'alltopics': Topic.objects.all().order_by('name').values()}
|
context = {'alltopics': Topic.objects.all().order_by('name').values()}
|
||||||
return render(request, 'blog/addpost.html', context)
|
return render(request, 'blog/addpost.html', context)
|
||||||
|
|
||||||
|
|
||||||
def createmocks(request, n) -> HttpResponse:
|
def createmocks(request, objtype, n) -> HttpResponse:
|
||||||
|
|
||||||
topics = TopicFactory.create_batch(n)
|
topics = TopicFactory.create_batch(n)
|
||||||
|
|
||||||
for topic in topics:
|
for topic in topics:
|
||||||
|
|
|
||||||
|
|
@ -126,3 +126,5 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
|
||||||
|
|
||||||
LOGIN_REDIRECT_URL = "/"
|
LOGIN_REDIRECT_URL = "/"
|
||||||
LOGOUT_REDIRECT_URL = "/"
|
LOGOUT_REDIRECT_URL = "/"
|
||||||
|
|
||||||
|
CSRF_HEADER_NAME = "X-CSRFToken"
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,9 @@
|
||||||
.posttitle {
|
.posttitle {
|
||||||
border: 1px solid #eaeaea;
|
border: 1px solid #eaeaea;
|
||||||
border-radius: 5px;
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#input_title {
|
||||||
|
font-size: 2.3em;
|
||||||
|
margin-top: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
@ -4,7 +4,6 @@
|
||||||
<head>
|
<head>
|
||||||
<meta charset="UTF-8">
|
<meta charset="UTF-8">
|
||||||
<title>{% block title %}{% endblock %}</title>
|
<title>{% block title %}{% endblock %}</title>
|
||||||
<!-- Compiled and minified CSS -->
|
|
||||||
<link type="text/css" rel="stylesheet"
|
<link type="text/css" rel="stylesheet"
|
||||||
href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"
|
href="https://cdnjs.cloudflare.com/ajax/libs/materialize/1.0.0/css/materialize.min.css"
|
||||||
media="screen,projection"/>
|
media="screen,projection"/>
|
||||||
|
|
@ -24,7 +23,7 @@
|
||||||
<ul id="slide-out" class="sidenav sidenav-fixed">
|
<ul id="slide-out" class="sidenav sidenav-fixed">
|
||||||
{% if user.is_authenticated %}
|
{% if user.is_authenticated %}
|
||||||
<li><a class="waves-effect" href="{% url 'addpost' %}"><i class="material-icons">add</i>New post</a></li>
|
<li><a class="waves-effect" href="{% url 'addpost' %}"><i class="material-icons">add</i>New post</a></li>
|
||||||
<li><a class="waves-effect" href="{% url 'addpost' %}"><i class="material-icons">reorder</i>Manage posts</a>
|
<li><a class="waves-effect" href="{% url 'order' %}"><i class="material-icons">reorder</i>Manage posts</a>
|
||||||
</li>
|
</li>
|
||||||
<li>
|
<li>
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,7 @@
|
||||||
{% extends 'base/base.html' %}
|
{% extends 'base/base.html' %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
Neuer Post
|
New Post
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block includehere %}
|
{% block includehere %}
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
|
||||||
|
|
@ -9,20 +9,20 @@
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<div class="col s12">
|
<div class="col s12">
|
||||||
<form method="post" action="{% url 'addpost' %}">
|
<form action="{% url 'addpost' %}" method="post" enctype="multipart/form-data">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<h3 contenteditable="true" class="posttitle">Titel</h3>
|
<input name="title" type="text" class="posttitle" id="input_title" value="Title">
|
||||||
<textarea>
|
<textarea name="markdown" id="mde">
|
||||||
</textarea>
|
</textarea>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col s6">
|
<div class="col s6">
|
||||||
<label>
|
<label>
|
||||||
Tags
|
Tags
|
||||||
<input type="text">
|
<input type="text" id="input_tags" name="tags">
|
||||||
</label>
|
</label>
|
||||||
</div>
|
</div>
|
||||||
<div class="input-field col s6">
|
<div class="input-field col s6">
|
||||||
<select>
|
<select name="topic" id="topic_select">
|
||||||
<option selected>No topic</option>
|
<option selected>No topic</option>
|
||||||
{% for topic in alltopics %}
|
{% for topic in alltopics %}
|
||||||
<option value="{{ topic.id }}">{{ topic.name }}</option>
|
<option value="{{ topic.id }}">{{ topic.name }}</option>
|
||||||
|
|
@ -102,6 +102,8 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
});
|
});
|
||||||
|
|
||||||
|
$("#mde").data({editor: simplemde});
|
||||||
</script>
|
</script>
|
||||||
<script>
|
<script>
|
||||||
|
|
||||||
|
|
|
||||||
9
markdownblog/markdownblog/templates/blog/order.html
Normal file
9
markdownblog/markdownblog/templates/blog/order.html
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
{% extends 'base/base.html' %}
|
||||||
|
{% load static %}
|
||||||
|
{% block title %}
|
||||||
|
Order Topics
|
||||||
|
{% endblock %}
|
||||||
|
{% block includehere %}
|
||||||
|
{% endblock %}
|
||||||
|
{% block content %}
|
||||||
|
{% endblock %}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue