evewiki 0.0.1.dev2__tar.gz → 0.0.1.dev4__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/PKG-INFO +9 -62
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/README.md +8 -61
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/__init__.py +1 -1
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/auth_hooks.py +1 -1
- evewiki-0.0.1.dev4/evewiki/forms.py +33 -0
- evewiki-0.0.1.dev4/evewiki/templates/evewiki/error.html +13 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/urls.py +1 -1
- evewiki-0.0.1.dev4/evewiki/views.py +169 -0
- evewiki-0.0.1.dev2/evewiki/forms.py +0 -29
- evewiki-0.0.1.dev2/evewiki/views.py +0 -149
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/LICENSE +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/admin.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/app_settings.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/apps.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/migrations/0001_initial.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/migrations/__init__.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/models/__init__.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/models/logs.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/models/page_versions.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/models/pages.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/models/settings.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/tasks.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/templates/evewiki/base.html +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/templates/evewiki/help.html +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/templates/evewiki/index.html +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/templates/evewiki/page.html +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/templates/evewiki/page_delete.html +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/templates/evewiki/page_tree.html +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/templates/evewiki/sidebar.html +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/tests/__init__.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/evewiki/tests/test_tasks.py +0 -0
- {evewiki-0.0.1.dev2 → evewiki-0.0.1.dev4}/pyproject.toml +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: evewiki
|
|
3
|
-
Version: 0.0.1.
|
|
3
|
+
Version: 0.0.1.dev4
|
|
4
4
|
Summary: Wiki plugin app for Alliance Auth.
|
|
5
5
|
Author-email: Ryan Cunning <ryan.cunning@gmail.com>
|
|
6
6
|
Requires-Python: >=3.8
|
|
@@ -27,7 +27,7 @@ Project-URL: Homepage, https://gitlab.com/cunningdesigns/aa-wiki
|
|
|
27
27
|
Project-URL: Source, https://gitlab.com/cunningdesigns/aa-wiki
|
|
28
28
|
Project-URL: Tracker, https://gitlab.com/cunningdesigns/aa-wiki/-/issues
|
|
29
29
|
|
|
30
|
-
#
|
|
30
|
+
# evewiki
|
|
31
31
|
|
|
32
32
|
Wiki plugin for [AllianceAuth](https://gitlab.com/allianceauth/allianceauth) to curate content.
|
|
33
33
|
|
|
@@ -59,9 +59,7 @@ You can alter them by adding a record to the `Settings` section/table in the `ev
|
|
|
59
59
|
| `hierarchy_max_display_depth` | Limit the depth of the tree for the hierarchy on the main display | 10 |
|
|
60
60
|
| `max_versions` | No one has infinite disk space, a sensible limit which can be modified to clear down the history | 1000 |
|
|
61
61
|
|
|
62
|
-
## Installation
|
|
63
|
-
|
|
64
|
-
> Currently produces an error!!!
|
|
62
|
+
## Installation
|
|
65
63
|
|
|
66
64
|
### Step 1 - Pre_Requisites
|
|
67
65
|
|
|
@@ -81,65 +79,14 @@ Configure your Auth settings (`local.py`) as follows:
|
|
|
81
79
|
'evewiki',
|
|
82
80
|
```
|
|
83
81
|
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
> This has instructions on how to circumvent the installation issue on a dev environment
|
|
87
|
-
|
|
88
|
-
*Assumes setup of AA as per the [documentation](https://allianceauth.readthedocs.io/en/latest/installation-containerized/docker.html)*
|
|
89
|
-
Final folder structure would look like
|
|
90
|
-
```plaintext
|
|
91
|
-
aa-dev
|
|
92
|
-
├─ aa-docker
|
|
93
|
-
└─ aa-wiki
|
|
94
|
-
|
|
95
|
-
```
|
|
96
|
-
|
|
97
|
-
Traverse into the `aa-dev` folder and clone the repo
|
|
98
|
-
```bash
|
|
99
|
-
git clone https://gitlab.com/cunningdesigns/aa-wiki.git
|
|
100
|
-
```
|
|
82
|
+
### Step 4 - Maintain Alliance Auth
|
|
101
83
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
Bind-mount the plugin-folder in `aa-docker/docker-compose.yml`
|
|
105
|
-
```yaml
|
|
106
|
-
x-allianceauth-base:
|
|
107
|
-
volumes:
|
|
108
|
-
- ../aa-wiki:/home/allianceauth/evewiki
|
|
109
|
-
```
|
|
84
|
+
Run migrations `python manage.py migrate`
|
|
85
|
+
Restart Alliance Auth
|
|
110
86
|
|
|
111
|
-
___
|
|
112
|
-
*there has to be a better way*
|
|
113
|
-
> Replace `aa-wiki/evewiki/views.py` with content from [example plugin](https://gitlab.com/ErikKalkoken/allianceauth-example-plugin/-/blob/master/example/views.py?ref_type=heads)
|
|
114
87
|
|
|
115
|
-
|
|
116
|
-
___
|
|
117
|
-
|
|
118
|
-
Start the containers (may require sudo)
|
|
119
|
-
```bash
|
|
120
|
-
docker compose --env-file=.env up -d
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
Open a terminal in the gunicorn container, initiate the plugin install
|
|
124
|
-
```bash
|
|
125
|
-
docker compose exec allianceauth_gunicorn bash
|
|
126
|
-
pip install -e ../evewiki
|
|
127
|
-
```
|
|
128
|
-
|
|
129
|
-
add `evewiki` to `aa-docker/conf/local.py`
|
|
130
|
-
|
|
131
|
-
Apply migrations and exit
|
|
132
|
-
```bash
|
|
133
|
-
python manage.py migrate
|
|
134
|
-
```
|
|
135
|
-
|
|
136
|
-
restart AA
|
|
137
|
-
```bash
|
|
138
|
-
docker compose restart allianceauth_gunicorn
|
|
139
|
-
```
|
|
88
|
+
### Step 5
|
|
140
89
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
> Remember to undo the modifications to `evewiki/evewiki/views.py` & `evewiki/evewiki/urls.py`
|
|
144
|
-
___
|
|
90
|
+
In AA admin site add Permissions `evewiki | general | Can access this app` and `evewiki | general | Can edit this app` to the desired `States` / `Groups`
|
|
91
|
+
i.e. you may wish to create a `wiki_editors` group to restrict the `Can edit this app` controls.
|
|
145
92
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
#
|
|
1
|
+
# evewiki
|
|
2
2
|
|
|
3
3
|
Wiki plugin for [AllianceAuth](https://gitlab.com/allianceauth/allianceauth) to curate content.
|
|
4
4
|
|
|
@@ -30,9 +30,7 @@ You can alter them by adding a record to the `Settings` section/table in the `ev
|
|
|
30
30
|
| `hierarchy_max_display_depth` | Limit the depth of the tree for the hierarchy on the main display | 10 |
|
|
31
31
|
| `max_versions` | No one has infinite disk space, a sensible limit which can be modified to clear down the history | 1000 |
|
|
32
32
|
|
|
33
|
-
## Installation
|
|
34
|
-
|
|
35
|
-
> Currently produces an error!!!
|
|
33
|
+
## Installation
|
|
36
34
|
|
|
37
35
|
### Step 1 - Pre_Requisites
|
|
38
36
|
|
|
@@ -52,64 +50,13 @@ Configure your Auth settings (`local.py`) as follows:
|
|
|
52
50
|
'evewiki',
|
|
53
51
|
```
|
|
54
52
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
> This has instructions on how to circumvent the installation issue on a dev environment
|
|
58
|
-
|
|
59
|
-
*Assumes setup of AA as per the [documentation](https://allianceauth.readthedocs.io/en/latest/installation-containerized/docker.html)*
|
|
60
|
-
Final folder structure would look like
|
|
61
|
-
```plaintext
|
|
62
|
-
aa-dev
|
|
63
|
-
├─ aa-docker
|
|
64
|
-
└─ aa-wiki
|
|
65
|
-
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
Traverse into the `aa-dev` folder and clone the repo
|
|
69
|
-
```bash
|
|
70
|
-
git clone https://gitlab.com/cunningdesigns/aa-wiki.git
|
|
71
|
-
```
|
|
53
|
+
### Step 4 - Maintain Alliance Auth
|
|
72
54
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
Bind-mount the plugin-folder in `aa-docker/docker-compose.yml`
|
|
76
|
-
```yaml
|
|
77
|
-
x-allianceauth-base:
|
|
78
|
-
volumes:
|
|
79
|
-
- ../aa-wiki:/home/allianceauth/evewiki
|
|
80
|
-
```
|
|
55
|
+
Run migrations `python manage.py migrate`
|
|
56
|
+
Restart Alliance Auth
|
|
81
57
|
|
|
82
|
-
___
|
|
83
|
-
*there has to be a better way*
|
|
84
|
-
> Replace `aa-wiki/evewiki/views.py` with content from [example plugin](https://gitlab.com/ErikKalkoken/allianceauth-example-plugin/-/blob/master/example/views.py?ref_type=heads)
|
|
85
58
|
|
|
86
|
-
|
|
87
|
-
___
|
|
88
|
-
|
|
89
|
-
Start the containers (may require sudo)
|
|
90
|
-
```bash
|
|
91
|
-
docker compose --env-file=.env up -d
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
Open a terminal in the gunicorn container, initiate the plugin install
|
|
95
|
-
```bash
|
|
96
|
-
docker compose exec allianceauth_gunicorn bash
|
|
97
|
-
pip install -e ../evewiki
|
|
98
|
-
```
|
|
99
|
-
|
|
100
|
-
add `evewiki` to `aa-docker/conf/local.py`
|
|
101
|
-
|
|
102
|
-
Apply migrations and exit
|
|
103
|
-
```bash
|
|
104
|
-
python manage.py migrate
|
|
105
|
-
```
|
|
106
|
-
|
|
107
|
-
restart AA
|
|
108
|
-
```bash
|
|
109
|
-
docker compose restart allianceauth_gunicorn
|
|
110
|
-
```
|
|
59
|
+
### Step 5
|
|
111
60
|
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
> Remember to undo the modifications to `evewiki/evewiki/views.py` & `evewiki/evewiki/urls.py`
|
|
115
|
-
___
|
|
61
|
+
In AA admin site add Permissions `evewiki | general | Can access this app` and `evewiki | general | Can edit this app` to the desired `States` / `Groups`
|
|
62
|
+
i.e. you may wish to create a `wiki_editors` group to restrict the `Can edit this app` controls.
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
from django import forms
|
|
2
|
+
|
|
3
|
+
from .models.pages import Page
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class PageForm(forms.ModelForm):
|
|
7
|
+
|
|
8
|
+
try:
|
|
9
|
+
# Customised ddl inferring additional context via text-indentation
|
|
10
|
+
parent = forms.ChoiceField(
|
|
11
|
+
choices=Page.list(),
|
|
12
|
+
required=False,
|
|
13
|
+
label="Path",
|
|
14
|
+
help_text=Page._meta.get_field("parent").help_text,
|
|
15
|
+
)
|
|
16
|
+
|
|
17
|
+
class Meta:
|
|
18
|
+
model = Page
|
|
19
|
+
fields = ["title", "parent", "slug", "priority", "states", "groups"]
|
|
20
|
+
|
|
21
|
+
def clean(self):
|
|
22
|
+
"""
|
|
23
|
+
Django needs a little help to turn the custom `parent` field back into a model.
|
|
24
|
+
"""
|
|
25
|
+
cleaned_data = super().clean()
|
|
26
|
+
parent_id = cleaned_data["parent"]
|
|
27
|
+
cleaned_data["parent"] = (
|
|
28
|
+
Page.objects.get(pk=int(parent_id)) if parent_id else None
|
|
29
|
+
)
|
|
30
|
+
return cleaned_data
|
|
31
|
+
|
|
32
|
+
except Exception as e:
|
|
33
|
+
print(f"setup required: {e}")
|
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
"""Views."""
|
|
2
|
+
|
|
3
|
+
from django.contrib import messages
|
|
4
|
+
from django.contrib.auth.decorators import login_required, permission_required
|
|
5
|
+
from django.core.handlers.wsgi import WSGIRequest
|
|
6
|
+
from django.http import HttpResponse
|
|
7
|
+
from django.shortcuts import redirect, render
|
|
8
|
+
|
|
9
|
+
from allianceauth.authentication.models import UserProfile
|
|
10
|
+
|
|
11
|
+
from .forms import PageForm
|
|
12
|
+
from .models.logs import Log
|
|
13
|
+
from .models.page_versions import PageVersion
|
|
14
|
+
from .models.pages import Page
|
|
15
|
+
from .models.settings import Setting
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@login_required
|
|
19
|
+
@permission_required("evewiki.basic_access")
|
|
20
|
+
def index(request: WSGIRequest, unknown_path: str = "/"):
|
|
21
|
+
"""Render index view."""
|
|
22
|
+
|
|
23
|
+
try:
|
|
24
|
+
|
|
25
|
+
settings = Setting.get_settings()
|
|
26
|
+
|
|
27
|
+
is_editor = False
|
|
28
|
+
if request.user.has_perm("evewiki.editor_access"):
|
|
29
|
+
is_editor = True
|
|
30
|
+
|
|
31
|
+
# Control light/dark mode on md editor
|
|
32
|
+
dark_mode = False
|
|
33
|
+
themes_to_use_dark_mode = [
|
|
34
|
+
"allianceauth.theme.darkly.auth_hooks.DarklyThemeHook"
|
|
35
|
+
]
|
|
36
|
+
user = UserProfile.objects.filter(user=request.user).first()
|
|
37
|
+
if user.theme in themes_to_use_dark_mode:
|
|
38
|
+
dark_mode = True
|
|
39
|
+
|
|
40
|
+
# Tree is too complex to call directly froma template
|
|
41
|
+
tree = Page.tree(user=request.user)
|
|
42
|
+
|
|
43
|
+
# "Unknown" i.e. has not bee picked up by urls.py
|
|
44
|
+
page = Page.get_by_path(path=unknown_path, user=request.user)
|
|
45
|
+
|
|
46
|
+
# Load the first page by default if nothing else can be found
|
|
47
|
+
# If there is no first-page, template will load a help page.
|
|
48
|
+
if page is None:
|
|
49
|
+
page = Page.objects.order_by("id").first()
|
|
50
|
+
|
|
51
|
+
# Content save
|
|
52
|
+
new_content = request.POST.get("content")
|
|
53
|
+
if new_content is not None:
|
|
54
|
+
try:
|
|
55
|
+
# Save the content
|
|
56
|
+
page.content = request.POST.get("content")
|
|
57
|
+
page.save()
|
|
58
|
+
# Record a version of the content
|
|
59
|
+
page_version = PageVersion(
|
|
60
|
+
page=page,
|
|
61
|
+
user=user,
|
|
62
|
+
content=page.content,
|
|
63
|
+
)
|
|
64
|
+
page_version.save()
|
|
65
|
+
# Log a thing happened
|
|
66
|
+
Log(user=user, action=f"Page content modified: {page.title}").save()
|
|
67
|
+
messages.success(request, f"Page '{page.title}' saved")
|
|
68
|
+
return redirect(f"/evewiki/{page.path}")
|
|
69
|
+
except Page.DoesNotExist:
|
|
70
|
+
pass
|
|
71
|
+
|
|
72
|
+
context = {
|
|
73
|
+
"context-title": "context-not-title",
|
|
74
|
+
"tree": tree,
|
|
75
|
+
"page": page,
|
|
76
|
+
"dark_mode": dark_mode,
|
|
77
|
+
"settings": settings,
|
|
78
|
+
"is_editor": is_editor,
|
|
79
|
+
}
|
|
80
|
+
return render(request, "evewiki/index.html", context)
|
|
81
|
+
except Exception as e:
|
|
82
|
+
print(f"setup required: {e}")
|
|
83
|
+
return render(request, "evewiki/error.html")
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
@login_required
|
|
87
|
+
@permission_required("evewiki.basic_access")
|
|
88
|
+
def page(request: WSGIRequest) -> HttpResponse:
|
|
89
|
+
|
|
90
|
+
try:
|
|
91
|
+
if (
|
|
92
|
+
not request.user.has_perm("evewiki.editor_access")
|
|
93
|
+
and not request.user.profile.state.name == "Admin"
|
|
94
|
+
):
|
|
95
|
+
return redirect("/evewiki")
|
|
96
|
+
|
|
97
|
+
user = UserProfile.objects.filter(user=request.user).first()
|
|
98
|
+
page = None
|
|
99
|
+
page_id = request.GET.get("id") or request.POST.get("id")
|
|
100
|
+
if page_id is not None:
|
|
101
|
+
try:
|
|
102
|
+
page = Page.objects.get(id=page_id)
|
|
103
|
+
except Page.DoesNotExist:
|
|
104
|
+
page = None
|
|
105
|
+
|
|
106
|
+
if request.method == "POST":
|
|
107
|
+
form = PageForm(request.POST, instance=page)
|
|
108
|
+
if form.is_valid():
|
|
109
|
+
saved_page = form.save()
|
|
110
|
+
Log(user=user, action=f"Page Created: {saved_page.title}").save()
|
|
111
|
+
messages.success(request, f"Page '{saved_page.title}' saved")
|
|
112
|
+
return redirect(f"/evewiki/{saved_page.path}")
|
|
113
|
+
else:
|
|
114
|
+
form = PageForm(instance=page)
|
|
115
|
+
|
|
116
|
+
page_versions = PageVersion.objects.filter(page=page).order_by("-created").all()
|
|
117
|
+
|
|
118
|
+
context = {
|
|
119
|
+
"Page": "Page",
|
|
120
|
+
"page": page,
|
|
121
|
+
"form": form,
|
|
122
|
+
"versions": page_versions,
|
|
123
|
+
}
|
|
124
|
+
return render(request, "evewiki/page.html", context)
|
|
125
|
+
except Exception as e:
|
|
126
|
+
print(f"setup required: {e}")
|
|
127
|
+
return render(request, "evewiki/error.html")
|
|
128
|
+
|
|
129
|
+
|
|
130
|
+
@login_required
|
|
131
|
+
@permission_required("evewiki.basic_access")
|
|
132
|
+
def page_delete(request: WSGIRequest) -> HttpResponse:
|
|
133
|
+
|
|
134
|
+
try:
|
|
135
|
+
if (
|
|
136
|
+
not request.user.has_perm("evewiki.editor_access")
|
|
137
|
+
and not request.user.profile.state.name == "Admin"
|
|
138
|
+
):
|
|
139
|
+
return redirect("/evewiki")
|
|
140
|
+
|
|
141
|
+
user = UserProfile.objects.filter(user=request.user).first()
|
|
142
|
+
page = None
|
|
143
|
+
page_id = request.GET.get("id")
|
|
144
|
+
confirm_delete = request.GET.get("confirm_delete")
|
|
145
|
+
if page_id is not None:
|
|
146
|
+
try:
|
|
147
|
+
page = Page.objects.get(id=page_id)
|
|
148
|
+
except Page.DoesNotExist:
|
|
149
|
+
page = None
|
|
150
|
+
|
|
151
|
+
# Check if page has children
|
|
152
|
+
children = Page.objects.filter(parent_id=page_id).all()
|
|
153
|
+
if len(children) > 0:
|
|
154
|
+
messages.error(request, "You cannot delete a page that has children.")
|
|
155
|
+
|
|
156
|
+
# Confirm the confirmation that this user definitely wants to delete
|
|
157
|
+
if confirm_delete == "true":
|
|
158
|
+
messages.success(request, f"Page '{page.title}' deleted")
|
|
159
|
+
page.delete()
|
|
160
|
+
# Pages can be deleted, links can be broken, versions orphaned.
|
|
161
|
+
# But the log is immutable
|
|
162
|
+
Log(user=user, action=f"Page Deleted: {page.title}").save()
|
|
163
|
+
return redirect("/evewiki/index")
|
|
164
|
+
|
|
165
|
+
context = {"Delete Page": "Delete Page", "page": page, "children": children}
|
|
166
|
+
return render(request, "evewiki/page_delete.html", context)
|
|
167
|
+
except Exception as e:
|
|
168
|
+
print(f"setup required: {e}")
|
|
169
|
+
return render(request, "evewiki/error.html")
|
|
@@ -1,29 +0,0 @@
|
|
|
1
|
-
from django import forms
|
|
2
|
-
|
|
3
|
-
from .models.pages import Page
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
class PageForm(forms.ModelForm):
|
|
7
|
-
|
|
8
|
-
# Customised ddl inferring additional context via text-indentation
|
|
9
|
-
parent = forms.ChoiceField(
|
|
10
|
-
choices=Page.list(),
|
|
11
|
-
required=False,
|
|
12
|
-
label="Path",
|
|
13
|
-
help_text=Page._meta.get_field("parent").help_text,
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
class Meta:
|
|
17
|
-
model = Page
|
|
18
|
-
fields = ["title", "parent", "slug", "priority", "states", "groups"]
|
|
19
|
-
|
|
20
|
-
def clean(self):
|
|
21
|
-
"""
|
|
22
|
-
Django needs a little help to turn the custom `parent` field back into a model.
|
|
23
|
-
"""
|
|
24
|
-
cleaned_data = super().clean()
|
|
25
|
-
parent_id = cleaned_data["parent"]
|
|
26
|
-
cleaned_data["parent"] = (
|
|
27
|
-
Page.objects.get(pk=int(parent_id)) if parent_id else None
|
|
28
|
-
)
|
|
29
|
-
return cleaned_data
|
|
@@ -1,149 +0,0 @@
|
|
|
1
|
-
"""Views."""
|
|
2
|
-
|
|
3
|
-
from django.contrib import messages
|
|
4
|
-
from django.contrib.auth.decorators import login_required, permission_required
|
|
5
|
-
from django.core.handlers.wsgi import WSGIRequest
|
|
6
|
-
from django.http import HttpResponse
|
|
7
|
-
from django.shortcuts import redirect, render
|
|
8
|
-
|
|
9
|
-
from allianceauth.authentication.models import UserProfile
|
|
10
|
-
|
|
11
|
-
from .forms import PageForm
|
|
12
|
-
from .models.logs import Log
|
|
13
|
-
from .models.page_versions import PageVersion
|
|
14
|
-
from .models.pages import Page
|
|
15
|
-
from .models.settings import Setting
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
@login_required
|
|
19
|
-
@permission_required("evewiki.basic_access")
|
|
20
|
-
def index(request: WSGIRequest, unknown_path: str = "/"):
|
|
21
|
-
"""Render index view."""
|
|
22
|
-
|
|
23
|
-
settings = Setting.get_settings()
|
|
24
|
-
|
|
25
|
-
is_editor = False
|
|
26
|
-
if request.user.has_perm("evewiki.editor_access"):
|
|
27
|
-
is_editor = True
|
|
28
|
-
|
|
29
|
-
# Control light/dark mode on md editor
|
|
30
|
-
dark_mode = False
|
|
31
|
-
themes_to_use_dark_mode = ["allianceauth.theme.darkly.auth_hooks.DarklyThemeHook"]
|
|
32
|
-
user = UserProfile.objects.filter(user=request.user).first()
|
|
33
|
-
if user.theme in themes_to_use_dark_mode:
|
|
34
|
-
dark_mode = True
|
|
35
|
-
|
|
36
|
-
# Tree is too complex to call directly froma template
|
|
37
|
-
tree = Page.tree(user=request.user)
|
|
38
|
-
|
|
39
|
-
# "Unknown" i.e. has not bee picked up by urls.py
|
|
40
|
-
page = Page.get_by_path(path=unknown_path, user=request.user)
|
|
41
|
-
|
|
42
|
-
# Load the first page by default if nothing else can be found
|
|
43
|
-
# If there is no first-page, template will load a help page.
|
|
44
|
-
if page is None:
|
|
45
|
-
page = Page.objects.order_by("id").first()
|
|
46
|
-
|
|
47
|
-
# Content save
|
|
48
|
-
new_content = request.POST.get("content")
|
|
49
|
-
if new_content is not None:
|
|
50
|
-
try:
|
|
51
|
-
# Save the content
|
|
52
|
-
page.content = request.POST.get("content")
|
|
53
|
-
page.save()
|
|
54
|
-
# Record a version of the content
|
|
55
|
-
page_version = PageVersion(
|
|
56
|
-
page=page,
|
|
57
|
-
user=user,
|
|
58
|
-
content=page.content,
|
|
59
|
-
)
|
|
60
|
-
page_version.save()
|
|
61
|
-
# Log a thing happened
|
|
62
|
-
Log(user=user, action=f"Page content modified: {page.title}").save()
|
|
63
|
-
messages.success(request, f"Page '{page.title}' saved")
|
|
64
|
-
return redirect(f"/evewiki/{page.path}")
|
|
65
|
-
except Page.DoesNotExist:
|
|
66
|
-
pass
|
|
67
|
-
|
|
68
|
-
context = {
|
|
69
|
-
"context-title": "context-not-title",
|
|
70
|
-
"tree": tree,
|
|
71
|
-
"page": page,
|
|
72
|
-
"dark_mode": dark_mode,
|
|
73
|
-
"settings": settings,
|
|
74
|
-
"is_editor": is_editor,
|
|
75
|
-
}
|
|
76
|
-
return render(request, "evewiki/index.html", context)
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
@login_required
|
|
80
|
-
@permission_required("evewiki.basic_access")
|
|
81
|
-
def page(request: WSGIRequest) -> HttpResponse:
|
|
82
|
-
|
|
83
|
-
if (
|
|
84
|
-
not request.user.has_perm("evewiki.editor_access")
|
|
85
|
-
and not request.user.profile.state.name == "Admin"
|
|
86
|
-
):
|
|
87
|
-
return redirect("/evewiki")
|
|
88
|
-
|
|
89
|
-
user = UserProfile.objects.filter(user=request.user).first()
|
|
90
|
-
page = None
|
|
91
|
-
page_id = request.GET.get("id") or request.POST.get("id")
|
|
92
|
-
if page_id is not None:
|
|
93
|
-
try:
|
|
94
|
-
page = Page.objects.get(id=page_id)
|
|
95
|
-
except Page.DoesNotExist:
|
|
96
|
-
page = None
|
|
97
|
-
|
|
98
|
-
if request.method == "POST":
|
|
99
|
-
form = PageForm(request.POST, instance=page)
|
|
100
|
-
if form.is_valid():
|
|
101
|
-
saved_page = form.save()
|
|
102
|
-
Log(user=user, action=f"Page Created: {saved_page.title}").save()
|
|
103
|
-
messages.success(request, f"Page '{saved_page.title}' saved")
|
|
104
|
-
return redirect(f"/evewiki/{saved_page.path}")
|
|
105
|
-
else:
|
|
106
|
-
form = PageForm(instance=page)
|
|
107
|
-
|
|
108
|
-
page_versions = PageVersion.objects.filter(page=page).order_by("-created").all()
|
|
109
|
-
|
|
110
|
-
context = {"Page": "Page", "page": page, "form": form, "versions": page_versions}
|
|
111
|
-
return render(request, "evewiki/page.html", context)
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
@login_required
|
|
115
|
-
@permission_required("evewiki.basic_access")
|
|
116
|
-
def page_delete(request: WSGIRequest) -> HttpResponse:
|
|
117
|
-
|
|
118
|
-
if (
|
|
119
|
-
not request.user.has_perm("evewiki.editor_access")
|
|
120
|
-
and not request.user.profile.state.name == "Admin"
|
|
121
|
-
):
|
|
122
|
-
return redirect("/evewiki")
|
|
123
|
-
|
|
124
|
-
user = UserProfile.objects.filter(user=request.user).first()
|
|
125
|
-
page = None
|
|
126
|
-
page_id = request.GET.get("id")
|
|
127
|
-
confirm_delete = request.GET.get("confirm_delete")
|
|
128
|
-
if page_id is not None:
|
|
129
|
-
try:
|
|
130
|
-
page = Page.objects.get(id=page_id)
|
|
131
|
-
except Page.DoesNotExist:
|
|
132
|
-
page = None
|
|
133
|
-
|
|
134
|
-
# Check if page has children
|
|
135
|
-
children = Page.objects.filter(parent_id=page_id).all()
|
|
136
|
-
if len(children) > 0:
|
|
137
|
-
messages.error(request, "You cannot delete a page that has children.")
|
|
138
|
-
|
|
139
|
-
# Confirm the confirmation that this user definitely wants to delete
|
|
140
|
-
if confirm_delete == "true":
|
|
141
|
-
messages.success(request, f"Page '{page.title}' deleted")
|
|
142
|
-
page.delete()
|
|
143
|
-
# Pages can be deleted, links can be broken, versions orphaned.
|
|
144
|
-
# But the log is immutable
|
|
145
|
-
Log(user=user, action=f"Page Deleted: {page.title}").save()
|
|
146
|
-
return redirect("/evewiki/index")
|
|
147
|
-
|
|
148
|
-
context = {"Delete Page": "Delete Page", "page": page, "children": children}
|
|
149
|
-
return render(request, "evewiki/page_delete.html", context)
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|