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