punkweb-bb 0.1.2__tar.gz → 0.1.4__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 (239) hide show
  1. punkweb_bb-0.1.4/PKG-INFO +171 -0
  2. punkweb_bb-0.1.4/README.md +153 -0
  3. punkweb_bb-0.1.4/punkweb_bb/__pycache__/guests.cpython-311.pyc +0 -0
  4. punkweb_bb-0.1.4/punkweb_bb/__pycache__/middleware.cpython-311.pyc +0 -0
  5. punkweb_bb-0.1.4/punkweb_bb/__pycache__/models.cpython-311.pyc +0 -0
  6. punkweb_bb-0.1.4/punkweb_bb/__pycache__/settings.cpython-311.pyc +0 -0
  7. punkweb_bb-0.1.4/punkweb_bb/__pycache__/tests.cpython-311.pyc +0 -0
  8. punkweb_bb-0.1.4/punkweb_bb/__pycache__/views.cpython-311.pyc +0 -0
  9. punkweb_bb-0.1.4/punkweb_bb/guests.py +20 -0
  10. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/middleware.py +7 -0
  11. punkweb_bb-0.1.4/punkweb_bb/migrations/0002_thread_view_count.py +18 -0
  12. punkweb_bb-0.1.4/punkweb_bb/migrations/__pycache__/0002_thread_view_count.cpython-311.pyc +0 -0
  13. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/models.py +4 -0
  14. punkweb_bb-0.1.4/punkweb_bb/settings.py +11 -0
  15. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/profile.css +7 -0
  16. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/punkweb.css +23 -0
  17. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/base.html +1 -1
  18. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/index.html +19 -6
  19. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/subcategory.html +7 -1
  20. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/thread.html +5 -2
  21. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/thread_create.html +3 -0
  22. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/thread_update.html +3 -0
  23. punkweb_bb-0.1.4/punkweb_bb/templatetags/__pycache__/__init__.cpython-311.pyc +0 -0
  24. punkweb_bb-0.1.4/punkweb_bb/templatetags/__pycache__/humanize_count.cpython-311.pyc +0 -0
  25. punkweb_bb-0.1.4/punkweb_bb/templatetags/__pycache__/humanize_int.cpython-311.pyc +0 -0
  26. punkweb_bb-0.1.4/punkweb_bb/templatetags/humanize_int.py +12 -0
  27. punkweb_bb-0.1.4/punkweb_bb/tests.py +757 -0
  28. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/views.py +20 -4
  29. punkweb_bb-0.1.4/punkweb_bb.egg-info/PKG-INFO +171 -0
  30. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb.egg-info/SOURCES.txt +8 -0
  31. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb.egg-info/requires.txt +1 -0
  32. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/setup.py +2 -1
  33. punkweb_bb-0.1.2/PKG-INFO +0 -69
  34. punkweb_bb-0.1.2/README.md +0 -51
  35. punkweb_bb-0.1.2/punkweb_bb/__pycache__/middleware.cpython-311.pyc +0 -0
  36. punkweb_bb-0.1.2/punkweb_bb/__pycache__/models.cpython-311.pyc +0 -0
  37. punkweb_bb-0.1.2/punkweb_bb/__pycache__/settings.cpython-311.pyc +0 -0
  38. punkweb_bb-0.1.2/punkweb_bb/__pycache__/views.cpython-311.pyc +0 -0
  39. punkweb_bb-0.1.2/punkweb_bb/settings.py +0 -7
  40. punkweb_bb-0.1.2/punkweb_bb/templatetags/__pycache__/__init__.cpython-311.pyc +0 -0
  41. punkweb_bb-0.1.2/punkweb_bb/tests.py +0 -230
  42. punkweb_bb-0.1.2/punkweb_bb.egg-info/PKG-INFO +0 -69
  43. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/LICENSE +0 -0
  44. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/MANIFEST.in +0 -0
  45. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__init__.py +0 -0
  46. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/__init__.cpython-311.pyc +0 -0
  47. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/admin.cpython-311.pyc +0 -0
  48. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/admin_forms.cpython-311.pyc +0 -0
  49. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/apps.cpython-311.pyc +0 -0
  50. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/bbcode_tags.cpython-311.pyc +0 -0
  51. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/context_processors.cpython-311.pyc +0 -0
  52. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/forms.cpython-311.pyc +0 -0
  53. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/mixins.cpython-311.pyc +0 -0
  54. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/pagination.cpython-311.pyc +0 -0
  55. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/parsers.cpython-311.pyc +0 -0
  56. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/response.cpython-311.pyc +0 -0
  57. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/signals.cpython-311.pyc +0 -0
  58. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/urls.cpython-311.pyc +0 -0
  59. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/__pycache__/widgets.cpython-311.pyc +0 -0
  60. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/admin.py +0 -0
  61. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/admin_forms.py +0 -0
  62. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/apps.py +0 -0
  63. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/bbcode_tags.py +0 -0
  64. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/context_processors.py +0 -0
  65. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/forms.py +0 -0
  66. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/migrations/0001_initial.py +0 -0
  67. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/migrations/__init__.py +0 -0
  68. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/migrations/__pycache__/0001_initial.cpython-311.pyc +0 -0
  69. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/migrations/__pycache__/__init__.cpython-311.pyc +0 -0
  70. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/mixins.py +0 -0
  71. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/pagination.py +0 -0
  72. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/parsers.py +0 -0
  73. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/response.py +0 -0
  74. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/signals.py +0 -0
  75. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/defaults.css +0 -0
  76. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/index.css +0 -0
  77. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/login.css +0 -0
  78. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/members.css +0 -0
  79. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/post-form.css +0 -0
  80. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/punkweb-modal.css +0 -0
  81. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/settings.css +0 -0
  82. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/shoutbox.css +0 -0
  83. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/subcategory.css +0 -0
  84. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/thread-form.css +0 -0
  85. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/thread.css +0 -0
  86. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/typography.css +0 -0
  87. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/css/variables.css +0 -0
  88. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/editor/bbcode-editor-content.css +0 -0
  89. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/editor/bbcode-editor-tags.js +0 -0
  90. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/editor/bbcode-editor.css +0 -0
  91. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/editor/bbcode-editor.js +0 -0
  92. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/favicon.ico +0 -0
  93. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/img/default-profile-image.png +0 -0
  94. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/js/punkweb-modal.js +0 -0
  95. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/js/shoutbox.js +0 -0
  96. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/htmx-1.9.4.min.js +0 -0
  97. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/jquery-3.7.0.min.js +0 -0
  98. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/open-color.css +0 -0
  99. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/prism.css +0 -0
  100. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/prism.js +0 -0
  101. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/README.md +0 -0
  102. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/formats/bbcode.js +0 -0
  103. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/formats/xhtml.js +0 -0
  104. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/icons/material.js +0 -0
  105. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/icons/monocons.js +0 -0
  106. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/jquery.sceditor.bbcode.js +0 -0
  107. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/jquery.sceditor.js +0 -0
  108. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/jquery.sceditor.xhtml.js +0 -0
  109. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/alternative-lists.js +0 -0
  110. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/autosave.js +0 -0
  111. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/autoyoutube.js +0 -0
  112. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/dragdrop.js +0 -0
  113. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/format.js +0 -0
  114. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/plaintext.js +0 -0
  115. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/undo.js +0 -0
  116. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/plugins/v1compat.js +0 -0
  117. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/sceditor.js +0 -0
  118. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/content/default.css +0 -0
  119. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/default.css +0 -0
  120. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/defaultdark.css +0 -0
  121. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/famfamfam.png +0 -0
  122. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/modern.css +0 -0
  123. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/office-toolbar.css +0 -0
  124. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/office.css +0 -0
  125. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/development/themes/square.css +0 -0
  126. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/alien.png +0 -0
  127. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/angel.png +0 -0
  128. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/angry.png +0 -0
  129. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/blink.png +0 -0
  130. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/blush.png +0 -0
  131. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/cheerful.png +0 -0
  132. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/cool.png +0 -0
  133. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/credits.txt +0 -0
  134. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/cwy.png +0 -0
  135. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/devil.png +0 -0
  136. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/dizzy.png +0 -0
  137. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/ermm.png +0 -0
  138. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/face.png +0 -0
  139. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/getlost.png +0 -0
  140. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/grin.png +0 -0
  141. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/happy.png +0 -0
  142. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/heart.png +0 -0
  143. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/kissing.png +0 -0
  144. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/laughing.png +0 -0
  145. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/ninja.png +0 -0
  146. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/pinch.png +0 -0
  147. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/pouty.png +0 -0
  148. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/sad.png +0 -0
  149. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/shocked.png +0 -0
  150. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/sick.png +0 -0
  151. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/sideways.png +0 -0
  152. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/silly.png +0 -0
  153. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/sleeping.png +0 -0
  154. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/smile.png +0 -0
  155. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/tongue.png +0 -0
  156. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/unsure.png +0 -0
  157. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/w00t.png +0 -0
  158. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/wassat.png +0 -0
  159. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/whistling.png +0 -0
  160. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/wink.png +0 -0
  161. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/emoticons/wub.png +0 -0
  162. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/example.html +0 -0
  163. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/ar.js +0 -0
  164. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/ca.js +0 -0
  165. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/cn.js +0 -0
  166. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/cs.js +0 -0
  167. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/de.js +0 -0
  168. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/el.js +0 -0
  169. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/en-US.js +0 -0
  170. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/en.js +0 -0
  171. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/es.js +0 -0
  172. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/et.js +0 -0
  173. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/fa.js +0 -0
  174. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/fi.js +0 -0
  175. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/fr.js +0 -0
  176. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/gl.js +0 -0
  177. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/hu.js +0 -0
  178. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/id.js +0 -0
  179. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/it.js +0 -0
  180. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/ja.js +0 -0
  181. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/lt.js +0 -0
  182. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/nb.js +0 -0
  183. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/nl.js +0 -0
  184. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/pl.js +0 -0
  185. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/pt-BR.js +0 -0
  186. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/pt.js +0 -0
  187. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/ru.js +0 -0
  188. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/sk.js +0 -0
  189. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/sv.js +0 -0
  190. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/template.js +0 -0
  191. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/tr.js +0 -0
  192. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/tw.js +0 -0
  193. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/uk.js +0 -0
  194. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/languages/vi.js +0 -0
  195. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/formats/bbcode.js +0 -0
  196. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/formats/xhtml.js +0 -0
  197. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/icons/material.js +0 -0
  198. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/icons/monocons.js +0 -0
  199. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/jquery.sceditor.bbcode.min.js +0 -0
  200. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/jquery.sceditor.min.js +0 -0
  201. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/jquery.sceditor.xhtml.min.js +0 -0
  202. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/alternative-lists.js +0 -0
  203. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/autosave.js +0 -0
  204. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/autoyoutube.js +0 -0
  205. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/dragdrop.js +0 -0
  206. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/format.js +0 -0
  207. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/plaintext.js +0 -0
  208. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/undo.js +0 -0
  209. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/plugins/v1compat.js +0 -0
  210. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/sceditor.min.js +0 -0
  211. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/content/default.min.css +0 -0
  212. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/default.min.css +0 -0
  213. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/defaultdark.min.css +0 -0
  214. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/famfamfam.png +0 -0
  215. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/modern.min.css +0 -0
  216. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/office-toolbar.min.css +0 -0
  217. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/office.min.css +0 -0
  218. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/static/punkweb_bb/vendor/sceditor-3.2.0/minified/themes/square.min.css +0 -0
  219. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/base_modal.html +0 -0
  220. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/bbcode.html +0 -0
  221. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/login.html +0 -0
  222. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/members.html +0 -0
  223. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/partials/post_delete.html +0 -0
  224. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/partials/post_update.html +0 -0
  225. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/partials/thread_delete.html +0 -0
  226. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/profile.html +0 -0
  227. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/settings.html +0 -0
  228. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/shoutbox/shout_list.html +0 -0
  229. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/shoutbox/shoutbox.html +0 -0
  230. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templates/punkweb_bb/signup.html +0 -0
  231. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templatetags/__init__.py +0 -0
  232. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templatetags/__pycache__/shoutbox_bbcode.cpython-311.pyc +0 -0
  233. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/templatetags/shoutbox_bbcode.py +0 -0
  234. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/urls.py +0 -0
  235. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb/widgets.py +0 -0
  236. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb.egg-info/dependency_links.txt +0 -0
  237. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb.egg-info/not-zip-safe +0 -0
  238. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/punkweb_bb.egg-info/top_level.txt +0 -0
  239. {punkweb_bb-0.1.2 → punkweb_bb-0.1.4}/setup.cfg +0 -0
@@ -0,0 +1,171 @@
1
+ Metadata-Version: 2.1
2
+ Name: punkweb_bb
3
+ Version: 0.1.4
4
+ Summary: Django application that provides a simple and modern forum board software for your Django website.
5
+ Home-page: https://github.com/Punkweb/PunkwebBB
6
+ Author: Punkweb
7
+ Author-email: punkwebnet@gmail.com
8
+ License: BSD-3-Clause
9
+ Classifier: Environment :: Web Environment
10
+ Classifier: Framework :: Django
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: BSD License
13
+ Classifier: Operating System :: OS Independent
14
+ Classifier: Programming Language :: Python
15
+ Classifier: Programming Language :: Python :: 3
16
+ Description-Content-Type: text/markdown
17
+ License-File: LICENSE
18
+
19
+ # PunkwebBB
20
+
21
+ PunkwebBB is a Django application that provides a simple and modern forum board software for your Django website.
22
+
23
+ This is the successor to [punkweb-boards](https://github.com/Punkweb/punkweb-boards).
24
+
25
+ Check out [punkweb.net](https://punkweb.net/board/) for a live demo and more information!
26
+
27
+ ## Built with
28
+
29
+ - [Django](https://www.djangoproject.com/)
30
+ - [django-precise-bbcode](https://github.com/ellmetha/django-precise-bbcode)
31
+ - [HTMX](https://htmx.org/)
32
+ - [jQuery](https://jquery.com/)
33
+ - [SCEditor](https://www.sceditor.com/)
34
+ - [PrismJS](https://prismjs.com/)
35
+
36
+ ## Requirements
37
+
38
+ - Python 3.11+
39
+ - Django 4.2+
40
+ - django-precise-bbcode 1.2+
41
+ - Pillow
42
+
43
+ It may work with older versions of Python and Django, but it has not been tested.
44
+
45
+ ## Installation
46
+
47
+ ```bash
48
+ pip install punkweb-bb
49
+ ```
50
+
51
+ Add `precise_bbcode` and `punkweb_bb` to your `INSTALLED_APPS` in your Django settings module:
52
+
53
+ ```python
54
+ INSTALLED_APPS = [
55
+ ...
56
+ "precise_bbcode",
57
+ "punkweb_bb",
58
+ ]
59
+ ```
60
+
61
+ _Note_: `precise_bbcode` is required. It must be installed before `punkweb_bb`.
62
+
63
+ Add the following middleware to your `MIDDLEWARE` setting:
64
+
65
+ ```python
66
+ MIDDLEWARE = [
67
+ ...
68
+ "punkweb_bb.middleware.ProfileOnlineCacheMiddleware",
69
+ ]
70
+ ```
71
+
72
+ Add the following context processor to your `TEMPLATES` setting:
73
+
74
+ ```python
75
+ TEMPLATES = [
76
+ {
77
+ ...
78
+ "OPTIONS": {
79
+ "context_processors": [
80
+ ...
81
+ "punkweb_bb.context_processors.punkweb_bb",
82
+ ],
83
+ },
84
+ },
85
+ ]
86
+ ```
87
+
88
+ Add the following URL pattern to your `urls.py`:
89
+
90
+ ```python
91
+ from django.urls import path, include
92
+
93
+ urlpatterns = [
94
+ ...
95
+ path("forum/", include("punkweb_bb.urls")), # or any other path you want
96
+ ]
97
+ ```
98
+
99
+ And finally, install the models:
100
+
101
+ ```bash
102
+ python manage.py migrate
103
+ ```
104
+
105
+ ## Configuration
106
+
107
+ These are the default settings for PunkwebBB, which can be overridden in your Django settings module:
108
+
109
+ ```python
110
+ PUNKWEB_BB = {
111
+ "SITE_NAME": "PUNKWEB",
112
+ "SITE_TITLE": "PunkwebBB",
113
+ "FAVICON": "punkweb_bb/favicon.ico",
114
+ "SHOUTBOX_ENABLED": True,
115
+ "DISCORD_WIDGET_ENABLED": False,
116
+ "DISCORD_WIDGET_THEME": "dark",
117
+ "DISCORD_SERVER_ID": None, # Found under Server Settings > Widget > Server ID
118
+ }
119
+ ```
120
+
121
+ ## Testing
122
+
123
+ Report:
124
+
125
+ ```bash
126
+ coverage run && coverage report
127
+ ```
128
+
129
+ HTML:
130
+
131
+ ```bash
132
+ coverage run && coverage html
133
+ ```
134
+
135
+ ```bash
136
+ Found 57 test(s).
137
+ Creating test database for alias 'default'...
138
+ System check identified no issues (0 silenced).
139
+ .........................................................
140
+ ----------------------------------------------------------------------
141
+ Ran 57 tests in 8.824s
142
+
143
+ OK
144
+ Destroying test database for alias 'default'...
145
+ Name Stmts Miss Cover
146
+ ----------------------------------------------------------------
147
+ punkweb_bb/__init__.py 0 0 100%
148
+ punkweb_bb/admin.py 41 1 98%
149
+ punkweb_bb/admin_forms.py 28 0 100%
150
+ punkweb_bb/apps.py 6 0 100%
151
+ punkweb_bb/bbcode_tags.py 115 3 97%
152
+ punkweb_bb/context_processors.py 3 0 100%
153
+ punkweb_bb/forms.py 35 0 100%
154
+ punkweb_bb/middleware.py 10 0 100%
155
+ punkweb_bb/mixins.py 11 0 100%
156
+ punkweb_bb/models.py 124 0 100%
157
+ punkweb_bb/pagination.py 11 4 64%
158
+ punkweb_bb/parsers.py 50 2 96%
159
+ punkweb_bb/response.py 3 0 100%
160
+ punkweb_bb/settings.py 6 0 100%
161
+ punkweb_bb/signals.py 9 0 100%
162
+ punkweb_bb/templatetags/__init__.py 0 0 100%
163
+ punkweb_bb/templatetags/humanize_int.py 9 5 44%
164
+ punkweb_bb/templatetags/shoutbox_bbcode.py 9 0 100%
165
+ punkweb_bb/tests.py 410 0 100%
166
+ punkweb_bb/urls.py 4 0 100%
167
+ punkweb_bb/views.py 174 17 90%
168
+ punkweb_bb/widgets.py 8 0 100%
169
+ ----------------------------------------------------------------
170
+ TOTAL 1066 32 97%
171
+ ```
@@ -0,0 +1,153 @@
1
+ # PunkwebBB
2
+
3
+ PunkwebBB is a Django application that provides a simple and modern forum board software for your Django website.
4
+
5
+ This is the successor to [punkweb-boards](https://github.com/Punkweb/punkweb-boards).
6
+
7
+ Check out [punkweb.net](https://punkweb.net/board/) for a live demo and more information!
8
+
9
+ ## Built with
10
+
11
+ - [Django](https://www.djangoproject.com/)
12
+ - [django-precise-bbcode](https://github.com/ellmetha/django-precise-bbcode)
13
+ - [HTMX](https://htmx.org/)
14
+ - [jQuery](https://jquery.com/)
15
+ - [SCEditor](https://www.sceditor.com/)
16
+ - [PrismJS](https://prismjs.com/)
17
+
18
+ ## Requirements
19
+
20
+ - Python 3.11+
21
+ - Django 4.2+
22
+ - django-precise-bbcode 1.2+
23
+ - Pillow
24
+
25
+ It may work with older versions of Python and Django, but it has not been tested.
26
+
27
+ ## Installation
28
+
29
+ ```bash
30
+ pip install punkweb-bb
31
+ ```
32
+
33
+ Add `precise_bbcode` and `punkweb_bb` to your `INSTALLED_APPS` in your Django settings module:
34
+
35
+ ```python
36
+ INSTALLED_APPS = [
37
+ ...
38
+ "precise_bbcode",
39
+ "punkweb_bb",
40
+ ]
41
+ ```
42
+
43
+ _Note_: `precise_bbcode` is required. It must be installed before `punkweb_bb`.
44
+
45
+ Add the following middleware to your `MIDDLEWARE` setting:
46
+
47
+ ```python
48
+ MIDDLEWARE = [
49
+ ...
50
+ "punkweb_bb.middleware.ProfileOnlineCacheMiddleware",
51
+ ]
52
+ ```
53
+
54
+ Add the following context processor to your `TEMPLATES` setting:
55
+
56
+ ```python
57
+ TEMPLATES = [
58
+ {
59
+ ...
60
+ "OPTIONS": {
61
+ "context_processors": [
62
+ ...
63
+ "punkweb_bb.context_processors.punkweb_bb",
64
+ ],
65
+ },
66
+ },
67
+ ]
68
+ ```
69
+
70
+ Add the following URL pattern to your `urls.py`:
71
+
72
+ ```python
73
+ from django.urls import path, include
74
+
75
+ urlpatterns = [
76
+ ...
77
+ path("forum/", include("punkweb_bb.urls")), # or any other path you want
78
+ ]
79
+ ```
80
+
81
+ And finally, install the models:
82
+
83
+ ```bash
84
+ python manage.py migrate
85
+ ```
86
+
87
+ ## Configuration
88
+
89
+ These are the default settings for PunkwebBB, which can be overridden in your Django settings module:
90
+
91
+ ```python
92
+ PUNKWEB_BB = {
93
+ "SITE_NAME": "PUNKWEB",
94
+ "SITE_TITLE": "PunkwebBB",
95
+ "FAVICON": "punkweb_bb/favicon.ico",
96
+ "SHOUTBOX_ENABLED": True,
97
+ "DISCORD_WIDGET_ENABLED": False,
98
+ "DISCORD_WIDGET_THEME": "dark",
99
+ "DISCORD_SERVER_ID": None, # Found under Server Settings > Widget > Server ID
100
+ }
101
+ ```
102
+
103
+ ## Testing
104
+
105
+ Report:
106
+
107
+ ```bash
108
+ coverage run && coverage report
109
+ ```
110
+
111
+ HTML:
112
+
113
+ ```bash
114
+ coverage run && coverage html
115
+ ```
116
+
117
+ ```bash
118
+ Found 57 test(s).
119
+ Creating test database for alias 'default'...
120
+ System check identified no issues (0 silenced).
121
+ .........................................................
122
+ ----------------------------------------------------------------------
123
+ Ran 57 tests in 8.824s
124
+
125
+ OK
126
+ Destroying test database for alias 'default'...
127
+ Name Stmts Miss Cover
128
+ ----------------------------------------------------------------
129
+ punkweb_bb/__init__.py 0 0 100%
130
+ punkweb_bb/admin.py 41 1 98%
131
+ punkweb_bb/admin_forms.py 28 0 100%
132
+ punkweb_bb/apps.py 6 0 100%
133
+ punkweb_bb/bbcode_tags.py 115 3 97%
134
+ punkweb_bb/context_processors.py 3 0 100%
135
+ punkweb_bb/forms.py 35 0 100%
136
+ punkweb_bb/middleware.py 10 0 100%
137
+ punkweb_bb/mixins.py 11 0 100%
138
+ punkweb_bb/models.py 124 0 100%
139
+ punkweb_bb/pagination.py 11 4 64%
140
+ punkweb_bb/parsers.py 50 2 96%
141
+ punkweb_bb/response.py 3 0 100%
142
+ punkweb_bb/settings.py 6 0 100%
143
+ punkweb_bb/signals.py 9 0 100%
144
+ punkweb_bb/templatetags/__init__.py 0 0 100%
145
+ punkweb_bb/templatetags/humanize_int.py 9 5 44%
146
+ punkweb_bb/templatetags/shoutbox_bbcode.py 9 0 100%
147
+ punkweb_bb/tests.py 410 0 100%
148
+ punkweb_bb/urls.py 4 0 100%
149
+ punkweb_bb/views.py 174 17 90%
150
+ punkweb_bb/widgets.py 8 0 100%
151
+ ----------------------------------------------------------------
152
+ TOTAL 1066 32 97%
153
+ ```
@@ -0,0 +1,20 @@
1
+ from expiringdict import ExpiringDict
2
+
3
+
4
+ class GuestList:
5
+ def __init__(self):
6
+ self.__guests = ExpiringDict(max_len=2048, max_age_seconds=60 * 5)
7
+
8
+ def length(self):
9
+ return len(self.__guests)
10
+
11
+ def add(self, ip):
12
+ if not self.__guests.get(ip, None):
13
+ self.__guests[ip] = True
14
+
15
+ def clear_expired(self):
16
+ for key in list(self.__guests.keys()):
17
+ _ = self.__guests.get(key, None)
18
+
19
+
20
+ guest_list = GuestList()
@@ -1,6 +1,8 @@
1
1
  from django.core.cache import cache
2
2
  from django.utils import timezone
3
3
 
4
+ from punkweb_bb.guests import guest_list
5
+
4
6
 
5
7
  class ProfileOnlineCacheMiddleware:
6
8
  def __init__(self, get_response):
@@ -11,6 +13,11 @@ class ProfileOnlineCacheMiddleware:
11
13
  cache.set(
12
14
  f"profile_online_{request.user.profile.id}", timezone.now(), 60 * 5
13
15
  )
16
+ else:
17
+ ip = request.META.get("REMOTE_ADDR")
18
+ guest_list.add(ip)
19
+
20
+ guest_list.clear_expired()
14
21
 
15
22
  response = self.get_response(request)
16
23
 
@@ -0,0 +1,18 @@
1
+ # Generated by Django 4.2.11 on 2024-05-07 04:24
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ("punkweb_bb", "0001_initial"),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name="thread",
15
+ name="view_count",
16
+ field=models.PositiveIntegerField(default=0),
17
+ ),
18
+ ]
@@ -5,6 +5,7 @@ import os
5
5
  from django.contrib.auth import get_user_model
6
6
  from django.core.cache import cache
7
7
  from django.db import models
8
+ from django.forms import ValidationError
8
9
  from django.urls import reverse
9
10
  from django.utils import timezone
10
11
  from precise_bbcode.fields import BBCodeTextField
@@ -107,6 +108,7 @@ class Thread(UUIDPrimaryKeyMixin, TimestampMixin):
107
108
  is_pinned = models.BooleanField(default=False)
108
109
  is_closed = models.BooleanField(default=False)
109
110
  last_post_created_at = models.DateTimeField(auto_now_add=True)
111
+ view_count = models.PositiveIntegerField(default=0)
110
112
 
111
113
  class Meta:
112
114
  ordering = (
@@ -161,6 +163,8 @@ class Post(UUIDPrimaryKeyMixin, TimestampMixin):
161
163
  return thread_url
162
164
 
163
165
  def save(self, *args, **kwargs):
166
+ if self.thread.is_closed:
167
+ raise ValidationError("Cannot add posts to a closed thread.")
164
168
  if self._state.adding:
165
169
  self.thread.last_post_created_at = timezone.now()
166
170
  self.thread.save()
@@ -0,0 +1,11 @@
1
+ from django.conf import settings
2
+
3
+ PUNKWEB_BB = getattr(settings, "PUNKWEB_BB", {})
4
+
5
+ SITE_NAME = PUNKWEB_BB.get("SITE_NAME", "PUNKWEB")
6
+ SITE_TITLE = PUNKWEB_BB.get("SITE_TITLE", "PunkwebBB")
7
+ FAVICON = PUNKWEB_BB.get("FAVICON", "punkweb_bb/favicon.ico")
8
+ SHOUTBOX_ENABLED = PUNKWEB_BB.get("SHOUTBOX_ENABLED", True)
9
+ DISCORD_WIDGET_ENABLED = PUNKWEB_BB.get("DISCORD_WIDGET_ENABLED", False)
10
+ DISCORD_WIDGET_THEME = PUNKWEB_BB.get("DISCORD_WIDGET_THEME", "dark")
11
+ DISCORD_SERVER_ID = PUNKWEB_BB.get("DISCORD_SERVER_ID", None)
@@ -53,3 +53,10 @@
53
53
  .profile__thread:not(:last-of-type) {
54
54
  border-bottom: 1px solid var(--border);
55
55
  }
56
+
57
+ @media screen and (max-width: 768px) {
58
+ .profile__info {
59
+ align-items: start;
60
+ flex-direction: column;
61
+ }
62
+ }
@@ -646,3 +646,26 @@ blockquote cite {
646
646
  .pw-breadcrumb-item.active {
647
647
  color: var(--breadcrumb-active);
648
648
  }
649
+
650
+ /* Callout */
651
+
652
+ .pw-callout {
653
+ background-color: var(--oc-gray-1);
654
+ border: 1px solid var(--border);
655
+ border-radius: 0.25rem;
656
+ color: var(--oc-gray-9);
657
+ padding: 0.5rem 1rem;
658
+ width: 100%;
659
+ }
660
+
661
+ .pw-callout.primary {
662
+ background-color: var(--primary-0);
663
+ border-color: 1px solid var(--primary-4);
664
+ color: var(--primary-9);
665
+ }
666
+
667
+ .pw-callout.danger {
668
+ background-color: var(--oc-red-0);
669
+ border-color: 1px solid var(--oc-red-4);
670
+ color: var(--oc-red-9);
671
+ }
@@ -6,7 +6,7 @@
6
6
  <meta charset="UTF-8" />
7
7
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8
8
  <title>{% block title_prefix %}{% endblock %}{{ punkweb_bb.settings.SITE_TITLE|default:"PunkwebBB" }}</title>
9
- <link rel="icon" href="{% static 'punkweb_bb/favicon.ico' %}" />
9
+ <link rel="icon" href="{% static punkweb_bb.settings.FAVICON %}" />
10
10
  <link rel="stylesheet" href="{% static 'punkweb_bb/vendor/open-color.css' %}" />
11
11
  <link rel="stylesheet" href="{% static 'punkweb_bb/vendor/prism.css' %}" />
12
12
  <link rel="stylesheet" href="{% static 'punkweb_bb/css/defaults.css' %}" />
@@ -171,16 +171,29 @@
171
171
  </div>
172
172
  {% endif %}
173
173
  <div class="index__statistics__row">
174
- <div class="index__statistics__label">Members online:</div>
175
- <div class="index__statistics__value">{{users_online|length}}</div>
176
- </div>
177
- <div class="index__statistics__row">
178
- <div class="index__statistics__label">Staff online:</div>
179
- <div class="index__statistics__value">{{staff_online|length}}</div>
174
+ <div class="index__statistics__label">Users online:</div>
175
+ <div class="index__statistics__value">{{total_online}} ({{members_online|length}} members, {{staff_online|length}} staff, {{guests_online}} guests)</div>
180
176
  </div>
181
177
  </div>
182
178
  </div>
183
179
  </div>
180
+ {% if punkweb_bb.settings.DISCORD_WIDGET_ENABLED %}
181
+ {% if punkweb_bb.settings.DISCORD_SERVER_ID %}
182
+ <iframe
183
+ src="https://discord.com/widget?id={{ punkweb_bb.settings.DISCORD_SERVER_ID }}&theme={{ punkweb_bb.settings.DISCORD_WIDGET_THEME|default:'dark' }}"
184
+ width="100%"
185
+ height="384"
186
+ allowtransparency="true"
187
+ frameborder="0"
188
+ sandbox="allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-scripts">
189
+ </iframe>
190
+ {% else %}
191
+ <div class="pw-callout danger">
192
+ <h4>Discord Widget Error</h4>
193
+ <p><code>DISCORD_SERVER_ID</code> not configured in settings module.</p>
194
+ </div>
195
+ {% endif %}
196
+ {% endif %}
184
197
  </div>
185
198
  </div>
186
199
  </div>
@@ -1,5 +1,5 @@
1
1
  {% extends 'punkweb_bb/base.html' %}
2
- {% load static %}
2
+ {% load static humanize_int %}
3
3
 
4
4
  {% block title_prefix %}{{subcategory.name}} | {% endblock%}
5
5
 
@@ -14,6 +14,9 @@
14
14
  <li class="pw-breadcrumb-item">
15
15
  <a href="{% url 'punkweb_bb:index' %}">Home</a>
16
16
  </li>
17
+ <li class="pw-breadcrumb-item">
18
+ <a href="{{subcategory.category.get_absolute_url}}">{{subcategory.category.name}}</a>
19
+ </li>
17
20
  <li class="pw-breadcrumb-item active">
18
21
  {{subcategory.name}}
19
22
  </li>
@@ -44,12 +47,14 @@
44
47
  <colgroup>
45
48
  <col span="1">
46
49
  <col span="1" width="96px">
50
+ <col span="1" width="96px">
47
51
  <col span="1" width="160px">
48
52
  </colgroup>
49
53
  <thead>
50
54
  <tr>
51
55
  <th>Title</th>
52
56
  <th>Posts</th>
57
+ <th>Views</th>
53
58
  <th></th>
54
59
  </tr>
55
60
  </thead>
@@ -74,6 +79,7 @@
74
79
  {{thread.created_at|date:'M j, Y'}}</div>
75
80
  </td>
76
81
  <td>{{thread.post_count}}</td>
82
+ <td>{{thread.view_count | humanize_int}}</td>
77
83
  <td>
78
84
  {% if thread.latest_post %}
79
85
  <div class="thread__latestPost">
@@ -21,6 +21,9 @@
21
21
  <li class="pw-breadcrumb-item">
22
22
  <a href="{% url 'punkweb_bb:index' %}">Home</a>
23
23
  </li>
24
+ <li class="pw-breadcrumb-item">
25
+ <a href="{{thread.subcategory.category.get_absolute_url}}">{{thread.subcategory.category.name}}</a>
26
+ </li>
24
27
  <li class="pw-breadcrumb-item">
25
28
  <a href="{{thread.subcategory.get_absolute_url}}">{{thread.subcategory.name}}</a>
26
29
  </li>
@@ -56,7 +59,7 @@
56
59
  <div class="thread__user__info__row">
57
60
  <div class="thread__user__info__label">Joined:</div>
58
61
  <div class="thread__user__info__value">
59
- {{thread.user.profile.created_at|date:"M d, Y"}}
62
+ {{thread.user.date_joined|date:"M d, Y"}}
60
63
  </div>
61
64
  </div>
62
65
  <div class="thread__user__info__row">
@@ -117,7 +120,7 @@
117
120
  <div class="thread__user__info__row">
118
121
  <div class="thread__user__info__label">Joined:</div>
119
122
  <div class="thread__user__info__value">
120
- {{post.user.profile.created_at|date:"M d, Y"}}
123
+ {{post.user.date_joined|date:"M d, Y"}}
121
124
  </div>
122
125
  </div>
123
126
  <div class="thread__user__info__row">
@@ -15,6 +15,9 @@
15
15
  <li class="pw-breadcrumb-item">
16
16
  <a href="{% url 'punkweb_bb:index' %}">Home</a>
17
17
  </li>
18
+ <li class="pw-breadcrumb-item">
19
+ <a href="{{subcategory.category.get_absolute_url}}">{{subcategory.category.name}}</a>
20
+ </li>
18
21
  <li class="pw-breadcrumb-item">
19
22
  <a href="{{subcategory.get_absolute_url}}">{{subcategory.name}}</a>
20
23
  </li>
@@ -15,6 +15,9 @@
15
15
  <li class="pw-breadcrumb-item">
16
16
  <a href="{% url 'punkweb_bb:index' %}">Home</a>
17
17
  </li>
18
+ <li class="pw-breadcrumb-item">
19
+ <a href="{{thread.subcategory.category.get_absolute_url}}">{{thread.subcategory.category.name}}</a>
20
+ </li>
18
21
  <li class="pw-breadcrumb-item">
19
22
  <a href="{{thread.subcategory.get_absolute_url}}">{{thread.subcategory.name}}</a>
20
23
  </li>
@@ -0,0 +1,12 @@
1
+ from django import template
2
+
3
+ register = template.Library()
4
+
5
+
6
+ @register.filter
7
+ def humanize_int(value):
8
+ if value >= 1000000:
9
+ return f"{value / 1000000:.1f}M"
10
+ elif value >= 1000:
11
+ return f"{value / 1000:.1f}K"
12
+ return value