wulver 0.1.0a8__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 (396) hide show
  1. wulver-0.1.0a8/.env.example +70 -0
  2. wulver-0.1.0a8/LICENSE +21 -0
  3. wulver-0.1.0a8/MANIFEST.in +10 -0
  4. wulver-0.1.0a8/PKG-INFO +126 -0
  5. wulver-0.1.0a8/README.md +88 -0
  6. wulver-0.1.0a8/apps/__init__.py +0 -0
  7. wulver-0.1.0a8/apps/ai_assistant/__init__.py +0 -0
  8. wulver-0.1.0a8/apps/ai_assistant/admin.py +564 -0
  9. wulver-0.1.0a8/apps/ai_assistant/apps.py +8 -0
  10. wulver-0.1.0a8/apps/ai_assistant/chunks.json +148 -0
  11. wulver-0.1.0a8/apps/ai_assistant/management/__init__.py +0 -0
  12. wulver-0.1.0a8/apps/ai_assistant/management/commands/__init__.py +0 -0
  13. wulver-0.1.0a8/apps/ai_assistant/management/commands/build_embeddings.py +59 -0
  14. wulver-0.1.0a8/apps/ai_assistant/management/commands/prune_ai_data.py +21 -0
  15. wulver-0.1.0a8/apps/ai_assistant/migrations/0001_initial.py +141 -0
  16. wulver-0.1.0a8/apps/ai_assistant/migrations/0002_assistantprofile_allow_anonymous_users_and_more.py +176 -0
  17. wulver-0.1.0a8/apps/ai_assistant/migrations/0003_assistantprofile_demo_mode.py +22 -0
  18. wulver-0.1.0a8/apps/ai_assistant/migrations/__init__.py +0 -0
  19. wulver-0.1.0a8/apps/ai_assistant/models.py +326 -0
  20. wulver-0.1.0a8/apps/ai_assistant/security.py +119 -0
  21. wulver-0.1.0a8/apps/ai_assistant/services/chat.py +415 -0
  22. wulver-0.1.0a8/apps/ai_assistant/services/embeddings.py +25 -0
  23. wulver-0.1.0a8/apps/ai_assistant/services/providers/__init__.py +8 -0
  24. wulver-0.1.0a8/apps/ai_assistant/services/providers/base.py +14 -0
  25. wulver-0.1.0a8/apps/ai_assistant/services/providers/openai_provider.py +45 -0
  26. wulver-0.1.0a8/apps/ai_assistant/services/retention.py +22 -0
  27. wulver-0.1.0a8/apps/ai_assistant/services/retrieval.py +36 -0
  28. wulver-0.1.0a8/apps/ai_assistant/templates/admin/ai_assistant/knowledgechunk/change_list.html +16 -0
  29. wulver-0.1.0a8/apps/ai_assistant/templates/admin/ai_assistant/knowledgechunk/import_json.html +13 -0
  30. wulver-0.1.0a8/apps/ai_assistant/templates/includes/ai_chat_widget.html +308 -0
  31. wulver-0.1.0a8/apps/ai_assistant/templatetags/__init__.py +0 -0
  32. wulver-0.1.0a8/apps/ai_assistant/templatetags/ai_assistant_ui.py +11 -0
  33. wulver-0.1.0a8/apps/ai_assistant/tests.py +354 -0
  34. wulver-0.1.0a8/apps/ai_assistant/urls.py +10 -0
  35. wulver-0.1.0a8/apps/ai_assistant/views.py +113 -0
  36. wulver-0.1.0a8/apps/analytics_manager/__init__.py +1 -0
  37. wulver-0.1.0a8/apps/analytics_manager/admin.py +124 -0
  38. wulver-0.1.0a8/apps/analytics_manager/apps.py +9 -0
  39. wulver-0.1.0a8/apps/analytics_manager/dashboard.py +82 -0
  40. wulver-0.1.0a8/apps/analytics_manager/management/__init__.py +1 -0
  41. wulver-0.1.0a8/apps/analytics_manager/management/commands/__init__.py +1 -0
  42. wulver-0.1.0a8/apps/analytics_manager/management/commands/cleanup_analytics.py +25 -0
  43. wulver-0.1.0a8/apps/analytics_manager/middleware.py +203 -0
  44. wulver-0.1.0a8/apps/analytics_manager/migrations/0001_initial.py +93 -0
  45. wulver-0.1.0a8/apps/analytics_manager/migrations/0002_create_default_analyticssettings.py +20 -0
  46. wulver-0.1.0a8/apps/analytics_manager/migrations/0003_exclude_health_endpoint.py +42 -0
  47. wulver-0.1.0a8/apps/analytics_manager/migrations/0004_analyticssettings_collection_mode.py +28 -0
  48. wulver-0.1.0a8/apps/analytics_manager/migrations/0005_dailysitestat_exclude_browser_assets.py +85 -0
  49. wulver-0.1.0a8/apps/analytics_manager/migrations/__init__.py +1 -0
  50. wulver-0.1.0a8/apps/analytics_manager/models.py +201 -0
  51. wulver-0.1.0a8/apps/backup_manager/__init__.py +1 -0
  52. wulver-0.1.0a8/apps/backup_manager/admin.py +353 -0
  53. wulver-0.1.0a8/apps/backup_manager/apps.py +8 -0
  54. wulver-0.1.0a8/apps/backup_manager/forms.py +94 -0
  55. wulver-0.1.0a8/apps/backup_manager/management/__init__.py +0 -0
  56. wulver-0.1.0a8/apps/backup_manager/management/commands/__init__.py +0 -0
  57. wulver-0.1.0a8/apps/backup_manager/management/commands/create_full_backup.py +31 -0
  58. wulver-0.1.0a8/apps/backup_manager/management/commands/restore_full_backup.py +31 -0
  59. wulver-0.1.0a8/apps/backup_manager/migrations/0001_initial.py +53 -0
  60. wulver-0.1.0a8/apps/backup_manager/migrations/0002_backupsnapshot_storage_root.py +17 -0
  61. wulver-0.1.0a8/apps/backup_manager/migrations/0003_create_default_backupsettings.py +19 -0
  62. wulver-0.1.0a8/apps/backup_manager/migrations/__init__.py +0 -0
  63. wulver-0.1.0a8/apps/backup_manager/models.py +183 -0
  64. wulver-0.1.0a8/apps/backup_manager/services/__init__.py +15 -0
  65. wulver-0.1.0a8/apps/backup_manager/services/archive.py +559 -0
  66. wulver-0.1.0a8/apps/backup_manager/services/database.py +319 -0
  67. wulver-0.1.0a8/apps/backup_manager/services/jobs.py +78 -0
  68. wulver-0.1.0a8/apps/backup_manager/services/paths.py +117 -0
  69. wulver-0.1.0a8/apps/backup_manager/templates/admin/backup_manager/backupsnapshot/change_list.html +22 -0
  70. wulver-0.1.0a8/apps/backup_manager/templates/admin/backup_manager/backupsnapshot/create_backup.html +3 -0
  71. wulver-0.1.0a8/apps/backup_manager/templates/admin/backup_manager/backupsnapshot/form_page.html +29 -0
  72. wulver-0.1.0a8/apps/backup_manager/templates/admin/backup_manager/backupsnapshot/restore_backup.html +3 -0
  73. wulver-0.1.0a8/apps/backup_manager/templates/admin/backup_manager/backupsnapshot/verify_backup.html +3 -0
  74. wulver-0.1.0a8/apps/backup_manager/tests.py +317 -0
  75. wulver-0.1.0a8/apps/blog_manager/__init__.py +0 -0
  76. wulver-0.1.0a8/apps/blog_manager/admin.py +1581 -0
  77. wulver-0.1.0a8/apps/blog_manager/apps.py +8 -0
  78. wulver-0.1.0a8/apps/blog_manager/article_preview.py +115 -0
  79. wulver-0.1.0a8/apps/blog_manager/context_processors.py +22 -0
  80. wulver-0.1.0a8/apps/blog_manager/image_module_forms.py +77 -0
  81. wulver-0.1.0a8/apps/blog_manager/image_module_storage.py +213 -0
  82. wulver-0.1.0a8/apps/blog_manager/migrations/0001_initial.py +185 -0
  83. wulver-0.1.0a8/apps/blog_manager/migrations/0002_initial.py +77 -0
  84. wulver-0.1.0a8/apps/blog_manager/migrations/0003_seed_defaults.py +55 -0
  85. wulver-0.1.0a8/apps/blog_manager/migrations/0004_articleimage.py +69 -0
  86. wulver-0.1.0a8/apps/blog_manager/migrations/0005_remove_articleimage_caption.py +14 -0
  87. wulver-0.1.0a8/apps/blog_manager/migrations/0006_alter_imagemodule_manifest_and_more.py +24 -0
  88. wulver-0.1.0a8/apps/blog_manager/migrations/0007_article_keywords_en_article_keywords_uk_and_more.py +73 -0
  89. wulver-0.1.0a8/apps/blog_manager/migrations/0008_alter_article_canonical_allowed_params_and_more.py +32 -0
  90. wulver-0.1.0a8/apps/blog_manager/migrations/0009_latestarticlesmodule_tags.py +24 -0
  91. wulver-0.1.0a8/apps/blog_manager/migrations/0010_latestarticlesmodule_authors.py +20 -0
  92. wulver-0.1.0a8/apps/blog_manager/migrations/0011_article_seo_title_article_seo_title_en_and_more.py +43 -0
  93. wulver-0.1.0a8/apps/blog_manager/migrations/__init__.py +0 -0
  94. wulver-0.1.0a8/apps/blog_manager/mixins.py +148 -0
  95. wulver-0.1.0a8/apps/blog_manager/models.py +648 -0
  96. wulver-0.1.0a8/apps/blog_manager/signals.py +12 -0
  97. wulver-0.1.0a8/apps/blog_manager/static/blog_manager/css/image-module-admin.css +130 -0
  98. wulver-0.1.0a8/apps/blog_manager/static/blog_manager/js/image-module-admin.js +136 -0
  99. wulver-0.1.0a8/apps/blog_manager/templates/admin/blog_manager/category/change_list.html +6 -0
  100. wulver-0.1.0a8/apps/blog_manager/templatetags/__init__.py +1 -0
  101. wulver-0.1.0a8/apps/blog_manager/templatetags/blog_categories.py +24 -0
  102. wulver-0.1.0a8/apps/blog_manager/templatetags/blog_modules.py +164 -0
  103. wulver-0.1.0a8/apps/blog_manager/templatetags/image_modules.py +32 -0
  104. wulver-0.1.0a8/apps/blog_manager/test_article_images.py +141 -0
  105. wulver-0.1.0a8/apps/blog_manager/test_image_modules.py +220 -0
  106. wulver-0.1.0a8/apps/blog_manager/test_multilingual.py +79 -0
  107. wulver-0.1.0a8/apps/blog_manager/tests.py +1067 -0
  108. wulver-0.1.0a8/apps/blog_manager/translation.py +36 -0
  109. wulver-0.1.0a8/apps/blog_manager/urls.py +10 -0
  110. wulver-0.1.0a8/apps/blog_manager/views.py +198 -0
  111. wulver-0.1.0a8/apps/comments_manager/__init__.py +0 -0
  112. wulver-0.1.0a8/apps/comments_manager/admin.py +214 -0
  113. wulver-0.1.0a8/apps/comments_manager/apps.py +11 -0
  114. wulver-0.1.0a8/apps/comments_manager/defaults.py +101 -0
  115. wulver-0.1.0a8/apps/comments_manager/migrations/0001_initial.py +55 -0
  116. wulver-0.1.0a8/apps/comments_manager/migrations/0002_seed_defaults.py +40 -0
  117. wulver-0.1.0a8/apps/comments_manager/migrations/0003_commentsettings_allow_anonymous_comments_and_more.py +34 -0
  118. wulver-0.1.0a8/apps/comments_manager/migrations/0004_latestcommentsmodule.py +34 -0
  119. wulver-0.1.0a8/apps/comments_manager/migrations/__init__.py +0 -0
  120. wulver-0.1.0a8/apps/comments_manager/models.py +112 -0
  121. wulver-0.1.0a8/apps/comments_manager/signals.py +33 -0
  122. wulver-0.1.0a8/apps/comments_manager/templates/admin/comments_manager/commentsettings/change_form.html +14 -0
  123. wulver-0.1.0a8/apps/comments_manager/templates/admin/comments_manager/commenttemplate/change_form.html +5 -0
  124. wulver-0.1.0a8/apps/comments_manager/templates/comments/comment.html +1 -0
  125. wulver-0.1.0a8/apps/comments_manager/templates/comments/form.html +1 -0
  126. wulver-0.1.0a8/apps/comments_manager/templates/comments/list.html +1 -0
  127. wulver-0.1.0a8/apps/comments_manager/templatetags/__init__.py +0 -0
  128. wulver-0.1.0a8/apps/comments_manager/templatetags/comment_modules.py +54 -0
  129. wulver-0.1.0a8/apps/comments_manager/templatetags/comment_ui.py +24 -0
  130. wulver-0.1.0a8/apps/comments_manager/test_modules.py +53 -0
  131. wulver-0.1.0a8/apps/comments_manager/tests.py +143 -0
  132. wulver-0.1.0a8/apps/comments_manager/translation.py +14 -0
  133. wulver-0.1.0a8/apps/comments_manager/views.py +14 -0
  134. wulver-0.1.0a8/apps/core_manager/__init__.py +0 -0
  135. wulver-0.1.0a8/apps/core_manager/admin.py +565 -0
  136. wulver-0.1.0a8/apps/core_manager/admin_help.py +778 -0
  137. wulver-0.1.0a8/apps/core_manager/admin_links.py +118 -0
  138. wulver-0.1.0a8/apps/core_manager/admin_mixins.py +22 -0
  139. wulver-0.1.0a8/apps/core_manager/apps.py +14 -0
  140. wulver-0.1.0a8/apps/core_manager/context_processors.py +10 -0
  141. wulver-0.1.0a8/apps/core_manager/dashboard_health.py +237 -0
  142. wulver-0.1.0a8/apps/core_manager/defaults/__init__.py +0 -0
  143. wulver-0.1.0a8/apps/core_manager/defaults/comments.py +7 -0
  144. wulver-0.1.0a8/apps/core_manager/environment_dashboard.py +423 -0
  145. wulver-0.1.0a8/apps/core_manager/environment_runtime.py +68 -0
  146. wulver-0.1.0a8/apps/core_manager/forms.py +68 -0
  147. wulver-0.1.0a8/apps/core_manager/image_processing.py +162 -0
  148. wulver-0.1.0a8/apps/core_manager/locale/uk/LC_MESSAGES/django.mo +0 -0
  149. wulver-0.1.0a8/apps/core_manager/locale/uk/LC_MESSAGES/django.po +323 -0
  150. wulver-0.1.0a8/apps/core_manager/management/__init__.py +0 -0
  151. wulver-0.1.0a8/apps/core_manager/management/commands/__init__.py +0 -0
  152. wulver-0.1.0a8/apps/core_manager/management/commands/wulver_bootstrap.py +54 -0
  153. wulver-0.1.0a8/apps/core_manager/management/commands/wulver_export_story.py +88 -0
  154. wulver-0.1.0a8/apps/core_manager/management/commands/wulver_install_demo.py +107 -0
  155. wulver-0.1.0a8/apps/core_manager/middleware.py +80 -0
  156. wulver-0.1.0a8/apps/core_manager/migrations/0001_initial.py +160 -0
  157. wulver-0.1.0a8/apps/core_manager/migrations/0002_seed_defaults.py +17 -0
  158. wulver-0.1.0a8/apps/core_manager/migrations/0003_sitesettings_search_template.py +20 -0
  159. wulver-0.1.0a8/apps/core_manager/migrations/0004_page_keywords_en_page_keywords_uk_and_more.py +164 -0
  160. wulver-0.1.0a8/apps/core_manager/migrations/0005_urlredirect.py +34 -0
  161. wulver-0.1.0a8/apps/core_manager/migrations/0006_sitesettings_contact_message_max_length_and_more.py +58 -0
  162. wulver-0.1.0a8/apps/core_manager/migrations/0007_sitemapsettings.py +38 -0
  163. wulver-0.1.0a8/apps/core_manager/migrations/0008_alter_sitesettings_canonical_allowed_params.py +24 -0
  164. wulver-0.1.0a8/apps/core_manager/migrations/0009_create_default_sitemapsettings.py +19 -0
  165. wulver-0.1.0a8/apps/core_manager/migrations/0010_remove_sitesettings_latest_articles_count.py +17 -0
  166. wulver-0.1.0a8/apps/core_manager/migrations/0011_page_seo_title_page_seo_title_en_page_seo_title_uk.py +28 -0
  167. wulver-0.1.0a8/apps/core_manager/migrations/0012_dashboardreadstate.py +28 -0
  168. wulver-0.1.0a8/apps/core_manager/migrations/__init__.py +0 -0
  169. wulver-0.1.0a8/apps/core_manager/models.py +557 -0
  170. wulver-0.1.0a8/apps/core_manager/redirect_signals.py +113 -0
  171. wulver-0.1.0a8/apps/core_manager/redirects.py +41 -0
  172. wulver-0.1.0a8/apps/core_manager/security.py +38 -0
  173. wulver-0.1.0a8/apps/core_manager/seo.py +559 -0
  174. wulver-0.1.0a8/apps/core_manager/services/__init__.py +1 -0
  175. wulver-0.1.0a8/apps/core_manager/services/reviews/__init__.py +3 -0
  176. wulver-0.1.0a8/apps/core_manager/services/reviews/base.py +71 -0
  177. wulver-0.1.0a8/apps/core_manager/services/reviews/github.py +146 -0
  178. wulver-0.1.0a8/apps/core_manager/services/reviews/manual.py +47 -0
  179. wulver-0.1.0a8/apps/core_manager/services/reviews/service.py +108 -0
  180. wulver-0.1.0a8/apps/core_manager/services/reviews/tests.py +117 -0
  181. wulver-0.1.0a8/apps/core_manager/sitemap_signals.py +30 -0
  182. wulver-0.1.0a8/apps/core_manager/sitemaps.py +330 -0
  183. wulver-0.1.0a8/apps/core_manager/static/core_manager/css/admin-help.css +217 -0
  184. wulver-0.1.0a8/apps/core_manager/static/core_manager/js/admin-help.js +44 -0
  185. wulver-0.1.0a8/apps/core_manager/templates/admin/core_manager/environment_index.html +288 -0
  186. wulver-0.1.0a8/apps/core_manager/templates/admin/core_manager/sitemapsettings/change_form.html +24 -0
  187. wulver-0.1.0a8/apps/core_manager/templates/admin/help/button.html +12 -0
  188. wulver-0.1.0a8/apps/core_manager/templates/admin/help/change_form.html +30 -0
  189. wulver-0.1.0a8/apps/core_manager/templates/admin/help/change_list.html +21 -0
  190. wulver-0.1.0a8/apps/core_manager/templates/admin/help/dialog.html +46 -0
  191. wulver-0.1.0a8/apps/core_manager/templates/admin/shared/tree_sortable.html +38 -0
  192. wulver-0.1.0a8/apps/core_manager/templates/admin/shared/tree_sortable_button.html +8 -0
  193. wulver-0.1.0a8/apps/core_manager/templates/admin/shared/tree_sortable_nodes.html +13 -0
  194. wulver-0.1.0a8/apps/core_manager/templates/unfold/helpers/history.html +41 -0
  195. wulver-0.1.0a8/apps/core_manager/templates/unfold/helpers/language_switch.html +21 -0
  196. wulver-0.1.0a8/apps/core_manager/templates/unfold/helpers/tab_actions.html +30 -0
  197. wulver-0.1.0a8/apps/core_manager/templates/unfold/helpers/userlinks.html +15 -0
  198. wulver-0.1.0a8/apps/core_manager/templatetags/__init__.py +0 -0
  199. wulver-0.1.0a8/apps/core_manager/templatetags/admin_help.py +19 -0
  200. wulver-0.1.0a8/apps/core_manager/templatetags/admin_language.py +66 -0
  201. wulver-0.1.0a8/apps/core_manager/templatetags/site_language.py +20 -0
  202. wulver-0.1.0a8/apps/core_manager/test_admin_help.py +82 -0
  203. wulver-0.1.0a8/apps/core_manager/test_admin_language.py +60 -0
  204. wulver-0.1.0a8/apps/core_manager/test_bootstrap.py +22 -0
  205. wulver-0.1.0a8/apps/core_manager/test_dashboard_health.py +96 -0
  206. wulver-0.1.0a8/apps/core_manager/test_environment_dashboard.py +171 -0
  207. wulver-0.1.0a8/apps/core_manager/test_environment_runtime.py +38 -0
  208. wulver-0.1.0a8/apps/core_manager/test_redirects.py +173 -0
  209. wulver-0.1.0a8/apps/core_manager/test_singleton_admin.py +57 -0
  210. wulver-0.1.0a8/apps/core_manager/test_sitemaps.py +287 -0
  211. wulver-0.1.0a8/apps/core_manager/test_template_layout.py +31 -0
  212. wulver-0.1.0a8/apps/core_manager/test_tree_sorting.py +101 -0
  213. wulver-0.1.0a8/apps/core_manager/tests.py +852 -0
  214. wulver-0.1.0a8/apps/core_manager/translation.py +34 -0
  215. wulver-0.1.0a8/apps/core_manager/tree_sorting.py +120 -0
  216. wulver-0.1.0a8/apps/core_manager/urls.py +15 -0
  217. wulver-0.1.0a8/apps/core_manager/views.py +629 -0
  218. wulver-0.1.0a8/apps/theme_manager/__init__.py +0 -0
  219. wulver-0.1.0a8/apps/theme_manager/admin.py +3080 -0
  220. wulver-0.1.0a8/apps/theme_manager/ai_image_generator.py +289 -0
  221. wulver-0.1.0a8/apps/theme_manager/apps.py +8 -0
  222. wulver-0.1.0a8/apps/theme_manager/asset_browser.py +255 -0
  223. wulver-0.1.0a8/apps/theme_manager/css_class_scanner.py +128 -0
  224. wulver-0.1.0a8/apps/theme_manager/defaults/__init__.py +1 -0
  225. wulver-0.1.0a8/apps/theme_manager/defaults/template_components.py +522 -0
  226. wulver-0.1.0a8/apps/theme_manager/forms/__init__.py +0 -0
  227. wulver-0.1.0a8/apps/theme_manager/forms/theme_django_upload.py +0 -0
  228. wulver-0.1.0a8/apps/theme_manager/forms/theme_html_upload.py +18 -0
  229. wulver-0.1.0a8/apps/theme_manager/locale/uk/LC_MESSAGES/django.mo +0 -0
  230. wulver-0.1.0a8/apps/theme_manager/locale/uk/LC_MESSAGES/django.po +362 -0
  231. wulver-0.1.0a8/apps/theme_manager/management/__init__.py +1 -0
  232. wulver-0.1.0a8/apps/theme_manager/management/commands/__init__.py +1 -0
  233. wulver-0.1.0a8/apps/theme_manager/management/commands/sync_template_components.py +18 -0
  234. wulver-0.1.0a8/apps/theme_manager/management/commands/wulver_init.py +88 -0
  235. wulver-0.1.0a8/apps/theme_manager/migrations/0001_initial.py +101 -0
  236. wulver-0.1.0a8/apps/theme_manager/migrations/0002_seed_default_components.py +27 -0
  237. wulver-0.1.0a8/apps/theme_manager/migrations/0003_seed_article_navigation_components.py +84 -0
  238. wulver-0.1.0a8/apps/theme_manager/migrations/0004_update_images_component.py +27 -0
  239. wulver-0.1.0a8/apps/theme_manager/migrations/0005_alter_theme_templates_map.py +18 -0
  240. wulver-0.1.0a8/apps/theme_manager/migrations/0006_themetemplate_css_classes.py +15 -0
  241. wulver-0.1.0a8/apps/theme_manager/migrations/0007_normalize_tag_component_search_links.py +30 -0
  242. wulver-0.1.0a8/apps/theme_manager/migrations/0008_update_pagination_component.py +62 -0
  243. wulver-0.1.0a8/apps/theme_manager/migrations/__init__.py +0 -0
  244. wulver-0.1.0a8/apps/theme_manager/models.py +238 -0
  245. wulver-0.1.0a8/apps/theme_manager/services/__init__.py +1 -0
  246. wulver-0.1.0a8/apps/theme_manager/services/template_components.py +34 -0
  247. wulver-0.1.0a8/apps/theme_manager/signals.py +45 -0
  248. wulver-0.1.0a8/apps/theme_manager/template_formatter.py +203 -0
  249. wulver-0.1.0a8/apps/theme_manager/template_load_analyzer.py +431 -0
  250. wulver-0.1.0a8/apps/theme_manager/template_versions.py +95 -0
  251. wulver-0.1.0a8/apps/theme_manager/templates/admin/theme_manager/theme/change_list.html +23 -0
  252. wulver-0.1.0a8/apps/theme_manager/templates/admin/theme_manager/theme/upload_html_template.html +22 -0
  253. wulver-0.1.0a8/apps/theme_manager/templates/theme_manager/template_file_view.html +134 -0
  254. wulver-0.1.0a8/apps/theme_manager/templatetags/__init__.py +1 -0
  255. wulver-0.1.0a8/apps/theme_manager/templatetags/pagination.py +16 -0
  256. wulver-0.1.0a8/apps/theme_manager/test_ai_image_generator.py +374 -0
  257. wulver-0.1.0a8/apps/theme_manager/test_asset_browser.py +234 -0
  258. wulver-0.1.0a8/apps/theme_manager/test_pagination.py +25 -0
  259. wulver-0.1.0a8/apps/theme_manager/test_template_formatter.py +95 -0
  260. wulver-0.1.0a8/apps/theme_manager/test_template_versions.py +240 -0
  261. wulver-0.1.0a8/apps/theme_manager/tests.py +1229 -0
  262. wulver-0.1.0a8/apps/theme_manager/urls.py +9 -0
  263. wulver-0.1.0a8/apps/theme_manager/views.py +11 -0
  264. wulver-0.1.0a8/apps/userprofile/__init__.py +0 -0
  265. wulver-0.1.0a8/apps/userprofile/admin.py +414 -0
  266. wulver-0.1.0a8/apps/userprofile/apps.py +19 -0
  267. wulver-0.1.0a8/apps/userprofile/context_processors.py +3 -0
  268. wulver-0.1.0a8/apps/userprofile/defaults/__init__.py +0 -0
  269. wulver-0.1.0a8/apps/userprofile/defaults/authentication_emails.py +88 -0
  270. wulver-0.1.0a8/apps/userprofile/defaults/authentication_templates.py +41 -0
  271. wulver-0.1.0a8/apps/userprofile/defaults/personal_account.py +83 -0
  272. wulver-0.1.0a8/apps/userprofile/email_backend.py +16 -0
  273. wulver-0.1.0a8/apps/userprofile/migrations/0001_initial.py +94 -0
  274. wulver-0.1.0a8/apps/userprofile/migrations/0002_seed_defaults.py +88 -0
  275. wulver-0.1.0a8/apps/userprofile/migrations/0003_personal_account_template.py +86 -0
  276. wulver-0.1.0a8/apps/userprofile/migrations/0004_authentication_templates.py +100 -0
  277. wulver-0.1.0a8/apps/userprofile/migrations/0005_alter_userprofile_options_alter_userprofile_avatar_and_more.py +40 -0
  278. wulver-0.1.0a8/apps/userprofile/migrations/__init__.py +0 -0
  279. wulver-0.1.0a8/apps/userprofile/mixins.py +64 -0
  280. wulver-0.1.0a8/apps/userprofile/models.py +241 -0
  281. wulver-0.1.0a8/apps/userprofile/signals.py +9 -0
  282. wulver-0.1.0a8/apps/userprofile/template_loader.py +33 -0
  283. wulver-0.1.0a8/apps/userprofile/templates/account/_auth_layout.html +29 -0
  284. wulver-0.1.0a8/apps/userprofile/templates/account/account_inactive.html +5 -0
  285. wulver-0.1.0a8/apps/userprofile/templates/account/email/account_already_exists_message.txt +1 -0
  286. wulver-0.1.0a8/apps/userprofile/templates/account/email/account_already_exists_subject.txt +1 -0
  287. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_changed_message.txt +1 -0
  288. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_changed_subject.txt +1 -0
  289. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_confirm_message.txt +1 -0
  290. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_confirm_subject.txt +1 -0
  291. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_confirmation_message.txt +1 -0
  292. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_confirmation_signup_message.txt +1 -0
  293. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_confirmation_signup_subject.txt +1 -0
  294. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_confirmation_subject.txt +1 -0
  295. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_deleted_message.txt +1 -0
  296. wulver-0.1.0a8/apps/userprofile/templates/account/email/email_deleted_subject.txt +1 -0
  297. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_changed_message.txt +1 -0
  298. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_changed_subject.txt +1 -0
  299. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_reset_key_message.txt +1 -0
  300. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_reset_key_subject.txt +1 -0
  301. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_reset_message.txt +1 -0
  302. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_reset_subject.txt +1 -0
  303. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_set_message.txt +1 -0
  304. wulver-0.1.0a8/apps/userprofile/templates/account/email/password_set_subject.txt +1 -0
  305. wulver-0.1.0a8/apps/userprofile/templates/account/email/unknown_account_message.txt +1 -0
  306. wulver-0.1.0a8/apps/userprofile/templates/account/email/unknown_account_subject.txt +1 -0
  307. wulver-0.1.0a8/apps/userprofile/templates/account/email.html +83 -0
  308. wulver-0.1.0a8/apps/userprofile/templates/account/email_confirm.html +28 -0
  309. wulver-0.1.0a8/apps/userprofile/templates/account/login.html +112 -0
  310. wulver-0.1.0a8/apps/userprofile/templates/account/logout.html +7 -0
  311. wulver-0.1.0a8/apps/userprofile/templates/account/password_change.html +8 -0
  312. wulver-0.1.0a8/apps/userprofile/templates/account/password_reset.html +59 -0
  313. wulver-0.1.0a8/apps/userprofile/templates/account/password_reset_done.html +30 -0
  314. wulver-0.1.0a8/apps/userprofile/templates/account/password_reset_form.html +73 -0
  315. wulver-0.1.0a8/apps/userprofile/templates/account/password_reset_from_key.html +91 -0
  316. wulver-0.1.0a8/apps/userprofile/templates/account/password_reset_from_key_done.html +25 -0
  317. wulver-0.1.0a8/apps/userprofile/templates/account/password_set.html +7 -0
  318. wulver-0.1.0a8/apps/userprofile/templates/account/reauthenticate.html +7 -0
  319. wulver-0.1.0a8/apps/userprofile/templates/account/signup.html +133 -0
  320. wulver-0.1.0a8/apps/userprofile/templates/account/signup_closed.html +6 -0
  321. wulver-0.1.0a8/apps/userprofile/templates/account/verification_sent.html +25 -0
  322. wulver-0.1.0a8/apps/userprofile/templates/account/verified_email_required.html +6 -0
  323. wulver-0.1.0a8/apps/userprofile/templates/admin/userprofile/authenticationemailtemplate/change_form.html +19 -0
  324. wulver-0.1.0a8/apps/userprofile/templates/admin/userprofile/authenticationtemplate/change_form.html +19 -0
  325. wulver-0.1.0a8/apps/userprofile/templates/admin/userprofile/personalaccounttemplate/change_form.html +19 -0
  326. wulver-0.1.0a8/apps/userprofile/templates/socialaccount/authentication_error.html +6 -0
  327. wulver-0.1.0a8/apps/userprofile/templates/socialaccount/connections.html +12 -0
  328. wulver-0.1.0a8/apps/userprofile/templates/socialaccount/login.html +6 -0
  329. wulver-0.1.0a8/apps/userprofile/templates/socialaccount/login_cancelled.html +6 -0
  330. wulver-0.1.0a8/apps/userprofile/templates/socialaccount/login_redirect.html +7 -0
  331. wulver-0.1.0a8/apps/userprofile/templates/socialaccount/signup.html +7 -0
  332. wulver-0.1.0a8/apps/userprofile/templatetags/__init__.py +0 -0
  333. wulver-0.1.0a8/apps/userprofile/templatetags/authentication_controls.py +20 -0
  334. wulver-0.1.0a8/apps/userprofile/templatetags/authentication_texts.py +48 -0
  335. wulver-0.1.0a8/apps/userprofile/tests.py +522 -0
  336. wulver-0.1.0a8/apps/userprofile/translation.py +11 -0
  337. wulver-0.1.0a8/apps/userprofile/views.py +37 -0
  338. wulver-0.1.0a8/config/__init__.py +0 -0
  339. wulver-0.1.0a8/config/asgi.py +16 -0
  340. wulver-0.1.0a8/config/settings.py +749 -0
  341. wulver-0.1.0a8/config/urls.py +91 -0
  342. wulver-0.1.0a8/config/wsgi.py +16 -0
  343. wulver-0.1.0a8/locale/uk/LC_MESSAGES/django.mo +0 -0
  344. wulver-0.1.0a8/locale/uk/LC_MESSAGES/django.po +5232 -0
  345. wulver-0.1.0a8/locale/uk/LC_MESSAGES/djangojs.mo +0 -0
  346. wulver-0.1.0a8/locale/uk/LC_MESSAGES/djangojs.po +445 -0
  347. wulver-0.1.0a8/packaging-requirements.txt +22 -0
  348. wulver-0.1.0a8/pyproject.toml +40 -0
  349. wulver-0.1.0a8/setup.cfg +4 -0
  350. wulver-0.1.0a8/static/admin/css/action-toolbar.css +76 -0
  351. wulver-0.1.0a8/static/admin/css/cms-link-browser.css +67 -0
  352. wulver-0.1.0a8/static/admin/js/cms-link-browser.js +269 -0
  353. wulver-0.1.0a8/static/admin/js/modal-scroll-lock.js +133 -0
  354. wulver-0.1.0a8/static/admin/js/save-and-continue-scroll.js +166 -0
  355. wulver-0.1.0a8/static/admin_tree_sorting/tree-sortable.css +222 -0
  356. wulver-0.1.0a8/static/admin_tree_sorting/tree-sortable.js +140 -0
  357. wulver-0.1.0a8/static/blog_manager/css/article-body-editor.css +172 -0
  358. wulver-0.1.0a8/static/blog_manager/css/article-content-images.css +293 -0
  359. wulver-0.1.0a8/static/blog_manager/css/article-extra-fields.css +64 -0
  360. wulver-0.1.0a8/static/blog_manager/js/article-body-editor.js +833 -0
  361. wulver-0.1.0a8/static/blog_manager/js/article-content-images.js +282 -0
  362. wulver-0.1.0a8/static/blog_manager/js/article-extra-fields.js +313 -0
  363. wulver-0.1.0a8/static/comments_manager/js/comment-css-editor.js +15 -0
  364. wulver-0.1.0a8/static/comments_manager/js/comment-template-html-editor.js +47 -0
  365. wulver-0.1.0a8/static/comments_manager/js/comments.js +68 -0
  366. wulver-0.1.0a8/static/images/favicon.webp +0 -0
  367. wulver-0.1.0a8/static/images/login.jpg +0 -0
  368. wulver-0.1.0a8/static/images/logo.webp +0 -0
  369. wulver-0.1.0a8/static/images/logo_m.webp +0 -0
  370. wulver-0.1.0a8/static/theme_manager/css/authentication-css-editor.css +30 -0
  371. wulver-0.1.0a8/static/theme_manager/css/main.css +1675 -0
  372. wulver-0.1.0a8/static/theme_manager/css/template-html-code-layout.css +102 -0
  373. wulver-0.1.0a8/static/theme_manager/js/article-extra-fields-schema.js +108 -0
  374. wulver-0.1.0a8/static/theme_manager/js/authentication-css-editor.js +29 -0
  375. wulver-0.1.0a8/static/theme_manager/js/template-html-code.js +3583 -0
  376. wulver-0.1.0a8/static/theme_manager/js/theme-template-page-fields.js +29 -0
  377. wulver-0.1.0a8/static/userprofile/css/authentication.css +104 -0
  378. wulver-0.1.0a8/static/userprofile/js/authentication-template-editor.js +26 -0
  379. wulver-0.1.0a8/static/userprofile/js/personal-account-template-editor.js +27 -0
  380. wulver-0.1.0a8/static/vendor/jquery-ui/jquery-ui.min.js +6 -0
  381. wulver-0.1.0a8/static/vendor/sortablejs/Sortable.min.js +2 -0
  382. wulver-0.1.0a8/templates/sitemap.xml +17 -0
  383. wulver-0.1.0a8/templates/sitemap.xsl +67 -0
  384. wulver-0.1.0a8/templates/sitemap_index.xml +12 -0
  385. wulver-0.1.0a8/wulver/__init__.py +3 -0
  386. wulver-0.1.0a8/wulver/build.py +49 -0
  387. wulver-0.1.0a8/wulver/cli.py +171 -0
  388. wulver-0.1.0a8/wulver/paths.py +5 -0
  389. wulver-0.1.0a8/wulver/resources/demo/story.zip +0 -0
  390. wulver-0.1.0a8/wulver/test_languages.py +27 -0
  391. wulver-0.1.0a8/wulver.egg-info/PKG-INFO +126 -0
  392. wulver-0.1.0a8/wulver.egg-info/SOURCES.txt +394 -0
  393. wulver-0.1.0a8/wulver.egg-info/dependency_links.txt +1 -0
  394. wulver-0.1.0a8/wulver.egg-info/entry_points.txt +2 -0
  395. wulver-0.1.0a8/wulver.egg-info/requires.txt +22 -0
  396. wulver-0.1.0a8/wulver.egg-info/top_level.txt +2 -0
@@ -0,0 +1,70 @@
1
+ # Copy this file to .env and choose one of the two profiles below.
2
+ # Never commit the real .env file.
3
+
4
+ # -----------------------------------------------------------------------------
5
+ # Local development (HTTP)
6
+ # -----------------------------------------------------------------------------
7
+ DEBUG=True
8
+ SECRET_KEY=
9
+ ALLOWED_HOSTS=127.0.0.1,localhost
10
+ CSRF_TRUSTED_ORIGINS=http://127.0.0.1:8000,http://localhost:8000
11
+ SERVE_MEDIA_LOCALLY=True
12
+ SECURE_SSL_REDIRECT=False
13
+ SESSION_COOKIE_SECURE=False
14
+ CSRF_COOKIE_SECURE=False
15
+ SECURE_HSTS_SECONDS=0
16
+ SECURE_HSTS_INCLUDE_SUBDOMAINS=False
17
+ SECURE_HSTS_PRELOAD=False
18
+ TRUST_X_FORWARDED_PROTO=False
19
+ AI_ASSISTANT_TRUST_X_FORWARDED_FOR=False
20
+ TRUST_X_FORWARDED_FOR=False
21
+ ACCOUNT_DEFAULT_HTTP_PROTOCOL=http
22
+ CSP_ENABLED=True
23
+ CSP_REPORT_ONLY=False
24
+
25
+ # -----------------------------------------------------------------------------
26
+ # Production example (HTTPS)
27
+ # Uncomment/replace these values when deploying.
28
+ # Generate SECRET_KEY with:
29
+ # python -c "from django.core.management.utils import get_random_secret_key; print(get_random_secret_key())"
30
+ # -----------------------------------------------------------------------------
31
+ # DEBUG=False
32
+ # SECRET_KEY=replace-with-a-unique-random-secret
33
+ # ALLOWED_HOSTS=example.com,www.example.com
34
+ # CSRF_TRUSTED_ORIGINS=https://example.com,https://www.example.com
35
+ # SERVE_MEDIA_LOCALLY=False
36
+ # SECURE_SSL_REDIRECT=True
37
+ # SESSION_COOKIE_SECURE=True
38
+ # CSRF_COOKIE_SECURE=True
39
+ # SECURE_HSTS_SECONDS=31536000
40
+ # SECURE_HSTS_INCLUDE_SUBDOMAINS=False
41
+ # SECURE_HSTS_PRELOAD=False
42
+ # TRUST_X_FORWARDED_PROTO=True
43
+ # AI_ASSISTANT_TRUST_X_FORWARDED_FOR=True
44
+ # TRUST_X_FORWARDED_FOR=True
45
+ # ACCOUNT_DEFAULT_HTTP_PROTOCOL=https
46
+ # CSP_ENABLED=True
47
+ # CSP_REPORT_ONLY=False
48
+
49
+ # Optional full override. Keep this on one line. Test custom themes in
50
+ # report-only mode before enforcing a stricter policy.
51
+ # CSP_POLICY=default-src 'self'; script-src 'self' 'unsafe-inline' https:; style-src 'self' 'unsafe-inline' https:; img-src 'self' data: blob: https:; font-src 'self' data: https:; connect-src 'self' https:; frame-src 'self' https://maps.google.com https://www.google.com; object-src 'none'; base-uri 'self'; frame-ancestors 'self'; form-action 'self'; upgrade-insecure-requests
52
+
53
+ # Set TRUST_X_FORWARDED_PROTO=True only behind a trusted HTTPS reverse proxy
54
+ # Set AI_ASSISTANT_TRUST_X_FORWARDED_FOR=True only when that proxy overwrites X-Forwarded-For
55
+ # Set TRUST_X_FORWARDED_FOR=True under the same condition for public CMS forms.
56
+ # that sets X-Forwarded-Proto correctly (for example, Nginx or a hosting proxy).
57
+
58
+ EMAIL_HOST=smtp.gmail.com
59
+ EMAIL_PORT=587
60
+ EMAIL_USE_TLS=True
61
+ EMAIL_HOST_USER=
62
+ EMAIL_HOST_PASSWORD=
63
+ EMAIL_BACKEND=django.core.mail.backends.console.EmailBackend
64
+ DEFAULT_FROM_EMAIL=noreply@example.com
65
+
66
+ GOOGLE_CLIENT_ID=
67
+ GOOGLE_CLIENT_SECRET=
68
+ OPENAI_API_KEY=
69
+ ARTICLE_API_TOKEN=
70
+ GITHUB_TOKEN=
wulver-0.1.0a8/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Volodymyr Katyushyn
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,10 @@
1
+ include packaging-requirements.txt
2
+ include .env.example
3
+ include wulver/resources/demo/story.zip
4
+ recursive-include config *.py
5
+ recursive-include static *.css *.js *.svg *.png *.jpg *.jpeg *.avif *.gif *.webp *.ico *.woff *.woff2 *.ttf *.map
6
+ prune static/themes
7
+ recursive-include locale *.po *.mo
8
+ recursive-include templates *.xml *.xsl
9
+ prune templates/story
10
+ global-exclude .DS_Store *.pyc
@@ -0,0 +1,126 @@
1
+ Metadata-Version: 2.4
2
+ Name: wulver
3
+ Version: 0.1.0a8
4
+ Summary: A Django CMS with a configurable template manager
5
+ License-Expression: MIT
6
+ Project-URL: Homepage, https://github.com/Katyushyn/Wulver
7
+ Project-URL: Repository, https://github.com/Katyushyn/Wulver
8
+ Project-URL: Issues, https://github.com/Katyushyn/Wulver/issues
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Framework :: Django
11
+ Classifier: Programming Language :: Python :: 3
12
+ Requires-Python: >=3.12
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ Requires-Dist: Django==6.1
16
+ Requires-Dist: django-allauth[socialaccount]==65.18.0
17
+ Requires-Dist: django-colorfield==0.14.0
18
+ Requires-Dist: django-contrib-comments==2.2.0
19
+ Requires-Dist: django-environ==0.13.0
20
+ Requires-Dist: django-modeltranslation==0.20.3
21
+ Requires-Dist: django-rosetta==0.10.3
22
+ Requires-Dist: django-unfold==0.97.0
23
+ Requires-Dist: django_compressor==4.6.0
24
+ Requires-Dist: easy-thumbnails==2.10.1
25
+ Requires-Dist: whitenoise==6.12.0
26
+ Requires-Dist: beautifulsoup4==4.15.0
27
+ Requires-Dist: lxml==6.1.1
28
+ Requires-Dist: pillow==12.2.0
29
+ Requires-Dist: pillow-avif-plugin==1.5.5
30
+ Requires-Dist: openai==2.41.1
31
+ Requires-Dist: requests==2.34.2
32
+ Requires-Dist: certifi==2026.5.20
33
+ Requires-Dist: pyzipper==0.3.6
34
+ Requires-Dist: Unidecode==1.4.0
35
+ Requires-Dist: polib==1.2.0
36
+ Requires-Dist: tiktoken==0.13.0
37
+ Dynamic: license-file
38
+
39
+ # Wulver
40
+
41
+ Wulver is a multilingual Django CMS focused on fast, maintainable corporate
42
+ websites. It combines structured content, editable themes and templates, SEO
43
+ controls, user accounts, comments, backups, and an extensible module model in
44
+ one administration interface.
45
+
46
+ > **Status:** pre-release. The repository is being prepared for its first
47
+ > public release. Interfaces, migrations, and installation steps may change.
48
+
49
+ ## Current capabilities
50
+
51
+ - multilingual pages, blog categories, articles, and tags;
52
+ - database-managed themes, templates, and reusable template components;
53
+ - SEO metadata, Schema.org data, canonical rules, redirects, robots, and sitemap;
54
+ - image processing and article media;
55
+ - authentication, profiles, comments, contact messages, and subscriptions;
56
+ - encrypted full-site backup and restore;
57
+ - optional AI-assisted administration features;
58
+ - Django Unfold administration and Rosetta translation management.
59
+
60
+ ## Install a new site
61
+
62
+ Use Python 3.12 or newer (Python 3.14 is recommended). In a new directory:
63
+
64
+ ```bash
65
+ python3.14 -m venv .venv
66
+ source .venv/bin/activate
67
+ python -m pip install --pre wulver
68
+ wulver init site
69
+ cd site
70
+ python manage.py runserver
71
+ ```
72
+
73
+ The installer asks for languages, whether to install the complete Story demo,
74
+ and administrator credentials. Both choices start with local-development
75
+ settings. Review the generated `.env` and administration dashboard before
76
+ production deployment. This is an alpha release, not a production-readiness guarantee.
77
+
78
+ ## Develop from source
79
+
80
+ Requirements: Python 3.14 and the system libraries required by Pillow and the
81
+ database driver you choose.
82
+
83
+ ```bash
84
+ python3.14 -m venv .venv
85
+ source .venv/bin/activate
86
+ python -m pip install -r requirements.txt
87
+ cp .env.example .env
88
+ python manage.py migrate
89
+ python manage.py createsuperuser
90
+ python manage.py runserver
91
+ ```
92
+
93
+ For a clean starter database, the Wulver initialization command can generate
94
+ migrations, apply them, and synchronize built-in template components:
95
+
96
+ ```bash
97
+ python manage.py wulver_init
98
+ ```
99
+
100
+ Never commit `.env`, a local database, uploaded media, generated static files,
101
+ or backup archives. The supplied `.gitignore` excludes these runtime files.
102
+
103
+ ## Production
104
+
105
+ The Django development server is not suitable for production. Deploy behind a
106
+ production WSGI/ASGI server and reverse proxy, set every security-related value
107
+ in `.env`, collect static files, and test backup restoration before launch.
108
+
109
+ Detailed installation, deployment, theme, and module documentation is planned
110
+ before the first stable release; see [the release roadmap](docs/release-roadmap.md).
111
+
112
+ ## Contributing and security
113
+
114
+ See [CONTRIBUTING.md](CONTRIBUTING.md) before opening a change. Report security
115
+ issues privately as described in [SECURITY.md](SECURITY.md).
116
+
117
+ ## License
118
+
119
+ Original Wulver code is licensed under the [MIT License](LICENSE).
120
+ It may be used, modified, and redistributed free of charge, including for
121
+ commercial projects, subject to preserving the copyright and license notice.
122
+
123
+ The MIT license does not relicense third-party materials. The Story theme by
124
+ BootstrapMade is redistributed with the author's permission and retains its
125
+ own terms and credits. Bundled libraries, fonts, images, and other third-party
126
+ assets retain their respective licenses and notices.
@@ -0,0 +1,88 @@
1
+ # Wulver
2
+
3
+ Wulver is a multilingual Django CMS focused on fast, maintainable corporate
4
+ websites. It combines structured content, editable themes and templates, SEO
5
+ controls, user accounts, comments, backups, and an extensible module model in
6
+ one administration interface.
7
+
8
+ > **Status:** pre-release. The repository is being prepared for its first
9
+ > public release. Interfaces, migrations, and installation steps may change.
10
+
11
+ ## Current capabilities
12
+
13
+ - multilingual pages, blog categories, articles, and tags;
14
+ - database-managed themes, templates, and reusable template components;
15
+ - SEO metadata, Schema.org data, canonical rules, redirects, robots, and sitemap;
16
+ - image processing and article media;
17
+ - authentication, profiles, comments, contact messages, and subscriptions;
18
+ - encrypted full-site backup and restore;
19
+ - optional AI-assisted administration features;
20
+ - Django Unfold administration and Rosetta translation management.
21
+
22
+ ## Install a new site
23
+
24
+ Use Python 3.12 or newer (Python 3.14 is recommended). In a new directory:
25
+
26
+ ```bash
27
+ python3.14 -m venv .venv
28
+ source .venv/bin/activate
29
+ python -m pip install --pre wulver
30
+ wulver init site
31
+ cd site
32
+ python manage.py runserver
33
+ ```
34
+
35
+ The installer asks for languages, whether to install the complete Story demo,
36
+ and administrator credentials. Both choices start with local-development
37
+ settings. Review the generated `.env` and administration dashboard before
38
+ production deployment. This is an alpha release, not a production-readiness guarantee.
39
+
40
+ ## Develop from source
41
+
42
+ Requirements: Python 3.14 and the system libraries required by Pillow and the
43
+ database driver you choose.
44
+
45
+ ```bash
46
+ python3.14 -m venv .venv
47
+ source .venv/bin/activate
48
+ python -m pip install -r requirements.txt
49
+ cp .env.example .env
50
+ python manage.py migrate
51
+ python manage.py createsuperuser
52
+ python manage.py runserver
53
+ ```
54
+
55
+ For a clean starter database, the Wulver initialization command can generate
56
+ migrations, apply them, and synchronize built-in template components:
57
+
58
+ ```bash
59
+ python manage.py wulver_init
60
+ ```
61
+
62
+ Never commit `.env`, a local database, uploaded media, generated static files,
63
+ or backup archives. The supplied `.gitignore` excludes these runtime files.
64
+
65
+ ## Production
66
+
67
+ The Django development server is not suitable for production. Deploy behind a
68
+ production WSGI/ASGI server and reverse proxy, set every security-related value
69
+ in `.env`, collect static files, and test backup restoration before launch.
70
+
71
+ Detailed installation, deployment, theme, and module documentation is planned
72
+ before the first stable release; see [the release roadmap](docs/release-roadmap.md).
73
+
74
+ ## Contributing and security
75
+
76
+ See [CONTRIBUTING.md](CONTRIBUTING.md) before opening a change. Report security
77
+ issues privately as described in [SECURITY.md](SECURITY.md).
78
+
79
+ ## License
80
+
81
+ Original Wulver code is licensed under the [MIT License](LICENSE).
82
+ It may be used, modified, and redistributed free of charge, including for
83
+ commercial projects, subject to preserving the copyright and license notice.
84
+
85
+ The MIT license does not relicense third-party materials. The Story theme by
86
+ BootstrapMade is redistributed with the author's permission and retains its
87
+ own terms and credits. Bundled libraries, fonts, images, and other third-party
88
+ assets retain their respective licenses and notices.
File without changes
File without changes