punkweb-bb 0.1.3__py3-none-any.whl → 0.2.0__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.
Files changed (49) hide show
  1. punkweb_bb/__pycache__/forms.cpython-311.pyc +0 -0
  2. punkweb_bb/__pycache__/guests.cpython-311.pyc +0 -0
  3. punkweb_bb/__pycache__/middleware.cpython-311.pyc +0 -0
  4. punkweb_bb/__pycache__/models.cpython-311.pyc +0 -0
  5. punkweb_bb/__pycache__/settings.cpython-311.pyc +0 -0
  6. punkweb_bb/__pycache__/tests.cpython-311.pyc +0 -0
  7. punkweb_bb/__pycache__/urls.cpython-311.pyc +0 -0
  8. punkweb_bb/__pycache__/utils.cpython-311.pyc +0 -0
  9. punkweb_bb/__pycache__/views.cpython-311.pyc +0 -0
  10. punkweb_bb/forms.py +40 -7
  11. punkweb_bb/guests.py +20 -0
  12. punkweb_bb/middleware.py +7 -0
  13. punkweb_bb/models.py +21 -0
  14. punkweb_bb/settings.py +3 -0
  15. punkweb_bb/static/punkweb_bb/css/category-form.css +24 -0
  16. punkweb_bb/static/punkweb_bb/css/index.css +6 -0
  17. punkweb_bb/static/punkweb_bb/css/punkweb.css +84 -5
  18. punkweb_bb/static/punkweb_bb/css/shoutbox.css +13 -2
  19. punkweb_bb/static/punkweb_bb/css/subcategory-form.css +24 -0
  20. punkweb_bb/static/punkweb_bb/css/subcategory.css +12 -0
  21. punkweb_bb/static/punkweb_bb/css/thread.css +19 -0
  22. punkweb_bb/static/punkweb_bb/css/variables.css +1 -0
  23. punkweb_bb/templates/punkweb_bb/category_create.html +50 -0
  24. punkweb_bb/templates/punkweb_bb/category_update.html +53 -0
  25. punkweb_bb/templates/punkweb_bb/index.html +46 -7
  26. punkweb_bb/templates/punkweb_bb/partials/category_delete.html +11 -0
  27. punkweb_bb/templates/punkweb_bb/partials/shout_delete.html +11 -0
  28. punkweb_bb/templates/punkweb_bb/partials/subcategory_delete.html +11 -0
  29. punkweb_bb/templates/punkweb_bb/shoutbox/shout_list.html +14 -4
  30. punkweb_bb/templates/punkweb_bb/subcategory.html +21 -6
  31. punkweb_bb/templates/punkweb_bb/subcategory_create.html +53 -0
  32. punkweb_bb/templates/punkweb_bb/subcategory_update.html +56 -0
  33. punkweb_bb/templates/punkweb_bb/thread.html +26 -6
  34. punkweb_bb/templates/punkweb_bb/thread_create.html +1 -0
  35. punkweb_bb/templatetags/__pycache__/can_delete.cpython-311.pyc +0 -0
  36. punkweb_bb/templatetags/__pycache__/can_edit.cpython-311.pyc +0 -0
  37. punkweb_bb/templatetags/__pycache__/can_post.cpython-311.pyc +0 -0
  38. punkweb_bb/templatetags/can_delete.py +8 -0
  39. punkweb_bb/templatetags/can_edit.py +8 -0
  40. punkweb_bb/templatetags/can_post.py +8 -0
  41. punkweb_bb/tests.py +19 -8
  42. punkweb_bb/urls.py +27 -0
  43. punkweb_bb/utils.py +17 -0
  44. punkweb_bb/views.py +232 -38
  45. {punkweb_bb-0.1.3.dist-info → punkweb_bb-0.2.0.dist-info}/METADATA +6 -2
  46. {punkweb_bb-0.1.3.dist-info → punkweb_bb-0.2.0.dist-info}/RECORD +49 -30
  47. {punkweb_bb-0.1.3.dist-info → punkweb_bb-0.2.0.dist-info}/LICENSE +0 -0
  48. {punkweb_bb-0.1.3.dist-info → punkweb_bb-0.2.0.dist-info}/WHEEL +0 -0
  49. {punkweb_bb-0.1.3.dist-info → punkweb_bb-0.2.0.dist-info}/top_level.txt +0 -0
punkweb_bb/views.py CHANGED
@@ -4,47 +4,46 @@ from django.contrib.auth import authenticate, get_user_model, login, logout
4
4
  from django.contrib.auth.decorators import login_required
5
5
  from django.http import HttpResponseForbidden
6
6
  from django.shortcuts import get_object_or_404, redirect, render
7
+ from django.urls import reverse
7
8
  from django.utils import timezone
8
9
 
9
10
  from punkweb_bb.forms import (
10
11
  BoardProfileModelForm,
12
+ CategoryModelForm,
11
13
  LoginForm,
12
14
  PostModelForm,
13
15
  ShoutModelForm,
14
16
  SignUpForm,
17
+ SubcategoryModelForm,
15
18
  ThreadModelForm,
16
19
  )
20
+ from punkweb_bb.guests import guest_list
17
21
  from punkweb_bb.models import Category, Post, Shout, Subcategory, Thread
18
22
  from punkweb_bb.pagination import paginate_qs
19
23
  from punkweb_bb.response import htmx_redirect
24
+ from punkweb_bb.utils import get_unique_slug
20
25
 
21
26
  User = get_user_model()
22
27
 
23
28
 
24
- def index_view(request):
25
- categories = Category.objects.all()
29
+ def signup_view(request):
30
+ if request.user.is_authenticated:
31
+ return redirect("punkweb_bb:index")
26
32
 
27
- recent_threads = Thread.objects.all().order_by("-created_at")[:5]
33
+ if request.method == "POST":
34
+ form = SignUpForm(request.POST)
28
35
 
29
- thread_count = Thread.objects.count()
30
- post_count = Post.objects.count()
36
+ if form.is_valid():
37
+ form.save()
31
38
 
32
- users = User.objects.select_related("profile").all()
33
- newest_user = users.order_by("-profile__created_at").first()
34
- users_online = [user for user in users if user.profile.is_online]
35
- staff_online = [user for user in users_online if user.is_staff]
39
+ return redirect("punkweb_bb:login")
40
+ else:
41
+ form = SignUpForm()
36
42
 
37
43
  context = {
38
- "categories": categories,
39
- "recent_threads": recent_threads,
40
- "thread_count": thread_count,
41
- "post_count": post_count,
42
- "users": users,
43
- "newest_user": newest_user,
44
- "users_online": users_online,
45
- "staff_online": staff_online,
44
+ "form": form,
46
45
  }
47
- return render(request, "punkweb_bb/index.html", context=context)
46
+ return render(request, "punkweb_bb/signup.html", context)
48
47
 
49
48
 
50
49
  def login_view(request):
@@ -78,24 +77,36 @@ def logout_view(request):
78
77
  return redirect("punkweb_bb:login")
79
78
 
80
79
 
81
- def signup_view(request):
82
- if request.user.is_authenticated:
83
- return redirect("punkweb_bb:index")
80
+ def index_view(request):
81
+ categories = Category.objects.all()
84
82
 
85
- if request.method == "POST":
86
- form = SignUpForm(request.POST)
83
+ recent_threads = Thread.objects.all().order_by("-created_at")[:5]
87
84
 
88
- if form.is_valid():
89
- form.save()
85
+ thread_count = Thread.objects.count()
86
+ post_count = Post.objects.count()
90
87
 
91
- return redirect("punkweb_bb:login")
92
- else:
93
- form = SignUpForm()
88
+ users = User.objects.select_related("profile").all()
89
+ newest_user = users.order_by("-profile__created_at").first()
90
+
91
+ users_online = [user for user in users if user.profile.is_online]
92
+ members_online = [user for user in users_online if not user.is_staff]
93
+ staff_online = [user for user in users_online if user.is_staff]
94
+ guests_online = guest_list.length()
95
+ total_online = len(members_online) + len(staff_online) + guests_online
94
96
 
95
97
  context = {
96
- "form": form,
98
+ "categories": categories,
99
+ "recent_threads": recent_threads,
100
+ "thread_count": thread_count,
101
+ "post_count": post_count,
102
+ "users": users,
103
+ "newest_user": newest_user,
104
+ "members_online": members_online,
105
+ "staff_online": staff_online,
106
+ "guests_online": guests_online,
107
+ "total_online": total_online,
97
108
  }
98
- return render(request, "punkweb_bb/signup.html", context)
109
+ return render(request, "punkweb_bb/index.html", context=context)
99
110
 
100
111
 
101
112
  def profile_view(request, user_id):
@@ -141,6 +152,72 @@ def settings_view(request):
141
152
  return render(request, "punkweb_bb/settings.html", context=context)
142
153
 
143
154
 
155
+ @login_required(login_url="/login/")
156
+ def category_create_view(request):
157
+ if not request.user.has_perm("punkweb_bb.add_category"):
158
+ return HttpResponseForbidden("You do not have permission to create categories.")
159
+
160
+ if request.method == "POST":
161
+ form = CategoryModelForm(request.POST)
162
+
163
+ if form.is_valid():
164
+ category = form.save(commit=False)
165
+ category.slug = get_unique_slug(Category, category.name)
166
+ category.save()
167
+
168
+ return redirect(category)
169
+ else:
170
+ form = CategoryModelForm()
171
+
172
+ context = {
173
+ "form": form,
174
+ }
175
+ return render(request, "punkweb_bb/category_create.html", context=context)
176
+
177
+
178
+ @login_required(login_url="/login/")
179
+ def category_update_view(request, category_slug):
180
+ if not request.user.has_perm("punkweb_bb.change_category"):
181
+ return HttpResponseForbidden("You do not have permission to change categories.")
182
+
183
+ category = get_object_or_404(Category, slug=category_slug)
184
+
185
+ if request.method == "POST":
186
+ form = CategoryModelForm(request.POST, instance=category)
187
+
188
+ if form.is_valid():
189
+ category = form.save()
190
+
191
+ return redirect(category)
192
+ else:
193
+ form = CategoryModelForm(instance=category)
194
+
195
+ context = {
196
+ "category": category,
197
+ "form": form,
198
+ }
199
+ return render(request, "punkweb_bb/category_update.html", context=context)
200
+
201
+
202
+ @login_required(login_url="/login/")
203
+ def category_delete_view(request, category_slug):
204
+ if not request.user.has_perm("punkweb_bb.delete_category"):
205
+ return HttpResponseForbidden("You do not have permission to delete categories.")
206
+
207
+ category = get_object_or_404(Category, slug=category_slug)
208
+
209
+ if request.method == "DELETE":
210
+ category.delete()
211
+
212
+ return htmx_redirect(reverse("punkweb_bb:index"))
213
+
214
+ context = {
215
+ "category": category,
216
+ }
217
+
218
+ return render(request, "punkweb_bb/partials/category_delete.html", context=context)
219
+
220
+
144
221
  def subcategory_view(request, subcategory_slug):
145
222
  subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
146
223
 
@@ -153,12 +230,92 @@ def subcategory_view(request, subcategory_slug):
153
230
  return render(request, "punkweb_bb/subcategory.html", context=context)
154
231
 
155
232
 
233
+ @login_required(login_url="/login/")
234
+ def subcategory_create_view(request, category_slug):
235
+ if not request.user.has_perm("punkweb_bb.add_subcategory"):
236
+ return HttpResponseForbidden(
237
+ "You do not have permission to create subcategories."
238
+ )
239
+
240
+ category = get_object_or_404(Category, slug=category_slug)
241
+
242
+ if request.method == "POST":
243
+ form = SubcategoryModelForm(request.POST)
244
+
245
+ if form.is_valid():
246
+ subcategory = form.save(commit=False)
247
+ subcategory.category = category
248
+ subcategory.slug = get_unique_slug(Subcategory, subcategory.name)
249
+ subcategory.save()
250
+
251
+ return redirect(subcategory)
252
+ else:
253
+ form = SubcategoryModelForm()
254
+
255
+ context = {
256
+ "category": category,
257
+ "form": form,
258
+ }
259
+ return render(request, "punkweb_bb/subcategory_create.html", context=context)
260
+
261
+
262
+ @login_required(login_url="/login/")
263
+ def subcategory_update_view(request, subcategory_slug):
264
+ if not request.user.has_perm("punkweb_bb.change_subcategory"):
265
+ return HttpResponseForbidden(
266
+ "You do not have permission to change subcategories."
267
+ )
268
+
269
+ subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
270
+
271
+ if request.method == "POST":
272
+ form = SubcategoryModelForm(request.POST, instance=subcategory)
273
+
274
+ if form.is_valid():
275
+ subcategory = form.save()
276
+
277
+ return redirect(subcategory)
278
+ else:
279
+ form = SubcategoryModelForm(instance=subcategory)
280
+
281
+ context = {
282
+ "subcategory": subcategory,
283
+ "form": form,
284
+ }
285
+ return render(request, "punkweb_bb/subcategory_update.html", context=context)
286
+
287
+
288
+ @login_required(login_url="/login/")
289
+ def subcategory_delete_view(request, subcategory_slug):
290
+ if not request.user.has_perm("punkweb_bb.delete_subcategory"):
291
+ return HttpResponseForbidden(
292
+ "You do not have permission to delete subcategories."
293
+ )
294
+
295
+ subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
296
+
297
+ if request.method == "DELETE":
298
+ subcategory.delete()
299
+
300
+ return htmx_redirect(subcategory.category.get_absolute_url())
301
+
302
+ context = {
303
+ "subcategory": subcategory,
304
+ }
305
+
306
+ return render(
307
+ request, "punkweb_bb/partials/subcategory_delete.html", context=context
308
+ )
309
+
310
+
156
311
  @login_required(login_url="/login/")
157
312
  def thread_create_view(request, subcategory_slug):
158
313
  subcategory = get_object_or_404(Subcategory, slug=subcategory_slug)
159
314
 
160
- if subcategory.staff_post_only and not request.user.is_staff:
161
- return redirect(subcategory)
315
+ if not subcategory.can_post(request.user):
316
+ return HttpResponseForbidden(
317
+ "You do not have permission to post in this subcategory."
318
+ )
162
319
 
163
320
  if request.method == "POST":
164
321
  form = ThreadModelForm(request.POST)
@@ -204,7 +361,12 @@ def thread_view(request, thread_id):
204
361
 
205
362
  @login_required(login_url="/login/")
206
363
  def thread_update_view(request, thread_id):
207
- thread = get_object_or_404(Thread, pk=thread_id, user=request.user)
364
+ thread = get_object_or_404(Thread, pk=thread_id)
365
+
366
+ if not thread.can_edit(request.user):
367
+ return HttpResponseForbidden(
368
+ "You do not have permission to change this thread."
369
+ )
208
370
 
209
371
  if request.method == "POST":
210
372
  form = ThreadModelForm(request.POST, instance=thread)
@@ -225,7 +387,12 @@ def thread_update_view(request, thread_id):
225
387
 
226
388
  @login_required(login_url="/login/")
227
389
  def thread_delete_view(request, thread_id):
228
- thread = get_object_or_404(Thread, pk=thread_id, user=request.user)
390
+ thread = get_object_or_404(Thread, pk=thread_id)
391
+
392
+ if not thread.can_delete(request.user):
393
+ return HttpResponseForbidden(
394
+ "You do not have permission to delete this thread."
395
+ )
229
396
 
230
397
  if request.method == "DELETE":
231
398
  thread.delete()
@@ -243,8 +410,10 @@ def thread_delete_view(request, thread_id):
243
410
  def post_create_view(request, thread_id):
244
411
  thread = get_object_or_404(Thread, pk=thread_id)
245
412
 
246
- if thread.is_closed:
247
- return HttpResponseForbidden("Cannot add posts to a closed thread.")
413
+ if not thread.can_post(request.user):
414
+ return HttpResponseForbidden(
415
+ "You do not have permission to post in this thread."
416
+ )
248
417
 
249
418
  form = PostModelForm(request.POST)
250
419
 
@@ -259,7 +428,10 @@ def post_create_view(request, thread_id):
259
428
 
260
429
  @login_required(login_url="/login/")
261
430
  def post_update_view(request, post_id):
262
- post = get_object_or_404(Post, pk=post_id, user=request.user)
431
+ post = get_object_or_404(Post, pk=post_id)
432
+
433
+ if not post.can_edit(request.user):
434
+ return HttpResponseForbidden("You do not have permission to change this post.")
263
435
 
264
436
  if request.method == "POST":
265
437
  form = PostModelForm(request.POST, instance=post)
@@ -281,7 +453,10 @@ def post_update_view(request, post_id):
281
453
 
282
454
  @login_required(login_url="/login/")
283
455
  def post_delete_view(request, post_id):
284
- post = get_object_or_404(Post, pk=post_id, user=request.user)
456
+ post = get_object_or_404(Post, pk=post_id)
457
+
458
+ if not post.can_delete(request.user):
459
+ return HttpResponseForbidden("You do not have permission to delete this post.")
285
460
 
286
461
  if request.method == "DELETE":
287
462
  post.delete()
@@ -333,6 +508,25 @@ def shout_create_view(request):
333
508
  )
334
509
 
335
510
 
511
+ @login_required(login_url="/login/")
512
+ def shout_delete_view(request, shout_id):
513
+ shout = get_object_or_404(Shout, pk=shout_id)
514
+
515
+ if not shout.can_delete(request.user):
516
+ return HttpResponseForbidden("You do not have permission to delete this shout.")
517
+
518
+ if request.method == "DELETE":
519
+ shout.delete()
520
+
521
+ return htmx_redirect(reverse("punkweb_bb:index"))
522
+
523
+ context = {
524
+ "shout": shout,
525
+ }
526
+
527
+ return render(request, "punkweb_bb/partials/shout_delete.html", context=context)
528
+
529
+
336
530
  def bbcode_view(request):
337
531
  codes = (
338
532
  ("Bold", "[b]Bold Text[/b]"),
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: punkweb-bb
3
- Version: 0.1.3
3
+ Version: 0.2.0
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
@@ -17,6 +17,7 @@ Description-Content-Type: text/markdown
17
17
  License-File: LICENSE
18
18
  Requires-Dist: django >=4.0
19
19
  Requires-Dist: django-precise-bbcode
20
+ Requires-Dist: expiringdict
20
21
  Requires-Dist: pillow
21
22
 
22
23
  # PunkwebBB
@@ -25,7 +26,7 @@ PunkwebBB is a Django application that provides a simple and modern forum board
25
26
 
26
27
  This is the successor to [punkweb-boards](https://github.com/Punkweb/punkweb-boards).
27
28
 
28
- Check out [punkweb.net](https://punkweb.net/board/) for a live demo and more information!
29
+ Check out [punkweb.net](https://punkweb.net/board/) for documentation, support and a live demonstration of the software.
29
30
 
30
31
  ## Built with
31
32
 
@@ -115,6 +116,9 @@ PUNKWEB_BB = {
115
116
  "SITE_TITLE": "PunkwebBB",
116
117
  "FAVICON": "punkweb_bb/favicon.ico",
117
118
  "SHOUTBOX_ENABLED": True,
119
+ "DISCORD_WIDGET_ENABLED": False,
120
+ "DISCORD_WIDGET_THEME": "dark",
121
+ "DISCORD_SERVER_ID": None, # Found under Server Settings > Widget > Server ID
118
122
  }
119
123
  ```
120
124
 
@@ -4,18 +4,20 @@ punkweb_bb/admin_forms.py,sha256=Ppgl960Alwwz_tsrCDct56SEab0ntxBMyb7LJHODuWc,112
4
4
  punkweb_bb/apps.py,sha256=GCDLy9B9vumeCsaauQ7LN4FOqE02mXWXECIz8G6KZCQ,207
5
5
  punkweb_bb/bbcode_tags.py,sha256=yNayXcZoRcRVZsdVrKIdKOV7bwlApFfq_CVfh1im7SY,4419
6
6
  punkweb_bb/context_processors.py,sha256=BEOGvWVukvxJUxWZBIc32ioB-mGqImSEBuhhZjqI2G0,146
7
- punkweb_bb/forms.py,sha256=O1lzmgumdnSEjBKi10c7ODftIqRmvtEIdNj1IODCikk,1977
8
- punkweb_bb/middleware.py,sha256=lF1w7XM07s1kcrOWodzErHop9zpIE5SEE52YLMAbDKg,456
7
+ punkweb_bb/forms.py,sha256=YeBrjOmBIytfQ5dfnLb1xKAnYR-zUSIr2cerFhCODaE,2907
8
+ punkweb_bb/guests.py,sha256=Nvn4ZVJvQSQs_f-GeSwNn79Qp8ap_CAoXpYfRTqSbxg,467
9
+ punkweb_bb/middleware.py,sha256=NrYv6nyAYKGcu-qKRnZmCyLghtJ4MUHvt3m5NS8HJbo,628
9
10
  punkweb_bb/mixins.py,sha256=XfiThPL7rB71IfukS1ikvYQhfg8RwgSVgsm10Ul1ezM,395
10
- punkweb_bb/models.py,sha256=Y5w80EQ85Mut71xiDVMALqLXdydlTxOiZEljmnH5g-E,5519
11
+ punkweb_bb/models.py,sha256=Vl3df9rUqH3TJyfJ__rr8ibhs98tUaUkMPzWlq_0ZT0,6218
11
12
  punkweb_bb/pagination.py,sha256=OgoZuJsq9MKMvBKYylJVPaNtM9ni3K8OAvOdi-eGr3M,409
12
13
  punkweb_bb/parsers.py,sha256=VjWSPqpVfypHLHP0NrfLqXB-1b0W6oFuGIzoAiPi71I,2732
13
14
  punkweb_bb/response.py,sha256=dETGVC9Xrsq02pQzmIIWbSUt472lJ4fgLwBKrXnP3t4,130
14
- punkweb_bb/settings.py,sha256=rYKMQxbC6rfzOQgcjAoBuMEgKHOITvOX1PrKTweEYKk,312
15
+ punkweb_bb/settings.py,sha256=ebJahIZHt1fYdhxB9wWDlWj5KhzExUtaXyoFLy8uR6k,517
15
16
  punkweb_bb/signals.py,sha256=bVdfg942Mwq-fYDZ1Z52Q0V2BCk1lgzGz8JVZFPnzJ8,365
16
- punkweb_bb/tests.py,sha256=BXkvqtr1JbE2WQYkgjse3wp9ky3cwOzQcVHoqNhHJmw,25989
17
- punkweb_bb/urls.py,sha256=_mRAtaZoKzPZ_uuOCFy6_lOwFCavv26p5kMKD9MH4c4,1538
18
- punkweb_bb/views.py,sha256=HDJCM8PgDkQu96UbZLFyjSD2K9WIjLhWEO-QBM3APmk,10723
17
+ punkweb_bb/tests.py,sha256=NcTt9RPt4MegOzjryUok9FTWZda6VHB3O3FJN99Pz8s,26338
18
+ punkweb_bb/urls.py,sha256=z5L0Dj1TgjNUMhogra4R55bfhpDyBSsW6KfLwFFpYRs,2415
19
+ punkweb_bb/utils.py,sha256=4XUoXB1hqCYShhPAbdFf2qSB5wTKt7IJtFizuRfkP2U,396
20
+ punkweb_bb/views.py,sha256=b8E8MIHsdyPUxxbzRQRhgvUJhfNn5ljOuVEKTGxOjcU,16610
19
21
  punkweb_bb/widgets.py,sha256=eF6CB5nnh_6XJadpDzDKgd9incd0VIR63Rnzdr8T2n0,840
20
22
  punkweb_bb/__pycache__/__init__.cpython-311.pyc,sha256=3PyxCxoznfadaGt0a7re4j0Ky9z9hblufpcwPB85kK8,161
21
23
  punkweb_bb/__pycache__/admin.cpython-311.pyc,sha256=rAPYqRy7hAVZn3qST3ypYdulvH9IBhzWEgvbbAMIMIY,3679
@@ -23,18 +25,20 @@ punkweb_bb/__pycache__/admin_forms.cpython-311.pyc,sha256=fQgpcTP-_bouxhHrDVxFzA
23
25
  punkweb_bb/__pycache__/apps.cpython-311.pyc,sha256=lw328DOwOp1F8FWTFYb3qV1EoBNgRr_Tc4J8DXfIl-I,730
24
26
  punkweb_bb/__pycache__/bbcode_tags.cpython-311.pyc,sha256=QI4BJt5plqLMiAvlVAxibuNONi69PJFQpotpS50olro,8534
25
27
  punkweb_bb/__pycache__/context_processors.cpython-311.pyc,sha256=P7rEsodXonYexbS5vUaUKVJ9tIx1pOVk6NQWVvWNvS8,392
26
- punkweb_bb/__pycache__/forms.cpython-311.pyc,sha256=JRbtAaXyXgG9eDdBjKBkSn8qeZtdxRc7L2_ceE-MpW8,4680
27
- punkweb_bb/__pycache__/middleware.cpython-311.pyc,sha256=gZN0oVrPh9nIUUni_DvPrhMOYPR98SXrYxgHIsUXX-0,1249
28
+ punkweb_bb/__pycache__/forms.cpython-311.pyc,sha256=wZAWlEguoeOOmcDKJJgXX_oLvYwA-JwQqDyE7IGI3H0,6194
29
+ punkweb_bb/__pycache__/guests.cpython-311.pyc,sha256=vgZJcZGyHZkllCAhXHGgajHh7YM1ntXinSed3ojIK6I,1581
30
+ punkweb_bb/__pycache__/middleware.cpython-311.pyc,sha256=KbZ6z2Q7eCRX3dB7mnRUpn58mb_O8sXpOw_sqVfQsgM,1560
28
31
  punkweb_bb/__pycache__/mixins.cpython-311.pyc,sha256=eP1NjqDNYMYXrC45DNkrTqVAUv1vsGBrqPy5U5CB_aw,1478
29
- punkweb_bb/__pycache__/models.cpython-311.pyc,sha256=9W03p0j5_dYnQ4YffZUrN_A5-Bvkbpvfmpr5rOkzyAQ,12308
32
+ punkweb_bb/__pycache__/models.cpython-311.pyc,sha256=4qd4eWnPR_p1G26cnhowd7gfJ6-p660NrS_C5q7038A,13824
30
33
  punkweb_bb/__pycache__/pagination.cpython-311.pyc,sha256=r54xmtiRp5dm1n2Xa7oElMFFaYFY0RzmMuF3Er4UqEA,990
31
34
  punkweb_bb/__pycache__/parsers.cpython-311.pyc,sha256=pp8JZt9V3HhquQMGrhglwLc53GxgNFWjjSnK3Bpxf8o,5335
32
35
  punkweb_bb/__pycache__/response.cpython-311.pyc,sha256=CEPckYWZkOrdU2Vow-ni0ZrWEUBww0uJzyr_wv---mM,448
33
- punkweb_bb/__pycache__/settings.cpython-311.pyc,sha256=ZjE994_MuSW_9Dn_ufsUH-vrld-BvqEwoCF7YL9tbrA,665
36
+ punkweb_bb/__pycache__/settings.cpython-311.pyc,sha256=earWFaFtg8IPqfOz9I6wdpI9bJtxjxsTwG7LoTCPmtw,947
34
37
  punkweb_bb/__pycache__/signals.cpython-311.pyc,sha256=AHChn7hDdrOmCAwKIKKuFOY-4hyBP9uwTkyb5bnFV-Q,864
35
- punkweb_bb/__pycache__/tests.cpython-311.pyc,sha256=3CM8FL8P1YXVcgShhXqXjg3Yo3T1amKXlVtHRUZ2d7o,50877
36
- punkweb_bb/__pycache__/urls.cpython-311.pyc,sha256=80TvNUws6ip1FCts6bubO3DGQJ2yOlB-WReK-qaTnGY,2304
37
- punkweb_bb/__pycache__/views.cpython-311.pyc,sha256=bjqhbTnN0-pvIygCzh0NXY6lNJUjMpz8B51EIlpay94,15592
38
+ punkweb_bb/__pycache__/tests.cpython-311.pyc,sha256=z7wbXzc3xY4lyg8II-k8fVe-UxQ2fk8XwV-wnb684wo,51768
39
+ punkweb_bb/__pycache__/urls.cpython-311.pyc,sha256=A7iTuJIZzme8BJX6pfyX-Ym9ZRpsLt-RDo4eveOiw8M,3322
40
+ punkweb_bb/__pycache__/utils.cpython-311.pyc,sha256=iNDU4dwAwpAzqlKl5kuHH989Ic_1lGA4JQq0wpR7ATo,748
41
+ punkweb_bb/__pycache__/views.cpython-311.pyc,sha256=B9W_SLDDVMsEKJ4yF--L9oe_qF1extBuone73KfgW-w,23918
38
42
  punkweb_bb/__pycache__/widgets.cpython-311.pyc,sha256=-RcQ3JapLHw8Bbi4FP05kQJJIa7bnliKPaFpkDCOWvQ,1552
39
43
  punkweb_bb/migrations/0001_initial.py,sha256=3RGsylygBcWx1kIPhSzOb9v_2yvowsxKfxuSinKKuS0,8950
40
44
  punkweb_bb/migrations/0002_thread_view_count.py,sha256=JJZT53Mp8Ofht3oIi67s-0wzCdpYyu8wOeCi_B8q8Yo,388
@@ -43,21 +47,23 @@ punkweb_bb/migrations/__pycache__/0001_initial.cpython-311.pyc,sha256=koi_Vflndm
43
47
  punkweb_bb/migrations/__pycache__/0002_thread_view_count.cpython-311.pyc,sha256=9HRllkD8LHPXadyurYvp2UcmRFEywalUVQjiOGWizgc,815
44
48
  punkweb_bb/migrations/__pycache__/__init__.cpython-311.pyc,sha256=sTbC1AXnh0V4BJwjcjs1ckdeYjG01I348hZwLE2HI4Y,172
45
49
  punkweb_bb/static/punkweb_bb/favicon.ico,sha256=lEfX--R9wEGPkkXgLYCsGmHuAGajigiqBXAoonxq8ZM,318
50
+ punkweb_bb/static/punkweb_bb/css/category-form.css,sha256=lvG7Lh2GGBVplKk46JAIHF1cmFLve2JT32BswmudIF8,359
46
51
  punkweb_bb/static/punkweb_bb/css/defaults.css,sha256=EsYORpHIQ8gotAdiGvBBU38i6F0mICj-OKr-JF6yYVg,1455
47
- punkweb_bb/static/punkweb_bb/css/index.css,sha256=NqpF7zNMzSrDeHw5gfbwcmeBET4TcSKQlHKSkHIEblQ,1331
52
+ punkweb_bb/static/punkweb_bb/css/index.css,sha256=BTuzV0HSvdOmWKd9cjYOv7sOOsdWqbxXxCp4Q3fyPeU,1418
48
53
  punkweb_bb/static/punkweb_bb/css/login.css,sha256=pt5ul4ycZsVB-No3c5gsQa1zVS1iAZgteN1CcllS26k,234
49
54
  punkweb_bb/static/punkweb_bb/css/members.css,sha256=1Fz0uVDbs3RnuXNjOtnGnK2jok3LEQBoPhjRYp7gNwE,395
50
55
  punkweb_bb/static/punkweb_bb/css/post-form.css,sha256=rEiYplAobLjjUYAcnjNqIjyIVhe9O5hAlPJ3STW-K14,321
51
56
  punkweb_bb/static/punkweb_bb/css/profile.css,sha256=yfNJT_D-05deqiBrdIgPeCSO_DFSL8-fGEEHnGrCIYM,916
52
57
  punkweb_bb/static/punkweb_bb/css/punkweb-modal.css,sha256=ctwo5bgbAW-k0uqrufDbqeQfAh87-BZ-5gPm8aJHeT4,1296
53
- punkweb_bb/static/punkweb_bb/css/punkweb.css,sha256=UZT592v_krB8DPFf6YN1zlKmmFiCAXdS_KqO98GrKNM,11284
58
+ punkweb_bb/static/punkweb_bb/css/punkweb.css,sha256=ABCJYmjHnUr3MkP-XUIvb1tiOamTy0tbDZZOM_-nQ4k,12678
54
59
  punkweb_bb/static/punkweb_bb/css/settings.css,sha256=ulQQFTu8slk2rYOmhvci5v-AVnguUuDhKQDhyQOsQNU,308
55
- punkweb_bb/static/punkweb_bb/css/shoutbox.css,sha256=-aPkQHelFsy8IYhURqTPEMIsd1ivS9mf-4ha3xHyAms,333
56
- punkweb_bb/static/punkweb_bb/css/subcategory.css,sha256=1wjszJbkCJL-UJRFqOWSmX4yr60ekx0YtswZouUsY7s,536
60
+ punkweb_bb/static/punkweb_bb/css/shoutbox.css,sha256=DapBIe21b6w7ugA_U1EJ-1LFb3IfnJZMw7Kc4DLxF1g,536
61
+ punkweb_bb/static/punkweb_bb/css/subcategory-form.css,sha256=KU-fI8-DiurYiiBVeNk-9vERekbJrOTxllPPFYXu5Fk,371
62
+ punkweb_bb/static/punkweb_bb/css/subcategory.css,sha256=7j9_-S4kspgojfebYBu8AQQS3uJtqCoE32T-BuAgHxw,711
57
63
  punkweb_bb/static/punkweb_bb/css/thread-form.css,sha256=9MfqocnamNMjeNJ-w6YTwYbm4oepeK09phFzVsg1XO8,329
58
- punkweb_bb/static/punkweb_bb/css/thread.css,sha256=E-mXoB1pXctyUyVbfnpb6RN0xCgRtxwBFr_AJ8MZ3k8,1508
64
+ punkweb_bb/static/punkweb_bb/css/thread.css,sha256=3s2xQj9uD3gQGhEzTCY6y7k5Dpq5E7eeI8gi4fwODos,1870
59
65
  punkweb_bb/static/punkweb_bb/css/typography.css,sha256=qbFGBcU-OOe7r41xeW0Gc_9x6yHxhh81XtswmFxgavc,448
60
- punkweb_bb/static/punkweb_bb/css/variables.css,sha256=VjAsNiHPpW9c6KBYvMyxd5LD7ykl4KMtvlyODfgmijA,1154
66
+ punkweb_bb/static/punkweb_bb/css/variables.css,sha256=WphZPeJgeqMYy4JYaSTX0gX-JiZh8EJlhieGOGk75DA,1193
61
67
  punkweb_bb/static/punkweb_bb/editor/bbcode-editor-content.css,sha256=c1VCTVYqvzjy-51dMZ27zp-zdZrL-2TwIEheeYQXDDw,1466
62
68
  punkweb_bb/static/punkweb_bb/editor/bbcode-editor-tags.js,sha256=pLgF7lIJnPQXpfqQnkTHBU5tjcvICDHpn2nhvzxwUqA,1624
63
69
  punkweb_bb/static/punkweb_bb/editor/bbcode-editor.css,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
@@ -191,30 +197,43 @@ punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/content/defau
191
197
  punkweb_bb/templates/punkweb_bb/base.html,sha256=Gu2ZVeP0p7GnsfXFxByXRd9LT4DNXx0O1czSGjwYg0w,4037
192
198
  punkweb_bb/templates/punkweb_bb/base_modal.html,sha256=OCbtsMWeNCO0Tl1PmHCcGkwoi1OZjeIK_VhNTzMor7M,460
193
199
  punkweb_bb/templates/punkweb_bb/bbcode.html,sha256=1EGBejsOMZOPi6P39oR6E35VdqnfR6wYWeKDl4Xr_js,396
194
- punkweb_bb/templates/punkweb_bb/index.html,sha256=2y8gS6UzoJkVXvmw5PEuuxyYIarlNjGzTmmNMuNWNJ8,8127
200
+ punkweb_bb/templates/punkweb_bb/category_create.html,sha256=773uJzxVvuPmWVrW87EoQTBNoo6cyi3UBp_PZn6JY5A,1369
201
+ punkweb_bb/templates/punkweb_bb/category_update.html,sha256=GUFo19BXY8JVvxP7cWAyWiTD5Z9LohR4f6vf1jlRqfo,1467
202
+ punkweb_bb/templates/punkweb_bb/index.html,sha256=HuhP13ijkcU7IofnCWvcLD9FeQOmb87jSAQrMBmrcek,10032
195
203
  punkweb_bb/templates/punkweb_bb/login.html,sha256=ZUOmbyZREzS7Sw02Lfb9zpRJQQWwJgolnj9lcBKnOtg,1087
196
204
  punkweb_bb/templates/punkweb_bb/members.html,sha256=ceRCRX0AN7V8d7paz9495y8aQByMUKDWVWL2GzoGbus,2729
197
205
  punkweb_bb/templates/punkweb_bb/profile.html,sha256=MW1JWLs_lLpg62DDcvcZJRwrHquYA5nCwQqL1v9ZGCo,2948
198
206
  punkweb_bb/templates/punkweb_bb/settings.html,sha256=CmmGdNddZj6Atpofcny0bwEHwTPRPC8vXXThCgsNH90,1994
199
207
  punkweb_bb/templates/punkweb_bb/signup.html,sha256=HP5owUfV2uEuvOccPoBa21XbjBHo0ulV6tjfgdToNLU,1167
200
- punkweb_bb/templates/punkweb_bb/subcategory.html,sha256=rLJtBKz2Zd07Lyan6fH2fn7i8bXyfVj9hpnBh6m3PS4,4950
201
- punkweb_bb/templates/punkweb_bb/thread.html,sha256=igyEa1Qz-joktKmUbgHtIY0EnxlWUCBHDdEXNTuKJDk,7595
202
- punkweb_bb/templates/punkweb_bb/thread_create.html,sha256=rLIO-ghdzHCiKJ6LCj2l4cxe9QbsMUG13ZxogYF9PUE,1537
208
+ punkweb_bb/templates/punkweb_bb/subcategory.html,sha256=Px3XQhYlbb5Vt4Q5-0_4trpng_mqo7wA9NFlIzWIODI,5543
209
+ punkweb_bb/templates/punkweb_bb/subcategory_create.html,sha256=8FhcWKiaYGIulrOaBzQ6qFMpDvsAnX_q-XJ5mKwBLW8,1521
210
+ punkweb_bb/templates/punkweb_bb/subcategory_update.html,sha256=kOq6tuhNBSMVQkBSpHpU06JuQ3h008fOKqLcxe9PgCg,1638
211
+ punkweb_bb/templates/punkweb_bb/thread.html,sha256=zv18JAucBrCDlOQn0J5wT8raNLtcvuW1vszXRguPPPk,8417
212
+ punkweb_bb/templates/punkweb_bb/thread_create.html,sha256=676jLKGc5m8IapbL_FS1yvTs2XVFPHjJ316SIiORAew,1639
203
213
  punkweb_bb/templates/punkweb_bb/thread_update.html,sha256=SLL_5tceZ8ZiPbWCO9eOe_aeMgV5lQ-p6eun1_XvKwE,1730
214
+ punkweb_bb/templates/punkweb_bb/partials/category_delete.html,sha256=Re9ESmC6AHeY9aICE0zE1i7vZEDHsF577Vmsz9L7jyA,435
204
215
  punkweb_bb/templates/punkweb_bb/partials/post_delete.html,sha256=tQtQGxTF0tZA5eXqfIuO6NctsS83eEhR4ImmBLbkAXM,417
205
216
  punkweb_bb/templates/punkweb_bb/partials/post_update.html,sha256=mFidDqgTuv4LffuSa8pShXxWmiramLLMhHjsaJs1Y9k,565
217
+ punkweb_bb/templates/punkweb_bb/partials/shout_delete.html,sha256=zo-Ff-meucwC03p656VI5SI79RmS5nF-NbrFb3znPBM,421
218
+ punkweb_bb/templates/punkweb_bb/partials/subcategory_delete.html,sha256=GImRDtfuMTg6_docXHTqVqe_1NzXblnrSyivxeatlIE,447
206
219
  punkweb_bb/templates/punkweb_bb/partials/thread_delete.html,sha256=m91u_r8qTvMqR2s4VxxFHQvZt-WGgHnHzJL_1KZkX9M,425
207
- punkweb_bb/templates/punkweb_bb/shoutbox/shout_list.html,sha256=uAls--UuLgS6NPW2qEsNbutR_aoJ_AuhZ_Fkt-c8ipU,312
220
+ punkweb_bb/templates/punkweb_bb/shoutbox/shout_list.html,sha256=hp2DzMRYGkzLD-mPJjCLvOpoyN5It0FihHff7nSGha0,689
208
221
  punkweb_bb/templates/punkweb_bb/shoutbox/shoutbox.html,sha256=J_Lp6KKcqSJr-IayyLN-p0JgMfuwbFP77g-UtcM53WI,672
209
222
  punkweb_bb/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
223
+ punkweb_bb/templatetags/can_delete.py,sha256=NiFi_VH3KKaAYxdu9cZXR9gT9SNEeLAxnbxb4R7O_Nw,137
224
+ punkweb_bb/templatetags/can_edit.py,sha256=CbnbCcmJkeHZbWbsMn5OmCXMBEa6N1KW6W1dHLQvdWM,133
225
+ punkweb_bb/templatetags/can_post.py,sha256=6J1ojqqyNX99DBZM30jQiirQxAyY5rMi05QXXQjJB7I,133
210
226
  punkweb_bb/templatetags/humanize_int.py,sha256=C4KmDG0Jv6o8rwT1RXLdWoGLddJxMxgOoRV9I2598AM,248
211
227
  punkweb_bb/templatetags/shoutbox_bbcode.py,sha256=OH-FsRTyPWZldaFypSVzPLlTrSm4XEOqQW9hBI0ROBk,310
212
228
  punkweb_bb/templatetags/__pycache__/__init__.cpython-311.pyc,sha256=VEPKwaIhqpKpSSJiotDYngAUdidDzR9PpPiHtKEl1jA,174
229
+ punkweb_bb/templatetags/__pycache__/can_delete.cpython-311.pyc,sha256=GfdHIumIAFyra6Nox6Y7AILBUW_DL7OZ0MtWWaj94mw,528
230
+ punkweb_bb/templatetags/__pycache__/can_edit.cpython-311.pyc,sha256=PJDUtJWrZWb8qgldPrC2si0QNokEhRaYnXaRk4dhuJU,524
231
+ punkweb_bb/templatetags/__pycache__/can_post.cpython-311.pyc,sha256=1IU4-Ar-kwjnB2EHQ_tJUyTFWPwTl8jsDbgnNT52zO8,524
213
232
  punkweb_bb/templatetags/__pycache__/humanize_count.cpython-311.pyc,sha256=UKD6_5RX8YpYpg-LPrgGxBkW56THsbYY51cKTYdKwRY,621
214
233
  punkweb_bb/templatetags/__pycache__/humanize_int.cpython-311.pyc,sha256=csY5ek-bevYVeM91hYFKozuKWXCTXb7M-7Bokwdxhrk,619
215
234
  punkweb_bb/templatetags/__pycache__/shoutbox_bbcode.cpython-311.pyc,sha256=Jhg9qW-nQe6IDr45rE0ZgeDYF4E61S7kYAYpbMo5ZQ8,833
216
- punkweb_bb-0.1.3.dist-info/LICENSE,sha256=YYysF07B-kyXSO7IWFB9f49ZXa6LIFUTVsR1Ogmhp8s,1507
217
- punkweb_bb-0.1.3.dist-info/METADATA,sha256=thU9kjReWNpjs73xcTkXgnO0LKX_-g_wELf87WiE-0Q,4930
218
- punkweb_bb-0.1.3.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
219
- punkweb_bb-0.1.3.dist-info/top_level.txt,sha256=sWuGdGnk0ejOXiFDzlBqrNs2VbPEx0_i8UwWXn4SuHU,11
220
- punkweb_bb-0.1.3.dist-info/RECORD,,
235
+ punkweb_bb-0.2.0.dist-info/LICENSE,sha256=YYysF07B-kyXSO7IWFB9f49ZXa6LIFUTVsR1Ogmhp8s,1507
236
+ punkweb_bb-0.2.0.dist-info/METADATA,sha256=nPCD6tOWqlYwLl3PC2pZgspZvXDmIR76lf0a0OqX9T0,5138
237
+ punkweb_bb-0.2.0.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
238
+ punkweb_bb-0.2.0.dist-info/top_level.txt,sha256=sWuGdGnk0ejOXiFDzlBqrNs2VbPEx0_i8UwWXn4SuHU,11
239
+ punkweb_bb-0.2.0.dist-info/RECORD,,