mirror of
https://git.cmoser.eu/tinytools/django-tinywiki.git
synced 2026-02-04 06:06:33 +01:00
Compare commits
3 Commits
8c3b30187d
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 450ea2e845 | |||
| 523fb8bcad | |||
| e8c5a0a77a |
@@ -124,6 +124,7 @@ TEMPLATES = [
|
||||
'django.contrib.auth.context_processors.auth',
|
||||
'django.contrib.messages.context_processors.messages',
|
||||
'tinywiki.context_processors.sidebar',
|
||||
'tinywiki.context_processors.base_template',
|
||||
],
|
||||
},
|
||||
},
|
||||
|
||||
@@ -21,6 +21,7 @@
|
||||
<div class="container-fluid">
|
||||
<div class="row bg-primary pt-2">
|
||||
<div clas="col-md-12 text-white ">
|
||||
{% block title %}
|
||||
{% if brand_logo %}
|
||||
<img class="mb2 me-2" width="46" height="46" src="{{ brand_logo }}">
|
||||
{% else %}
|
||||
@@ -32,6 +33,7 @@
|
||||
{% if subtitle %}
|
||||
<span class="h2 text-truncate-sm">{{ subtitle }}</h2>
|
||||
{% endif %}
|
||||
{% endblock title %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="navbar navbar-expand-lg">
|
||||
|
||||
@@ -1,10 +1,16 @@
|
||||
from django.http import HttpRequest
|
||||
from django.utils.safestring import mark_safe
|
||||
from .models import SidebarSection
|
||||
from . import settings
|
||||
|
||||
def sidebar(request: HttpRequest = None):
|
||||
sections = [
|
||||
section.widget
|
||||
for section in SidebarSection.objects.filter(is_visible=True).order_by('-priority')
|
||||
]
|
||||
return {'tinywiki_sidebar': mark_safe("\n".join(sections))}
|
||||
return {
|
||||
'tinywiki_sidebar': mark_safe("\n".join(sections))
|
||||
}
|
||||
|
||||
def base_template(request: HttpRequest = None):
|
||||
return {'base_template': settings.TINYWIKI_BASE_TEMPLATE}
|
||||
|
||||
@@ -26,13 +26,6 @@ TINYWIKI_BOOSTRAP_TAGS = {
|
||||
}
|
||||
}
|
||||
|
||||
TINYWIKI_BASE_TEMPLATE = getattr(
|
||||
settings,
|
||||
"TINYWIKI_BASE_TEMPLATE",
|
||||
getattr(settings,
|
||||
"BASE_TEMPLATE",
|
||||
"tinywiki/base.html")
|
||||
)
|
||||
|
||||
TINYWIKI_HOME = getattr(settings, "TINYWIKI_HOME", "tw-home")
|
||||
TINYWIKI_BBCODE_EXTRA_FORMATTERS = getattr(settings, 'TINYWIKI_BBCODE_EXTRA_FORMATTERS', None)
|
||||
@@ -40,4 +33,13 @@ TINYWIKI_BBCODE_EXTRA_SIMPLE_FORMATTERS = getattr(settings,
|
||||
'TINYWIKI_BBCODE_EXTRA_SIMPLE_FORMATTERS',
|
||||
None)
|
||||
|
||||
USE_BOOTSTRAP = getattr(settings, "USE_BOOTSTRAP", False)
|
||||
USE_BOOTSTRAP = getattr(settings, "USE_BOOTSTRAP", True)
|
||||
|
||||
TINYWIKI_BASE_TEMPLATE = getattr(
|
||||
settings,
|
||||
"TINYWIKI_BASE_TEMPLATE",
|
||||
getattr(
|
||||
settings, "BASE_TEMPLATE",
|
||||
"tinywiki/bs-base.html" if USE_BOOTSTRAP else "tinywiki/base.html"
|
||||
)
|
||||
)
|
||||
|
||||
100
tinywiki/templates/tinywiki/bs-base.html
Normal file
100
tinywiki/templates/tinywiki/bs-base.html
Normal file
@@ -0,0 +1,100 @@
|
||||
<!DOCTYPE html>
|
||||
{% load i18n static %}
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<title>TinyWiki</title>
|
||||
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-sRIl4kxILFvY47J16cr9ZwB07vP4J8+LH7qKQnuqkuIAvNWLzeN8tE5YBujZqJLB" crossorigin="anonymous">
|
||||
{% block extra_css %}{% endblock %}
|
||||
<script src="https://cdn.jsdelivr.net/npm/htmx.org@2.0.8/dist/htmx.min.js" integrity="sha384-/TgkGk7p307TH7EXJDuUlgG3Ce1UVolAOFopFekQkkXihi5u/6OCvVKyz1W+idaz" crossorigin="anonymous"></script>
|
||||
<style>
|
||||
{% block style %}{% endblock %}
|
||||
</style>
|
||||
<script>
|
||||
document.documentElement.setAttribute('data-bs-theme', (window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light'));
|
||||
</script>
|
||||
{% block scripts %}{% endblock %}
|
||||
</head>
|
||||
<body class="min-vh-100 d-flex flex-column">
|
||||
|
||||
<div class="container-fluid">
|
||||
<div class="row bg-primary pt-2">
|
||||
<div clas="col-md-12 text-white ">
|
||||
{% block title %}
|
||||
{% if brand_logo %}
|
||||
<img class="mb2 me-2" width="46" height="46" src="{{ brand_logo }}">
|
||||
{% else %}
|
||||
<svg class="bi mb-2 me-2 text-white" width="46" height="46" fill="currentColor">
|
||||
<use xlink:href="{% static 'icons/bootstrap-icons.svg' %}#book" ></use>
|
||||
</svg>
|
||||
{% endif %}
|
||||
<span class="display-6 font-weight-bold text-white me-2">{{ brand_name }}</span>
|
||||
{% if subtitle %}
|
||||
<span class="h2 text-truncate-sm">{{ subtitle }}</h2>
|
||||
{% endif %}
|
||||
{% endblock title %}
|
||||
</div>
|
||||
</div>
|
||||
<div class="navbar navbar-expand-lg">
|
||||
<div class="collapse navbar-collapse">
|
||||
<ul class="navbar-nav mb-2 mb-lg-0 me-auto">
|
||||
<li class="nav-item me-3">
|
||||
<a class="nav-link" href="{% url 'tinywiki:home' %}">HOME</a>
|
||||
</li>
|
||||
{% if user_can_create_wiki_pages %}
|
||||
<li class="nav-item me-3">
|
||||
<a class="nav-link" href="{% url 'tinywiki:page-create' %}">{% translate "Create Page" %}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
<li class="nav-item me-3">
|
||||
<a class="nav-link" href="{% url 'tinywiki:toc' %}">{% translate "Wiki content" %}</a>
|
||||
</li>
|
||||
</ul>
|
||||
<ul class="navbar-nav mb-2 mb-lg-0 list-group-horizontal">
|
||||
{% if user.is_authenticated %}
|
||||
<li class="nav-item">
|
||||
<form method="POST" action="{% url 'account_logout' %}" class="d-inline">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="nav-link">{% translate "Log out" %}</button>
|
||||
</form>
|
||||
</li>
|
||||
{% else %}
|
||||
<li class="nav-item">
|
||||
<a class="nav-link" href="{% url "account_login" %}">{% translate "Log in" %}</a>
|
||||
</li>
|
||||
{% endif %}
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row h-100 mb-4">
|
||||
<div class="col-lg-3 pt-6 px-4 d-none d-lg-block" >
|
||||
{% block left_sidebar %}
|
||||
{{ tinywiki_sidebar }}
|
||||
{% endblock left_sidebar %}
|
||||
</div>
|
||||
<div class="col-lg-6">
|
||||
<main>
|
||||
{% block content %}
|
||||
<h1>It Works!</h1>
|
||||
{% endblock %}
|
||||
</main>
|
||||
</div>
|
||||
<div class="col-lg-3">
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="bg-secondary text-white mt-auto">
|
||||
<span class="ms-2">
|
||||
Powered by TinyWiki
|
||||
</span>
|
||||
<span class="text-end">
|
||||
<a class="text-white" href="{% url 'tinywiki:page' 'tw-license' %}"> © 2025</a>
|
||||
</span>
|
||||
</footer>
|
||||
{% block extra_body %}{% endblock extra_body %}
|
||||
<script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.11.8/dist/umd/popper.min.js"></script>
|
||||
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.8/dist/js/bootstrap.min.js"></script>
|
||||
{% block extra_scripts %}{% endblock extra_scripts %}
|
||||
</body>
|
||||
</html>
|
||||
@@ -4,67 +4,65 @@ from django.views.generic import FormView as DjangoFormView
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
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
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_template_name(cls)->str:
|
||||
return cls.template_name
|
||||
|
||||
|
||||
def get_tinywiki_context_data(self):
|
||||
create_pages = False
|
||||
if self.request.user.is_authenticated:
|
||||
@@ -73,22 +71,20 @@ class Base:
|
||||
return {
|
||||
'brand_logo': settings.TINYWIKI_BRAND_LOGO,
|
||||
'brand_name': settings.TINYWIKI_BRAND_NAME,
|
||||
'base_template': self.get_base_template_name(),
|
||||
'use_bootstrap': settings.USE_BOOTSTRAP,
|
||||
'user_can_create_wiki_pages':create_pages
|
||||
}
|
||||
|
||||
|
||||
class View(Base,DjangoView):
|
||||
template_name = "tinywiki"
|
||||
|
||||
|
||||
def get_context_data(self,**kwargs):
|
||||
context = self.get_tinywiki_context_data()
|
||||
context.update(kwargs)
|
||||
return context
|
||||
|
||||
|
||||
class FormView(Base,DjangoFormView):
|
||||
def get_context_data(self, **kwargs) -> dict[str, Any]:
|
||||
context = self.get_tinywiki_context_data()
|
||||
context.update(kwargs)
|
||||
return super().get_context_data(**context)
|
||||
|
||||
Reference in New Issue
Block a user