2025.09.14-18:02:28
This commit is contained in:
0
tinywiki/__init__.py
Normal file
0
tinywiki/__init__.py
Normal file
3
tinywiki/admin.py
Normal file
3
tinywiki/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
||||
6
tinywiki/apps.py
Normal file
6
tinywiki/apps.py
Normal 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
42
tinywiki/enums.py
Normal 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,
|
||||
)
|
||||
44
tinywiki/migrations/0001_initial.py
Normal file
44
tinywiki/migrations/0001_initial.py
Normal 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')),
|
||||
],
|
||||
),
|
||||
]
|
||||
26
tinywiki/migrations/0002_initial_data.py
Normal file
26
tinywiki/migrations/0002_initial_data.py
Normal 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)
|
||||
]
|
||||
|
||||
0
tinywiki/migrations/__init__.py
Normal file
0
tinywiki/migrations/__init__.py
Normal file
91
tinywiki/models.py
Normal file
91
tinywiki/models.py
Normal 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
19
tinywiki/settings.py
Normal 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',
|
||||
}
|
||||
}
|
||||
0
tinywiki/templates/tinywiki/base.html
Normal file
0
tinywiki/templates/tinywiki/base.html
Normal file
3
tinywiki/tests.py
Normal file
3
tinywiki/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
||||
7
tinywiki/urls.py
Normal file
7
tinywiki/urls.py
Normal file
@@ -0,0 +1,7 @@
|
||||
from django.urls import path
|
||||
|
||||
app_name = "tinywiki"
|
||||
|
||||
urlpatterns = [
|
||||
|
||||
]
|
||||
3
tinywiki/views.py
Normal file
3
tinywiki/views.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
||||
Reference in New Issue
Block a user