Files
django-tinywiki/tinywiki/views/home.py
2025-09-17 19:07:58 +02:00

94 lines
3.2 KiB
Python

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