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 blog.models import Blogpost, Topic, Tag
|
||||
|
||||
|
||||
# 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):
|
||||
|
||||
def __str__(self) -> str:
|
||||
return str(self.name)
|
||||
|
||||
name = models.CharField(max_length=255)
|
||||
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):
|
||||
|
|
@ -16,4 +20,4 @@ class Blogpost(models.Model):
|
|||
last_modified = models.DateTimeField(auto_now=True)
|
||||
title = models.CharField(max_length=255)
|
||||
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
|
||||
|
||||
# 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
|
||||
|
||||
urlpatterns = [
|
||||
path('', viewblog),
|
||||
path('', viewblog, name="index"),
|
||||
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):
|
||||
return render(request, 'blog/index.html')
|
||||
def viewblog(request) -> HttpResponse:
|
||||
return render(request, 'blog/index.html', {"debug": settings.DEBUG})
|
||||
|
||||
|
||||
def addpost(request):
|
||||
@login_required
|
||||
def addpost(request) -> HttpResponse:
|
||||
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">
|
||||
{% 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">reorder</i>Manage posts</a>
|
||||
</li>
|
||||
<li>
|
||||
<div class="divider"></div>
|
||||
</li>
|
||||
|
|
@ -31,6 +33,17 @@
|
|||
class="material-icons">admin_panel_settings</i>Admin
|
||||
panel</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 %}
|
||||
<li><a class="waves-effect" href="{% url 'login' %}"><i class="material-icons">login</i>Login</a></li>
|
||||
{% endif %}
|
||||
|
|
|
|||
|
|
@ -1,15 +1,30 @@
|
|||
{% extends 'base/base.html' %}
|
||||
{% load static %}
|
||||
{% block title %}
|
||||
Neuer Post
|
||||
{% endblock %}
|
||||
{% block includehere %}
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/simplemde/latest/simplemde.min.css">
|
||||
<link rel="stylesheet" href="{% static 'addpost.css' %}">
|
||||
{% endblock %}
|
||||
{% block content %}
|
||||
<h3>Neuen Post erstellen</h3>
|
||||
<div class="col s12">
|
||||
<textarea>
|
||||
</textarea>
|
||||
<form method="post" action="{% url 'addpost' %}">
|
||||
{% csrf_token %}
|
||||
<h3 contenteditable="true" class="posttitle">Titel</h3>
|
||||
<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>
|
||||
{% endblock %}
|
||||
{% block scripts %}
|
||||
|
|
|
|||
|
|
@ -1,2 +1,3 @@
|
|||
django>=4.0.4
|
||||
psycopg2-binary>=2.9.3
|
||||
django==4.0.5
|
||||
psycopg2-binary>=2.9.3
|
||||
factory-boy>=3.2.1
|
||||
Loading…
Add table
Add a link
Reference in a new issue