2025.09.14-18:02:28

This commit is contained in:
2025-09-14 18:02:28 +02:00
parent 565ef0cad1
commit ff37c9cd8b
32 changed files with 733 additions and 22 deletions

0
tinywiki/__init__.py Normal file
View File

3
tinywiki/admin.py Normal file
View File

@@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

6
tinywiki/apps.py Normal file
View File

@@ -0,0 +1,6 @@
from django.apps import AppConfig
class TinywikiConfig(AppConfig):
default_auto_field = 'django.db.models.BigAutoField'
name = 'tinywiki'

42
tinywiki/enums.py Normal file
View File

@@ -0,0 +1,42 @@
from enum import StrEnum
from django.utils.translation import gettext,gettext_lazy,gettext_noop as _
class WikiContentType(StrEnum):
MARKDOWN = "markdown"
BBCODE = "bbcode"
@property
def str_raw(self)->str:
mapping = {
WikiContentType.MARKDOWN: _("Markdown"),
WikiContentType.BBCODE: _("BBCode")
}
return mapping[self]
@staticmethod
def from_string(string:str)->"WikiContentType":
mapping = {
WikiContentType.MARKDOWN.value: WikiContentType.MARKDOWN,
WikiContentType.BBCODE.value: WikiContentType.BBCODE,
}
return mapping[string.lower()]
@property
def str_lazy(self)->str:
return gettext_lazy(self.str_raw)
@property
def str(self)->str:
return gettext(self.str_raw)
def __str__(self):
return self.str
def __repr__(self):
return f"<{self.__qualname__}: {self.value.upper()}>"
WIKI_CONTENT_TYPES = (
WikiContentType.MARKDOWN,
WikiContentType.BBCODE,
)

View File

@@ -0,0 +1,44 @@
# Generated by Django 5.2.4 on 2025-09-14 13:31
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.CreateModel(
name='Image',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('slug', models.SlugField(max_length=255, verbose_name='slug')),
('alt', models.CharField(max_length=511, verbose_name='alternative text')),
('description', models.CharField(blank=True, max_length=1023, null=True, verbose_name='description')),
('image', models.ImageField(upload_to='tinywiki/img', verbose_name='image file')),
('uploaded_at', models.DateTimeField(auto_now_add=True, verbose_name='upladed at')),
('uploaded_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tinywiki_image_uploads', to=settings.AUTH_USER_MODEL, verbose_name='uploaded by')),
],
),
migrations.CreateModel(
name='Page',
fields=[
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('slug', models.SlugField(max_length=255, unique=True, verbose_name='slug')),
('title', models.CharField(max_length=255, verbose_name='title')),
('content_type_data', models.CharField(choices=[('markdown', 'Markdown'), ('bbcode', 'BBCode')], default='bbcode', verbose_name='content type')),
('content', models.TextField(verbose_name='Page content')),
('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')),
('last_edited_at', models.DateTimeField(auto_now=True, verbose_name='last edited at')),
('author', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tinywiki_athors', to=settings.AUTH_USER_MODEL, verbose_name='author')),
('created_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tinywiki_created', to=settings.AUTH_USER_MODEL, verbose_name='created by')),
('last_edited_by', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='tinywiki_last_edited', to=settings.AUTH_USER_MODEL, verbose_name='last edited by')),
],
),
]

View File

@@ -0,0 +1,26 @@
# Generated by Django 5.2.4 on 2025-09-14 13:15
from django.db import migrations
from .. import settings
class Migration(migrations.Migration):
dependencies = [
('tinywiki', '0001_initial'),
]
def init_tinywiki_user(apps,schema_editor):
from django.contrib.auth import get_user_model
user = get_user_model.objects.create_user(**settings.TINYWIKI_USER_CONFIG)
def init_default_pages(apps,schema_editor)->None:
from ..models import Page,Image
#TODO
def init_user_pages(apps,schema_edit)->None:
from ..models import Page,Image
#TODO
operations = [
migrations.RunPython(init_tinywiki_user),
migrations.RunPython(init_default_pages)
]

View File

91
tinywiki/models.py Normal file
View File

@@ -0,0 +1,91 @@
from tabnanny import verbose
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.conf import settings
from django.contrib.auth import get_user_model
from django.utils.safestring import mark_safe,SafeText
from tinywiki.enums import WIKI_CONTENT_TYPES, WikiContentType
import markdown
import bbcode
class Page(models.Model):
slug = models.SlugField(_("slug"),
max_length=255,
null=False,
blank=False,
unique=True)
title = models.CharField(_("title"),
max_length=255,
null=False,
blank=False)
author = models.ForeignKey(get_user_model(),
on_delete=models.SET_NULL,
verbose_name=_("author"),
null=True,
blank=True,
related_name="tinywiki_athors")
content_type_data = models.CharField(_("content type"),
choices=[(i.value,i.str_lazy) for i in WIKI_CONTENT_TYPES],
default=WikiContentType.BBCODE.value)
content = models.TextField(_("Page content"),
null=False,
blank=False)
created_at = models.DateTimeField(_("created at"),
auto_now_add=True)
created_by = models.ForeignKey(get_user_model(),
on_delete=models.SET_NULL,
verbose_name=_("created by"),
null=True,
blank=True,
related_name="tinywiki_created")
last_edited_at = models.DateTimeField(_("last edited at"),
auto_now=True)
last_edited_by = models.ForeignKey(get_user_model(),
on_delete=models.SET_NULL,
verbose_name=_("last edited by"),
null=True,
blank=True,
related_name="tinywiki_last_edited")
@property
def content_type(self)->WikiContentType:
return WikiContentType.from_string(self.content_type_data)
@property
def html_content(self)->SafeText|str:
if self.content_type == WikiContentType.MARKDOWN:
return mark_safe(markdown.markdown(self.content))
elif self.content_type == WikiContentType.BBCODE:
return mark_safe(bbcode.render_html(self.content))
return self.content
class Image(models.Model):
models.ManyToManyField(Page, verbose_name=_(""))
slug = models.SlugField(_("slug"),
max_length=255)
alt = models.CharField(_("alternative text"),
max_length=511,
null=False,
blank=False)
description = models.CharField(_("description"),
max_length=1023,
null=True,
blank=True)
image = models.ImageField(_("image file"),
upload_to="tinywiki/img")
uploaded_by = models.ForeignKey(get_user_model(),
on_delete=models.SET_NULL,
verbose_name=_("uploaded by"),
null=True,
blank=True,
related_name="tinywiki_image_uploads")
uploaded_at = models.DateTimeField(_("uploaded at"),
auto_now_add=True)

19
tinywiki/settings.py Normal file
View File

@@ -0,0 +1,19 @@
from pathlib import Path
from django.conf import settings
TINYWIKI_USER_CONFIG = getattr(settings,
"TINYWIKI_USER_CONFIG",
{
"username":"TinyWiki",
"email":"tinywiki@example.com"
})
TINYWIKI_USER_LOOKUP = getattr(settings,
"TINYWIKI_USER_LOOKUP",
{'username':"TinyWiki"})
TINYWIKI_BOOSTRAP_TAGS = {
'img': {
'class':'img-fluid',
}
}

View File

3
tinywiki/tests.py Normal file
View File

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

7
tinywiki/urls.py Normal file
View File

@@ -0,0 +1,7 @@
from django.urls import path
app_name = "tinywiki"
urlpatterns = [
]

3
tinywiki/views.py Normal file
View File

@@ -0,0 +1,3 @@
from django.shortcuts import render
# Create your views here.