implemented mocking topics

This commit is contained in:
CDaut 2022-06-01 16:54:47 +02:00 committed by CDaut
parent f3297544f9
commit dfb3b30271
12 changed files with 169 additions and 16 deletions

View file

@ -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)

View 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

View 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')),
],
),
]

View file

@ -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'),
),
]

View file

@ -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)

View file

@ -1,3 +1 @@
from django.test import TestCase from django.test import TestCase
# Create your tests here.

View file

@ -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'),
] ]

View file

@ -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")

View file

@ -0,0 +1,4 @@
.posttitle {
border: 1px solid #eaeaea;
border-radius: 5px;
}

View file

@ -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 %}

View file

@ -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 %}

View file

@ -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