implemented mocking topics
This commit is contained in:
parent
f3297544f9
commit
dfb3b30271
12 changed files with 169 additions and 16 deletions
|
|
@ -1,3 +1,20 @@
|
||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
|
from blog.models import Blogpost, Topic, Tag
|
||||||
|
|
||||||
|
|
||||||
# Register your models here.
|
# Register your models here.
|
||||||
|
class BlogPostAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class TopicAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class TagAdmin(admin.ModelAdmin):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
admin.site.register(Blogpost, BlogPostAdmin)
|
||||||
|
admin.site.register(Topic, TopicAdmin)
|
||||||
|
admin.site.register(Tag, TagAdmin)
|
||||||
|
|
|
||||||
11
markdownblog/blog/factories.py
Normal file
11
markdownblog/blog/factories.py
Normal file
|
|
@ -0,0 +1,11 @@
|
||||||
|
import factory
|
||||||
|
|
||||||
|
from blog.models import Topic
|
||||||
|
|
||||||
|
|
||||||
|
class TopicFactory(factory.Factory):
|
||||||
|
class Meta:
|
||||||
|
model = Topic
|
||||||
|
|
||||||
|
name = factory.Faker("word")
|
||||||
|
numbered = False
|
||||||
42
markdownblog/blog/migrations/0001_initial.py
Normal file
42
markdownblog/blog/migrations/0001_initial.py
Normal file
|
|
@ -0,0 +1,42 @@
|
||||||
|
# Generated by Django 4.0.4 on 2022-06-01 08:31
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
initial = True
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Tag',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=255)),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Topic',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('name', models.CharField(max_length=255)),
|
||||||
|
('numbered', models.BooleanField(default=False)),
|
||||||
|
('rootTopic', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='blog.topic')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
migrations.CreateModel(
|
||||||
|
name='Blogpost',
|
||||||
|
fields=[
|
||||||
|
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
|
('created', models.DateTimeField(auto_now_add=True)),
|
||||||
|
('last_modified', models.DateTimeField(auto_now=True)),
|
||||||
|
('title', models.CharField(max_length=255)),
|
||||||
|
('tags', models.ManyToManyField(to='blog.tag')),
|
||||||
|
('topics', models.ForeignKey(blank=True, on_delete=django.db.models.deletion.CASCADE, to='blog.topic')),
|
||||||
|
],
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -0,0 +1,24 @@
|
||||||
|
# Generated by Django 4.0.5 on 2022-06-01 14:09
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('blog', '0001_initial'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='blogpost',
|
||||||
|
name='topics',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.topic'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='topic',
|
||||||
|
name='rootTopic',
|
||||||
|
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='blog.topic'),
|
||||||
|
),
|
||||||
|
]
|
||||||
|
|
@ -6,9 +6,13 @@ class Tag(models.Model):
|
||||||
|
|
||||||
|
|
||||||
class Topic(models.Model):
|
class Topic(models.Model):
|
||||||
|
|
||||||
|
def __str__(self) -> str:
|
||||||
|
return str(self.name)
|
||||||
|
|
||||||
name = models.CharField(max_length=255)
|
name = models.CharField(max_length=255)
|
||||||
numbered = models.BooleanField(default=False)
|
numbered = models.BooleanField(default=False)
|
||||||
rootTopic = models.ForeignKey('self', blank=True, on_delete=models.CASCADE)
|
rootTopic = models.ForeignKey('self', blank=True, null=True, on_delete=models.CASCADE)
|
||||||
|
|
||||||
|
|
||||||
class Blogpost(models.Model):
|
class Blogpost(models.Model):
|
||||||
|
|
@ -16,4 +20,4 @@ class Blogpost(models.Model):
|
||||||
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, on_delete=models.CASCADE)
|
topics = models.ForeignKey(Topic, blank=True, null=True, on_delete=models.CASCADE)
|
||||||
|
|
|
||||||
|
|
@ -1,3 +1 @@
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
|
|
||||||
# Create your tests here.
|
|
||||||
|
|
|
||||||
|
|
@ -1,7 +1,8 @@
|
||||||
from blog.views import viewblog, addpost
|
from blog.views import viewblog, addpost, createmocks
|
||||||
from django.urls import path
|
from django.urls import path
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path('', viewblog),
|
path('', viewblog, name="index"),
|
||||||
path('manage/add/', addpost, name='addpost'),
|
path('manage/add/', addpost, name='addpost'),
|
||||||
|
path('mock/topic/<int:n>/', createmocks, name='mock'),
|
||||||
]
|
]
|
||||||
|
|
|
||||||
|
|
@ -1,10 +1,33 @@
|
||||||
from django.shortcuts import render
|
import random
|
||||||
|
|
||||||
|
from django.contrib.auth.decorators import login_required
|
||||||
|
from django.http import HttpResponse
|
||||||
|
from django.shortcuts import render, redirect
|
||||||
|
from blog.factories import TopicFactory
|
||||||
|
|
||||||
|
from markdownblog import settings
|
||||||
|
|
||||||
|
|
||||||
# Create your views here.
|
def viewblog(request) -> HttpResponse:
|
||||||
def viewblog(request):
|
return render(request, 'blog/index.html', {"debug": settings.DEBUG})
|
||||||
return render(request, 'blog/index.html')
|
|
||||||
|
|
||||||
|
|
||||||
def addpost(request):
|
@login_required
|
||||||
|
def addpost(request) -> HttpResponse:
|
||||||
return render(request, 'blog/addpost.html')
|
return render(request, 'blog/addpost.html')
|
||||||
|
|
||||||
|
|
||||||
|
def createmocks(request, 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")
|
||||||
|
|
|
||||||
4
markdownblog/markdownblog/static/addpost.css
Normal file
4
markdownblog/markdownblog/static/addpost.css
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
.posttitle {
|
||||||
|
border: 1px solid #eaeaea;
|
||||||
|
border-radius: 5px;
|
||||||
|
}
|
||||||
|
|
@ -24,6 +24,8 @@
|
||||||
<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>
|
||||||
<li>
|
<li>
|
||||||
<div class="divider"></div>
|
<div class="divider"></div>
|
||||||
</li>
|
</li>
|
||||||
|
|
@ -31,6 +33,17 @@
|
||||||
class="material-icons">admin_panel_settings</i>Admin
|
class="material-icons">admin_panel_settings</i>Admin
|
||||||
panel</a></li>
|
panel</a></li>
|
||||||
<li><a class="waves-effect" href="{% url 'logout' %}"><i class="material-icons">logout</i>Logout</a></li>
|
<li><a class="waves-effect" href="{% url 'logout' %}"><i class="material-icons">logout</i>Logout</a></li>
|
||||||
|
{% if debug %}
|
||||||
|
<li>
|
||||||
|
<div class="divider"></div>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="waves-effect" href="{% url 'mock' n=10 %}">Mock 10 topics</a>
|
||||||
|
</li>
|
||||||
|
<li>
|
||||||
|
<a class="waves-effect" href="{% url 'admin:index' %}">Mock Posts</a>
|
||||||
|
</li>
|
||||||
|
{% endif %}
|
||||||
{% else %}
|
{% else %}
|
||||||
<li><a class="waves-effect" href="{% url 'login' %}"><i class="material-icons">login</i>Login</a></li>
|
<li><a class="waves-effect" href="{% url 'login' %}"><i class="material-icons">login</i>Login</a></li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
|
||||||
|
|
@ -1,15 +1,30 @@
|
||||||
{% extends 'base/base.html' %}
|
{% extends 'base/base.html' %}
|
||||||
|
{% load static %}
|
||||||
{% block title %}
|
{% block title %}
|
||||||
Neuer Post
|
Neuer 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">
|
||||||
|
<link rel="stylesheet" href="{% static 'addpost.css' %}">
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h3>Neuen Post erstellen</h3>
|
|
||||||
<div class="col s12">
|
<div class="col s12">
|
||||||
|
<form method="post" action="{% url 'addpost' %}">
|
||||||
|
{% csrf_token %}
|
||||||
|
<h3 contenteditable="true" class="posttitle">Titel</h3>
|
||||||
<textarea>
|
<textarea>
|
||||||
</textarea>
|
</textarea>
|
||||||
|
<div class="col s6">
|
||||||
|
<label>
|
||||||
|
Tags
|
||||||
|
<input type="text">
|
||||||
|
</label>
|
||||||
|
<button type="submit" class="waves-effect waves-light btn">
|
||||||
|
<i class="material-icons left">add</i>
|
||||||
|
Create Post
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
{% block scripts %}
|
{% block scripts %}
|
||||||
|
|
|
||||||
|
|
@ -1,2 +1,3 @@
|
||||||
django>=4.0.4
|
django==4.0.5
|
||||||
psycopg2-binary>=2.9.3
|
psycopg2-binary>=2.9.3
|
||||||
|
factory-boy>=3.2.1
|
||||||
Loading…
Add table
Add a link
Reference in a new issue