2025.10.06-03:08:05
This commit is contained in:
@@ -6,6 +6,57 @@ from typing import Any
|
||||
class Base:
|
||||
base_template_name = settings.TINYWIKI_BASE_TEMPLATE
|
||||
|
||||
@property
|
||||
def user_can_edit_pages(self)->bool:
|
||||
if (self.request.user.is_staff
|
||||
or self.request.user.has_perm('page.tiynwiki-edit')
|
||||
or self.request.user.has_perm('page.tinywiki-edit-all')):
|
||||
return True
|
||||
return False
|
||||
|
||||
@property
|
||||
def user_can_edit_all_pages(self)->bool:
|
||||
if (self.request.user.is_staff
|
||||
or self.request.user.has_perm('page.tinywiki-edit-all')):
|
||||
return True
|
||||
return False
|
||||
|
||||
@property
|
||||
def user_can_edit_system_pages(self)->bool:
|
||||
if (self.request.user.is_staff
|
||||
or self.request.user.has_perm('page.tiynwiki-edit-system')):
|
||||
return True
|
||||
return False
|
||||
|
||||
@property
|
||||
def user_can_create_pages(self)->bool:
|
||||
if (self.request.user.is_staff
|
||||
or self.request.user.has_perm('page.tiynwiki-create')):
|
||||
return True
|
||||
return False
|
||||
|
||||
@property
|
||||
def user_can_create_system_pages(self)->bool:
|
||||
if (self.request.user.is_staff
|
||||
or self.request.user.has_perm('page.tiynwiki-create-system')):
|
||||
return True
|
||||
return False
|
||||
|
||||
def page_is_creatable(self,slug:str)->bool:
|
||||
if not slug:
|
||||
return False
|
||||
if slug.startswith('tw-'):
|
||||
return self.user_can_create_system_pages
|
||||
return self.user_can_create_pages
|
||||
|
||||
def page_is_editable(self,page)->bool:
|
||||
if page.slug.startswith('tw-'):
|
||||
return self.user_can_edit_system_pages
|
||||
elif (self.user_can_edit_all_pages
|
||||
or (self.request.user.pk == page.author.pk and self.user_can_edit_pages)):
|
||||
return True
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
def get_base_template_name(cls)->str:
|
||||
return cls.base_template_name
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
from curses.ascii import isalpha
|
||||
from django.shortcuts import render
|
||||
from django.utils.safestring import mark_safe
|
||||
from django.urls import reverse
|
||||
|
||||
from django_project.settings import STATIC_URL
|
||||
from tinywiki import settings
|
||||
from .base import View
|
||||
from django.http import HttpRequest,HttpResponse
|
||||
@@ -18,12 +21,34 @@ class HomeView(View):
|
||||
def get(self,request):
|
||||
try:
|
||||
page = Page.objects.get(slug='tw-home')
|
||||
if (not Page.status == WikiPageStatus.PUBLISHED
|
||||
and not request.user.is_staff
|
||||
and not request.user.has_perm('page.view-all')):
|
||||
page = None
|
||||
|
||||
except Page.DoesNotExist:
|
||||
page = None
|
||||
if self.user_can_create_system_pages:
|
||||
if settings.USE_BOOTSTRAP:
|
||||
create_tw_home = f"<a class=\"icon-link icon-link-hover\" href={reverse("tinywiki:page",kwargs={'slug':'tw-home'})}>{_('create a new page with the slug <i>tw-home</i>')}<svg class=\"bi\"><use xlink:href=\"{settings.settings.STATIC_URL + 'tinywiki/icons/bootstrap-icons.svg' }#house-add\" ></use></svg></a>"
|
||||
else:
|
||||
create_tw_home = f"<a href={reverse("tinywiki:page",kwargs={'slug':'tw-home'})}>{_('create a new page with the slug <i>tw-home</i>')}</a>"
|
||||
else:
|
||||
create_tw_home = "create a new page with the slug <i>tw-home</i>"
|
||||
|
||||
if settings.USE_BOOTSTRAP:
|
||||
markdown_guide = f"<a class=\"icon-link icon-link-hover\" href={reverse('tinywiki:page',kwargs={'slug':'tw-markdown'})}>{_('Guide for markdown used by TinyWiki')}<svg class=\"bi\"><use xlink:href=\"{settings.settings.STATIC_URL + 'tinywiki/icons/bootstrap-icons.svg' }#journal\"></use></svg></a>"
|
||||
bbcode_guide = f"<a class=\"icon-link icon-link-hover\" href={reverse('tinywiki:page',kwargs={'slug':'tw-bbcode'})}>{_('Guide for BBCode used by TinyWiki')}<svg class=\"bi\"><use xlink:href=\"{settings.settings.STATIC_URL + 'tinywiki/icons/bootstrap-icons.svg' }#journal\"></use></svg></a>"
|
||||
else:
|
||||
markdown_guide = f"<a class=\"icon-link icon-link-hover\" href={reverse('tinywiki:page',kwargs={'slug':'tw-markdown'})}>{_('Guide for markdown used by TinyWiki')}</a>"
|
||||
bbcode_guide = f"<a class=\"icon-link icon-link-hover\" href={reverse('tinywiki:page',kwargs={'slug':'tw-bbcode'})}>{_('Guide for BBCode used by TinyWiki')}</a>"
|
||||
return render(request,
|
||||
self.get_template_name(),
|
||||
self.get_context_data(page=page))
|
||||
self.get_context_data(page=page,
|
||||
user_can_create_system_pages=self.user_can_create_system_pages,
|
||||
create_tw_home=mark_safe(create_tw_home),
|
||||
markdown_guide=mark_safe(markdown_guide),
|
||||
bbcode_guide=mark_safe(bbcode_guide)))
|
||||
|
||||
class TocView(View):
|
||||
template_name = "tinywiki/home/wiki-content.html"
|
||||
|
||||
19
tinywiki/views/image.py
Normal file
19
tinywiki/views/image.py
Normal file
@@ -0,0 +1,19 @@
|
||||
from .base import FormView
|
||||
|
||||
class ImageUplodadView(FormView):
|
||||
pass
|
||||
|
||||
class ImageEditView(FormView):
|
||||
pass
|
||||
|
||||
class ImageDeleteFiew(FormView):
|
||||
pass
|
||||
|
||||
class HxImageUplaodView(FormView):
|
||||
pass
|
||||
|
||||
class HxImageEditView(FormView):
|
||||
pass
|
||||
|
||||
class HxImageDeleteView(FormView):
|
||||
pass
|
||||
@@ -1,15 +1,16 @@
|
||||
from django.shortcuts import render,get_object_or_404,redirect
|
||||
from django.urls import reverse, reverse_lazy
|
||||
from django.http import HttpRequest,HttpResponse
|
||||
from django.http import HttpRequest,HttpResponse,Http404
|
||||
from django.contrib.auth.mixins import LoginRequiredMixin,UserPassesTestMixin
|
||||
from django.core.exceptions import PermissionDenied
|
||||
|
||||
from django.utils.translation import gettext as _
|
||||
|
||||
from .. import settings
|
||||
|
||||
from ..models import Page
|
||||
from .base import View,FormView
|
||||
from ..forms import PageForm,PageAdminForm
|
||||
from ..forms import PageForm,PageAdminForm,PageDeleteForm
|
||||
|
||||
class PageView(View):
|
||||
template_name = "tinywiki/page/view.html"
|
||||
@@ -49,13 +50,19 @@ class PageView(View):
|
||||
|
||||
|
||||
def get(self,request:HttpRequest,slug:str)->HttpResponse:
|
||||
page = get_object_or_404(Page,slug=slug)
|
||||
try:
|
||||
page = Page.objects.get(slug=slug)
|
||||
except Page.DoesNotExist:
|
||||
if self.page_is_creatable(slug):
|
||||
return redirect(reverse('tinywiki:page-create') + f"?slug={slug}")
|
||||
raise Http404()
|
||||
return render(request,
|
||||
self.get_template_name(),
|
||||
self.get_context_data(page=page))
|
||||
|
||||
class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
template_name = "tinywiki/page/create.html"
|
||||
bs_template_name = "tinywiki/page/bs-create.html"
|
||||
form_class = PageForm
|
||||
|
||||
def test_func(self) -> bool:
|
||||
@@ -65,14 +72,26 @@ class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
return self.request.user.has_perm('tinywiki.tinywiki-create')
|
||||
return False
|
||||
|
||||
def get_template_name(self) -> str:
|
||||
if settings.USE_BOOTSTRAP:
|
||||
return self.bs_template_name
|
||||
return self.template_name
|
||||
|
||||
def get(self,request):
|
||||
return render(request,
|
||||
self.get_template_name(),
|
||||
self.get_context_data())
|
||||
|
||||
def get_context_data(self,**kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['create']=True
|
||||
context['slug'] = self.request.GET.get('slug',None)
|
||||
context.setdefault("title_extra","")
|
||||
context.setdefault("slug_extra","")
|
||||
context.setdefault("content_type_extra","")
|
||||
context.setdefault("status_extra","")
|
||||
context.setdefault("content_extra","")
|
||||
|
||||
return context
|
||||
|
||||
def form_invalid(self, form):
|
||||
@@ -149,6 +168,7 @@ class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
|
||||
class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
template_name = "tinywiki/page/edit.html"
|
||||
bs_template_name = "tinywiki/page/bs-edit.html"
|
||||
form_class = PageForm
|
||||
|
||||
def test_func(self) -> bool:
|
||||
@@ -156,9 +176,16 @@ class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
if self.request.user.is_staff:
|
||||
return True
|
||||
return False
|
||||
def get_context_data(self,**kwargs):
|
||||
|
||||
def get_template_name(self) -> str:
|
||||
if settings.USE_BOOTSTRAP:
|
||||
return self.bs_template_name
|
||||
return self.template_name
|
||||
|
||||
def get_context_data(self,page,**kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['create']=False
|
||||
context['page']=page
|
||||
context.setdefault("title_extra","")
|
||||
context.setdefault("slug_extra","")
|
||||
context.setdefault("content_type_extra","")
|
||||
@@ -195,6 +222,7 @@ class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
return render(self.request,
|
||||
self.get_template_name(),
|
||||
self.get_context_data(
|
||||
page=self.instance,
|
||||
slug_extra=slug_extra,
|
||||
title_extra=title_extra,
|
||||
status_extra=status_extra,
|
||||
@@ -218,7 +246,10 @@ class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
raise PermissionDenied()
|
||||
|
||||
self.instance = instance
|
||||
return super().get(request)
|
||||
|
||||
return render(request,
|
||||
self.get_template_name(),
|
||||
self.get_context_data(page=instance))
|
||||
|
||||
def post(self,request,slug:str):
|
||||
instance = get_object_or_404(Page,slug=slug)
|
||||
@@ -255,7 +286,138 @@ class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
self.get_template_name(),
|
||||
self.get_context_data(slug_invalid=True))
|
||||
|
||||
class PageDeleteView(View):
|
||||
template_name = "tinywiki/page/delete"
|
||||
def get(self,request,slug):
|
||||
return render()
|
||||
class PageDeleteView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
template_name = "tinywiki/page/delete.html"
|
||||
form_class = PageDeleteForm
|
||||
def test_func(self) -> bool:
|
||||
if self.request.user.is_staff:
|
||||
return True
|
||||
if self.request.user.has_perm('tinyiwki-delete-all') or self.request.user.has_perm('tinywiki-delete'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def get(self,request:HttpRequest,slug:str)->HttpResponse:
|
||||
instance = get_object_or_404(Page,slug=slug)
|
||||
if not request.user.is_staff and not instance.author == request.user:
|
||||
raise PermissionDenied()
|
||||
|
||||
return render(request,
|
||||
self.template_name,
|
||||
self.get_context_data(form=self.get_form_class()(),
|
||||
page=instance))
|
||||
|
||||
def form_invalid(self,form:PageDeleteForm)->HttpResponse:
|
||||
return redirect(reverse('tinywiki:page',kwargs={'slug':self.instance.slug}))
|
||||
|
||||
def form_valid(self,form:PageDeleteForm)->HttpResponse:
|
||||
if self.instance.slug == form.cleaned_data['slug']:
|
||||
try:
|
||||
self.instance.delete()
|
||||
return redirect(reverse("tinywiki:home"))
|
||||
except: pass
|
||||
return redirect(reverse('tinywiki:page',kwargs={'slug':self.instance.slug}))
|
||||
|
||||
|
||||
def post(self,request:HttpRequest,slug:str)->HttpResponse:
|
||||
self.instance = get_object_or_404(Page,slug=slug)
|
||||
if not request.user.is_staff and not instance.author == request.user:
|
||||
raise PermissionDenied()
|
||||
return super().post(request)
|
||||
|
||||
|
||||
class HxPageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
|
||||
template_name = "tinywiki/page/hx-edit.html"
|
||||
bs_template_name = "tinywiki/page/hx-bs-edit.html"
|
||||
form_class = PageForm
|
||||
|
||||
def test_func(self) -> bool:
|
||||
if self.request.user.is_authenticated:
|
||||
if self.request.user.is_staff:
|
||||
return True
|
||||
if self.request.user.has_perm('tinywiki-edit-page') or self.request.user.has_perm('tinywiki-edit-all-pages'):
|
||||
return True
|
||||
return False
|
||||
|
||||
def get_template_name(self) -> str:
|
||||
if settings.USE_BOOTSTRAP:
|
||||
return self.bs_template_name
|
||||
return self.template_name
|
||||
|
||||
def get_context_data(self,**kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['create']=False
|
||||
context['page']=self.instance
|
||||
context.setdefault("title_extra","")
|
||||
context.setdefault("slug_extra","")
|
||||
context.setdefault("content_type_extra","")
|
||||
context.setdefault("status_extra","")
|
||||
context.setdefault("content_extra","")
|
||||
return context
|
||||
|
||||
def form_invalid(self, form):
|
||||
if 'slug' in form.errors:
|
||||
slug_extra = "is-invalid"
|
||||
else:
|
||||
slug_extra = "is-valid"
|
||||
|
||||
if 'title' in form.errors:
|
||||
title_extra = 'is-invalid'
|
||||
else:
|
||||
title_extra = 'is-valid'
|
||||
|
||||
if 'status_data' in form.errors:
|
||||
status_extra = 'is-invalid'
|
||||
else:
|
||||
status_extra = 'is-valid'
|
||||
|
||||
if 'content_type_data' in form.errors:
|
||||
content_type_extra = 'is-invalid'
|
||||
else:
|
||||
content_type_extra = 'is-valid'
|
||||
|
||||
if 'content' in form.errors:
|
||||
content_extra = 'is-invalid'
|
||||
else:
|
||||
content_extra = 'is-valid'
|
||||
|
||||
return render(self.request,
|
||||
self.get_template_name(),
|
||||
self.get_context_data(
|
||||
page=self.instance,
|
||||
))
|
||||
|
||||
def post(self,request,pk:int):
|
||||
instance = get_object_or_404(Page,pk=pk)
|
||||
user = request.user
|
||||
if (instance.slug.startswith('tw-') and not user.is_staff):
|
||||
raise PermissionDenied(_("Only staff users are allowed to edit TinyWiki system pages!"))
|
||||
|
||||
if user.pk != instance.author.pk:
|
||||
if not user.is_staff and not user.has_perm("page.tinywiki-edit-all"):
|
||||
raise PermissionDenied()
|
||||
else:
|
||||
if not user.has_perm('page.tinywiki-edit-all') or not user.has_perm('page.tinywiki-edit'):
|
||||
raise PermissionDenied()
|
||||
|
||||
self.instance = instance
|
||||
|
||||
return super().post(request)
|
||||
|
||||
def get_form(self):
|
||||
return self.get_form_class()(instance=self.instance,**self.get_form_kwargs())
|
||||
|
||||
def form_valid(self,form):
|
||||
user = self.request.user
|
||||
instance = form.save(commit=False)
|
||||
instance.created_by = user
|
||||
instance.last_edited_by = user
|
||||
try:
|
||||
form.save(commit=True)
|
||||
return render(self.request,self.get_template_name(),self.get_context_data(save_success=True))
|
||||
except:
|
||||
return render(self.request,
|
||||
self.get_template_name(),
|
||||
self.get_context_data(save_success=False))
|
||||
|
||||
class HxPageDeleteView(View):
|
||||
pass
|
||||
Reference in New Issue
Block a user