2025.12.23 17:30:33 (cachyos.cmoser.eu)

This commit is contained in:
2025-12-23 17:30:33 +01:00
parent 3c4647ce49
commit c2e431e43b
14 changed files with 1175 additions and 569 deletions

View File

@@ -1,9 +1,9 @@
from django.shortcuts import render,get_object_or_404,redirect
from django.urls import reverse, reverse_lazy
from django.http import HttpRequest,HttpResponse,Http404
from django.contrib.auth.mixins import LoginRequiredMixin,UserPassesTestMixin
from django.core.exceptions import PermissionDenied
from django.shortcuts import render, get_object_or_404, redirect
from django.urls import reverse
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
@@ -12,17 +12,19 @@ from ..models import Page
from .base import View,FormView
from ..forms import PageForm,PageAdminForm,PageDeleteForm
class PageView(View):
template_name = "tinywiki/page/view.html"
bs_template_name = "tinywiki/page/bs-view.html"
@classmethod
def get_template_name(cls) -> str:
if settings.USE_BOOTSTRAP:
return cls.bs_template_name
return cls.template_name
def get_context_data(self,page,**kwargs):
def get_context_data(self, page, **kwargs):
can_edit_page = False
can_delete_page = False
user = self.request.user
@@ -39,17 +41,17 @@ class PageView(View):
or (user.pk == page.author.pk and user.has_perm('page.tinywiki-edit'))):
can_edit_page = True
if (user.has_perm('page.tinywiki-delete-all')
or (user.pk == page.author.pk and user.has_perm('page.tinywiki-delete'))):
or (user.pk == page.author.pk
and user.has_perm('page.tinywiki-delete'))):
can_delete_page = True
kwargs.update({'page':page,
'user_can_edit_wiki_page':can_edit_page,
'user_can_delete_wiki_page':can_delete_page,
'subtitle':page.title})
return super().get_context_data(**kwargs)
def get(self,request:HttpRequest,slug:str)->HttpResponse:
def get(self, request: HttpRequest, slug: str) -> HttpResponse:
try:
page = Page.objects.get(slug=slug)
except Page.DoesNotExist:
@@ -59,30 +61,31 @@ class PageView(View):
return render(request,
self.get_template_name(),
self.get_context_data(page=page))
class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
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:
if self.request.user.is_authenticated:
if self.request.user.is_staff:
return True
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):
def get(self, request):
return render(request,
self.get_template_name(),
self.get_context_data())
def get_context_data(self,**kwargs):
def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs)
context['create']=True
context['slug'] = self.request.GET.get('slug',None)
@@ -91,35 +94,35 @@ class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
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(
@@ -129,13 +132,13 @@ class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
content_type_extra=content_type_extra,
content_extra=content_extra,
))
def form_valid(self,form):
def form_valid(self, form):
user = self.request.user
instance = form.save(commit=False)
if (instance.slug.startswith('tw-')
and not user.is_staff and
not user.has_perm('page.tinywiki-create-system')):
if (instance.slug.startswith('tw-')
and not user.is_staff and
not user.has_perm('page.tinywiki-create-system')):
return render(self.request,
self.get_template_name(),
self.get_context_data(
@@ -145,7 +148,7 @@ class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
content_type_extra="is-valid",
content_extra="is-valid",
))
instance.author = user
instance.created_by = user
instance.last_edited_by = user
@@ -164,24 +167,24 @@ class PageCreateView(LoginRequiredMixin,UserPassesTestMixin,FormView):
content_type_extra="is-valid",
content_extra="is-valid",
))
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:
if self.request.user.is_authenticated:
if self.request.user.is_staff:
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,page,**kwargs):
context = super().get_context_data(**kwargs)
context['create']=False
@@ -192,33 +195,33 @@ class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
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(
@@ -229,48 +232,48 @@ class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
content_type_extra=content_type_extra,
content_extra=content_extra,
))
def get(self,request,slug:str):
instance = get_object_or_404(Page,slug=slug)
user = request.user
if (instance.slug.startswith('tw-')
if (instance.slug.startswith('tw-')
and not user.is_staff
and not user.has_perm('page.tinywiki-edit-system')):
raise PermissionDenied(_("Only staff users and wiki-admins 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 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)
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)
@@ -285,7 +288,7 @@ class PageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
return render(self.request,
self.get_template_name(),
self.get_context_data(slug_invalid=True))
class PageDeleteView(LoginRequiredMixin,UserPassesTestMixin,FormView):
template_name = "tinywiki/page/delete.html"
form_class = PageDeleteForm
@@ -295,20 +298,20 @@ class PageDeleteView(LoginRequiredMixin,UserPassesTestMixin,FormView):
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:
@@ -316,20 +319,20 @@ class PageDeleteView(LoginRequiredMixin,UserPassesTestMixin,FormView):
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:
@@ -337,12 +340,12 @@ class HxPageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
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
@@ -353,59 +356,59 @@ class HxPageEditView(LoginRequiredMixin,UserPassesTestMixin,FormView):
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)