evewiki 0.0.1.dev1__tar.gz → 0.0.1.dev3__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.
Files changed (32) hide show
  1. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/PKG-INFO +14 -49
  2. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/README.md +13 -48
  3. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/__init__.py +1 -1
  4. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/auth_hooks.py +1 -1
  5. evewiki-0.0.1.dev3/evewiki/forms.py +33 -0
  6. evewiki-0.0.1.dev3/evewiki/templates/evewiki/error.html +13 -0
  7. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/urls.py +1 -1
  8. evewiki-0.0.1.dev3/evewiki/views.py +169 -0
  9. evewiki-0.0.1.dev1/evewiki/forms.py +0 -29
  10. evewiki-0.0.1.dev1/evewiki/views.py +0 -149
  11. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/LICENSE +0 -0
  12. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/admin.py +0 -0
  13. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/app_settings.py +0 -0
  14. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/apps.py +0 -0
  15. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/migrations/0001_initial.py +0 -0
  16. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/migrations/__init__.py +0 -0
  17. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/models/__init__.py +0 -0
  18. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/models/logs.py +0 -0
  19. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/models/page_versions.py +0 -0
  20. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/models/pages.py +0 -0
  21. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/models/settings.py +0 -0
  22. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/tasks.py +0 -0
  23. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/templates/evewiki/base.html +0 -0
  24. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/templates/evewiki/help.html +0 -0
  25. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/templates/evewiki/index.html +0 -0
  26. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/templates/evewiki/page.html +0 -0
  27. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/templates/evewiki/page_delete.html +0 -0
  28. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/templates/evewiki/page_tree.html +0 -0
  29. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/templates/evewiki/sidebar.html +0 -0
  30. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/tests/__init__.py +0 -0
  31. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/evewiki/tests/test_tasks.py +0 -0
  32. {evewiki-0.0.1.dev1 → evewiki-0.0.1.dev3}/pyproject.toml +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: evewiki
3
- Version: 0.0.1.dev1
3
+ Version: 0.0.1.dev3
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
- # aa-wiki
30
+ # evewiki
31
31
 
32
32
  Wiki plugin for [AllianceAuth](https://gitlab.com/allianceauth/allianceauth) to curate content.
33
33
 
@@ -61,61 +61,26 @@ You can alter them by adding a record to the `Settings` section/table in the `ev
61
61
 
62
62
  ## Installation
63
63
 
64
- *Assumes setup of AA as per the [documentation](https://allianceauth.readthedocs.io/en/latest/installation-containerized/docker.html)*
65
- Final folder structure would look like
66
- ```plaintext
67
- aa-dev
68
- ├─ aa-docker
69
- └─ aa-wiki
70
-
71
- ```
64
+ ### Step 1 - Pre_Requisites
72
65
 
73
- Traverse into the `aa-dev` folder and clone the repo
74
- ```bash
75
- git clone https://gitlab.com/cunningdesigns/aa-wiki.git
76
- ```
66
+ Evewiki is an App for Alliance Auth, Please make sure you have this installed. Evewiki is not a standalone Django Application
77
67
 
78
- Traverse to `../aa-docker` folder
68
+ ### Step 2 - Install app
79
69
 
80
- Bind-mount the plugin-folder in `aa-docker/docker-compose.yml`
81
- ```yaml
82
- x-allianceauth-base:
83
- volumes:
84
- - ../aa-wiki:/home/allianceauth/evewiki
85
- ```
70
+ pip install evewiki
86
71
 
87
- ___
88
- *there has to be a better way*
89
- > 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)
72
+ ### Step 3 - Configure Auth settings
90
73
 
91
- > Comment out lines 11,12 & 14 on `aa-wiki/evewiki/urls.py`
92
- ___
74
+ Configure your Auth settings (`local.py`) as follows:
93
75
 
94
- Start the containers (may require sudo)
95
- ```bash
96
- docker compose --env-file=.env up -d
97
- ```
76
+ - Add the following `INSTALLED_APPS` in `local.py`
98
77
 
99
- Open a terminal in the gunicorn container, initiate the plugin install
100
- ```bash
101
- docker compose exec allianceauth_gunicorn bash
102
- pip install -e ../evewiki
103
- ```
104
-
105
- add `evewiki` to `aa-docker/conf/local.py`
106
-
107
- Apply migrations and exit
108
- ```bash
109
- python manage.py migrate
78
+ ```plaintext
79
+ 'evewiki',
110
80
  ```
111
81
 
112
- restart AA
113
- ```bash
114
- docker compose restart allianceauth_gunicorn
115
- ```
82
+ ### Step 4
116
83
 
117
- ___
118
- *there has to be a better way*
119
- > Remember to undo the modifications to `evewiki/evewiki/views.py` & `evewiki/evewiki/urls.py`
120
- ___
84
+ In AA admin site add Permissions `evewiki | general | Can access this app` and `evewiki | general | Can edit this app` to the desired `States` / `Groups`
85
+ i.e. you may wish to create a `wiki_editors` group to restrict the `Can edit this app` controls.
121
86
 
@@ -1,4 +1,4 @@
1
- # aa-wiki
1
+ # evewiki
2
2
 
3
3
  Wiki plugin for [AllianceAuth](https://gitlab.com/allianceauth/allianceauth) to curate content.
4
4
 
@@ -32,60 +32,25 @@ You can alter them by adding a record to the `Settings` section/table in the `ev
32
32
 
33
33
  ## Installation
34
34
 
35
- *Assumes setup of AA as per the [documentation](https://allianceauth.readthedocs.io/en/latest/installation-containerized/docker.html)*
36
- Final folder structure would look like
37
- ```plaintext
38
- aa-dev
39
- ├─ aa-docker
40
- └─ aa-wiki
41
-
42
- ```
35
+ ### Step 1 - Pre_Requisites
43
36
 
44
- Traverse into the `aa-dev` folder and clone the repo
45
- ```bash
46
- git clone https://gitlab.com/cunningdesigns/aa-wiki.git
47
- ```
37
+ Evewiki is an App for Alliance Auth, Please make sure you have this installed. Evewiki is not a standalone Django Application
48
38
 
49
- Traverse to `../aa-docker` folder
39
+ ### Step 2 - Install app
50
40
 
51
- Bind-mount the plugin-folder in `aa-docker/docker-compose.yml`
52
- ```yaml
53
- x-allianceauth-base:
54
- volumes:
55
- - ../aa-wiki:/home/allianceauth/evewiki
56
- ```
41
+ pip install evewiki
57
42
 
58
- ___
59
- *there has to be a better way*
60
- > 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)
43
+ ### Step 3 - Configure Auth settings
61
44
 
62
- > Comment out lines 11,12 & 14 on `aa-wiki/evewiki/urls.py`
63
- ___
45
+ Configure your Auth settings (`local.py`) as follows:
64
46
 
65
- Start the containers (may require sudo)
66
- ```bash
67
- docker compose --env-file=.env up -d
68
- ```
47
+ - Add the following `INSTALLED_APPS` in `local.py`
69
48
 
70
- Open a terminal in the gunicorn container, initiate the plugin install
71
- ```bash
72
- docker compose exec allianceauth_gunicorn bash
73
- pip install -e ../evewiki
74
- ```
75
-
76
- add `evewiki` to `aa-docker/conf/local.py`
77
-
78
- Apply migrations and exit
79
- ```bash
80
- python manage.py migrate
49
+ ```plaintext
50
+ 'evewiki',
81
51
  ```
82
52
 
83
- restart AA
84
- ```bash
85
- docker compose restart allianceauth_gunicorn
86
- ```
53
+ ### Step 4
87
54
 
88
- ___
89
- *there has to be a better way*
90
- > Remember to undo the modifications to `evewiki/evewiki/views.py` & `evewiki/evewiki/urls.py`
91
- ___
55
+ In AA admin site add Permissions `evewiki | general | Can access this app` and `evewiki | general | Can edit this app` to the desired `States` / `Groups`
56
+ i.e. you may wish to create a `wiki_editors` group to restrict the `Can edit this app` controls.
@@ -3,4 +3,4 @@
3
3
  # pylint: disable = invalid-name
4
4
  default_app_config = "evewiki.apps.EveWikiConfig"
5
5
 
6
- __version__ = "0.0.1.dev1"
6
+ __version__ = "0.0.1.dev3"
@@ -3,7 +3,7 @@ from django.utils.translation import gettext_lazy as _
3
3
  from allianceauth import hooks
4
4
  from allianceauth.services.hooks import MenuItemHook, UrlHook
5
5
 
6
- from . import urls
6
+ from evewiki import urls
7
7
 
8
8
 
9
9
  class EveWikiMenuItem(MenuItemHook):
@@ -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,13 @@
1
+ {% block details %}
2
+ <h1>Setup Required</h1>
3
+
4
+ {% endblock %}
5
+
6
+ {% block extra_javascript %}
7
+ {% endblock %}
8
+
9
+ {% block extra_css %}
10
+ {% endblock %}
11
+
12
+ {% block extra_script %}
13
+ {% endblock %}
@@ -2,7 +2,7 @@
2
2
 
3
3
  from django.urls import path, re_path
4
4
 
5
- from . import views
5
+ from evewiki import views
6
6
 
7
7
  app_name = "evewiki"
8
8
 
@@ -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