commentail 0.1.0__tar.gz → 0.2.0__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 (228) hide show
  1. commentail-0.2.0/CHANGELOG.md +116 -0
  2. {commentail-0.1.0 → commentail-0.2.0}/MANIFEST.in +2 -2
  3. {commentail-0.1.0/commentail.egg-info → commentail-0.2.0}/PKG-INFO +68 -18
  4. {commentail-0.1.0 → commentail-0.2.0}/README.md +63 -15
  5. commentail-0.2.0/README.ru.md +236 -0
  6. {commentail-0.1.0 → commentail-0.2.0}/commentail/admin_views.py +30 -17
  7. {commentail-0.1.0 → commentail-0.2.0}/commentail/avatars.py +20 -6
  8. {commentail-0.1.0 → commentail-0.2.0}/commentail/config.py +10 -0
  9. commentail-0.2.0/commentail/locale/de/LC_MESSAGES/django.mo +0 -0
  10. commentail-0.2.0/commentail/locale/de/LC_MESSAGES/django.po +920 -0
  11. commentail-0.2.0/commentail/locale/es/LC_MESSAGES/django.mo +0 -0
  12. commentail-0.2.0/commentail/locale/es/LC_MESSAGES/django.po +920 -0
  13. commentail-0.2.0/commentail/locale/fr/LC_MESSAGES/django.mo +0 -0
  14. commentail-0.2.0/commentail/locale/fr/LC_MESSAGES/django.po +920 -0
  15. commentail-0.2.0/commentail/locale/pt_BR/LC_MESSAGES/django.mo +0 -0
  16. commentail-0.2.0/commentail/locale/pt_BR/LC_MESSAGES/django.po +920 -0
  17. commentail-0.2.0/commentail/locale/ru/LC_MESSAGES/django.mo +0 -0
  18. {commentail-0.1.0 → commentail-0.2.0}/commentail/locale/ru/LC_MESSAGES/django.po +98 -3
  19. commentail-0.2.0/commentail/migrations/0014_reading_indexes.py +39 -0
  20. {commentail-0.1.0 → commentail-0.2.0}/commentail/models.py +16 -2
  21. {commentail-0.1.0 → commentail-0.2.0}/commentail/objects.py +15 -1
  22. {commentail-0.1.0 → commentail-0.2.0}/commentail/outbox.py +27 -16
  23. {commentail-0.1.0 → commentail-0.2.0}/commentail/panels.py +7 -0
  24. {commentail-0.1.0 → commentail-0.2.0}/commentail/policies.py +44 -15
  25. {commentail-0.1.0 → commentail-0.2.0}/commentail/public.py +71 -33
  26. commentail-0.2.0/commentail/recent.py +226 -0
  27. {commentail-0.1.0 → commentail-0.2.0}/commentail/services.py +72 -26
  28. {commentail-0.1.0 → commentail-0.2.0}/commentail/static/commentail/admin.css +18 -0
  29. {commentail-0.1.0 → commentail-0.2.0}/commentail/static/commentail/commentail.js +13 -0
  30. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/list.html +2 -2
  31. commentail-0.2.0/commentail/templates/commentail/admin/page_panel.html +28 -0
  32. commentail-0.2.0/commentail/templates/commentail/emails/base.html +20 -0
  33. commentail-0.2.0/commentail/templates/commentail/emails/button.html +2 -0
  34. commentail-0.2.0/commentail/templates/commentail/emails/confirm.html +10 -0
  35. commentail-0.2.0/commentail/templates/commentail/emails/confirm.txt +18 -0
  36. commentail-0.2.0/commentail/templates/commentail/emails/edit.html +9 -0
  37. commentail-0.2.0/commentail/templates/commentail/emails/edit.txt +17 -0
  38. commentail-0.2.0/commentail/templates/commentail/emails/published.html +6 -0
  39. commentail-0.2.0/commentail/templates/commentail/emails/published.txt +10 -0
  40. commentail-0.2.0/commentail/templates/commentail/emails/published_subject.txt +1 -0
  41. commentail-0.2.0/commentail/templates/commentail/emails/rejected.html +7 -0
  42. commentail-0.2.0/commentail/templates/commentail/emails/rejected.txt +13 -0
  43. commentail-0.2.0/commentail/templates/commentail/emails/rejected_subject.txt +1 -0
  44. commentail-0.2.0/commentail/templates/commentail/emails/reply.html +8 -0
  45. commentail-0.2.0/commentail/templates/commentail/emails/reply.txt +17 -0
  46. commentail-0.2.0/commentail/templates/commentail/form.html +1 -0
  47. {commentail-0.1.0 → commentail-0.2.0}/commentail/templatetags/commentail_tags.py +24 -0
  48. {commentail-0.1.0 → commentail-0.2.0}/commentail/wagtail_hooks.py +2 -2
  49. {commentail-0.1.0 → commentail-0.2.0/commentail.egg-info}/PKG-INFO +68 -18
  50. {commentail-0.1.0 → commentail-0.2.0}/commentail.egg-info/SOURCES.txt +40 -1
  51. {commentail-0.1.0 → commentail-0.2.0}/commentail.egg-info/requires.txt +2 -2
  52. commentail-0.2.0/docs/releases/0.1.1.md +53 -0
  53. commentail-0.2.0/docs/releases/0.2.0.md +83 -0
  54. commentail-0.2.0/docs/wiki/Changelog.md +116 -0
  55. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Configuration.md +24 -2
  56. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Deployment.md +2 -0
  57. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Email-and-worker.md +27 -0
  58. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Example-and-testing.md +26 -6
  59. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Guest-comments.md +5 -1
  60. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Home.md +11 -4
  61. commentail-0.2.0/docs/wiki/Installation.md +142 -0
  62. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Moderation.md +5 -0
  63. commentail-0.2.0/docs/wiki/Performance.md +137 -0
  64. commentail-0.2.0/docs/wiki/Recent-comments.md +102 -0
  65. commentail-0.2.0/docs/wiki/Release-0.1.1.md +53 -0
  66. commentail-0.2.0/docs/wiki/Release-0.2.0.md +83 -0
  67. commentail-0.2.0/docs/wiki/Roadmap.md +26 -0
  68. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Support.md +1 -1
  69. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Templates.md +17 -1
  70. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/_Sidebar.md +7 -1
  71. {commentail-0.1.0 → commentail-0.2.0}/example/README.md +4 -2
  72. {commentail-0.1.0 → commentail-0.2.0}/pyproject.toml +4 -2
  73. commentail-0.1.0/requirements-test.txt → commentail-0.2.0/requirements-test-common.txt +1 -3
  74. commentail-0.2.0/requirements-test.txt +4 -0
  75. {commentail-0.1.0 → commentail-0.2.0}/tests/settings.py +2 -1
  76. {commentail-0.1.0 → commentail-0.2.0}/tests/test_admin_ui.py +27 -1
  77. commentail-0.2.0/tests/test_capability_access.py +190 -0
  78. {commentail-0.1.0 → commentail-0.2.0}/tests/test_concurrency.py +42 -2
  79. commentail-0.2.0/tests/test_email_presentation.py +119 -0
  80. commentail-0.2.0/tests/test_extension_contracts.py +182 -0
  81. {commentail-0.1.0 → commentail-0.2.0}/tests/test_lifecycle.py +16 -2
  82. commentail-0.2.0/tests/test_localization.py +257 -0
  83. commentail-0.2.0/tests/test_name_limit.js +41 -0
  84. {commentail-0.1.0 → commentail-0.2.0}/tests/test_outbox.py +79 -2
  85. commentail-0.2.0/tests/test_performance.py +224 -0
  86. commentail-0.2.0/tests/test_presentation_contracts.py +304 -0
  87. commentail-0.2.0/tests/test_recent_comments.py +281 -0
  88. {commentail-0.1.0 → commentail-0.2.0}/tests/test_smtp_chain.py +32 -8
  89. commentail-0.2.0/tests/test_transaction_contracts.py +122 -0
  90. commentail-0.2.0/tests/urls_custom_prefix.py +9 -0
  91. commentail-0.2.0/tools/benchmark_performance.py +386 -0
  92. {commentail-0.1.0 → commentail-0.2.0}/tools/check_dist.py +2 -2
  93. commentail-0.2.0/tools/check_translations.py +92 -0
  94. commentail-0.1.0/CHANGELOG.md +0 -15
  95. commentail-0.1.0/commentail/locale/ru/LC_MESSAGES/django.mo +0 -0
  96. commentail-0.1.0/commentail/templates/commentail/admin/page_panel.html +0 -1
  97. commentail-0.1.0/commentail/templates/commentail/emails/confirm.txt +0 -7
  98. commentail-0.1.0/commentail/templates/commentail/emails/edit.txt +0 -5
  99. commentail-0.1.0/commentail/templates/commentail/emails/published.txt +0 -3
  100. commentail-0.1.0/commentail/templates/commentail/emails/published_subject.txt +0 -1
  101. commentail-0.1.0/commentail/templates/commentail/emails/rejected.txt +0 -5
  102. commentail-0.1.0/commentail/templates/commentail/emails/rejected_subject.txt +0 -1
  103. commentail-0.1.0/commentail/templates/commentail/emails/reply.txt +0 -6
  104. commentail-0.1.0/commentail/templates/commentail/form.html +0 -1
  105. commentail-0.1.0/docs/wiki/Installation.md +0 -87
  106. {commentail-0.1.0 → commentail-0.2.0}/LICENSE +0 -0
  107. {commentail-0.1.0 → commentail-0.2.0}/commentail/__init__.py +0 -0
  108. {commentail-0.1.0 → commentail-0.2.0}/commentail/admin_urls.py +0 -0
  109. {commentail-0.1.0 → commentail-0.2.0}/commentail/admission.py +0 -0
  110. {commentail-0.1.0 → commentail-0.2.0}/commentail/apps.py +0 -0
  111. {commentail-0.1.0 → commentail-0.2.0}/commentail/assets.py +0 -0
  112. {commentail-0.1.0 → commentail-0.2.0}/commentail/checks.py +0 -0
  113. {commentail-0.1.0 → commentail-0.2.0}/commentail/detection.py +0 -0
  114. {commentail-0.1.0 → commentail-0.2.0}/commentail/drafts.py +0 -0
  115. {commentail-0.1.0 → commentail-0.2.0}/commentail/forms.py +0 -0
  116. {commentail-0.1.0 → commentail-0.2.0}/commentail/group_permissions.py +0 -0
  117. {commentail-0.1.0 → commentail-0.2.0}/commentail/limits.py +0 -0
  118. {commentail-0.1.0 → commentail-0.2.0}/commentail/logging.py +0 -0
  119. {commentail-0.1.0 → commentail-0.2.0}/commentail/management/__init__.py +0 -0
  120. {commentail-0.1.0 → commentail-0.2.0}/commentail/management/commands/__init__.py +0 -0
  121. {commentail-0.1.0 → commentail-0.2.0}/commentail/management/commands/process_commentail.py +0 -0
  122. {commentail-0.1.0 → commentail-0.2.0}/commentail/middleware.py +0 -0
  123. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0001_initial.py +0 -0
  124. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0002_sitegrouppermission_hide_sitegrouppermission_view.py +0 -0
  125. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0003_actiontoken_captchachallenge_guestgrant.py +0 -0
  126. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0004_submissionrecord.py +0 -0
  127. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0005_rateevent.py +0 -0
  128. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0006_alter_comment_guest_name_and_more.py +0 -0
  129. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0007_actiontoken_nonce_replysubscription_mailjob.py +0 -0
  130. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0008_mailjob_revision.py +0 -0
  131. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0009_formticket.py +0 -0
  132. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0010_captchachallenge_backend_and_more.py +0 -0
  133. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0011_discussion_content_type_discussion_object_id_and_more.py +0 -0
  134. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0012_formticket_draft.py +0 -0
  135. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/0013_sitecommentsettings_email_enabled.py +0 -0
  136. {commentail-0.1.0 → commentail-0.2.0}/commentail/migrations/__init__.py +0 -0
  137. {commentail-0.1.0 → commentail-0.2.0}/commentail/page_integration.py +0 -0
  138. {commentail-0.1.0 → commentail-0.2.0}/commentail/permissions.py +0 -0
  139. {commentail-0.1.0 → commentail-0.2.0}/commentail/rules_csv.py +0 -0
  140. {commentail-0.1.0 → commentail-0.2.0}/commentail/security.py +0 -0
  141. {commentail-0.1.0 → commentail-0.2.0}/commentail/signals.py +0 -0
  142. {commentail-0.1.0 → commentail-0.2.0}/commentail/static/commentail/admin.js +0 -0
  143. {commentail-0.1.0 → commentail-0.2.0}/commentail/static/commentail/commentail.css +0 -0
  144. {commentail-0.1.0 → commentail-0.2.0}/commentail/structured.py +0 -0
  145. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/action.html +0 -0
  146. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/detail.html +0 -0
  147. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/form.html +0 -0
  148. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/group_permission_row.html +0 -0
  149. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/group_permissions.html +0 -0
  150. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/mail.html +0 -0
  151. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/objects.html +0 -0
  152. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/rules.html +0 -0
  153. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/admin/rules_import.html +0 -0
  154. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/base.html +0 -0
  155. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/block.html +0 -0
  156. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/captcha.html +0 -0
  157. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/comment.html +0 -0
  158. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/edit-form.html +0 -0
  159. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/emails/confirm_subject.txt +0 -0
  160. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/emails/edit_subject.txt +0 -0
  161. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/emails/reply_subject.txt +0 -0
  162. {commentail-0.1.0 → commentail-0.2.0}/commentail/templates/commentail/replies.html +0 -0
  163. {commentail-0.1.0 → commentail-0.2.0}/commentail/templatetags/__init__.py +0 -0
  164. {commentail-0.1.0 → commentail-0.2.0}/commentail/text.py +0 -0
  165. {commentail-0.1.0 → commentail-0.2.0}/commentail/urls.py +0 -0
  166. {commentail-0.1.0 → commentail-0.2.0}/commentail/views.py +0 -0
  167. {commentail-0.1.0 → commentail-0.2.0}/commentail.egg-info/dependency_links.txt +0 -0
  168. {commentail-0.1.0 → commentail-0.2.0}/commentail.egg-info/top_level.txt +0 -0
  169. {commentail-0.1.0 → commentail-0.2.0}/docs/assets/commentail-preview.png +0 -0
  170. {commentail-0.1.0 → commentail-0.2.0}/docs/assets/support-qr.png +0 -0
  171. {commentail-0.1.0 → commentail-0.2.0}/docs/releases/0.1.0.md +0 -0
  172. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Callbacks.md +0 -0
  173. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Object-adapters.md +0 -0
  174. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Release-0.1.0.md +0 -0
  175. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Replies-and-editing.md +0 -0
  176. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Rules-and-CSV.md +0 -0
  177. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Security-and-privacy.md +0 -0
  178. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Structured-data.md +0 -0
  179. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Styling.md +0 -0
  180. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/Troubleshooting.md +0 -0
  181. {commentail-0.1.0 → commentail-0.2.0}/docs/wiki/_Footer.md +0 -0
  182. {commentail-0.1.0 → commentail-0.2.0}/example/demo/__init__.py +0 -0
  183. {commentail-0.1.0 → commentail-0.2.0}/example/demo/settings.py +0 -0
  184. {commentail-0.1.0 → commentail-0.2.0}/example/demo/urls.py +0 -0
  185. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/__init__.py +0 -0
  186. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/comments.py +0 -0
  187. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/management/__init__.py +0 -0
  188. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/management/commands/__init__.py +0 -0
  189. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/management/commands/bootstrap_demo.py +0 -0
  190. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/migrations/0001_initial.py +0 -0
  191. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/migrations/0002_product.py +0 -0
  192. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/migrations/__init__.py +0 -0
  193. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/models.py +0 -0
  194. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/templates/demo_home/home_page.html +0 -0
  195. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/templates/demo_home/product.html +0 -0
  196. {commentail-0.1.0 → commentail-0.2.0}/example/demo_home/views.py +0 -0
  197. {commentail-0.1.0 → commentail-0.2.0}/example/manage.py +0 -0
  198. {commentail-0.1.0 → commentail-0.2.0}/setup.cfg +0 -0
  199. {commentail-0.1.0 → commentail-0.2.0}/tests/__init__.py +0 -0
  200. {commentail-0.1.0 → commentail-0.2.0}/tests/targets/__init__.py +0 -0
  201. {commentail-0.1.0 → commentail-0.2.0}/tests/targets/apps.py +0 -0
  202. {commentail-0.1.0 → commentail-0.2.0}/tests/targets/migrations/0001_initial.py +0 -0
  203. {commentail-0.1.0 → commentail-0.2.0}/tests/targets/migrations/__init__.py +0 -0
  204. {commentail-0.1.0 → commentail-0.2.0}/tests/targets/models.py +0 -0
  205. {commentail-0.1.0 → commentail-0.2.0}/tests/templates/wagtailcore/page.html +0 -0
  206. {commentail-0.1.0 → commentail-0.2.0}/tests/test_actions.py +0 -0
  207. {commentail-0.1.0 → commentail-0.2.0}/tests/test_admin.js +0 -0
  208. {commentail-0.1.0 → commentail-0.2.0}/tests/test_admission.py +0 -0
  209. {commentail-0.1.0 → commentail-0.2.0}/tests/test_avatars.py +0 -0
  210. {commentail-0.1.0 → commentail-0.2.0}/tests/test_captcha_backend.py +0 -0
  211. {commentail-0.1.0 → commentail-0.2.0}/tests/test_cleanup.py +0 -0
  212. {commentail-0.1.0 → commentail-0.2.0}/tests/test_detection.py +0 -0
  213. {commentail-0.1.0 → commentail-0.2.0}/tests/test_group_panel.py +0 -0
  214. {commentail-0.1.0 → commentail-0.2.0}/tests/test_inline_edit.py +0 -0
  215. {commentail-0.1.0 → commentail-0.2.0}/tests/test_mail_admin.py +0 -0
  216. {commentail-0.1.0 → commentail-0.2.0}/tests/test_notifications.py +0 -0
  217. {commentail-0.1.0 → commentail-0.2.0}/tests/test_object_adapters.py +0 -0
  218. {commentail-0.1.0 → commentail-0.2.0}/tests/test_progressive.js +0 -0
  219. {commentail-0.1.0 → commentail-0.2.0}/tests/test_public_ui.py +0 -0
  220. {commentail-0.1.0 → commentail-0.2.0}/tests/test_rate_limits.py +0 -0
  221. {commentail-0.1.0 → commentail-0.2.0}/tests/test_release_gaps.py +0 -0
  222. {commentail-0.1.0 → commentail-0.2.0}/tests/test_reply.js +0 -0
  223. {commentail-0.1.0 → commentail-0.2.0}/tests/test_rules_admin.py +0 -0
  224. {commentail-0.1.0 → commentail-0.2.0}/tests/test_rules_csv.py +0 -0
  225. {commentail-0.1.0 → commentail-0.2.0}/tests/test_security.py +0 -0
  226. {commentail-0.1.0 → commentail-0.2.0}/tests/test_structured_data.py +0 -0
  227. {commentail-0.1.0 → commentail-0.2.0}/tests/test_submission.py +0 -0
  228. {commentail-0.1.0 → commentail-0.2.0}/tests/urls.py +0 -0
@@ -0,0 +1,116 @@
1
+ # Changelog
2
+
3
+ Each release records changes relative to the previous version. Upgrade notes
4
+ describe changes that an existing installation needs to review.
5
+
6
+ ## [0.2.0] — 2026-10-19 · Beta
7
+
8
+ Changes from **0.1.1 → 0.2.0**.
9
+
10
+ ### Added
11
+
12
+ - `commentail_recent` template tag for latest published comments with a limit,
13
+ exact Page filter, optional replies and host-owned markup. Selection enforces
14
+ visitor access, Site isolation and hidden-discussion settings; results contain
15
+ plain presentation fields and comment permalinks without private model data.
16
+
17
+ - Grouped Comments settings in the Wagtail Page editor, with site inheritance
18
+ and existing save/publication behavior preserved.
19
+ - Russian README included in the source distribution.
20
+
21
+ - Minimal HTML emails for all five notification types, with host Site names,
22
+ explanatory copy, labelled action links and equivalent plain text in all six
23
+ supported languages. Revision decisions have distinct subjects and explanations.
24
+
25
+ - German (`de`), French (`fr`), Spanish (`es`) and Brazilian Portuguese (`pt-br`)
26
+ translations for public forms, validation/action messages, moderation/settings,
27
+ delivery screens and all five notification email types, including revision decisions.
28
+ - Source-coverage and compiled-catalog checks for every shipped locale, plus
29
+ regression checks for recipient-language mail delivery and English fallback.
30
+
31
+ ### Fixed
32
+
33
+ - Bounded and indexed recent-comment reads, batched Page access checks and reused
34
+ target URLs. Discussion rendering groups reply counts and avoids per-comment
35
+ target/settings/revision queries; moderation totals use a shared aggregate.
36
+ - Whole-word rule matching avoids a rule-by-text-position scan. Cleanup locks
37
+ only expired unconfirmed candidates; worker claims preload authors/revisions.
38
+ - The moderation Page filter uses Wagtail's searchable chooser instead of loading
39
+ every discussion Page into its HTML. Added reproducible synthetic load checks.
40
+
41
+ - Email copy distinguishes revision approval from public visibility, explains
42
+ editing cutoff for replies awaiting moderation, and uses contextual action
43
+ labels without promising new replies in read-only discussions.
44
+
45
+ - Generated author labels in reply emails use the recipient's saved language,
46
+ including the generic account name, instead of the mail worker's language.
47
+
48
+ ### Upgrade notes
49
+
50
+ - Host email overrides keep precedence; review
51
+ both MIME alternatives and any custom subject/body wording when upgrading.
52
+ - Enable the desired language through the host site's Django language settings;
53
+ use `pt-br` for Brazilian Portuguese. Commentail's gettext directory is `pt_BR`.
54
+ - Documentation remains in English and Russian.
55
+ - Run migration `0014_reading_indexes` for publication/thread, active CAPTCHA and
56
+ rate-cleanup indexes, then recollect static files. Index builds may block writes
57
+ on large tables; SQLite also rebuilds the rate-event table. See
58
+ [performance and migration guidance](docs/wiki/Performance.md).
59
+
60
+ ## [0.1.1] — 2026-10-19 · Beta
61
+
62
+ Changes from **0.1.0 → 0.1.1**.
63
+
64
+ ### Added
65
+
66
+ - Wagtail 8.0 support with Django 5.2, 6.0 or 6.1, and Django 6.0 support on
67
+ Wagtail 7.4.3+. The five framework pairs cover Python 3.12–3.14 with file
68
+ SQLite and PostgreSQL 16 (30 combinations).
69
+ - Regression coverage for capability access, extension/presentation contracts,
70
+ lifecycle transactions, concurrency and mail-worker recovery.
71
+ - A public roadmap, including expansion of supported UI and email languages/locales.
72
+
73
+ ### Changed
74
+
75
+ - New guest names allow **40 Unicode graphemes**, down from 80, after trimming.
76
+ Server validation and browser guidance reject overlong input without truncation.
77
+ Existing stored names and registered-account names are preserved.
78
+ - PostgreSQL installation guidance explicitly includes `django.contrib.postgres`
79
+ for Django 6.x checks.
80
+
81
+ ### Fixed
82
+
83
+ - Email action and status links now follow the configured Commentail URL prefix,
84
+ including nested paths, instead of assuming `/commentail/`.
85
+ - The guest-name label uses its own translation context, preventing collisions
86
+ with host-site translations for other uses of "Name".
87
+
88
+ ### Upgrade notes
89
+
90
+ - No new Commentail database migrations; framework upgrades may have their own.
91
+ - Review overridden guest forms for the 40-grapheme limit and recollect static files.
92
+ - Previously delivered emails are not rewritten. Pending mail uses the installed
93
+ version's URL generation; existing SMTP retry/duplicate-delivery limits remain.
94
+ - UI and email languages remain English and Russian. Additional locales are planned.
95
+
96
+ See [0.1.1 release notes](docs/releases/0.1.1.md) and
97
+ [installation/restoration](docs/wiki/Installation.md).
98
+
99
+ ## [0.1.0] — 2026-10-17 · Beta
100
+
101
+ Initial release for Wagtail 7.4.3+ within 7.4, Django 5.2 and Python 3.12–3.14.
102
+
103
+ - Template-based Page integration and adapters for ordinary Django models.
104
+ - Site/Page configuration, moderation queue, group permissions and CSV rules.
105
+ - Verified guests, replaceable CAPTCHA and Site-scoped rate limits.
106
+ - Threaded replies, inline author revisions and protected guest actions.
107
+ - Database email outbox, direct-reply notifications and unsubscribe.
108
+ - Schema.org Comment microdata and JSON-LD, with per-site output selection.
109
+ - Theme inheritance, template overrides, Python hooks and English/Russian UI.
110
+
111
+ See [0.1.0 release notes](docs/releases/0.1.0.md).
112
+
113
+ [0.1.1]: https://github.com/hardcodd/Commentail/compare/v0.1.0...v0.1.1
114
+ [0.1.0]: https://github.com/hardcodd/Commentail/releases/tag/v0.1.0
115
+
116
+ [0.2.0]: https://github.com/hardcodd/Commentail/compare/v0.1.1...v0.2.0
@@ -1,8 +1,8 @@
1
1
  recursive-include tests *.py *.html *.js
2
2
  recursive-include example *.py *.html *.md
3
- include requirements-test.txt
3
+ include requirements-test.txt requirements-test-common.txt
4
4
  recursive-include tools *.py
5
- include CHANGELOG.md
5
+ include CHANGELOG.md README.ru.md
6
6
  recursive-include docs/wiki *.md
7
7
  recursive-include docs/releases *.md
8
8
  include docs/assets/commentail-preview.png
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: commentail
3
- Version: 0.1.0
3
+ Version: 0.2.0
4
4
  Summary: Self-hosted Wagtail comments with moderation, verified guests and threaded replies
5
5
  License-Expression: MIT
6
6
  Project-URL: Source, https://github.com/hardcodd/Commentail
@@ -10,6 +10,8 @@ Project-URL: Changelog, https://github.com/hardcodd/Commentail/blob/main/CHANGEL
10
10
  Project-URL: Funding, https://pay.cloudtips.ru/p/f92ee349
11
11
  Classifier: Development Status :: 4 - Beta
12
12
  Classifier: Framework :: Django :: 5.2
13
+ Classifier: Framework :: Django :: 6.0
14
+ Classifier: Framework :: Django :: 6.1
13
15
  Classifier: Framework :: Wagtail
14
16
  Classifier: Programming Language :: Python :: 3.12
15
17
  Classifier: Programming Language :: Python :: 3.13
@@ -17,8 +19,8 @@ Classifier: Programming Language :: Python :: 3.14
17
19
  Requires-Python: >=3.12
18
20
  Description-Content-Type: text/markdown
19
21
  License-File: LICENSE
20
- Requires-Dist: Django<5.3,>=5.2
21
- Requires-Dist: Wagtail<7.5,>=7.4.3
22
+ Requires-Dist: Django<6.2,>=5.2
23
+ Requires-Dist: Wagtail<8.1,>=7.4.3
22
24
  Requires-Dist: regex>=2026.9.29
23
25
  Provides-Extra: postgres
24
26
  Requires-Dist: psycopg[binary]>=3.3.6; extra == "postgres"
@@ -33,6 +35,9 @@ Dynamic: license-file
33
35
  Moderated discussions, verified guests and inline replies — styled by your site.
34
36
 
35
37
  [![Tests and distributions](https://github.com/hardcodd/Commentail/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/hardcodd/Commentail/actions/workflows/tests.yml)
38
+ [![Django Packages · Commentail](https://img.shields.io/badge/Django%20Packages-Commentail-0C4B33.svg)](https://djangopackages.org/packages/p/commentail/)
39
+
40
+ English · [Русский](README.ru.md)
36
41
 
37
42
  [Get started](#quick-start) · [Documentation](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Home.md) · [Wiki](https://github.com/hardcodd/Commentail/wiki) · [Support](#support-commentail)
38
43
 
@@ -40,7 +45,7 @@ Moderated discussions, verified guests and inline replies — styled by your sit
40
45
 
41
46
  </div>
42
47
 
43
- Commentail is a Django comments library built for **Wagtail 7.4 LTS**. Add a
48
+ Commentail is a Django comments library for **Wagtail 7.4 LTS and 8.0**. Add a
44
49
  Django template tag to an article, moderate discussions inside Wagtail, and keep
45
50
  content, accounts and email delivery in your own application.
46
51
 
@@ -48,7 +53,10 @@ The widget inherits your site's typography and colors. CSS custom properties,
48
53
  replaceable templates and Python callbacks let you adapt it without a frontend
49
54
  framework or an external comments platform.
50
55
 
51
- > Wagtail 8.0 is not supported by 0.1.0.
56
+ > **0.2.0 Beta** adds recent comments, six languages,
57
+ > HTML emails and indexed database reads.
58
+ > [Version-to-version changelog](https://github.com/hardcodd/Commentail/blob/main/CHANGELOG.md) · [Roadmap](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Roadmap.md).
59
+ > [Changes and upgrade notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.2.0.md).
52
60
 
53
61
  ## Why Commentail?
54
62
 
@@ -73,17 +81,32 @@ the visible text and author name. Choose either format or disable output in Pyth
73
81
  | Component | Version / requirement |
74
82
  | --- | --- |
75
83
  | Python | 3.12–3.14 |
76
- | Wagtail | >=7.4.3, <7.5 |
77
- | Django | >=5.2, <5.3 |
78
- | Database | SQLite or PostgreSQL; CI covers PostgreSQL 14 |
79
- | UI languages | English and Russian |
84
+ | Wagtail / Django | 7.4.3+ in 7.4 / Django 5.2 or 6.0; 8.0.x / Django 5.2, 6.0 or 6.1 |
85
+ | Database | File SQLite or PostgreSQL 16 |
86
+ | UI and email languages | English, Russian, German, French, Spanish and Brazilian Portuguese |
80
87
  | Frontend | Django templates, optional progressive JavaScript |
81
88
  | License | [MIT](https://github.com/hardcodd/Commentail/blob/main/LICENSE) |
82
89
 
90
+ This table describes the 0.2.0 Beta release. CI defines all five framework
91
+ pairs on Python 3.12, 3.13 and 3.14 with both databases (30 combinations).
92
+ Package bounds are `Wagtail>=7.4.3,<8.1` and `Django>=5.2,<6.2`; only the pairs
93
+ listed above are supported. Wagtail 7.4 with Django 6.1 is outside this matrix.
94
+ Wagtail 8.1 and later require separate verification before support is declared.
95
+
83
96
  Guest comments require configured SMTP and the scheduled worker. Registered
84
97
  users can comment without an email address, but receive no mail. Your site
85
98
  provides login and registration. No required external CDN or CAPTCHA service.
86
99
 
100
+ ### Languages
101
+
102
+ Alongside English and Russian, 0.2.0 includes German (`de`), French (`fr`),
103
+ Spanish (`es`) and Brazilian Portuguese (`pt-br`) for the public UI,
104
+ moderation/settings and all notification emails.
105
+ The host site selects the active Django language; queued emails retain the
106
+ recipient's saved language. User comments and rejection reasons are not translated.
107
+ Documentation remains in English and Russian.
108
+ [Language configuration →](docs/wiki/Configuration.md#languages)
109
+
87
110
  ## Quick start
88
111
 
89
112
  ### 1. Install
@@ -91,16 +114,22 @@ provides login and registration. No required external CDN or CAPTCHA service.
91
114
  In your site's virtual environment, install the release:
92
115
 
93
116
  ```sh
94
- python -m pip install commentail==0.1.0
117
+ python -m pip install commentail==0.2.0
95
118
  ```
96
119
 
97
- For the optional PostgreSQL driver, use `python -m pip install 'commentail[postgres]==0.1.0'`.
98
- You can also install a downloaded wheel directly, or extract the source distribution
99
- and run `python -m pip install .` in its root.
120
+ For the optional PostgreSQL driver, use
121
+ `python -m pip install 'commentail[postgres]==0.2.0'`.
122
+ You can also extract the source distribution and run `python -m pip install .` in its root.
123
+ When upgrading from 0.1.1, review the
124
+ [upgrade notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.2.0.md),
125
+ including migration `0014_reading_indexes` and email overrides. For older
126
+ installations, also review the [0.1.1 notes](docs/releases/0.1.1.md). The 0.1.0 package retains
127
+ its original Wagtail 7.4 and Django 5.2 limits.
100
128
 
101
129
  ### 2. Connect Django and Wagtail
102
130
 
103
131
  - Add `commentail` and `wagtail.contrib.settings` to your existing `INSTALLED_APPS`.
132
+ - With PostgreSQL, also include `django.contrib.postgres` (required by Django 6.x checks).
104
133
  - Insert `commentail.middleware.CapabilityHeadersMiddleware` before CSRF middleware.
105
134
  - Retain the host session/authentication/messages middleware and template request context processor.
106
135
  - Include Commentail URLs **before** Wagtail's catch-all:
@@ -127,8 +156,28 @@ The template controls where Page comments are available; the corresponding Page
127
156
  editor receives a Comments tab. Configure site defaults, then inherit or override
128
157
  on individual Pages. **Review all** is the initial moderation policy.
129
158
 
159
+ ### Recent comments elsewhere
160
+
161
+ Use the recent-comments tag on a home page, sidebar or another template:
162
+
163
+ ```django
164
+ {% load commentail_tags %}
165
+ {% commentail_recent limit=5 as recent_comments %}
166
+ {% for comment in recent_comments %}
167
+ <a href="{{ comment.url }}">{{ comment.author_name }}: {{ comment.text|truncatechars:120 }}</a>
168
+ {% endfor %}
169
+ ```
170
+
171
+ Use `page=page` for one Page and `include_replies=False` for roots only. The list
172
+ respects the current visitor's access and Site, requires a request context and
173
+ must not be shared-cached. It needs no widget CSS or JavaScript.
174
+ [Fields, filters and caching →](docs/wiki/Recent-comments.md)
175
+
130
176
  ### 4. Enable email and cleanup
131
177
 
178
+ Version 0.2.0 includes minimal HTML emails with the site name, clear action
179
+ links and equivalent plain text. Existing host email overrides take precedence.
180
+
132
181
  Configure Django's SMTP settings and schedule this once per minute:
133
182
 
134
183
  ```sh
@@ -169,22 +218,23 @@ cover the same topics. Start with the task you need:
169
218
  | Reader behavior | [Guests](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Guest-comments.md) · [Replies and editing](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Replies-and-editing.md) |
170
219
  | Customize | [CSS and themes](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Styling.md) · [Templates and email](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Templates.md) · [Python callbacks](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Callbacks.md) · [Django model adapters](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Object-adapters.md) |
171
220
  | Operate | [SMTP and worker](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Email-and-worker.md) · [Deployment](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Deployment.md) · [Security and privacy](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Security-and-privacy.md) |
172
- | Diagnose | [Troubleshooting / FAQ](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Troubleshooting.md) · [Example and testing](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Example-and-testing.md) |
221
+ | Diagnose | [Troubleshooting / FAQ](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Troubleshooting.md) · [Example and testing](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Example-and-testing.md) · [Performance and load checks](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Performance.md) |
173
222
 
174
223
  ## Release scope and verification
175
224
 
176
- [0.1.0 release notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.1.0.md) describe the initial feature set and
177
- limits. The source distribution includes the runnable Wagtail example, tests and
225
+ [0.2.0 Beta release notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.2.0.md) describe the changes and upgrade steps;
226
+ [0.1.0 release notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.1.0.md) preserve the initial release contract.
227
+ The source distribution includes the runnable Wagtail example, tests and
178
228
  guides; the wheel includes the runtime, translations, templates and static assets.
179
229
 
180
- CI checks six Python/database combinations, JavaScript, lint, migration drift,
230
+ The CI workflow defines 30 framework/Python/database combinations, JavaScript, lint, migration drift,
181
231
  translations and source/wheel installation. Browser checks covered installed Safari,
182
232
  Chrome, Yandex Browser and Firefox with and without JS, plus selected VoiceOver
183
233
  scenarios and a phone. Previous major browser versions remain unverified; this is
184
234
  not an exhaustive accessibility or device certification.
185
235
 
186
236
  There is no separate REST API, rich-text editor, uploads, likes, reports or live
187
- updates in 0.1.0. SMTP retries can duplicate mail after an uncertain delivery result.
237
+ updates in 0.2.0. SMTP retries can duplicate mail after an uncertain delivery result.
188
238
  Host-specific themes, access rules and email delivery need their own acceptance checks.
189
239
 
190
240
  ## Support Commentail
@@ -7,6 +7,9 @@
7
7
  Moderated discussions, verified guests and inline replies — styled by your site.
8
8
 
9
9
  [![Tests and distributions](https://github.com/hardcodd/Commentail/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/hardcodd/Commentail/actions/workflows/tests.yml)
10
+ [![Django Packages · Commentail](https://img.shields.io/badge/Django%20Packages-Commentail-0C4B33.svg)](https://djangopackages.org/packages/p/commentail/)
11
+
12
+ English · [Русский](README.ru.md)
10
13
 
11
14
  [Get started](#quick-start) · [Documentation](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Home.md) · [Wiki](https://github.com/hardcodd/Commentail/wiki) · [Support](#support-commentail)
12
15
 
@@ -14,7 +17,7 @@ Moderated discussions, verified guests and inline replies — styled by your sit
14
17
 
15
18
  </div>
16
19
 
17
- Commentail is a Django comments library built for **Wagtail 7.4 LTS**. Add a
20
+ Commentail is a Django comments library for **Wagtail 7.4 LTS and 8.0**. Add a
18
21
  Django template tag to an article, moderate discussions inside Wagtail, and keep
19
22
  content, accounts and email delivery in your own application.
20
23
 
@@ -22,7 +25,10 @@ The widget inherits your site's typography and colors. CSS custom properties,
22
25
  replaceable templates and Python callbacks let you adapt it without a frontend
23
26
  framework or an external comments platform.
24
27
 
25
- > Wagtail 8.0 is not supported by 0.1.0.
28
+ > **0.2.0 Beta** adds recent comments, six languages,
29
+ > HTML emails and indexed database reads.
30
+ > [Version-to-version changelog](https://github.com/hardcodd/Commentail/blob/main/CHANGELOG.md) · [Roadmap](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Roadmap.md).
31
+ > [Changes and upgrade notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.2.0.md).
26
32
 
27
33
  ## Why Commentail?
28
34
 
@@ -47,17 +53,32 @@ the visible text and author name. Choose either format or disable output in Pyth
47
53
  | Component | Version / requirement |
48
54
  | --- | --- |
49
55
  | Python | 3.12–3.14 |
50
- | Wagtail | >=7.4.3, <7.5 |
51
- | Django | >=5.2, <5.3 |
52
- | Database | SQLite or PostgreSQL; CI covers PostgreSQL 14 |
53
- | UI languages | English and Russian |
56
+ | Wagtail / Django | 7.4.3+ in 7.4 / Django 5.2 or 6.0; 8.0.x / Django 5.2, 6.0 or 6.1 |
57
+ | Database | File SQLite or PostgreSQL 16 |
58
+ | UI and email languages | English, Russian, German, French, Spanish and Brazilian Portuguese |
54
59
  | Frontend | Django templates, optional progressive JavaScript |
55
60
  | License | [MIT](https://github.com/hardcodd/Commentail/blob/main/LICENSE) |
56
61
 
62
+ This table describes the 0.2.0 Beta release. CI defines all five framework
63
+ pairs on Python 3.12, 3.13 and 3.14 with both databases (30 combinations).
64
+ Package bounds are `Wagtail>=7.4.3,<8.1` and `Django>=5.2,<6.2`; only the pairs
65
+ listed above are supported. Wagtail 7.4 with Django 6.1 is outside this matrix.
66
+ Wagtail 8.1 and later require separate verification before support is declared.
67
+
57
68
  Guest comments require configured SMTP and the scheduled worker. Registered
58
69
  users can comment without an email address, but receive no mail. Your site
59
70
  provides login and registration. No required external CDN or CAPTCHA service.
60
71
 
72
+ ### Languages
73
+
74
+ Alongside English and Russian, 0.2.0 includes German (`de`), French (`fr`),
75
+ Spanish (`es`) and Brazilian Portuguese (`pt-br`) for the public UI,
76
+ moderation/settings and all notification emails.
77
+ The host site selects the active Django language; queued emails retain the
78
+ recipient's saved language. User comments and rejection reasons are not translated.
79
+ Documentation remains in English and Russian.
80
+ [Language configuration →](docs/wiki/Configuration.md#languages)
81
+
61
82
  ## Quick start
62
83
 
63
84
  ### 1. Install
@@ -65,16 +86,22 @@ provides login and registration. No required external CDN or CAPTCHA service.
65
86
  In your site's virtual environment, install the release:
66
87
 
67
88
  ```sh
68
- python -m pip install commentail==0.1.0
89
+ python -m pip install commentail==0.2.0
69
90
  ```
70
91
 
71
- For the optional PostgreSQL driver, use `python -m pip install 'commentail[postgres]==0.1.0'`.
72
- You can also install a downloaded wheel directly, or extract the source distribution
73
- and run `python -m pip install .` in its root.
92
+ For the optional PostgreSQL driver, use
93
+ `python -m pip install 'commentail[postgres]==0.2.0'`.
94
+ You can also extract the source distribution and run `python -m pip install .` in its root.
95
+ When upgrading from 0.1.1, review the
96
+ [upgrade notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.2.0.md),
97
+ including migration `0014_reading_indexes` and email overrides. For older
98
+ installations, also review the [0.1.1 notes](docs/releases/0.1.1.md). The 0.1.0 package retains
99
+ its original Wagtail 7.4 and Django 5.2 limits.
74
100
 
75
101
  ### 2. Connect Django and Wagtail
76
102
 
77
103
  - Add `commentail` and `wagtail.contrib.settings` to your existing `INSTALLED_APPS`.
104
+ - With PostgreSQL, also include `django.contrib.postgres` (required by Django 6.x checks).
78
105
  - Insert `commentail.middleware.CapabilityHeadersMiddleware` before CSRF middleware.
79
106
  - Retain the host session/authentication/messages middleware and template request context processor.
80
107
  - Include Commentail URLs **before** Wagtail's catch-all:
@@ -101,8 +128,28 @@ The template controls where Page comments are available; the corresponding Page
101
128
  editor receives a Comments tab. Configure site defaults, then inherit or override
102
129
  on individual Pages. **Review all** is the initial moderation policy.
103
130
 
131
+ ### Recent comments elsewhere
132
+
133
+ Use the recent-comments tag on a home page, sidebar or another template:
134
+
135
+ ```django
136
+ {% load commentail_tags %}
137
+ {% commentail_recent limit=5 as recent_comments %}
138
+ {% for comment in recent_comments %}
139
+ <a href="{{ comment.url }}">{{ comment.author_name }}: {{ comment.text|truncatechars:120 }}</a>
140
+ {% endfor %}
141
+ ```
142
+
143
+ Use `page=page` for one Page and `include_replies=False` for roots only. The list
144
+ respects the current visitor's access and Site, requires a request context and
145
+ must not be shared-cached. It needs no widget CSS or JavaScript.
146
+ [Fields, filters and caching →](docs/wiki/Recent-comments.md)
147
+
104
148
  ### 4. Enable email and cleanup
105
149
 
150
+ Version 0.2.0 includes minimal HTML emails with the site name, clear action
151
+ links and equivalent plain text. Existing host email overrides take precedence.
152
+
106
153
  Configure Django's SMTP settings and schedule this once per minute:
107
154
 
108
155
  ```sh
@@ -143,22 +190,23 @@ cover the same topics. Start with the task you need:
143
190
  | Reader behavior | [Guests](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Guest-comments.md) · [Replies and editing](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Replies-and-editing.md) |
144
191
  | Customize | [CSS and themes](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Styling.md) · [Templates and email](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Templates.md) · [Python callbacks](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Callbacks.md) · [Django model adapters](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Object-adapters.md) |
145
192
  | Operate | [SMTP and worker](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Email-and-worker.md) · [Deployment](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Deployment.md) · [Security and privacy](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Security-and-privacy.md) |
146
- | Diagnose | [Troubleshooting / FAQ](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Troubleshooting.md) · [Example and testing](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Example-and-testing.md) |
193
+ | Diagnose | [Troubleshooting / FAQ](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Troubleshooting.md) · [Example and testing](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Example-and-testing.md) · [Performance and load checks](https://github.com/hardcodd/Commentail/blob/main/docs/wiki/Performance.md) |
147
194
 
148
195
  ## Release scope and verification
149
196
 
150
- [0.1.0 release notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.1.0.md) describe the initial feature set and
151
- limits. The source distribution includes the runnable Wagtail example, tests and
197
+ [0.2.0 Beta release notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.2.0.md) describe the changes and upgrade steps;
198
+ [0.1.0 release notes](https://github.com/hardcodd/Commentail/blob/main/docs/releases/0.1.0.md) preserve the initial release contract.
199
+ The source distribution includes the runnable Wagtail example, tests and
152
200
  guides; the wheel includes the runtime, translations, templates and static assets.
153
201
 
154
- CI checks six Python/database combinations, JavaScript, lint, migration drift,
202
+ The CI workflow defines 30 framework/Python/database combinations, JavaScript, lint, migration drift,
155
203
  translations and source/wheel installation. Browser checks covered installed Safari,
156
204
  Chrome, Yandex Browser and Firefox with and without JS, plus selected VoiceOver
157
205
  scenarios and a phone. Previous major browser versions remain unverified; this is
158
206
  not an exhaustive accessibility or device certification.
159
207
 
160
208
  There is no separate REST API, rich-text editor, uploads, likes, reports or live
161
- updates in 0.1.0. SMTP retries can duplicate mail after an uncertain delivery result.
209
+ updates in 0.2.0. SMTP retries can duplicate mail after an uncertain delivery result.
162
210
  Host-specific themes, access rules and email delivery need their own acceptance checks.
163
211
 
164
212
  ## Support Commentail