codex-django 0.2.5__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 (360) hide show
  1. codex_django-0.2.5/.djlintrc +6 -0
  2. codex_django-0.2.5/.github/workflows/ci.yml +111 -0
  3. codex_django-0.2.5/.github/workflows/docs.yml +73 -0
  4. codex_django-0.2.5/.github/workflows/publish.yml +42 -0
  5. codex_django-0.2.5/.gitignore +91 -0
  6. codex_django-0.2.5/.pre-commit-config.yaml +37 -0
  7. codex_django-0.2.5/.python-version +1 -0
  8. codex_django-0.2.5/CHANGELOG.md +64 -0
  9. codex_django-0.2.5/CLAUDE.md +133 -0
  10. codex_django-0.2.5/PKG-INFO +189 -0
  11. codex_django-0.2.5/README.md +119 -0
  12. codex_django-0.2.5/docs/changelog.md +11 -0
  13. codex_django-0.2.5/docs/dev/cheatsheet_libraries.md +48 -0
  14. codex_django-0.2.5/docs/dev/pypi_alpha_release.md +66 -0
  15. codex_django-0.2.5/docs/en/README.md +28 -0
  16. codex_django-0.2.5/docs/en/api/README.md +26 -0
  17. codex_django-0.2.5/docs/en/api/booking.md +28 -0
  18. codex_django-0.2.5/docs/en/api/cabinet.md +31 -0
  19. codex_django-0.2.5/docs/en/api/cli.md +18 -0
  20. codex_django-0.2.5/docs/en/api/core.md +22 -0
  21. codex_django-0.2.5/docs/en/api/internal/booking.md +37 -0
  22. codex_django-0.2.5/docs/en/api/internal/cabinet.md +45 -0
  23. codex_django-0.2.5/docs/en/api/internal/cli.md +19 -0
  24. codex_django-0.2.5/docs/en/api/internal/core.md +53 -0
  25. codex_django-0.2.5/docs/en/api/internal/notifications.md +25 -0
  26. codex_django-0.2.5/docs/en/api/internal/system.md +41 -0
  27. codex_django-0.2.5/docs/en/api/notifications.md +29 -0
  28. codex_django-0.2.5/docs/en/api/system.md +19 -0
  29. codex_django-0.2.5/docs/en/architecture/README.md +17 -0
  30. codex_django-0.2.5/docs/en/architecture/booking.md +149 -0
  31. codex_django-0.2.5/docs/en/architecture/cabinet.md +180 -0
  32. codex_django-0.2.5/docs/en/architecture/cli/README.md +19 -0
  33. codex_django-0.2.5/docs/en/architecture/cli/blueprints.md +12 -0
  34. codex_django-0.2.5/docs/en/architecture/cli/commands.md +7 -0
  35. codex_django-0.2.5/docs/en/architecture/cli/engine.md +7 -0
  36. codex_django-0.2.5/docs/en/architecture/cli/entrypoints.md +12 -0
  37. codex_django-0.2.5/docs/en/architecture/cli/module.md +17 -0
  38. codex_django-0.2.5/docs/en/architecture/cli/project-output.md +7 -0
  39. codex_django-0.2.5/docs/en/architecture/core.md +120 -0
  40. codex_django-0.2.5/docs/en/architecture/notifications.md +125 -0
  41. codex_django-0.2.5/docs/en/architecture/showcase.md +120 -0
  42. codex_django-0.2.5/docs/en/architecture/system.md +148 -0
  43. codex_django-0.2.5/docs/en/getting-started.md +67 -0
  44. codex_django-0.2.5/docs/en/guides/blueprints-and-scaffolding.md +43 -0
  45. codex_django-0.2.5/docs/en/guides/booking.md +43 -0
  46. codex_django-0.2.5/docs/en/guides/cabinet.md +37 -0
  47. codex_django-0.2.5/docs/en/guides/installation-modes.md +64 -0
  48. codex_django-0.2.5/docs/en/guides/notifications.md +38 -0
  49. codex_django-0.2.5/docs/en/guides/project-structure.md +45 -0
  50. codex_django-0.2.5/docs/en/guides/runtime-vs-cli.md +54 -0
  51. codex_django-0.2.5/docs/en/guides/system.md +34 -0
  52. codex_django-0.2.5/docs/index.md +126 -0
  53. codex_django-0.2.5/docs/javascripts/mermaid.js +16 -0
  54. codex_django-0.2.5/docs/ru/README.md +28 -0
  55. codex_django-0.2.5/docs/ru/architecture/README.md +17 -0
  56. codex_django-0.2.5/docs/ru/architecture/booking.md +149 -0
  57. codex_django-0.2.5/docs/ru/architecture/cabinet.md +180 -0
  58. codex_django-0.2.5/docs/ru/architecture/cli/README.md +19 -0
  59. codex_django-0.2.5/docs/ru/architecture/cli/blueprints.md +12 -0
  60. codex_django-0.2.5/docs/ru/architecture/cli/commands.md +7 -0
  61. codex_django-0.2.5/docs/ru/architecture/cli/engine.md +7 -0
  62. codex_django-0.2.5/docs/ru/architecture/cli/entrypoints.md +12 -0
  63. codex_django-0.2.5/docs/ru/architecture/cli/module.md +17 -0
  64. codex_django-0.2.5/docs/ru/architecture/cli/project-output.md +7 -0
  65. codex_django-0.2.5/docs/ru/architecture/core.md +120 -0
  66. codex_django-0.2.5/docs/ru/architecture/notifications.md +125 -0
  67. codex_django-0.2.5/docs/ru/architecture/showcase.md +120 -0
  68. codex_django-0.2.5/docs/ru/architecture/system.md +148 -0
  69. codex_django-0.2.5/docs/ru/getting-started.md +67 -0
  70. codex_django-0.2.5/docs/ru/guides/blueprints-and-scaffolding.md +43 -0
  71. codex_django-0.2.5/docs/ru/guides/booking.md +41 -0
  72. codex_django-0.2.5/docs/ru/guides/cabinet.md +37 -0
  73. codex_django-0.2.5/docs/ru/guides/installation-modes.md +64 -0
  74. codex_django-0.2.5/docs/ru/guides/notifications.md +38 -0
  75. codex_django-0.2.5/docs/ru/guides/project-structure.md +44 -0
  76. codex_django-0.2.5/docs/ru/guides/runtime-vs-cli.md +54 -0
  77. codex_django-0.2.5/docs/ru/guides/system.md +34 -0
  78. codex_django-0.2.5/docs/stylesheets/extra.css +78 -0
  79. codex_django-0.2.5/mkdocs.yml +126 -0
  80. codex_django-0.2.5/pyproject.toml +142 -0
  81. codex_django-0.2.5/src/codex_django/__init__.py +1 -0
  82. codex_django-0.2.5/src/codex_django/apps.py +6 -0
  83. codex_django-0.2.5/src/codex_django/booking/__init__.py +48 -0
  84. codex_django-0.2.5/src/codex_django/booking/adapters/__init__.py +13 -0
  85. codex_django-0.2.5/src/codex_django/booking/adapters/availability.py +424 -0
  86. codex_django-0.2.5/src/codex_django/booking/adapters/cache.py +39 -0
  87. codex_django-0.2.5/src/codex_django/booking/mixins/__init__.py +63 -0
  88. codex_django-0.2.5/src/codex_django/booking/mixins/appointment.py +114 -0
  89. codex_django-0.2.5/src/codex_django/booking/mixins/master.py +154 -0
  90. codex_django-0.2.5/src/codex_django/booking/mixins/schedule.py +106 -0
  91. codex_django-0.2.5/src/codex_django/booking/mixins/service.py +109 -0
  92. codex_django-0.2.5/src/codex_django/booking/mixins/settings.py +140 -0
  93. codex_django-0.2.5/src/codex_django/booking/selectors.py +367 -0
  94. codex_django-0.2.5/src/codex_django/cabinet/__init__.py +28 -0
  95. codex_django-0.2.5/src/codex_django/cabinet/apps.py +18 -0
  96. codex_django-0.2.5/src/codex_django/cabinet/context_processors.py +61 -0
  97. codex_django-0.2.5/src/codex_django/cabinet/migrations/0001_initial.py +44 -0
  98. codex_django-0.2.5/src/codex_django/cabinet/migrations/__init__.py +0 -0
  99. codex_django-0.2.5/src/codex_django/cabinet/models/__init__.py +11 -0
  100. codex_django-0.2.5/src/codex_django/cabinet/models/mixins.py +57 -0
  101. codex_django-0.2.5/src/codex_django/cabinet/models/settings.py +86 -0
  102. codex_django-0.2.5/src/codex_django/cabinet/redis/__init__.py +1 -0
  103. codex_django-0.2.5/src/codex_django/cabinet/redis/managers/__init__.py +6 -0
  104. codex_django-0.2.5/src/codex_django/cabinet/redis/managers/dashboard.py +125 -0
  105. codex_django-0.2.5/src/codex_django/cabinet/redis/managers/settings.py +62 -0
  106. codex_django-0.2.5/src/codex_django/cabinet/registry.py +129 -0
  107. codex_django-0.2.5/src/codex_django/cabinet/selector/__init__.py +5 -0
  108. codex_django-0.2.5/src/codex_django/cabinet/selector/dashboard.py +178 -0
  109. codex_django-0.2.5/src/codex_django/cabinet/static/cabinet/css/codex_cabinet.css +351 -0
  110. codex_django-0.2.5/src/codex_django/cabinet/static/cabinet/css/fonts/bootstrap-icons.woff +0 -0
  111. codex_django-0.2.5/src/codex_django/cabinet/static/cabinet/css/fonts/bootstrap-icons.woff2 +0 -0
  112. codex_django-0.2.5/src/codex_django/cabinet/static/cabinet/js/app/cabinet.js +37 -0
  113. codex_django-0.2.5/src/codex_django/cabinet/static/cabinet/js/vendor/alpine.min.js +5 -0
  114. codex_django-0.2.5/src/codex_django/cabinet/static/cabinet/js/vendor/bootstrap.bundle.min.js +7 -0
  115. codex_django-0.2.5/src/codex_django/cabinet/static/cabinet/js/vendor/htmx.min.js +9 -0
  116. codex_django-0.2.5/src/codex_django/cabinet/templates/account/login.html +52 -0
  117. codex_django-0.2.5/src/codex_django/cabinet/templates/account/logout.html +31 -0
  118. codex_django-0.2.5/src/codex_django/cabinet/templates/account/password_reset.html +56 -0
  119. codex_django-0.2.5/src/codex_django/cabinet/templates/account/password_reset_done.html +29 -0
  120. codex_django-0.2.5/src/codex_django/cabinet/templates/account/password_reset_from_key.html +62 -0
  121. codex_django-0.2.5/src/codex_django/cabinet/templates/account/password_reset_from_key_done.html +29 -0
  122. codex_django-0.2.5/src/codex_django/cabinet/templates/account/signup.html +58 -0
  123. codex_django-0.2.5/src/codex_django/cabinet/templates/account/verification_sent.html +29 -0
  124. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/base_auth.html +26 -0
  125. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/base_cabinet.html +75 -0
  126. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/base_client.html +111 -0
  127. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/base_htmx.html +14 -0
  128. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/dashboard/index.html +135 -0
  129. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_avatar.html +1 -0
  130. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_empty_state.html +8 -0
  131. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_export_modal.html +34 -0
  132. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_head.html +8 -0
  133. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_modal_base.html +5 -0
  134. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_nav_item.html +9 -0
  135. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_page_header.html +12 -0
  136. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_report_filters.html +64 -0
  137. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_sidebar.html +34 -0
  138. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_sidebar_client.html +35 -0
  139. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_sidebar_staff.html +26 -0
  140. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_status_badge.html +1 -0
  141. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_topbar.html +111 -0
  142. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/includes/_topbar_shortcut.html +6 -0
  143. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/index.html +116 -0
  144. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/partials/_contact.html +83 -0
  145. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/partials/_email.html +83 -0
  146. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/partials/_geo.html +54 -0
  147. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/partials/_legal.html +76 -0
  148. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/partials/_marketing.html +67 -0
  149. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/partials/_social.html +107 -0
  150. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/site_settings/partials/_technical.html +79 -0
  151. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/widgets/chart.html +33 -0
  152. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/widgets/donut.html +14 -0
  153. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/widgets/kpi.html +23 -0
  154. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/widgets/list.html +45 -0
  155. codex_django-0.2.5/src/codex_django/cabinet/templates/cabinet/widgets/table.html +99 -0
  156. codex_django-0.2.5/src/codex_django/cabinet/types.py +130 -0
  157. codex_django-0.2.5/src/codex_django/cabinet/urls.py +14 -0
  158. codex_django-0.2.5/src/codex_django/cabinet/views/__init__.py +10 -0
  159. codex_django-0.2.5/src/codex_django/cabinet/views/dashboard.py +21 -0
  160. codex_django-0.2.5/src/codex_django/cabinet/views/site_settings.py +54 -0
  161. codex_django-0.2.5/src/codex_django/cli/__init__.py +20 -0
  162. codex_django-0.2.5/src/codex_django/cli/_compat.py +23 -0
  163. codex_django-0.2.5/src/codex_django/cli/commands/__init__.py +9 -0
  164. codex_django-0.2.5/src/codex_django/cli/commands/add_app.py +9 -0
  165. codex_django-0.2.5/src/codex_django/cli/commands/booking.py +9 -0
  166. codex_django-0.2.5/src/codex_django/cli/commands/client_cabinet.py +9 -0
  167. codex_django-0.2.5/src/codex_django/cli/commands/deploy.py +9 -0
  168. codex_django-0.2.5/src/codex_django/cli/commands/init.py +9 -0
  169. codex_django-0.2.5/src/codex_django/cli/commands/notifications.py +9 -0
  170. codex_django-0.2.5/src/codex_django/cli/commands/quality.py +9 -0
  171. codex_django-0.2.5/src/codex_django/cli/engine.py +9 -0
  172. codex_django-0.2.5/src/codex_django/cli/main.py +9 -0
  173. codex_django-0.2.5/src/codex_django/cli/prompts.py +9 -0
  174. codex_django-0.2.5/src/codex_django/cli/utils.py +9 -0
  175. codex_django-0.2.5/src/codex_django/core/__init__.py +25 -0
  176. codex_django-0.2.5/src/codex_django/core/context_processors.py +41 -0
  177. codex_django-0.2.5/src/codex_django/core/i18n/__init__.py +5 -0
  178. codex_django-0.2.5/src/codex_django/core/i18n/discovery.py +60 -0
  179. codex_django-0.2.5/src/codex_django/core/management/__init__.py +1 -0
  180. codex_django-0.2.5/src/codex_django/core/management/commands/__init__.py +1 -0
  181. codex_django-0.2.5/src/codex_django/core/management/commands/codex_makemessages.py +209 -0
  182. codex_django-0.2.5/src/codex_django/core/mixins/__init__.py +30 -0
  183. codex_django-0.2.5/src/codex_django/core/mixins/models.py +168 -0
  184. codex_django-0.2.5/src/codex_django/core/redis/__init__.py +25 -0
  185. codex_django-0.2.5/src/codex_django/core/redis/managers/__init__.py +19 -0
  186. codex_django-0.2.5/src/codex_django/core/redis/managers/base.py +41 -0
  187. codex_django-0.2.5/src/codex_django/core/redis/managers/booking.py +127 -0
  188. codex_django-0.2.5/src/codex_django/core/redis/managers/notifications.py +75 -0
  189. codex_django-0.2.5/src/codex_django/core/redis/managers/seo.py +98 -0
  190. codex_django-0.2.5/src/codex_django/core/redis/managers/settings.py +124 -0
  191. codex_django-0.2.5/src/codex_django/core/redis/managers/static_content.py +48 -0
  192. codex_django-0.2.5/src/codex_django/core/seo/__init__.py +5 -0
  193. codex_django-0.2.5/src/codex_django/core/seo/selectors.py +64 -0
  194. codex_django-0.2.5/src/codex_django/core/sitemaps.py +100 -0
  195. codex_django-0.2.5/src/codex_django/core/templatetags/__init__.py +1 -0
  196. codex_django-0.2.5/src/codex_django/core/templatetags/codex_i18n.py +35 -0
  197. codex_django-0.2.5/src/codex_django/notifications/__init__.py +40 -0
  198. codex_django-0.2.5/src/codex_django/notifications/adapters/__init__.py +0 -0
  199. codex_django-0.2.5/src/codex_django/notifications/adapters/arq_client.py +79 -0
  200. codex_django-0.2.5/src/codex_django/notifications/adapters/cache_adapter.py +32 -0
  201. codex_django-0.2.5/src/codex_django/notifications/adapters/direct_adapter.py +120 -0
  202. codex_django-0.2.5/src/codex_django/notifications/adapters/i18n_adapter.py +24 -0
  203. codex_django-0.2.5/src/codex_django/notifications/adapters/queue_adapter.py +50 -0
  204. codex_django-0.2.5/src/codex_django/notifications/builder.py +117 -0
  205. codex_django-0.2.5/src/codex_django/notifications/mixins/__init__.py +0 -0
  206. codex_django-0.2.5/src/codex_django/notifications/mixins/models.py +47 -0
  207. codex_django-0.2.5/src/codex_django/notifications/selector.py +113 -0
  208. codex_django-0.2.5/src/codex_django/notifications/service.py +227 -0
  209. codex_django-0.2.5/src/codex_django/py.typed +0 -0
  210. codex_django-0.2.5/src/codex_django/showcase/__init__.py +0 -0
  211. codex_django-0.2.5/src/codex_django/showcase/apps.py +7 -0
  212. codex_django-0.2.5/src/codex_django/showcase/mock.py +1467 -0
  213. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/app.css +644 -0
  214. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/base/layout.css +64 -0
  215. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/base/reset.css +15 -0
  216. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/base.css +20 -0
  217. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/bootstrap/overrides.css +1 -0
  218. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/cabinet.css +353 -0
  219. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/compiler_config.json +5 -0
  220. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/components/auth.css +214 -0
  221. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/components/buttons.css +1 -0
  222. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/components/cards.css +1 -0
  223. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/components/forms.css +1 -0
  224. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/components/tables.css +1 -0
  225. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/fonts/bootstrap-icons.woff +0 -0
  226. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/fonts/bootstrap-icons.woff2 +0 -0
  227. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/theme/tokens.css +30 -0
  228. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/vendor/bootstrap-icons.min.css +5 -0
  229. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/css/vendor/bootstrap.min.css +6 -0
  230. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/js/app/cabinet.js +37 -0
  231. codex_django-0.2.5/src/codex_django/showcase/static/showcase/cabinet/js/vendor/bootstrap.bundle.min.js +7 -0
  232. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/analytics/reports.html +46 -0
  233. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/auth/login.html +10 -0
  234. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/base_auth.html +26 -0
  235. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/base_cabinet.html +73 -0
  236. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/base_client.html +146 -0
  237. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/base_htmx.html +14 -0
  238. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/booking/appointments.html +288 -0
  239. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/booking/base_booking.html +47 -0
  240. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/booking/index.html +233 -0
  241. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/booking/new.html +274 -0
  242. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/catalog/index.html +35 -0
  243. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/client/my_appointments.html +246 -0
  244. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/client/profile.html +114 -0
  245. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/client/settings.html +123 -0
  246. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/client/settings_notifications.html +105 -0
  247. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/client/settings_privacy.html +134 -0
  248. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/clients/index.html +184 -0
  249. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/conversations/_detail.html +110 -0
  250. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/conversations/_empty.html +5 -0
  251. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/conversations/index.html +134 -0
  252. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/dashboard/index.html +136 -0
  253. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_avatar.html +1 -0
  254. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_empty_state.html +8 -0
  255. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_export_modal.html +34 -0
  256. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_head.html +11 -0
  257. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_modal_base.html +5 -0
  258. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_nav_item.html +9 -0
  259. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_page_header.html +12 -0
  260. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_report_filters.html +64 -0
  261. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_sidebar.html +34 -0
  262. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_sidebar_client.html +59 -0
  263. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_sidebar_staff.html +104 -0
  264. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_status_badge.html +1 -0
  265. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_topbar.html +192 -0
  266. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/_topbar_shortcut.html +6 -0
  267. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/client/_sidebar.html +0 -0
  268. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/includes/client/_topbar.html +0 -0
  269. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/notifications/log.html +140 -0
  270. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/notifications/templates.html +161 -0
  271. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/index.html +116 -0
  272. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_contact.html +83 -0
  273. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_email.html +83 -0
  274. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_geo.html +54 -0
  275. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_legal.html +76 -0
  276. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_marketing.html +67 -0
  277. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_social.html +107 -0
  278. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_technical.html +88 -0
  279. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/site_settings/partials/_topbar.html +123 -0
  280. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/staff/index.html +196 -0
  281. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/widgets/chart.html +33 -0
  282. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/widgets/client_base.html +22 -0
  283. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/widgets/donut.html +14 -0
  284. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/widgets/kpi.html +23 -0
  285. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/widgets/list.html +43 -0
  286. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/cabinet/widgets/table.html +99 -0
  287. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/includes/showcase_hub.html +169 -0
  288. codex_django-0.2.5/src/codex_django/showcase/templates/showcase/index.html +19 -0
  289. codex_django-0.2.5/src/codex_django/showcase/templatetags/__init__.py +0 -0
  290. codex_django-0.2.5/src/codex_django/showcase/templatetags/showcase_extras.py +13 -0
  291. codex_django-0.2.5/src/codex_django/showcase/urls.py +44 -0
  292. codex_django-0.2.5/src/codex_django/showcase/views.py +147 -0
  293. codex_django-0.2.5/src/codex_django/system/__init__.py +26 -0
  294. codex_django-0.2.5/src/codex_django/system/context_processors.py +75 -0
  295. codex_django-0.2.5/src/codex_django/system/management/__init__.py +1 -0
  296. codex_django-0.2.5/src/codex_django/system/management/base_commands.py +153 -0
  297. codex_django-0.2.5/src/codex_django/system/mixins/__init__.py +56 -0
  298. codex_django-0.2.5/src/codex_django/system/mixins/integrations.py +185 -0
  299. codex_django-0.2.5/src/codex_django/system/mixins/seo.py +59 -0
  300. codex_django-0.2.5/src/codex_django/system/mixins/settings.py +308 -0
  301. codex_django-0.2.5/src/codex_django/system/mixins/translations.py +52 -0
  302. codex_django-0.2.5/src/codex_django/system/mixins/user_profile.py +93 -0
  303. codex_django-0.2.5/src/codex_django/system/redis/__init__.py +1 -0
  304. codex_django-0.2.5/src/codex_django/system/redis/managers/__init__.py +5 -0
  305. codex_django-0.2.5/src/codex_django/system/redis/managers/fixtures.py +67 -0
  306. codex_django-0.2.5/src/codex_django/system/utils/__init__.py +1 -0
  307. codex_django-0.2.5/src/codex_django/system/utils/fixture_hash.py +45 -0
  308. codex_django-0.2.5/tests/__init__.py +0 -0
  309. codex_django-0.2.5/tests/conftest.py +42 -0
  310. codex_django-0.2.5/tests/e2e/__init__.py +0 -0
  311. codex_django-0.2.5/tests/integration/__init__.py +0 -0
  312. codex_django-0.2.5/tests/settings.py +47 -0
  313. codex_django-0.2.5/tests/unit/__init__.py +0 -0
  314. codex_django-0.2.5/tests/unit/booking/__init__.py +0 -0
  315. codex_django-0.2.5/tests/unit/booking/conftest.py +35 -0
  316. codex_django-0.2.5/tests/unit/booking/test_availability_adapter.py +741 -0
  317. codex_django-0.2.5/tests/unit/booking/test_cache_adapter.py +109 -0
  318. codex_django-0.2.5/tests/unit/booking/test_selectors.py +561 -0
  319. codex_django-0.2.5/tests/unit/booking/test_settings_mixins.py +139 -0
  320. codex_django-0.2.5/tests/unit/cabinet/__init__.py +0 -0
  321. codex_django-0.2.5/tests/unit/cabinet/test_context_processors.py +119 -0
  322. codex_django-0.2.5/tests/unit/cabinet/test_context_processors_namespacing.py +84 -0
  323. codex_django-0.2.5/tests/unit/cabinet/test_dashboard_cache.py +65 -0
  324. codex_django-0.2.5/tests/unit/cabinet/test_dashboard_selector.py +165 -0
  325. codex_django-0.2.5/tests/unit/cabinet/test_models.py +85 -0
  326. codex_django-0.2.5/tests/unit/cabinet/test_redis_managers.py +122 -0
  327. codex_django-0.2.5/tests/unit/cabinet/test_registry.py +115 -0
  328. codex_django-0.2.5/tests/unit/cabinet/test_types.py +98 -0
  329. codex_django-0.2.5/tests/unit/cabinet/test_urls.py +10 -0
  330. codex_django-0.2.5/tests/unit/cabinet/test_views.py +75 -0
  331. codex_django-0.2.5/tests/unit/cli/test_compat_shims.py +104 -0
  332. codex_django-0.2.5/tests/unit/core/__init__.py +0 -0
  333. codex_django-0.2.5/tests/unit/core/redis/__init__.py +0 -0
  334. codex_django-0.2.5/tests/unit/core/redis/test_managers.py +298 -0
  335. codex_django-0.2.5/tests/unit/core/test_codex_makemessages.py +82 -0
  336. codex_django-0.2.5/tests/unit/core/test_core_context_processors.py +114 -0
  337. codex_django-0.2.5/tests/unit/core/test_i18n_discovery.py +86 -0
  338. codex_django-0.2.5/tests/unit/core/test_seo_selectors.py +107 -0
  339. codex_django-0.2.5/tests/unit/core/test_sitemaps.py +73 -0
  340. codex_django-0.2.5/tests/unit/notifications/__init__.py +0 -0
  341. codex_django-0.2.5/tests/unit/notifications/conftest.py +34 -0
  342. codex_django-0.2.5/tests/unit/notifications/test_adapters.py +421 -0
  343. codex_django-0.2.5/tests/unit/notifications/test_builder.py +206 -0
  344. codex_django-0.2.5/tests/unit/notifications/test_engine.py +195 -0
  345. codex_django-0.2.5/tests/unit/notifications/test_selector.py +138 -0
  346. codex_django-0.2.5/tests/unit/showcase/test_apps.py +10 -0
  347. codex_django-0.2.5/tests/unit/showcase/test_mock.py +38 -0
  348. codex_django-0.2.5/tests/unit/showcase/test_urls_and_tags.py +17 -0
  349. codex_django-0.2.5/tests/unit/showcase/test_views.py +172 -0
  350. codex_django-0.2.5/tests/unit/system/__init__.py +0 -0
  351. codex_django-0.2.5/tests/unit/system/test_base_commands.py +207 -0
  352. codex_django-0.2.5/tests/unit/system/test_context_processors.py +121 -0
  353. codex_django-0.2.5/tests/unit/system/test_fixture_hash.py +44 -0
  354. codex_django-0.2.5/tests/unit/system/test_mixins.py +176 -0
  355. codex_django-0.2.5/tests/urls.py +1 -0
  356. codex_django-0.2.5/tools/__init__.py +0 -0
  357. codex_django-0.2.5/tools/dev/__init__.py +0 -0
  358. codex_django-0.2.5/tools/dev/check.py +98 -0
  359. codex_django-0.2.5/uv.lock +2195 -0
  360. codex_django-0.2.5/verify_init.py +32 -0
@@ -0,0 +1,6 @@
1
+ {
2
+ "profile": "django",
3
+ "indent": 4,
4
+ "ignore": "H016,H030,H031",
5
+ "extension": "html"
6
+ }
@@ -0,0 +1,111 @@
1
+ name: CI Pipeline
2
+
3
+ on:
4
+ push:
5
+ branches: [develop, main]
6
+ paths-ignore: ["**.md", "docs/**", ".gitignore"]
7
+ pull_request:
8
+ branches: [main]
9
+ workflow_dispatch:
10
+
11
+ jobs:
12
+ quality-gate:
13
+ name: Quality Gate
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+ - uses: actions/setup-python@v5
18
+ with:
19
+ python-version: "3.12"
20
+ - uses: astral-sh/setup-uv@v7
21
+ with:
22
+ version: "0.10.7"
23
+
24
+ - name: Sync dev environment
25
+ run: uv sync --locked --extra maintainer
26
+
27
+ - name: Run pre-commit
28
+ run: uv run pre-commit run --all-files
29
+
30
+ - name: Run pip-audit
31
+ run: uv run pip-audit --skip-editable --ignore-vuln CVE-2026-4539
32
+
33
+ - name: Run mypy
34
+ run: uv run mypy src/
35
+
36
+ unit-tests:
37
+ name: Unit Tests
38
+ needs: quality-gate
39
+ runs-on: ubuntu-latest
40
+ steps:
41
+ - uses: actions/checkout@v4
42
+ - uses: actions/setup-python@v5
43
+ with:
44
+ python-version: "3.12"
45
+ - uses: astral-sh/setup-uv@v7
46
+ with:
47
+ version: "0.10.7"
48
+
49
+ - name: Sync dev environment
50
+ run: uv sync --locked --extra maintainer
51
+
52
+ - name: Run unit tests
53
+ run: uv run pytest tests/ -m "unit" -v --tb=short
54
+
55
+ integration-tests:
56
+ name: Integration Tests
57
+ needs: unit-tests
58
+ runs-on: ubuntu-latest
59
+
60
+ steps:
61
+ - uses: actions/checkout@v4
62
+ - uses: actions/setup-python@v5
63
+ with:
64
+ python-version: "3.12"
65
+ - uses: astral-sh/setup-uv@v7
66
+ with:
67
+ version: "0.10.7"
68
+
69
+ - name: Sync dev environment
70
+ run: uv sync --locked --extra maintainer
71
+
72
+ - name: Run integration tests
73
+ run: |
74
+ set +e
75
+ uv run pytest --override-ini addopts='' tests/ -m "integration" -v --tb=short
76
+ status=$?
77
+ set -e
78
+ if [ "$status" -eq 5 ]; then
79
+ echo "No integration tests collected; treating as success."
80
+ exit 0
81
+ fi
82
+ exit "$status"
83
+
84
+ e2e-tests:
85
+ name: E2E Tests
86
+ needs: integration-tests
87
+ runs-on: ubuntu-latest
88
+
89
+ steps:
90
+ - uses: actions/checkout@v4
91
+ - uses: actions/setup-python@v5
92
+ with:
93
+ python-version: "3.12"
94
+ - uses: astral-sh/setup-uv@v7
95
+ with:
96
+ version: "0.10.7"
97
+
98
+ - name: Sync dev environment
99
+ run: uv sync --locked --extra maintainer
100
+
101
+ - name: Run E2E tests
102
+ run: |
103
+ set +e
104
+ uv run pytest --override-ini addopts='' tests/ -m "e2e" -v --tb=short
105
+ status=$?
106
+ set -e
107
+ if [ "$status" -eq 5 ]; then
108
+ echo "No E2E tests collected; treating as success."
109
+ exit 0
110
+ fi
111
+ exit "$status"
@@ -0,0 +1,73 @@
1
+ name: Deploy Docs
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+ workflow_dispatch:
8
+ inputs:
9
+ version:
10
+ description: "Version alias to deploy (e.g. 0.x, 1.x)"
11
+ required: true
12
+ alias:
13
+ description: "Alias (latest, stable, or leave empty)"
14
+ required: false
15
+ default: "latest"
16
+
17
+ env:
18
+ FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
19
+
20
+ permissions:
21
+ contents: write
22
+
23
+ jobs:
24
+ deploy:
25
+ name: Build & Deploy Docs
26
+ runs-on: ubuntu-latest
27
+ steps:
28
+ - name: Checkout code
29
+ uses: actions/checkout@v4
30
+ with:
31
+ fetch-depth: 0
32
+
33
+ - name: Configure Git Credentials
34
+ run: |
35
+ git config user.name github-actions[bot]
36
+ git config user.email 41898282+github-actions[bot]@users.noreply.github.com
37
+
38
+ - name: Set up Python 3.12
39
+ uses: actions/setup-python@v5
40
+ with:
41
+ python-version: "3.12"
42
+ - uses: astral-sh/setup-uv@v7
43
+ with:
44
+ version: "0.10.7"
45
+
46
+ - name: Sync docs environment
47
+ run: uv sync --locked --extra docs
48
+
49
+ - name: Resolve version alias (tag push)
50
+ if: github.event_name == 'push'
51
+ id: version
52
+ run: |
53
+ TAG="${GITHUB_REF_NAME}"
54
+ VERSION=$(echo "$TAG" | sed 's/^v//')
55
+ MAJOR=$(echo "$VERSION" | cut -d. -f1)
56
+ echo "version=${VERSION}" >> "$GITHUB_OUTPUT"
57
+ echo "alias=${MAJOR}.x" >> "$GITHUB_OUTPUT"
58
+
59
+ - name: Deploy versioned docs (tag push)
60
+ if: github.event_name == 'push'
61
+ run: |
62
+ uv run mike deploy --push --update-aliases "${{ steps.version.outputs.version }}" "${{ steps.version.outputs.alias }}" latest
63
+ uv run mike set-default --push latest
64
+
65
+ - name: Deploy versioned docs (manual)
66
+ if: github.event_name == 'workflow_dispatch'
67
+ run: |
68
+ if [ -n "${{ inputs.alias }}" ]; then
69
+ uv run mike deploy --push --update-aliases "${{ inputs.version }}" "${{ inputs.alias }}"
70
+ else
71
+ uv run mike deploy --push "${{ inputs.version }}"
72
+ fi
73
+ uv run mike set-default --push latest
@@ -0,0 +1,42 @@
1
+ name: Publish to PyPI
2
+
3
+ on:
4
+ push:
5
+ tags:
6
+ - "v*"
7
+
8
+ jobs:
9
+ build-n-publish:
10
+ name: Build and publish to PyPI
11
+ runs-on: ubuntu-latest
12
+ environment:
13
+ name: pypi
14
+ url: https://pypi.org/project/codex-django/
15
+ permissions:
16
+ id-token: write
17
+ contents: read
18
+
19
+ steps:
20
+ - name: Checkout code
21
+ uses: actions/checkout@v4
22
+ with:
23
+ fetch-depth: 0
24
+
25
+ - name: Set up Python
26
+ uses: actions/setup-python@v5
27
+ with:
28
+ python-version: "3.12"
29
+ - uses: astral-sh/setup-uv@v7
30
+ with:
31
+ version: "0.10.7"
32
+
33
+ - name: Build sdist and wheel
34
+ run: uv build --no-sources
35
+
36
+ - name: Check artifacts
37
+ run: uvx twine check dist/*
38
+
39
+ - name: Publish to PyPI
40
+ uses: pypa/gh-action-pypi-publish@release/v1
41
+ with:
42
+ print-hash: true
@@ -0,0 +1,91 @@
1
+ # Byte-compiled / optimized / DLL files
2
+ __pycache__/
3
+ *.py[codz]
4
+ *$py.class
5
+
6
+ # C extensions
7
+ *.so
8
+
9
+ # Distribution / packaging
10
+ .Python
11
+ build/
12
+ develop-eggs/
13
+ dist/
14
+ downloads/
15
+ eggs/
16
+ .eggs/
17
+ lib/
18
+ lib64/
19
+ parts/
20
+ sdist/
21
+ var/
22
+ wheels/
23
+ share/python-wheels/
24
+ *.egg-info/
25
+ .installed.cfg
26
+ *.egg
27
+ MANIFEST
28
+
29
+ # Unit test / coverage reports
30
+ htmlcov/
31
+ .tox/
32
+ .nox/
33
+ .coverage
34
+ .coverage.*
35
+ .cache
36
+ nosetests.xml
37
+ coverage.xml
38
+ *.cover
39
+ *.py.cover
40
+ .hypothesis/
41
+ .pytest_cache/
42
+ cover/
43
+
44
+ # Django stuff:
45
+ *.log
46
+ local_settings.py
47
+ db.sqlite3
48
+ db.sqlite3-journal
49
+
50
+ # Environments
51
+ .env
52
+ .envrc
53
+ .venv
54
+ .venv-rebuild/
55
+ env/
56
+ venv/
57
+ ENV/
58
+ env.bak/
59
+ venv.bak/
60
+
61
+ # mkdocs documentation
62
+ /site
63
+
64
+ # mypy
65
+ .mypy_cache/
66
+ .dmypy.json
67
+ dmypy.json
68
+
69
+ # Ruff stuff:
70
+ .ruff_cache/
71
+ .uv-cache/
72
+
73
+ # PyPI configuration file
74
+ .pypirc
75
+
76
+ # Claude Code
77
+ .claude/
78
+
79
+ # IDEs
80
+ .idea/
81
+ .vscode/
82
+ .cursorignore
83
+ .cursorindexingignore
84
+
85
+ # OS junk
86
+ .DS_Store
87
+ Thumbs.db
88
+ *.swp
89
+
90
+ # Codex Sandbox
91
+ sandbox/
@@ -0,0 +1,37 @@
1
+ repos:
2
+ - repo: https://github.com/pre-commit/pre-commit-hooks
3
+ rev: v5.0.0
4
+ hooks:
5
+ - id: trailing-whitespace
6
+ - id: end-of-file-fixer
7
+ - id: check-yaml
8
+ exclude: ^mkdocs\.yml$
9
+ - id: check-json
10
+ - id: check-added-large-files
11
+ args: ['--maxkb=2000']
12
+ - id: check-merge-conflict
13
+
14
+ - repo: https://github.com/astral-sh/ruff-pre-commit
15
+ rev: v0.9.6
16
+ hooks:
17
+ - id: ruff
18
+ args: [--fix]
19
+ - id: ruff-format
20
+
21
+ - repo: https://github.com/igorshubovych/markdownlint-cli
22
+ rev: v0.44.0
23
+ hooks:
24
+ - id: markdownlint
25
+ args: ["--fix", "--disable", "MD013"]
26
+
27
+ - repo: https://github.com/PyCQA/bandit
28
+ rev: 1.8.2
29
+ hooks:
30
+ - id: bandit
31
+ args: ["-c", "pyproject.toml"]
32
+ additional_dependencies: ["bandit[toml]"]
33
+
34
+ - repo: https://github.com/Yelp/detect-secrets
35
+ rev: v1.5.0
36
+ hooks:
37
+ - id: detect-secrets
@@ -0,0 +1 @@
1
+ 3.12
@@ -0,0 +1,64 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ ## [Unreleased]
6
+
7
+ - Ongoing release polish after the first public packaging pass.
8
+
9
+ ## [0.2.5] - 2026-03-29
10
+
11
+ First public release.
12
+
13
+ ### Added
14
+
15
+ - Optional `cli` extra that installs the published `codex-django-cli` companion package.
16
+ - Runtime compatibility shims that forward legacy `codex_django.cli.*` imports to `codex-django-cli`.
17
+ - Additional runtime test coverage for dashboard selectors, Redis managers, and showcase views.
18
+
19
+ ### Changed
20
+
21
+ - Refocused `codex-django` on reusable Django runtime modules while project scaffolding lives in `codex-django-cli`.
22
+ - Replaced the old runtime extras layout with `cli`, `dev`, `maintainer`, and `docs`.
23
+ - Updated README, install guides, and CI workflow around the runtime/CLI split.
24
+ - Reworked the docs landing page into a runtime-oriented entry screen with quick-start paths and module navigation.
25
+ - Raised the runtime coverage threshold to reflect the audited baseline.
26
+
27
+ ### Fixed
28
+
29
+ - Packaging metadata and lockfile resolution for `codex-django[cli]`.
30
+ - Online installation flow where a built `codex-django` wheel pulls `codex-django-cli` from the package registry.
31
+ - Compatibility typing around the lazy CLI dispatch module.
32
+ - Empty integration/e2e marker handling in the maintainer quality gate.
33
+ - Async test environment resolution by restoring `arq` and `pytest-asyncio` in development extras.
34
+ - Missing `unit` marker coverage for cabinet context processor tests.
35
+
36
+ ## [0.2.0] - Internal milestone
37
+
38
+ ### Added
39
+
40
+ - Broader runtime modules for cabinet, showcase, booking, system, notifications, and core integrations.
41
+ - Expanded unit coverage for runtime helpers and compatibility surfaces.
42
+
43
+ ### Changed
44
+
45
+ - Reworked the runtime architecture around reusable adapters, mixins, selectors, and generated-project boundaries.
46
+ - Evolved scaffold templates and docs in parallel with the runtime modules.
47
+
48
+ ## [0.1.5] - Internal milestone
49
+
50
+ ### Added
51
+
52
+ - Cabinet/dashboard foundation with selectors, widgets, settings, and templates.
53
+ - Showcase reference implementation with mock data, views, and demo flows.
54
+ - Booking runtime adapters and selectors.
55
+
56
+ ### Changed
57
+
58
+ - Extended project templates, feature blueprints, and deployment-oriented repository scaffolds.
59
+
60
+ ## [0.1.0] - Internal milestone
61
+
62
+ ### Added
63
+
64
+ - Initial library scaffold for Django runtime utilities, mixins, adapters, and Codex-oriented project structure.
@@ -0,0 +1,133 @@
1
+ # CLAUDE.md — codex-django
2
+
3
+ > Читать в начале каждой сессии. Содержит ориентацию по проекту, памяти и ветках.
4
+
5
+ ---
6
+
7
+ ## Расположение проекта
8
+
9
+ ```
10
+ C:\install\projects\codex_tools\codex-django\
11
+ ```
12
+
13
+ Все codex-* библиотеки — соседи на одном уровне:
14
+ ```
15
+ C:\install\projects\codex_tools\
16
+ codex-core\
17
+ codex-platform\
18
+ codex-services\
19
+ codex-django\ ← этот проект
20
+ codex-bot\
21
+ ```
22
+
23
+ ---
24
+
25
+ ## Файлы памяти (локальные)
26
+
27
+ ```
28
+ C:\Users\prime\.claude\projects\C--install-projects-codex-tools-codex-django\memory\
29
+ ```
30
+
31
+ | Файл | Содержимое |
32
+ |------|-----------|
33
+ | `MEMORY.md` | Мастер-индекс. Читать первым. |
34
+ | `claude_context.md` | Стиль работы, частые ошибки, активные проекты |
35
+ | `roadmap_overview.md` | 8 блоков доделки, порядок, статусы |
36
+ | `roadmap_block1.md` | ✅ Git hygiene + стабы |
37
+ | `roadmap_block2.md` | Тесты: booking + notifications |
38
+ | `roadmap_block3.md` | Тесты: system + core |
39
+ | `roadmap_block4.md` | Cabinet: widget adapter + client cabinet |
40
+ | `roadmap_block5.md` | i18n валидация |
41
+ | `roadmap_block6.md` | Booking: мульти-сервис |
42
+ | `roadmap_block7.md` | Docs + PyPI alpha |
43
+ | `roadmap_block8.md` | Deploy blueprints + Showcase |
44
+ | `cabinet_index.md` | Архитектура кабинета |
45
+ | `cabinet_css_js.md` | CSS/JS стек |
46
+ | `cabinet_dashboard_architecture.md` | DashboardSelector, Redis, adapter pattern |
47
+ | `project_ecosystem.md` | Экосистема codex-*, lily_website |
48
+ | `project_test_conventions.md` | Уровни тестов, команды запуска |
49
+
50
+ ---
51
+
52
+ ## MCP граф памяти (полная версия)
53
+
54
+ Сервер: `memory` (MCP)
55
+
56
+ ```python
57
+ # Старт навигации всегда с:
58
+ search_nodes("MASTER_INDEX")
59
+ ```
60
+
61
+ ### Ключевые ноды по проекту:
62
+
63
+ | Нода | Тип | Содержит |
64
+ |------|-----|---------|
65
+ | `MASTER_INDEX` | Index | 7 секций (SEC:*) |
66
+ | `SEC:Architecture` | IndexSection | Архитектурные решения |
67
+ | `codex-django:architecture:project` | Architecture | Структура, ветки, пути |
68
+ | `codex-django:architecture:cabinet` | Architecture | CabinetApp дизайн |
69
+ | `codex-django:architecture:cli-blueprint` | Architecture | Blueprint система |
70
+ | `codex-django:cabinet:index` | project-index | Кабинет: подход и принципы |
71
+ | `codex-django:cabinet:css-js` | conventions | CSS/JS стек, компилер |
72
+ | `Claude:Index` | PersonalNotes | Стиль работы, уроки |
73
+ | `Graph:ConventionStandard` | Standard | Правила именования нод |
74
+
75
+ ---
76
+
77
+ ## Git ветки
78
+
79
+ | Ветка | Назначение |
80
+ |-------|-----------|
81
+ | `main` | Стабильный релиз (PyPI) |
82
+ | `develop` | Активная разработка — **все коммиты сюда** |
83
+
84
+ > **Важно:** merge в `main` только перед релизом (Block 7 — PyPI alpha).
85
+ > Сейчас работаем в `develop`. Не пушим (`git push` запрещён без явного запроса).
86
+
87
+ ---
88
+
89
+ ## Quality gate
90
+
91
+ ```bash
92
+ # Полная проверка (интерактивный — спросит про integration тесты):
93
+ python tools/dev/check.py --all
94
+
95
+ # Только lint:
96
+ python tools/dev/check.py --lint
97
+
98
+ # Только типы:
99
+ python tools/dev/check.py --types
100
+
101
+ # Только тесты:
102
+ python tools/dev/check.py --tests unit
103
+ ```
104
+
105
+ **Текущий статус gate (после Block 1):**
106
+ - Lint (ruff + bandit) ✅
107
+ - Mypy ✅ (93 файла, 0 ошибок)
108
+ - pip-audit ✅ (CVE-2026-4539 pygments — no fix, ignored)
109
+ - Unit tests ✅ 153 passed, coverage ~35%
110
+
111
+ ---
112
+
113
+ ## Roadmap статус
114
+
115
+ | # | Блок | Статус |
116
+ |---|------|--------|
117
+ | 1 | Git hygiene + стабы | ✅ |
118
+ | 2 | Тесты: booking + notifications | ⬜ |
119
+ | 3 | Тесты: system + core | ⬜ |
120
+ | 4 | Cabinet: widget adapter | ⬜ |
121
+ | 5 | i18n валидация | ⬜ |
122
+ | 6 | Booking мульти-сервис | ⬜ |
123
+ | 7 | Docs + PyPI | ⬜ |
124
+ | 8 | Deploy + Showcase | ⬜ |
125
+
126
+ ---
127
+
128
+ ## Как стартовать новую сессию
129
+
130
+ 1. Прочитай этот файл
131
+ 2. Прочитай `memory/roadmap_overview.md`
132
+ 3. Прочитай нужный `memory/roadmap_blockN.md`
133
+ 4. По необходимости: `search_nodes("MASTER_INDEX")` для полного контекста