punkweb-bb 0.5.0__py3-none-any.whl → 0.5.2__py3-none-any.whl
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.
- punkweb_bb/__pycache__/__init__.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/admin.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/admin_forms.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/apps.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/bbcode.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/decorators.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/forms.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/guests.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/middleware.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/mixins.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/models.cpython-311.pyc +0 -0
- punkweb_bb/__pycache__/models.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/pagination.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/response.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/searching.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/settings.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/signals.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/tests.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/urls.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/utils.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/views.cpython-311.pyc +0 -0
- punkweb_bb/__pycache__/views.cpython-313.pyc +0 -0
- punkweb_bb/__pycache__/widgets.cpython-313.pyc +0 -0
- punkweb_bb/bbcode.py +16 -4
- punkweb_bb/migrations/0008_alter_groupstyle_username_style.py +18 -0
- punkweb_bb/migrations/__pycache__/0001_initial.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0002_thread_view_count.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0003_alter_thread_options.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0004_groupstyle.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0005_alter_thread_options.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0006_remove_boardprofile__signature_rendered_and_more.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0007_boardprofile_bio.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0008_alter_groupstyle_username_style.cpython-311.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0008_alter_groupstyle_username_style.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/0009_report.cpython-313.pyc +0 -0
- punkweb_bb/migrations/__pycache__/__init__.cpython-313.pyc +0 -0
- punkweb_bb/models.py +6 -3
- punkweb_bb/settings.py +2 -0
- punkweb_bb/static/punkweb_bb/css/bbcode-editor-content.css +4 -0
- punkweb_bb/static/punkweb_bb/css/members.css +6 -0
- punkweb_bb/static/punkweb_bb/css/punkweb.css +4 -0
- punkweb_bb/static/punkweb_bb/vendor/prism-duotone-sea.css +170 -0
- punkweb_bb/static/punkweb_bb/vendor/punkweb-ui.min.css +1 -1
- punkweb_bb/templates/punkweb_bb/base.html +84 -96
- punkweb_bb/templates/punkweb_bb/base_delete_dialog.html +13 -10
- punkweb_bb/templates/punkweb_bb/base_dialog.html +6 -6
- punkweb_bb/templates/punkweb_bb/bbcode.html +12 -14
- punkweb_bb/templates/punkweb_bb/category_create.html +26 -27
- punkweb_bb/templates/punkweb_bb/category_update.html +27 -30
- punkweb_bb/templates/punkweb_bb/components/pagination_controls.html +36 -44
- punkweb_bb/templates/punkweb_bb/components/profile_image.html +8 -8
- punkweb_bb/templates/punkweb_bb/forms/inline_form.html +5 -5
- punkweb_bb/templates/punkweb_bb/forms/stacked_form.html +35 -32
- punkweb_bb/templates/punkweb_bb/index.html +205 -211
- punkweb_bb/templates/punkweb_bb/login.html +24 -30
- punkweb_bb/templates/punkweb_bb/members.html +57 -61
- punkweb_bb/templates/punkweb_bb/partials/category_delete.html +3 -3
- punkweb_bb/templates/punkweb_bb/partials/post_delete.html +3 -3
- punkweb_bb/templates/punkweb_bb/partials/post_update.html +12 -11
- punkweb_bb/templates/punkweb_bb/partials/shout_delete.html +3 -3
- punkweb_bb/templates/punkweb_bb/partials/subcategory_delete.html +3 -3
- punkweb_bb/templates/punkweb_bb/partials/thread_delete.html +3 -3
- punkweb_bb/templates/punkweb_bb/partials/thread_move.html +13 -12
- punkweb_bb/templates/punkweb_bb/profile.html +73 -84
- punkweb_bb/templates/punkweb_bb/search.html +12 -16
- punkweb_bb/templates/punkweb_bb/settings.html +29 -36
- punkweb_bb/templates/punkweb_bb/shoutbox/shout_list.html +17 -19
- punkweb_bb/templates/punkweb_bb/shoutbox/shoutbox.html +18 -29
- punkweb_bb/templates/punkweb_bb/signup.html +24 -30
- punkweb_bb/templates/punkweb_bb/subcategory.html +114 -132
- punkweb_bb/templates/punkweb_bb/subcategory_create.html +32 -39
- punkweb_bb/templates/punkweb_bb/subcategory_update.html +33 -42
- punkweb_bb/templates/punkweb_bb/thread.html +207 -238
- punkweb_bb/templates/punkweb_bb/thread_create.html +36 -43
- punkweb_bb/templates/punkweb_bb/thread_update.html +36 -45
- punkweb_bb/templates/punkweb_bb/widgets/markdown-editor.html +3 -1
- punkweb_bb/templatetags/__pycache__/__init__.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/can_delete.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/can_edit.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/can_post.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/humanize_int.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/punkweb_bb.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/render.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/styled_group_name.cpython-313.pyc +0 -0
- punkweb_bb/templatetags/__pycache__/styled_username.cpython-313.pyc +0 -0
- punkweb_bb/tests.py +21 -0
- punkweb_bb/views.py +27 -27
- {punkweb_bb-0.5.0.dist-info → punkweb_bb-0.5.2.dist-info}/METADATA +93 -37
- {punkweb_bb-0.5.0.dist-info → punkweb_bb-0.5.2.dist-info}/RECORD +92 -49
- {punkweb_bb-0.5.0.dist-info → punkweb_bb-0.5.2.dist-info}/WHEEL +1 -1
- {punkweb_bb-0.5.0.dist-info → punkweb_bb-0.5.2.dist-info/licenses}/LICENSE +0 -0
- {punkweb_bb-0.5.0.dist-info → punkweb_bb-0.5.2.dist-info}/top_level.txt +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
punkweb_bb/tests.py
CHANGED
|
@@ -205,6 +205,27 @@ class ThreadTestCase(TestCase):
|
|
|
205
205
|
|
|
206
206
|
self.assertRaises(ValidationError, post.save)
|
|
207
207
|
|
|
208
|
+
def test_update_post_in_closed_thread(self):
|
|
209
|
+
thread = Thread.objects.create(
|
|
210
|
+
subcategory=self.subcategory,
|
|
211
|
+
user=self.user,
|
|
212
|
+
title="test",
|
|
213
|
+
content="test",
|
|
214
|
+
)
|
|
215
|
+
post = Post.objects.create(
|
|
216
|
+
thread=thread,
|
|
217
|
+
user=self.user,
|
|
218
|
+
content="test",
|
|
219
|
+
)
|
|
220
|
+
|
|
221
|
+
thread.is_closed = True
|
|
222
|
+
thread.save()
|
|
223
|
+
|
|
224
|
+
post.content = "edited test"
|
|
225
|
+
post.save()
|
|
226
|
+
|
|
227
|
+
self.assertEqual(post.content, "edited test")
|
|
228
|
+
|
|
208
229
|
def test_is_pinned(self):
|
|
209
230
|
thread = Thread.objects.create(
|
|
210
231
|
subcategory=self.subcategory,
|
punkweb_bb/views.py
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
from django import forms
|
|
2
1
|
from django.contrib.auth import authenticate, get_user_model, login, logout
|
|
3
2
|
from django.contrib.auth.decorators import login_required, permission_required
|
|
4
3
|
from django.core.exceptions import PermissionDenied
|
|
@@ -175,7 +174,7 @@ def members_view(request):
|
|
|
175
174
|
return render(request, "punkweb_bb/members.html", context=context)
|
|
176
175
|
|
|
177
176
|
|
|
178
|
-
@login_required(
|
|
177
|
+
@login_required()
|
|
179
178
|
def settings_view(request):
|
|
180
179
|
if request.method == "POST":
|
|
181
180
|
form = BoardProfileModelForm(
|
|
@@ -198,7 +197,7 @@ def settings_view(request):
|
|
|
198
197
|
return render(request, "punkweb_bb/settings.html", context=context)
|
|
199
198
|
|
|
200
199
|
|
|
201
|
-
@login_required(
|
|
200
|
+
@login_required()
|
|
202
201
|
@permission_required("punkweb_bb.view_category", raise_exception=True)
|
|
203
202
|
def category_create_view(request):
|
|
204
203
|
if request.method == "POST":
|
|
@@ -219,7 +218,7 @@ def category_create_view(request):
|
|
|
219
218
|
return render(request, "punkweb_bb/category_create.html", context=context)
|
|
220
219
|
|
|
221
220
|
|
|
222
|
-
@login_required(
|
|
221
|
+
@login_required()
|
|
223
222
|
@permission_required("punkweb_bb.change_category", raise_exception=True)
|
|
224
223
|
def category_update_view(request, category_slug):
|
|
225
224
|
category = get_object_or_404(Category, slug=category_slug)
|
|
@@ -241,7 +240,7 @@ def category_update_view(request, category_slug):
|
|
|
241
240
|
return render(request, "punkweb_bb/category_update.html", context=context)
|
|
242
241
|
|
|
243
242
|
|
|
244
|
-
@login_required(
|
|
243
|
+
@login_required()
|
|
245
244
|
@permission_required("punkweb_bb.delete_category", raise_exception=True)
|
|
246
245
|
def category_delete_view(request, category_slug):
|
|
247
246
|
category = get_object_or_404(Category, slug=category_slug)
|
|
@@ -270,7 +269,7 @@ def subcategory_view(request, subcategory_slug):
|
|
|
270
269
|
return render(request, "punkweb_bb/subcategory.html", context=context)
|
|
271
270
|
|
|
272
271
|
|
|
273
|
-
@login_required(
|
|
272
|
+
@login_required()
|
|
274
273
|
@permission_required("punkweb_bb.add_subcategory", raise_exception=True)
|
|
275
274
|
def subcategory_create_view(request, category_slug):
|
|
276
275
|
category = get_object_or_404(Category, slug=category_slug)
|
|
@@ -295,7 +294,7 @@ def subcategory_create_view(request, category_slug):
|
|
|
295
294
|
return render(request, "punkweb_bb/subcategory_create.html", context=context)
|
|
296
295
|
|
|
297
296
|
|
|
298
|
-
@login_required(
|
|
297
|
+
@login_required()
|
|
299
298
|
@permission_required("punkweb_bb.change_subcategory", raise_exception=True)
|
|
300
299
|
def subcategory_update_view(request, subcategory_slug):
|
|
301
300
|
subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
|
|
@@ -317,7 +316,7 @@ def subcategory_update_view(request, subcategory_slug):
|
|
|
317
316
|
return render(request, "punkweb_bb/subcategory_update.html", context=context)
|
|
318
317
|
|
|
319
318
|
|
|
320
|
-
@login_required(
|
|
319
|
+
@login_required()
|
|
321
320
|
@permission_required("punkweb_bb.delete_subcategory", raise_exception=True)
|
|
322
321
|
def subcategory_delete_view(request, subcategory_slug):
|
|
323
322
|
subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
|
|
@@ -336,7 +335,7 @@ def subcategory_delete_view(request, subcategory_slug):
|
|
|
336
335
|
)
|
|
337
336
|
|
|
338
337
|
|
|
339
|
-
@login_required(
|
|
338
|
+
@login_required()
|
|
340
339
|
def thread_create_view(request, subcategory_slug):
|
|
341
340
|
subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
|
|
342
341
|
|
|
@@ -384,7 +383,7 @@ def thread_view(request, thread_id):
|
|
|
384
383
|
return render(request, "punkweb_bb/thread.html", context=context)
|
|
385
384
|
|
|
386
385
|
|
|
387
|
-
@login_required(
|
|
386
|
+
@login_required()
|
|
388
387
|
def thread_update_view(request, thread_id):
|
|
389
388
|
thread = get_object_or_404(Thread, pk=thread_id)
|
|
390
389
|
|
|
@@ -407,7 +406,7 @@ def thread_update_view(request, thread_id):
|
|
|
407
406
|
return render(request, "punkweb_bb/thread_update.html", context=context)
|
|
408
407
|
|
|
409
408
|
|
|
410
|
-
@login_required(
|
|
409
|
+
@login_required()
|
|
411
410
|
def thread_delete_view(request, thread_id):
|
|
412
411
|
thread = get_object_or_404(Thread, pk=thread_id)
|
|
413
412
|
|
|
@@ -425,7 +424,7 @@ def thread_delete_view(request, thread_id):
|
|
|
425
424
|
return render(request, "punkweb_bb/partials/thread_delete.html", context=context)
|
|
426
425
|
|
|
427
426
|
|
|
428
|
-
@login_required(
|
|
427
|
+
@login_required()
|
|
429
428
|
@permission_required("punkweb_bb.pin_thread", raise_exception=True)
|
|
430
429
|
def thread_pin_view(request, thread_id):
|
|
431
430
|
thread = get_object_or_404(Thread, pk=thread_id)
|
|
@@ -436,7 +435,7 @@ def thread_pin_view(request, thread_id):
|
|
|
436
435
|
return htmx_redirect(thread.get_absolute_url())
|
|
437
436
|
|
|
438
437
|
|
|
439
|
-
@login_required(
|
|
438
|
+
@login_required()
|
|
440
439
|
@permission_required("punkweb_bb.close_thread", raise_exception=True)
|
|
441
440
|
def thread_close_view(request, thread_id):
|
|
442
441
|
thread = get_object_or_404(Thread, pk=thread_id)
|
|
@@ -447,7 +446,7 @@ def thread_close_view(request, thread_id):
|
|
|
447
446
|
return htmx_redirect(thread.get_absolute_url())
|
|
448
447
|
|
|
449
448
|
|
|
450
|
-
@login_required(
|
|
449
|
+
@login_required()
|
|
451
450
|
@permission_required("punkweb_bb.move_thread", raise_exception=True)
|
|
452
451
|
def thread_move_view(request, thread_id):
|
|
453
452
|
thread = get_object_or_404(Thread, pk=thread_id)
|
|
@@ -475,24 +474,25 @@ def thread_move_view(request, thread_id):
|
|
|
475
474
|
return render(request, "punkweb_bb/partials/thread_move.html", context=context)
|
|
476
475
|
|
|
477
476
|
|
|
478
|
-
@login_required(
|
|
477
|
+
@login_required()
|
|
479
478
|
def post_create_view(request, thread_id):
|
|
480
|
-
|
|
479
|
+
if request.method == "POST":
|
|
480
|
+
thread = get_object_or_404(Thread, pk=thread_id)
|
|
481
481
|
|
|
482
|
-
|
|
482
|
+
check_object_permission(thread, "can_post", request.user)
|
|
483
483
|
|
|
484
|
-
|
|
484
|
+
form = PostModelForm(request.POST)
|
|
485
485
|
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
486
|
+
if form.is_valid():
|
|
487
|
+
post = form.save(commit=False)
|
|
488
|
+
post.thread = thread
|
|
489
|
+
post.user = request.user
|
|
490
|
+
post.save()
|
|
491
491
|
|
|
492
|
-
|
|
492
|
+
return redirect(post)
|
|
493
493
|
|
|
494
494
|
|
|
495
|
-
@login_required(
|
|
495
|
+
@login_required()
|
|
496
496
|
def post_update_view(request, post_id):
|
|
497
497
|
post = get_object_or_404(Post, pk=post_id)
|
|
498
498
|
|
|
@@ -516,7 +516,7 @@ def post_update_view(request, post_id):
|
|
|
516
516
|
return render(request, "punkweb_bb/partials/post_update.html", context=context)
|
|
517
517
|
|
|
518
518
|
|
|
519
|
-
@login_required(
|
|
519
|
+
@login_required()
|
|
520
520
|
def post_delete_view(request, post_id):
|
|
521
521
|
post = get_object_or_404(Post, pk=post_id)
|
|
522
522
|
|
|
@@ -572,7 +572,7 @@ def shout_create_view(request):
|
|
|
572
572
|
)
|
|
573
573
|
|
|
574
574
|
|
|
575
|
-
@login_required(
|
|
575
|
+
@login_required()
|
|
576
576
|
def shout_delete_view(request, shout_id):
|
|
577
577
|
shout = get_object_or_404(Shout, pk=shout_id)
|
|
578
578
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
Metadata-Version: 2.
|
|
2
|
-
Name:
|
|
3
|
-
Version: 0.5.
|
|
1
|
+
Metadata-Version: 2.4
|
|
2
|
+
Name: punkweb_bb
|
|
3
|
+
Version: 0.5.2
|
|
4
4
|
Summary: Django application that provides a simple and modern forum board software for your Django website.
|
|
5
5
|
Home-page: https://github.com/Punkweb/PunkwebBB
|
|
6
6
|
Author: Punkweb
|
|
@@ -15,43 +15,70 @@ Classifier: Programming Language :: Python
|
|
|
15
15
|
Classifier: Programming Language :: Python :: 3
|
|
16
16
|
Description-Content-Type: text/markdown
|
|
17
17
|
License-File: LICENSE
|
|
18
|
-
Requires-Dist: django
|
|
18
|
+
Requires-Dist: django>=4.0
|
|
19
19
|
Requires-Dist: bbcode
|
|
20
20
|
Requires-Dist: markdown
|
|
21
21
|
Requires-Dist: pillow
|
|
22
22
|
Requires-Dist: expiringdict
|
|
23
|
+
Dynamic: author
|
|
24
|
+
Dynamic: author-email
|
|
25
|
+
Dynamic: classifier
|
|
26
|
+
Dynamic: description
|
|
27
|
+
Dynamic: description-content-type
|
|
28
|
+
Dynamic: home-page
|
|
29
|
+
Dynamic: license
|
|
30
|
+
Dynamic: license-file
|
|
31
|
+
Dynamic: requires-dist
|
|
32
|
+
Dynamic: summary
|
|
23
33
|
|
|
24
34
|
# PunkwebBB
|
|
25
35
|
|
|
26
|
-
|
|
36
|
+
## What is PunkwebBB?
|
|
37
|
+
|
|
38
|
+
PunkwebBB is a Django application that provides a complete forum board solution for Django websites. What sets it apart is its focus on simplicity and independence - it doesn't rely on other Django apps, making it incredibly straightforward to install and configure. The goal? To have a fully functional forum up and running in under a minute.
|
|
27
39
|
|
|
28
40
|
Check out [punkweb.net](https://punkweb.net/board/) for documentation, support and a live demonstration of the software.
|
|
29
41
|
|
|
30
|
-
##
|
|
42
|
+
## Requirements
|
|
43
|
+
|
|
44
|
+
- Python 3.9+
|
|
45
|
+
- Django 3.2+
|
|
46
|
+
|
|
47
|
+
It may work with older versions of Python and Django, but it has not been tested.
|
|
48
|
+
|
|
49
|
+
## Key Features
|
|
50
|
+
|
|
51
|
+
### 1. Modern Technology Stack
|
|
31
52
|
|
|
32
53
|
- [Django](https://www.djangoproject.com/)
|
|
33
54
|
- [HTMX](https://htmx.org/)
|
|
34
|
-
- [jQuery](https://jquery.com/)
|
|
35
55
|
- [bbcode](https://pypi.org/project/bbcode/)
|
|
36
56
|
- [Markdown](https://pypi.org/project/Markdown/)
|
|
37
57
|
- [SCEditor](https://www.sceditor.com/)
|
|
38
58
|
- [TinyMDE](https://github.com/jefago/tiny-markdown-editor)
|
|
39
59
|
- [PrismJS](https://prismjs.com/)
|
|
40
60
|
|
|
41
|
-
|
|
61
|
+
### 2. Core Functionality
|
|
42
62
|
|
|
43
|
-
-
|
|
44
|
-
-
|
|
63
|
+
- User registration and authentication
|
|
64
|
+
- Thread and post management
|
|
65
|
+
- Real-time shoutbox
|
|
66
|
+
- Discord integration
|
|
67
|
+
- BBCode and Markdown parsing
|
|
68
|
+
- Responsive design
|
|
69
|
+
- Admin controls and moderation tools
|
|
45
70
|
|
|
46
|
-
|
|
71
|
+
## Getting Started
|
|
47
72
|
|
|
48
|
-
|
|
73
|
+
### Installation
|
|
49
74
|
|
|
50
75
|
```bash
|
|
51
76
|
pip install punkweb-bb
|
|
52
77
|
```
|
|
53
78
|
|
|
54
|
-
|
|
79
|
+
### Configuration
|
|
80
|
+
|
|
81
|
+
Add to your Django settings:
|
|
55
82
|
|
|
56
83
|
```python
|
|
57
84
|
INSTALLED_APPS = [
|
|
@@ -69,46 +96,75 @@ MIDDLEWARE = [
|
|
|
69
96
|
]
|
|
70
97
|
```
|
|
71
98
|
|
|
72
|
-
|
|
99
|
+
### URL Configuration
|
|
73
100
|
|
|
74
101
|
```python
|
|
75
102
|
from django.urls import path, include
|
|
76
103
|
|
|
77
104
|
urlpatterns = [
|
|
78
105
|
...
|
|
79
|
-
path("forum/", include("punkweb_bb.urls")),
|
|
106
|
+
path("forum/", include("punkweb_bb.urls")),
|
|
80
107
|
]
|
|
81
108
|
```
|
|
82
109
|
|
|
83
|
-
|
|
110
|
+
## Customization Options
|
|
84
111
|
|
|
85
|
-
|
|
86
|
-
|
|
112
|
+
PunkwebBB comes with a range of configurable settings:
|
|
113
|
+
|
|
114
|
+
```python
|
|
115
|
+
PUNKWEB_BB = {
|
|
116
|
+
"SITE_NAME": "Your Site Name",
|
|
117
|
+
"SITE_TITLE": "Your Forum Title",
|
|
118
|
+
"PARSER": "bbcode", # or "markdown"
|
|
119
|
+
"FAVICON": "path/to/favicon.ico",
|
|
120
|
+
"OG_IMAGE": None, # Full URL for Open Graph meta tags
|
|
121
|
+
"SHOUTBOX_ENABLED": True,
|
|
122
|
+
"SHOUTBOX_POLLING_ENABLED": True,
|
|
123
|
+
"SHOUTBOX_POLLING_INTERVAL": 30, # seconds
|
|
124
|
+
"DISCORD_WIDGET_ENABLED": False,
|
|
125
|
+
"DISCORD_WIDGET_THEME": "dark",
|
|
126
|
+
"DISCORD_SERVER_ID": None,
|
|
127
|
+
}
|
|
87
128
|
```
|
|
88
129
|
|
|
89
|
-
##
|
|
130
|
+
## Why Choose PunkwebBB?
|
|
90
131
|
|
|
91
|
-
|
|
132
|
+
### 1. Simplicity
|
|
92
133
|
|
|
93
|
-
|
|
134
|
+
The installation process is straightforward, and the default configuration works out of the box. You don't need to be a Django expert to get started.
|
|
94
135
|
|
|
95
|
-
|
|
136
|
+
### 2. Independence
|
|
96
137
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
138
|
+
Unlike many forum solutions that require multiple dependencies, PunkwebBB is self-contained. This means fewer potential points of failure and easier maintenance.
|
|
139
|
+
|
|
140
|
+
### 3. Modern Features
|
|
141
|
+
|
|
142
|
+
From real-time shoutbox to Discord integration, PunkwebBB includes features that modern communities expect.
|
|
143
|
+
|
|
144
|
+
### 4. Extensibility
|
|
145
|
+
|
|
146
|
+
While it's simple to set up, PunkwebBB is also highly customizable. You can extend its functionality to match your specific needs.
|
|
147
|
+
|
|
148
|
+
### 5. Performance
|
|
149
|
+
|
|
150
|
+
Built with efficiency in mind, PunkwebBB handles user interactions smoothly without unnecessary overhead.
|
|
151
|
+
|
|
152
|
+
## Real-World Applications
|
|
153
|
+
|
|
154
|
+
PunkwebBB is ideal for:
|
|
155
|
+
|
|
156
|
+
- Gaming communities
|
|
157
|
+
- Business support forums
|
|
158
|
+
- Educational platforms
|
|
159
|
+
- Technical discussion boards
|
|
160
|
+
- Fan communities
|
|
161
|
+
- Knowledge-sharing platforms
|
|
162
|
+
|
|
163
|
+
## Conclusion
|
|
164
|
+
|
|
165
|
+
PunkwebBB represents a perfect balance between simplicity and functionality. Whether you're building a small community forum or a large-scale discussion platform, it provides all the essential features while remaining easy to implement and maintain.
|
|
166
|
+
|
|
167
|
+
The project's focus on independence and straightforward installation makes it an excellent choice for developers who want to add forum functionality to their Django projects without the complexity of larger forum solutions.
|
|
112
168
|
|
|
113
169
|
## Testing
|
|
114
170
|
|