2025.09.17-19:07:57

This commit is contained in:
2025-09-17 19:07:58 +02:00
parent ff37c9cd8b
commit 38a85cb9d5
47 changed files with 1530 additions and 38 deletions

94
tinywiki/views/home.py Normal file
View File

@@ -0,0 +1,94 @@
from curses.ascii import isalpha
from django.shortcuts import render
from tinywiki import settings
from .base import View
from django.http import HttpRequest,HttpResponse
from django.db.models.functions import Lower
import string
from ..models import Page
from ..enums import WikiPageStatus
from django.utils.translation import ngettext, gettext as _
# Create your views here.
class HomeView(View):
template_name = "tinywiki/home/home.html"
def get(self,request):
try:
page = Page.objects.get(slug='tw-home')
except Page.DoesNotExist:
page = None
return render(request,
self.get_template_name(),
self.get_context_data(page=page))
class TocView(View):
template_name = "tinywiki/home/wiki-content.html"
bs_template_name = "tinywiki/home/bs-wiki-content.html"
@classmethod
def get_template_name(cls):
if settings.USE_BOOTSTRAP:
return cls.bs_template_name
return cls.template_name
def get(self,request):
def mkdict(page:Page):
return {'slug':page.slug,'title':page.title, 'is_system':page.slug.startswith('tw-')}
user = self.request.user
if (user.is_staff or user.has_perm('page.read_all')):
pages = Page.objects.all()
else:
pages = Page.objects.filter(status_data=WikiPageStatus.PUBLISHED.value)
toc_mapping = {}
for page in pages:
first_char = page.title.lstrip()[0].upper()
if first_char.isdigit():
if '0-9' not in toc_mapping:
toc_mapping['0-9'] = [mkdict(page)]
else:
toc_mapping['0-9'].append(mkdict(page))
elif first_char in string.punctuation:
if '#' not in toc_mapping:
toc_mapping['#'] = [mkdict(page)]
else:
toc_mapping['#'].append(mkdict(page))
else:
if first_char not in toc_mapping:
toc_mapping[first_char] = [mkdict(page)]
else:
toc_mapping[first_char].append(mkdict(page))
toc = []
for key in sorted(toc_mapping.keys()):
toc_entries = toc_mapping[key]
count = len(toc_mapping[key])
split = (count + 1) // 2
pages_0 = toc_entries[:split]
if split >= count:
pages_1 = []
else:
pages_1 = toc_entries[split:]
if (key.startswith('0') or key == '#'):
toc_section = key
else:
toc_section = f"{key}..."
toc_section = ngettext("{toc_section} ({n} page)","{toc_section} ({n} pages)", count).format(
toc_section=toc_section,
n=count,
)
toc.append((toc_section,pages_0,pages_1))
return render(request,
self.get_template_name(),
self.get_context_data(toc=toc,subtitle=_("Table of Contents")))