domainkit 1.7.1__tar.gz → 2.0.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 (651) hide show
  1. {domainkit-1.7.1 → domainkit-2.0.0}/PKG-INFO +38 -38
  2. {domainkit-1.7.1 → domainkit-2.0.0}/README.md +35 -35
  3. {domainkit-1.7.1 → domainkit-2.0.0}/pyproject.toml +3 -3
  4. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/global_settings.py +1 -1
  5. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/apps.py +7 -2
  6. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/baseline.py +111 -22
  7. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/management/commands/audit.py +6 -4
  8. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/pruning.py +108 -53
  9. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/trails.py +5 -0
  10. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/__init__.py +10 -0
  11. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/admin.py +3 -1
  12. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/api.py +21 -11
  13. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/apps.py +34 -17
  14. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/backends.py +13 -6
  15. domainkit-2.0.0/src/domainkit/contrib/auth/codes.py +177 -0
  16. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/cookies.py +1 -1
  17. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/events.py +6 -0
  18. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/exceptions.py +24 -0
  19. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/cleartokens.py +2 -1
  20. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/createsuperuser.py +66 -16
  21. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/models.py +118 -13
  22. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/onetime.py +10 -46
  23. domainkit-2.0.0/src/domainkit/contrib/auth/recovery.py +513 -0
  24. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/repositories.py +131 -17
  25. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/settings.py +42 -31
  26. domainkit-2.0.0/src/domainkit/contrib/auth/signup.py +389 -0
  27. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/tables.py +48 -5
  28. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/tasks.py +5 -4
  29. domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.subject.txt +1 -0
  30. domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/email_verification_code.txt +9 -0
  31. domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.subject.txt +1 -0
  32. domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/password_reset_code.txt +9 -0
  33. domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/signup_code.subject.txt +1 -0
  34. domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/signup_confirm.txt → domainkit-2.0.0/src/domainkit/contrib/auth/templates/mail/auth/signup_code.txt +4 -2
  35. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/testing.py +24 -1
  36. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/throttling.py +5 -2
  37. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/uow.py +24 -0
  38. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/backends.py +1 -1
  39. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/templates.py +4 -4
  40. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/apps.py +6 -3
  41. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/dispatch.py +2 -3
  42. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/erasure.py +6 -6
  43. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/commands/runworker.py +2 -1
  44. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/outbox.py +10 -0
  45. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/settings.py +1 -1
  46. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/services.py +6 -8
  47. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/admin.py +2 -1
  48. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/guard.py +4 -26
  49. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/connections.py +81 -13
  50. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/routing.py +17 -7
  51. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/uow.py +4 -1
  52. domainkit-2.0.0/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
  53. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.po +9 -0
  54. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.po +9 -0
  55. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/startdomain.py +4 -3
  56. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/generators.py +15 -9
  57. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/base.py-tpl +2 -0
  58. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/Dockerfile-tpl +5 -4
  59. domainkit-2.0.0/src/domainkit/management/templates/project/dot-github/dependabot.yml-tpl +19 -0
  60. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/base.py-tpl +8 -4
  61. domainkit-1.7.1/src/domainkit/contrib/auth/recovery.py +0 -361
  62. domainkit-1.7.1/src/domainkit/contrib/auth/signup.py +0 -332
  63. domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/email_verification.subject.txt +0 -1
  64. domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/email_verification.txt +0 -7
  65. domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/password_reset.subject.txt +0 -1
  66. domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/password_reset.txt +0 -8
  67. domainkit-1.7.1/src/domainkit/contrib/auth/templates/mail/auth/signup_confirm.subject.txt +0 -1
  68. domainkit-1.7.1/src/domainkit/i18n/locale/ar/LC_MESSAGES/messages.mo +0 -0
  69. {domainkit-1.7.1 → domainkit-2.0.0}/LICENSE +0 -0
  70. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/__init__.py +0 -0
  71. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/__main__.py +0 -0
  72. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/__init__.py +0 -0
  73. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/config.py +0 -0
  74. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/hooks.py +0 -0
  75. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/apps/registry.py +0 -0
  76. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/architecture.py +0 -0
  77. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/__init__.py +0 -0
  78. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/base.py +0 -0
  79. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/handler.py +0 -0
  80. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/kafka.py +0 -0
  81. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/memory.py +0 -0
  82. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/nats_jetstream.py +0 -0
  83. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/pull.py +0 -0
  84. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/rabbitmq.py +0 -0
  85. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/redis_streams.py +0 -0
  86. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/broker/sqs.py +0 -0
  87. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/__init__.py +0 -0
  88. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/base.py +0 -0
  89. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/core.py +0 -0
  90. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/decorators.py +0 -0
  91. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/handler.py +0 -0
  92. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/memory.py +0 -0
  93. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/metrics.py +0 -0
  94. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/pages.py +0 -0
  95. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cache/redis.py +0 -0
  96. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/checks.py +0 -0
  97. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/clock.py +0 -0
  98. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/__init__.py +0 -0
  99. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/aws.py +0 -0
  100. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/azure.py +0 -0
  101. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/cloud/google.py +0 -0
  102. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/__init__.py +0 -0
  103. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/env.py +0 -0
  104. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/conf/lazy.py +0 -0
  105. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/context.py +0 -0
  106. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/__init__.py +0 -0
  107. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/__init__.py +0 -0
  108. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/api.py +0 -0
  109. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/apps.py +0 -0
  110. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/exceptions.py +0 -0
  111. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/holds.py +0 -0
  112. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/hooks.py +0 -0
  113. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/ledger.py +0 -0
  114. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/management/__init__.py +0 -0
  115. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/management/commands/__init__.py +0 -0
  116. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/management/commands/accounting.py +0 -0
  117. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/models.py +0 -0
  118. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/personal.py +0 -0
  119. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/protection.py +0 -0
  120. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/reconciliation.py +0 -0
  121. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/reports.py +0 -0
  122. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/schemas.py +0 -0
  123. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/settings.py +0 -0
  124. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/tables.py +0 -0
  125. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/tasks.py +0 -0
  126. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/accounting/uow.py +0 -0
  127. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/admin/__init__.py +0 -0
  128. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/admin/sites.py +0 -0
  129. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/__init__.py +0 -0
  130. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/api.py +0 -0
  131. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/apps.py +0 -0
  132. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/builtin.py +0 -0
  133. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/exceptions.py +0 -0
  134. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/guards.py +0 -0
  135. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/management/__init__.py +0 -0
  136. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/management/commands/__init__.py +0 -0
  137. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/management/commands/approvals.py +0 -0
  138. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/models.py +0 -0
  139. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/personal.py +0 -0
  140. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/rules.py +0 -0
  141. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/services.py +0 -0
  142. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/settings.py +0 -0
  143. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/tables.py +0 -0
  144. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/tasks.py +0 -0
  145. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/approvals/uow.py +0 -0
  146. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/__init__.py +0 -0
  147. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/api.py +0 -0
  148. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/checkpoints.py +0 -0
  149. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/history.py +0 -0
  150. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/ledgerstates.py +0 -0
  151. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/management/__init__.py +0 -0
  152. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/management/commands/__init__.py +0 -0
  153. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/models.py +0 -0
  154. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/personal.py +0 -0
  155. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/protection.py +0 -0
  156. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/recorder.py +0 -0
  157. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/seals.py +0 -0
  158. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/settings.py +0 -0
  159. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/tables.py +0 -0
  160. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/tasks.py +0 -0
  161. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/audit/testing.py +0 -0
  162. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/access.py +0 -0
  163. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/authentication.py +0 -0
  164. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/captcha.py +0 -0
  165. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/certificates.py +0 -0
  166. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/common-passwords.NOTICE +0 -0
  167. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/common-passwords.txt.gz +0 -0
  168. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/devices.py +0 -0
  169. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/erasure.py +0 -0
  170. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/hashers.py +0 -0
  171. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/integration.py +0 -0
  172. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/__init__.py +0 -0
  173. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/__init__.py +0 -0
  174. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/addcertificate.py +0 -0
  175. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/changepassword.py +0 -0
  176. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/createtoken.py +0 -0
  177. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/resealmfa.py +0 -0
  178. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/management/commands/resetmfa.py +0 -0
  179. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/metrics.py +0 -0
  180. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/mfa.py +0 -0
  181. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/middleware.py +0 -0
  182. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/permissions.py +0 -0
  183. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/personal_tokens.py +0 -0
  184. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/principals.py +0 -0
  185. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/sca.py +0 -0
  186. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/stepup.py +0 -0
  187. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.subject.txt +0 -0
  188. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/templates/mail/auth/signup_exists.txt +0 -0
  189. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/tokens.py +0 -0
  190. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/totp.py +0 -0
  191. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/users.py +0 -0
  192. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/auth/validators.py +0 -0
  193. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/__init__.py +0 -0
  194. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/apps.py +0 -0
  195. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/models.py +0 -0
  196. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/sync.py +0 -0
  197. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/contenttypes/tables.py +0 -0
  198. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/__init__.py +0 -0
  199. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/api.py +0 -0
  200. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/apps.py +0 -0
  201. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/binding.py +0 -0
  202. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/events.py +0 -0
  203. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/exceptions.py +0 -0
  204. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/passkeys.py +0 -0
  205. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/personal.py +0 -0
  206. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/push.py +0 -0
  207. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/settings.py +0 -0
  208. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/stores.py +0 -0
  209. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/tables.py +0 -0
  210. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/devices/webauthn.py +0 -0
  211. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/__init__.py +0 -0
  212. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/apps.py +0 -0
  213. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/management/__init__.py +0 -0
  214. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/management/commands/__init__.py +0 -0
  215. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/management/commands/evidence.py +0 -0
  216. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/models.py +0 -0
  217. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/settings.py +0 -0
  218. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/store.py +0 -0
  219. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/evidence/tasks.py +0 -0
  220. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/__init__.py +0 -0
  221. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/admin.py +0 -0
  222. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/apps.py +0 -0
  223. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/dependencies.py +0 -0
  224. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/events.py +0 -0
  225. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/exceptions.py +0 -0
  226. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/management/__init__.py +0 -0
  227. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/management/commands/__init__.py +0 -0
  228. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/management/commands/flags.py +0 -0
  229. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/models.py +0 -0
  230. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/settings.py +0 -0
  231. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/store.py +0 -0
  232. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/tables.py +0 -0
  233. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/flags/uow.py +0 -0
  234. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/__init__.py +0 -0
  235. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/apps.py +0 -0
  236. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/middleware.py +0 -0
  237. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/operations.py +0 -0
  238. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/settings.py +0 -0
  239. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/statements.py +0 -0
  240. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/tables.py +0 -0
  241. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/idempotency/tasks.py +0 -0
  242. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/__init__.py +0 -0
  243. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/api.py +0 -0
  244. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/apps.py +0 -0
  245. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/binding.py +0 -0
  246. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/events.py +0 -0
  247. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/exceptions.py +0 -0
  248. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/ldap.py +0 -0
  249. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/personal.py +0 -0
  250. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/providers.py +0 -0
  251. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/saml.py +0 -0
  252. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/services.py +0 -0
  253. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/settings.py +0 -0
  254. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/stores.py +0 -0
  255. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/identity/tables.py +0 -0
  256. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/__init__.py +0 -0
  257. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/apps.py +0 -0
  258. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/management/__init__.py +0 -0
  259. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/management/commands/__init__.py +0 -0
  260. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/management/commands/keys.py +0 -0
  261. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/operations.py +0 -0
  262. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/settings.py +0 -0
  263. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/store.py +0 -0
  264. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/keys/tables.py +0 -0
  265. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/__init__.py +0 -0
  266. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/api.py +0 -0
  267. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/apps.py +0 -0
  268. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/exceptions.py +0 -0
  269. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/management/__init__.py +0 -0
  270. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/management/commands/__init__.py +0 -0
  271. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/management/commands/limits.py +0 -0
  272. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/models.py +0 -0
  273. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/personal.py +0 -0
  274. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/postings.py +0 -0
  275. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/services.py +0 -0
  276. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/settings.py +0 -0
  277. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/tables.py +0 -0
  278. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/tasks.py +0 -0
  279. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/uow.py +0 -0
  280. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/limits/usage.py +0 -0
  281. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/__init__.py +0 -0
  282. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/admins.py +0 -0
  283. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/apps.py +0 -0
  284. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/delivery.py +0 -0
  285. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/message.py +0 -0
  286. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/providers.py +0 -0
  287. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/mail/settings.py +0 -0
  288. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/__init__.py +0 -0
  289. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/admin.py +0 -0
  290. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/breaker.py +0 -0
  291. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/budget.py +0 -0
  292. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/cron.py +0 -0
  293. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/__init__.py +0 -0
  294. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/commands/__init__.py +0 -0
  295. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/management/commands/messages.py +0 -0
  296. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/metrics.py +0 -0
  297. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/ordering.py +0 -0
  298. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/registry.py +0 -0
  299. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/retry.py +0 -0
  300. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/runs.py +0 -0
  301. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/tables.py +0 -0
  302. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/testing.py +0 -0
  303. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/messaging/worker.py +0 -0
  304. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/__init__.py +0 -0
  305. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/apps.py +0 -0
  306. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/backends.py +0 -0
  307. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/delivery.py +0 -0
  308. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/events.py +0 -0
  309. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/messages.py +0 -0
  310. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/push.py +0 -0
  311. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/settings.py +0 -0
  312. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/notifications/sms.py +0 -0
  313. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/__init__.py +0 -0
  314. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/apps.py +0 -0
  315. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/backends.py +0 -0
  316. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/criteria.py +0 -0
  317. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/deletions.py +0 -0
  318. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/models.py +0 -0
  319. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/services.py +0 -0
  320. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/tables.py +0 -0
  321. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/objectpermissions/uow.py +0 -0
  322. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/__init__.py +0 -0
  323. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/api.py +0 -0
  324. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/apps.py +0 -0
  325. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/events.py +0 -0
  326. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/exceptions.py +0 -0
  327. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/personal.py +0 -0
  328. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/settings.py +0 -0
  329. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/stores.py +0 -0
  330. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/phones/tables.py +0 -0
  331. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/__init__.py +0 -0
  332. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/apps.py +0 -0
  333. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/events.py +0 -0
  334. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/management/__init__.py +0 -0
  335. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/management/commands/__init__.py +0 -0
  336. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/management/commands/privacy.py +0 -0
  337. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/models.py +0 -0
  338. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/operations.py +0 -0
  339. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/privacy/retention.py +0 -0
  340. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/__init__.py +0 -0
  341. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/apps.py +0 -0
  342. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/client.py +0 -0
  343. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/delivery.py +0 -0
  344. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/management/__init__.py +0 -0
  345. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/management/commands/__init__.py +0 -0
  346. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/management/commands/webhooks.py +0 -0
  347. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/models.py +0 -0
  348. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/owned.py +0 -0
  349. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/settings.py +0 -0
  350. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/signing.py +0 -0
  351. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/tables.py +0 -0
  352. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/contrib/webhooks/uow.py +0 -0
  353. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/__init__.py +0 -0
  354. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/dbclock.py +0 -0
  355. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/derive.py +0 -0
  356. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/drivers.py +0 -0
  357. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/encrypted.py +0 -0
  358. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/errors.py +0 -0
  359. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/fixtures.py +0 -0
  360. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/hooks.py +0 -0
  361. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migration_env/__init__.py +0 -0
  362. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migration_env/env.py +0 -0
  363. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migration_env/script.py.mako +0 -0
  364. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/migrations.py +0 -0
  365. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/models.py +0 -0
  366. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/money.py +0 -0
  367. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/orm.py +0 -0
  368. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/partitioning.py +0 -0
  369. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/places.py +0 -0
  370. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/query.py +0 -0
  371. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/refs.py +0 -0
  372. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/repository.py +0 -0
  373. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/snapshots.py +0 -0
  374. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/squashing.py +0 -0
  375. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/db/types.py +0 -0
  376. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/__init__.py +0 -0
  377. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/_dataclass.py +0 -0
  378. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/_validation.py +0 -0
  379. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/choices.py +0 -0
  380. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/events.py +0 -0
  381. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/exceptions.py +0 -0
  382. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/fields.py +0 -0
  383. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/markers.py +0 -0
  384. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/messages.py +0 -0
  385. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/model.py +0 -0
  386. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/pagination.py +0 -0
  387. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/personal.py +0 -0
  388. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/places.py +0 -0
  389. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/preconditions.py +0 -0
  390. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/query.py +0 -0
  391. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/refs.py +0 -0
  392. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/repository.py +0 -0
  393. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/stores.py +0 -0
  394. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/tenancy.py +0 -0
  395. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/uow.py +0 -0
  396. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ddd/usecases.py +0 -0
  397. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/deadlines.py +0 -0
  398. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/debug/__init__.py +0 -0
  399. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/debug/middleware.py +0 -0
  400. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/debug/queries.py +0 -0
  401. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/deprecation.py +0 -0
  402. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/encryption.py +0 -0
  403. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/exceptions.py +0 -0
  404. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/__init__.py +0 -0
  405. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/access.py +0 -0
  406. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/apidocs.py +0 -0
  407. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/application.py +0 -0
  408. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/blocking.py +0 -0
  409. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/client.py +0 -0
  410. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/compression.py +0 -0
  411. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/deadlines.py +0 -0
  412. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/errors.py +0 -0
  413. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/filters.py +0 -0
  414. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/guard.py +0 -0
  415. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/health.py +0 -0
  416. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/live.py +0 -0
  417. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/live_events.py +0 -0
  418. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/locale.py +0 -0
  419. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/metrics.py +0 -0
  420. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/middleware.py +0 -0
  421. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/openapi.py +0 -0
  422. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/pagination.py +0 -0
  423. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/ratelimit.py +0 -0
  424. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/responses.py +0 -0
  425. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/routing.py +0 -0
  426. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/servers.py +0 -0
  427. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/shedding.py +0 -0
  428. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/sse.py +0 -0
  429. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/redoc/LICENSE +0 -0
  430. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/redoc/redoc.standalone.js +0 -0
  431. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/redoc/redoc.standalone.js.LICENSE.txt +0 -0
  432. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/LICENSE +0 -0
  433. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/NOTICE +0 -0
  434. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-init.js +0 -0
  435. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js +0 -0
  436. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-ui-bundle.js.LICENSE.txt +0 -0
  437. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/static/swagger-ui/swagger-ui.css +0 -0
  438. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/uploads.py +0 -0
  439. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/versioning.py +0 -0
  440. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/http/websockets.py +0 -0
  441. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/__init__.py +0 -0
  442. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/catalogs.py +0 -0
  443. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/extraction.py +0 -0
  444. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/formats.py +0 -0
  445. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/locale/en/LC_MESSAGES/messages.mo +0 -0
  446. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/timezone.py +0 -0
  447. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/translation.py +0 -0
  448. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/i18n/validation.py +0 -0
  449. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/__init__.py +0 -0
  450. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/_http.py +0 -0
  451. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/aws.py +0 -0
  452. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/azure.py +0 -0
  453. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/gcp.py +0 -0
  454. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/huawei.py +0 -0
  455. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/pkcs11.py +0 -0
  456. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/ring.py +0 -0
  457. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/keys/vault.py +0 -0
  458. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/__init__.py +0 -0
  459. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/base.py +0 -0
  460. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/handler.py +0 -0
  461. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/immudb.py +0 -0
  462. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/memory.py +0 -0
  463. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/ledger/trust.py +0 -0
  464. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/lifecycle.py +0 -0
  465. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/log.py +0 -0
  466. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/__init__.py +0 -0
  467. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/actions.py +0 -0
  468. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/base.py +0 -0
  469. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/__init__.py +0 -0
  470. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/addcommand.py +0 -0
  471. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/addevent.py +0 -0
  472. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/addquery.py +0 -0
  473. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/broker.py +0 -0
  474. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/cache.py +0 -0
  475. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/check.py +0 -0
  476. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/compilemessages.py +0 -0
  477. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/dbshell.py +0 -0
  478. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/diffsettings.py +0 -0
  479. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/dumpdata.py +0 -0
  480. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/flush.py +0 -0
  481. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/init.py +0 -0
  482. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/inspectdb.py +0 -0
  483. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/loaddata.py +0 -0
  484. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/makemessages.py +0 -0
  485. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/makemigrations.py +0 -0
  486. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/migrate.py +0 -0
  487. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/openapi.py +0 -0
  488. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/partitions.py +0 -0
  489. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/runserver.py +0 -0
  490. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/seed.py +0 -0
  491. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/shell.py +0 -0
  492. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/showmigrations.py +0 -0
  493. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/squashmigrations.py +0 -0
  494. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/commands/startaggregate.py +0 -0
  495. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/operators.py +0 -0
  496. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/__init__.py-tpl +0 -0
  497. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/api/__init__.py-tpl +0 -0
  498. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/api/routes.py-tpl +0 -0
  499. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/__init__.py-tpl +0 -0
  500. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/commands.py-tpl +0 -0
  501. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/services.py-tpl +0 -0
  502. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/application/unit_of_work.py-tpl +0 -0
  503. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/apps.py-tpl +0 -0
  504. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/domain/__init__.py-tpl +0 -0
  505. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/domain/model.py-tpl +0 -0
  506. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/infrastructure/__init__.py-tpl +0 -0
  507. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/infrastructure/orm.py-tpl +0 -0
  508. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/package/infrastructure/unit_of_work.py-tpl +0 -0
  509. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/__init__.py-tpl +0 -0
  510. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/fakes.py-tpl +0 -0
  511. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/test_api.py-tpl +0 -0
  512. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/minimal/tests/test_services.py-tpl +0 -0
  513. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/__init__.py-tpl +0 -0
  514. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/api/__init__.py-tpl +0 -0
  515. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/api/routes.py-tpl +0 -0
  516. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/__init__.py-tpl +0 -0
  517. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/commands.py-tpl +0 -0
  518. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/handlers.py-tpl +0 -0
  519. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/services.py-tpl +0 -0
  520. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/application/unit_of_work.py-tpl +0 -0
  521. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/apps.py-tpl +0 -0
  522. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/domain/__init__.py-tpl +0 -0
  523. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/domain/events.py-tpl +0 -0
  524. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/domain/model.py-tpl +0 -0
  525. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/infrastructure/__init__.py-tpl +0 -0
  526. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/infrastructure/orm.py-tpl +0 -0
  527. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/package/infrastructure/unit_of_work.py-tpl +0 -0
  528. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/__init__.py-tpl +0 -0
  529. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/controllers.py-tpl +0 -0
  530. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/domain.py-tpl +0 -0
  531. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/models.py-tpl +0 -0
  532. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/package/routes.py-tpl +0 -0
  533. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/tests/__init__.py-tpl +0 -0
  534. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/tests/test_api.py-tpl +0 -0
  535. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/simple/tests/test_controllers.py-tpl +0 -0
  536. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/__init__.py-tpl +0 -0
  537. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/fakes.py-tpl +0 -0
  538. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/test_api.py-tpl +0 -0
  539. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/test_model.py-tpl +0 -0
  540. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/tests/test_services.py-tpl +0 -0
  541. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/package/__init__.py-tpl +0 -0
  542. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/package/models.py-tpl +0 -0
  543. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/tests/__init__.py-tpl +0 -0
  544. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/domain/user/tests/test_users.py-tpl +0 -0
  545. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/dot-github/workflows/ci.yml-tpl +0 -0
  546. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/pyproject.toml-tpl +0 -0
  547. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/rules.py-tpl +0 -0
  548. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/local.py-tpl +0 -0
  549. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/production.py-tpl +0 -0
  550. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/settings/test.py-tpl +0 -0
  551. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/config/urls.py-tpl +0 -0
  552. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/__init__.py-tpl +0 -0
  553. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/__init__.py-tpl +0 -0
  554. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/api/routes.py-tpl +0 -0
  555. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/__init__.py-tpl +0 -0
  556. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/commands.py-tpl +0 -0
  557. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/services.py-tpl +0 -0
  558. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/application/unit_of_work.py-tpl +0 -0
  559. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/apps.py-tpl +0 -0
  560. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/__init__.py-tpl +0 -0
  561. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/domain/model.py-tpl +0 -0
  562. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/__init__.py-tpl +0 -0
  563. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/orm.py-tpl +0 -0
  564. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/src/domains/payments/infrastructure/unit_of_work.py-tpl +0 -0
  565. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/conftest.py-tpl +0 -0
  566. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/payments/__init__.py-tpl +0 -0
  567. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_cards.py-tpl +0 -0
  568. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/payments/test_transfers.py-tpl +0 -0
  569. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/people.py-tpl +0 -0
  570. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/profiles/fintech/tests/test_controls.py-tpl +0 -0
  571. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-dockerignore-tpl +0 -0
  572. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-env-tpl +0 -0
  573. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-github/workflows/ci.yml-tpl +0 -0
  574. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/dot-gitignore-tpl +0 -0
  575. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/manage.py-tpl +0 -0
  576. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/pyproject.toml-tpl +0 -0
  577. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/__init__.py-tpl +0 -0
  578. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/asgi.py-tpl +0 -0
  579. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/__init__.py-tpl +0 -0
  580. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/local.py-tpl +0 -0
  581. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/production.py-tpl +0 -0
  582. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/settings/test.py-tpl +0 -0
  583. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/config/urls.py-tpl +0 -0
  584. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/src/domains/__init__.py-tpl +0 -0
  585. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/tests/__init__.py-tpl +0 -0
  586. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/management/templates/project/tests/test_health.py-tpl +0 -0
  587. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/money/__init__.py +0 -0
  588. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/money/iso4217.csv +0 -0
  589. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/py.typed +0 -0
  590. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/reporting.py +0 -0
  591. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/__init__.py +0 -0
  592. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/access.py +0 -0
  593. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/batches.py +0 -0
  594. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/conditional.py +0 -0
  595. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/events.py +0 -0
  596. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/policies.py +0 -0
  597. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/renderers.py +0 -0
  598. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/__init__.py +0 -0
  599. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/batching.py +0 -0
  600. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/commands.py +0 -0
  601. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/context.py +0 -0
  602. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/crud.py +0 -0
  603. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/declaring.py +0 -0
  604. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/listing.py +0 -0
  605. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/presenting.py +0 -0
  606. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/queries.py +0 -0
  607. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/reach.py +0 -0
  608. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/reading.py +0 -0
  609. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/routing/values.py +0 -0
  610. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/resources/schemas.py +0 -0
  611. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/__init__.py +0 -0
  612. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/_http.py +0 -0
  613. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/meilisearch.py +0 -0
  614. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/search/opensearch.py +0 -0
  615. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/signing.py +0 -0
  616. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/__init__.py +0 -0
  617. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/azure.py +0 -0
  618. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/base.py +0 -0
  619. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/filesystem.py +0 -0
  620. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/gcs.py +0 -0
  621. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/handler.py +0 -0
  622. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/images.py +0 -0
  623. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/memory.py +0 -0
  624. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/remote.py +0 -0
  625. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/s3.py +0 -0
  626. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/storage/scanning.py +0 -0
  627. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/tasks.py +0 -0
  628. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/tenancy.py +0 -0
  629. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/__init__.py +0 -0
  630. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/authenticators.py +0 -0
  631. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/blocking.py +0 -0
  632. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/clients.py +0 -0
  633. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/databases.py +0 -0
  634. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/factories.py +0 -0
  635. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/kms.py +0 -0
  636. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/live.py +0 -0
  637. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/testing/queries.py +0 -0
  638. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/tracing.py +0 -0
  639. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/__init__.py +0 -0
  640. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/closing.py +0 -0
  641. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/decimals.py +0 -0
  642. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/delivery.py +0 -0
  643. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/formatting.py +0 -0
  644. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/headers.py +0 -0
  645. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/loops.py +0 -0
  646. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/module_loading.py +0 -0
  647. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/rates.py +0 -0
  648. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/readiness.py +0 -0
  649. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/redis_urls.py +0 -0
  650. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/text.py +0 -0
  651. {domainkit-1.7.1 → domainkit-2.0.0}/src/domainkit/utils/unset.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: domainkit
3
- Version: 1.7.1
3
+ Version: 2.0.0
4
4
  Summary: A Django-style framework for domain-driven FastAPI services.
5
5
  License-Expression: MIT
6
6
  License-File: LICENSE
@@ -100,8 +100,8 @@ Requires-Dist: starlette (>=1.8.0,<2.0.0)
100
100
  Requires-Dist: tzdata (>=2025.2) ; extra == "tzdata"
101
101
  Requires-Dist: uvicorn[standard] (>=0.54.0,<1.0.0)
102
102
  Requires-Dist: uvloop (>=0.23.0,<1.0.0) ; (sys_platform != "win32") and (extra == "uvloop")
103
- Project-URL: Changelog, https://github.com/karimmattar/domainkit/blob/v1.7.1/CHANGELOG.md
104
- Project-URL: Documentation, https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/reference.md
103
+ Project-URL: Changelog, https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md
104
+ Project-URL: Documentation, https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md
105
105
  Project-URL: Homepage, https://github.com/karimmattar/domainkit
106
106
  Project-URL: Issues, https://github.com/karimmattar/domainkit/issues
107
107
  Description-Content-Type: text/markdown
@@ -169,71 +169,71 @@ the pages of that release's tag; on GitHub, `main` describes the next
169
169
  release, and a release's pages are under its tag
170
170
  (`https://github.com/karimmattar/domainkit/tree/vX.Y.Z/docs`).
171
171
 
172
- - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/tutorial.md): getting started, in five
172
+ - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md): getting started, in five
173
173
  parts: a first resource, rules, permissions, events and the worker, and
174
174
  tests and production; every command and code change run in CI
175
- - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/operations.md): running in production:
175
+ - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/operations.md): running in production:
176
176
  processes, configuration, sizing, migrations in a rollout, the worker,
177
- sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/runbook.md)
178
- for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/security.md) the hardening
179
- checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/upgrading.md) from one version
177
+ sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runbook.md)
178
+ for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/security.md) the hardening
179
+ checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/upgrading.md) from one version
180
180
  to the next, and from 0.12 to 1.0
181
181
 
182
- - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/reference.md): settings, deployment checks,
182
+ - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md): settings, deployment checks,
183
183
  middleware, errors, the API surface (OpenAPI, versions, deprecations),
184
184
  observability, testing, commands, and extension points, a page for each
185
- - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/databases.md): several databases, routing,
185
+ - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/databases.md): several databases, routing,
186
186
  sharding, partitioning, and ledgers
187
- - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/queries.md): querying repositories,
187
+ - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/queries.md): querying repositories,
188
188
  pages, filters, soft delete, row locks, and savepoints
189
- - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/resources.md): aggregates over REST:
189
+ - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/resources.md): aggregates over REST:
190
190
  resource routes, commands and queries, derived schemas, partial changes,
191
191
  ETags and conditional writes, field policies, nesting, the generators,
192
192
  and the generic admin
193
- - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/runtime.md): how async work runs
193
+ - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runtime.md): how async work runs
194
194
  (event loops, background tasks, clean contexts, logging off the loop,
195
195
  finding blocking code, free-threaded Python, the shutdown budget,
196
196
  readiness, event-handler timeouts, workers and the outbox), running under
197
197
  load (request deadlines, load shedding, database timeouts and PgBouncer,
198
198
  outgoing HTTP calls), and servers
199
- - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/cache.md): caches in memory, Redis, and Valkey,
199
+ - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/cache.md): caches in memory, Redis, and Valkey,
200
200
  and shared rate limits
201
- - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/money.md): amounts, currencies, rounding, and
201
+ - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/money.md): amounts, currencies, rounding, and
202
202
  allocation, and money in tables, queries, and schemas
203
- - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/contrib.md): messaging (and workers on RabbitMQ),
203
+ - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/contrib.md): messaging (and workers on RabbitMQ),
204
204
  webhooks, audit and records' history, idempotency, evidence, feature
205
205
  flags, keys and encrypted fields, the double-entry ledger, approvals,
206
206
  and limits
207
- - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/auth.md): users, groups, permissions, content
207
+ - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md): users, groups, permissions, content
208
208
  types, passwords, backends, tokens, route rules, and the admin API
209
- - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/mail.md): email, mail templates, text messages,
209
+ - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/mail.md): email, mail templates, text messages,
210
210
  and push notifications, sent through the outbox
211
- - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/i18n.md): responses in the caller's language,
211
+ - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/i18n.md): responses in the caller's language,
212
212
  time zones, and number and date formats
213
- - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/uploads.md): file storages, receiving uploads,
213
+ - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/uploads.md): file storages, receiving uploads,
214
214
  and serving files
215
- - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/live.md): WebSockets and Server-Sent Events,
215
+ - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/live.md): WebSockets and Server-Sent Events,
216
216
  bounded and re-authorized while open, and committed events streamed live
217
- - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/privacy.md): exporting and erasing a person's
217
+ - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/privacy.md): exporting and erasing a person's
218
218
  data, and retention
219
- - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/testing.md): the pytest plugin: test databases,
219
+ - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/testing.md): the pytest plugin: test databases,
220
220
  sync and async clients, factories, a clock to freeze, and query counts
221
- - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/performance.md): what a request costs, the
221
+ - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md): what a request costs, the
222
222
  benchmark ladder CI gates on, and how to make requests cheaper
223
- - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/versioning.md): compatibility, deprecations,
223
+ - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md): compatibility, deprecations,
224
224
  releases, and which releases get security fixes
225
- - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/threat-model.md): what domainkit protects,
225
+ - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/threat-model.md): what domainkit protects,
226
226
  where the trust boundaries are, what it does at each, and what is left to
227
227
  a project
228
- - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/fintech.md): a bank's first review, answered: each
228
+ - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/fintech.md): a bank's first review, answered: each
229
229
  control's page, setting, and test, and `domainkit init --profile fintech`,
230
230
  a project with them all on and wired
231
- - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/audit/0.9.0.md): the 0.9.0 audit's findings
231
+ - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/audit/0.9.0.md): the 0.9.0 audit's findings
232
232
  that the CHANGELOG names, with their status
233
- - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/api.md): the public API, module by module, one line a name;
233
+ - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/api.md): the public API, module by module, one line a name;
234
234
  `mkdocs.yml` builds these pages into a site, with every name's docstring
235
235
  - [docs/adr/](https://github.com/karimmattar/domainkit/tree/main/docs/adr): the decisions behind the design
236
- - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/SECURITY.md)
236
+ - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/SECURITY.md)
237
237
 
238
238
  ## Quick start
239
239
 
@@ -261,7 +261,7 @@ shell history:
261
261
 
262
262
  ```bash
263
263
  read -rsp "Password: " PASSWORD && export PASSWORD
264
- TOKEN=$(python -c "import json, os; print(json.dumps({'username': 'admin', 'password': os.environ['PASSWORD']}))" \
264
+ TOKEN=$(python -c "import json, os; print(json.dumps({'identifier': 'admin@example.com', 'password': os.environ['PASSWORD']}))" \
265
265
  | curl -s http://127.0.0.1:8000/auth/login -H "Content-Type: application/json" -d @- \
266
266
  | python -c "import json, sys; print(json.load(sys.stdin)['access_token'])")
267
267
  unset PASSWORD
@@ -279,7 +279,7 @@ grow it. Without `--minimal`, `startdomain` writes a fuller example (notes
279
279
  as child entities, an owner, events and a handler, filters); the tutorial
280
280
  starts from that one. A route the caller may not reach answers 404, as an unknown path does,
281
281
  so check the path first (`/docs` lists every route). `createsuperuser`
282
- without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/tutorial.md)
282
+ without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md)
283
283
  goes on from here, in six parts from a first route: rules written by
284
284
  hand, permissions, events run by the worker, and tests.
285
285
 
@@ -287,7 +287,7 @@ hand, permissions, events run by the worker, and tests.
287
287
  Users, groups, and permissions are installed, requests are authenticated,
288
288
  and every route must say who may call it: generated domains need their
289
289
  model permissions, and `/auth` and `/admin/auth` log users in and manage
290
- them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/auth.md)).
290
+ them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md)).
291
291
 
292
292
 
293
293
  ```text
@@ -319,13 +319,13 @@ also turn the API docs off, send HSTS for a year, and limit each caller to
319
319
 
320
320
  Serve it with one worker process per core, each on its own event loop:
321
321
  `uvicorn config.asgi:application --workers 4 --loop uvloop`, or Granian
322
- (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/reference/servers.md)
323
- gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/performance.md)
322
+ (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference/servers.md)
323
+ gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md)
324
324
  how many cores a load needs.
325
325
 
326
326
  ## Developing domainkit
327
327
 
328
- [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/CONTRIBUTING.md)
328
+ [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CONTRIBUTING.md)
329
329
  says how to set up, which checks a change must pass, and how to write it
330
330
  up. In short:
331
331
 
@@ -375,9 +375,9 @@ not the whole suite. A release reuses the run of its commit's push to
375
375
  A full mutation testing run happens weekly, in 17 shards that run side by
376
376
  side; each writes its score and the mutants no test caught to its job
377
377
  summary. Releases are published to PyPI
378
- from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/versioning.md).
378
+ from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md).
379
379
 
380
380
  ## License
381
381
 
382
- MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v1.7.1/LICENSE).
382
+ MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.0.0/LICENSE).
383
383
 
@@ -61,71 +61,71 @@ the pages of that release's tag; on GitHub, `main` describes the next
61
61
  release, and a release's pages are under its tag
62
62
  (`https://github.com/karimmattar/domainkit/tree/vX.Y.Z/docs`).
63
63
 
64
- - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/tutorial.md): getting started, in five
64
+ - [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md): getting started, in five
65
65
  parts: a first resource, rules, permissions, events and the worker, and
66
66
  tests and production; every command and code change run in CI
67
- - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/operations.md): running in production:
67
+ - [docs/operations.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/operations.md): running in production:
68
68
  processes, configuration, sizing, migrations in a rollout, the worker,
69
- sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/runbook.md)
70
- for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/security.md) the hardening
71
- checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/upgrading.md) from one version
69
+ sealing, backups, and what to alert on; [docs/runbook.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runbook.md)
70
+ for each alarm, [docs/security.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/security.md) the hardening
71
+ checklist, and [docs/upgrading.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/upgrading.md) from one version
72
72
  to the next, and from 0.12 to 1.0
73
73
 
74
- - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/reference.md): settings, deployment checks,
74
+ - [docs/reference.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md): settings, deployment checks,
75
75
  middleware, errors, the API surface (OpenAPI, versions, deprecations),
76
76
  observability, testing, commands, and extension points, a page for each
77
- - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/databases.md): several databases, routing,
77
+ - [docs/databases.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/databases.md): several databases, routing,
78
78
  sharding, partitioning, and ledgers
79
- - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/queries.md): querying repositories,
79
+ - [docs/queries.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/queries.md): querying repositories,
80
80
  pages, filters, soft delete, row locks, and savepoints
81
- - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/resources.md): aggregates over REST:
81
+ - [docs/resources.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/resources.md): aggregates over REST:
82
82
  resource routes, commands and queries, derived schemas, partial changes,
83
83
  ETags and conditional writes, field policies, nesting, the generators,
84
84
  and the generic admin
85
- - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/runtime.md): how async work runs
85
+ - [docs/runtime.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/runtime.md): how async work runs
86
86
  (event loops, background tasks, clean contexts, logging off the loop,
87
87
  finding blocking code, free-threaded Python, the shutdown budget,
88
88
  readiness, event-handler timeouts, workers and the outbox), running under
89
89
  load (request deadlines, load shedding, database timeouts and PgBouncer,
90
90
  outgoing HTTP calls), and servers
91
- - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/cache.md): caches in memory, Redis, and Valkey,
91
+ - [docs/cache.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/cache.md): caches in memory, Redis, and Valkey,
92
92
  and shared rate limits
93
- - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/money.md): amounts, currencies, rounding, and
93
+ - [docs/money.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/money.md): amounts, currencies, rounding, and
94
94
  allocation, and money in tables, queries, and schemas
95
- - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/contrib.md): messaging (and workers on RabbitMQ),
95
+ - [docs/contrib.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/contrib.md): messaging (and workers on RabbitMQ),
96
96
  webhooks, audit and records' history, idempotency, evidence, feature
97
97
  flags, keys and encrypted fields, the double-entry ledger, approvals,
98
98
  and limits
99
- - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/auth.md): users, groups, permissions, content
99
+ - [docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md): users, groups, permissions, content
100
100
  types, passwords, backends, tokens, route rules, and the admin API
101
- - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/mail.md): email, mail templates, text messages,
101
+ - [docs/mail.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/mail.md): email, mail templates, text messages,
102
102
  and push notifications, sent through the outbox
103
- - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/i18n.md): responses in the caller's language,
103
+ - [docs/i18n.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/i18n.md): responses in the caller's language,
104
104
  time zones, and number and date formats
105
- - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/uploads.md): file storages, receiving uploads,
105
+ - [docs/uploads.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/uploads.md): file storages, receiving uploads,
106
106
  and serving files
107
- - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/live.md): WebSockets and Server-Sent Events,
107
+ - [docs/live.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/live.md): WebSockets and Server-Sent Events,
108
108
  bounded and re-authorized while open, and committed events streamed live
109
- - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/privacy.md): exporting and erasing a person's
109
+ - [docs/privacy.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/privacy.md): exporting and erasing a person's
110
110
  data, and retention
111
- - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/testing.md): the pytest plugin: test databases,
111
+ - [docs/testing.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/testing.md): the pytest plugin: test databases,
112
112
  sync and async clients, factories, a clock to freeze, and query counts
113
- - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/performance.md): what a request costs, the
113
+ - [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md): what a request costs, the
114
114
  benchmark ladder CI gates on, and how to make requests cheaper
115
- - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/versioning.md): compatibility, deprecations,
115
+ - [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md): compatibility, deprecations,
116
116
  releases, and which releases get security fixes
117
- - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/threat-model.md): what domainkit protects,
117
+ - [docs/threat-model.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/threat-model.md): what domainkit protects,
118
118
  where the trust boundaries are, what it does at each, and what is left to
119
119
  a project
120
- - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/fintech.md): a bank's first review, answered: each
120
+ - [docs/fintech.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/fintech.md): a bank's first review, answered: each
121
121
  control's page, setting, and test, and `domainkit init --profile fintech`,
122
122
  a project with them all on and wired
123
- - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/audit/0.9.0.md): the 0.9.0 audit's findings
123
+ - [docs/audit/0.9.0.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/audit/0.9.0.md): the 0.9.0 audit's findings
124
124
  that the CHANGELOG names, with their status
125
- - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/api.md): the public API, module by module, one line a name;
125
+ - [docs/api.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/api.md): the public API, module by module, one line a name;
126
126
  `mkdocs.yml` builds these pages into a site, with every name's docstring
127
127
  - [docs/adr/](https://github.com/karimmattar/domainkit/tree/main/docs/adr): the decisions behind the design
128
- - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/SECURITY.md)
128
+ - [CHANGELOG.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md) and [SECURITY.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/SECURITY.md)
129
129
 
130
130
  ## Quick start
131
131
 
@@ -153,7 +153,7 @@ shell history:
153
153
 
154
154
  ```bash
155
155
  read -rsp "Password: " PASSWORD && export PASSWORD
156
- TOKEN=$(python -c "import json, os; print(json.dumps({'username': 'admin', 'password': os.environ['PASSWORD']}))" \
156
+ TOKEN=$(python -c "import json, os; print(json.dumps({'identifier': 'admin@example.com', 'password': os.environ['PASSWORD']}))" \
157
157
  | curl -s http://127.0.0.1:8000/auth/login -H "Content-Type: application/json" -d @- \
158
158
  | python -c "import json, sys; print(json.load(sys.stdin)['access_token'])")
159
159
  unset PASSWORD
@@ -171,7 +171,7 @@ grow it. Without `--minimal`, `startdomain` writes a fuller example (notes
171
171
  as child entities, an owner, events and a handler, filters); the tutorial
172
172
  starts from that one. A route the caller may not reach answers 404, as an unknown path does,
173
173
  so check the path first (`/docs` lists every route). `createsuperuser`
174
- without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/tutorial.md)
174
+ without options asks for each value instead. [docs/tutorial.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/tutorial.md)
175
175
  goes on from here, in six parts from a first route: rules written by
176
176
  hand, permissions, events run by the worker, and tests.
177
177
 
@@ -179,7 +179,7 @@ hand, permissions, events run by the worker, and tests.
179
179
  Users, groups, and permissions are installed, requests are authenticated,
180
180
  and every route must say who may call it: generated domains need their
181
181
  model permissions, and `/auth` and `/admin/auth` log users in and manage
182
- them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/auth.md)).
182
+ them ([docs/auth.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/auth.md)).
183
183
 
184
184
 
185
185
  ```text
@@ -211,13 +211,13 @@ also turn the API docs off, send HSTS for a year, and limit each caller to
211
211
 
212
212
  Serve it with one worker process per core, each on its own event loop:
213
213
  `uvicorn config.asgi:application --workers 4 --loop uvloop`, or Granian
214
- (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/reference/servers.md)
215
- gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/performance.md)
214
+ (`pip install 'domainkit[granian]'`). [docs/reference/servers.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference/servers.md)
215
+ gives the whole command with its limits, and [docs/performance.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/performance.md)
216
216
  how many cores a load needs.
217
217
 
218
218
  ## Developing domainkit
219
219
 
220
- [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/CONTRIBUTING.md)
220
+ [CONTRIBUTING.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/CONTRIBUTING.md)
221
221
  says how to set up, which checks a change must pass, and how to write it
222
222
  up. In short:
223
223
 
@@ -267,8 +267,8 @@ not the whole suite. A release reuses the run of its commit's push to
267
267
  A full mutation testing run happens weekly, in 17 shards that run side by
268
268
  side; each writes its score and the mutants no test caught to its job
269
269
  summary. Releases are published to PyPI
270
- from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/versioning.md).
270
+ from a version tag; see [docs/versioning.md](https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/versioning.md).
271
271
 
272
272
  ## License
273
273
 
274
- MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v1.7.1/LICENSE).
274
+ MIT; see [LICENSE](https://github.com/karimmattar/domainkit/blob/v2.0.0/LICENSE).
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "domainkit"
3
- version = "1.7.1"
3
+ version = "2.0.0"
4
4
  description = "A Django-style framework for domain-driven FastAPI services."
5
5
  readme = "README.md"
6
6
  license = "MIT"
@@ -148,8 +148,8 @@ domainkit = "domainkit.management:execute_from_command_line"
148
148
 
149
149
  [project.urls]
150
150
  Homepage = "https://github.com/karimmattar/domainkit"
151
- Documentation = "https://github.com/karimmattar/domainkit/blob/v1.7.1/docs/reference.md"
152
- Changelog = "https://github.com/karimmattar/domainkit/blob/v1.7.1/CHANGELOG.md"
151
+ Documentation = "https://github.com/karimmattar/domainkit/blob/v2.0.0/docs/reference.md"
152
+ Changelog = "https://github.com/karimmattar/domainkit/blob/v2.0.0/CHANGELOG.md"
153
153
  Issues = "https://github.com/karimmattar/domainkit/issues"
154
154
 
155
155
  [build-system]
@@ -1543,7 +1543,7 @@ class Settings(BaseModel):
1543
1543
  if self.SECRET_KEY is None:
1544
1544
  yield CheckMessage(
1545
1545
  "security.E016",
1546
- f"SECRET_KEY is required {where}: it signs reset links, cookies, "
1546
+ f"SECRET_KEY is required {where}: it signs cookies, codes, "
1547
1547
  "and other values the service hands out",
1548
1548
  "Make one with: python -c 'import secrets; "
1549
1549
  "print(secrets.token_urlsafe(64))'.",
@@ -129,5 +129,10 @@ class AuditConfig(DomainConfig):
129
129
  await write(uow.session, event_rows(events, config))
130
130
 
131
131
  def databases(self, router: DatabaseRouter) -> frozenset[str]:
132
- """Every hosting target: events are audited where they commit."""
133
- return frozenset(router.hosting_targets())
132
+ """Every hosting target, where events are audited as they commit.
133
+
134
+ And ``AUDIT.DATABASE``, which keeps the explicit records and the
135
+ ledger states, when no domain lives there.
136
+ """
137
+ config = registry.settings(AuditSettings)
138
+ return frozenset({*router.hosting_targets(), config.DATABASE})
@@ -7,16 +7,17 @@ that seals on a schedule (the worker, with ``domainkit.contrib.messaging``,
7
7
  or ``audit seal`` from cron, ``AUDIT.SEALED_EXTERNALLY``), and the
8
8
  ``protect()`` triggers on PostgreSQL. ``check`` lists the settings that
9
9
  are missing; the application, when it starts, also asks each audited
10
- PostgreSQL database for the triggers. With ``AUDIT.REQUIRE_BASELINE``, the
11
- default since 0.10, both refuse: each problem is an error (``audit.E001`` to
12
- ``audit.E005``), which ``SILENCED_CHECKS`` cannot silence. A project that sets
13
- it to False gets the same problems as warnings (``audit.W001`` to
14
- ``audit.W005``), as in 0.9.
10
+ PostgreSQL database for the triggers, in its own schema and in each
11
+ tenant's schema that holds a trail (``TENANCY.SCHEMA_DATABASES``). With
12
+ ``AUDIT.REQUIRE_BASELINE``, the default since 0.10, both refuse: each
13
+ problem is an error (``audit.E001`` to ``audit.E005``), which
14
+ ``SILENCED_CHECKS`` cannot silence. A project that sets it to False gets
15
+ the same problems as warnings (``audit.W001`` to ``audit.W005``), as in 0.9.
15
16
  """
16
17
 
17
18
  import asyncio
18
19
  import logging
19
- from typing import Final
20
+ from typing import Any, Final
20
21
 
21
22
  from sqlalchemy import text
22
23
  from sqlalchemy.exc import SQLAlchemyError
@@ -26,6 +27,7 @@ from domainkit.checks import CheckFailed, CheckMessage
26
27
  from domainkit.conf import settings
27
28
  from domainkit.conf.global_settings import DEPLOYED_ENVIRONMENTS
28
29
  from domainkit.db import connections
30
+ from domainkit.db.uow import tenant_schemas
29
31
 
30
32
  from .personal import audited_databases
31
33
  from .protection import ROW_TRIGGER, TRUNCATE_TRIGGER, function_body, trigger_names
@@ -48,6 +50,28 @@ _TRIGGERS: Final = text(
48
50
  )
49
51
  """The triggers on the trail and its seals, as ``search_path`` finds them,
50
52
  with what decides whether they fire and what they run."""
53
+ _OWN_TRAIL: Final = text("SELECT to_regclass(:log)")
54
+ """The connection's own schema's trail, if it holds one."""
55
+ _TENANT_TRAILS: Final = text(
56
+ "SELECT n.nspname FROM pg_class AS c "
57
+ "JOIN pg_namespace AS n ON n.oid = c.relnamespace "
58
+ "WHERE c.relname = :log AND n.nspname = ANY(:schemas)"
59
+ )
60
+ """The tenant schemas, of those named, that hold an audit trail."""
61
+ _TENANT_TRIGGERS: Final = text(
62
+ "SELECT n.nspname, c.relname, t.tgname, t.tgenabled::text AS enabled, "
63
+ "t.tgtype, "
64
+ "t.tgqual IS NULL AND t.tgnargs = 0 AND cardinality(t.tgattr::int2[]) = 0 "
65
+ "AS plain, p.proname, p.prosrc, l.lanname "
66
+ "FROM pg_trigger AS t "
67
+ "JOIN pg_class AS c ON c.oid = t.tgrelid "
68
+ "JOIN pg_namespace AS n ON n.oid = c.relnamespace "
69
+ "JOIN pg_proc AS p ON p.oid = t.tgfoid "
70
+ "JOIN pg_language AS l ON l.oid = p.prolang "
71
+ "WHERE c.relname IN (:log, :seals) AND n.nspname = ANY(:schemas) "
72
+ "AND NOT t.tgisinternal"
73
+ )
74
+ """The same triggers in every tenant schema named, in one round trip."""
51
75
  FIRING: Final = frozenset({"O", "A"})
52
76
  """``tgenabled`` of a trigger that fires for the application's sessions.
53
77
 
@@ -132,24 +156,76 @@ async def missing_triggers(database: str) -> list[str]:
132
156
  same events, for each row or statement, with no ``WHEN``, columns, or
133
157
  arguments, and running the plpgsql function ``protect()`` writes, its
134
158
  body the same but for whitespace. None on databases other than
135
- PostgreSQL: ``protect()`` does nothing there.
159
+ PostgreSQL: ``protect()`` does nothing there. None either on a database
160
+ that keeps a schema per tenant and holds no trail of its own: plain
161
+ ``migrate`` leaves its own schema out (``missing_in_tenant_trails``).
136
162
  """
163
+ tenancy = settings.TENANCY
164
+ per_tenant = tenancy is not None and database in tenancy.SCHEMA_DATABASES
137
165
  async with connections.engine(database).connect() as connection:
138
166
  if connection.dialect.name != "postgresql":
139
167
  return []
168
+ if (
169
+ per_tenant
170
+ and await connection.scalar(_OWN_TRAIL, {"log": audit_log.name}) is None
171
+ ):
172
+ return []
140
173
  found = await connection.execute(
141
174
  _TRIGGERS, {"log": audit_log.name, "seals": audit_seals.name}
142
175
  )
176
+ present = {(row.relname, row.tgname) for row in found if _as_protect_made(row)}
177
+ return sorted(name for table, name in PROTECTED.keys() - present)
178
+
179
+
180
+ async def missing_in_tenant_trails(database: str) -> dict[str, list[str]]:
181
+ """The ``protect()`` triggers each tenant's trail of ``database`` lacks.
182
+
183
+ By trail (``<alias>/<schema>``), for each tenant schema that holds an
184
+ audit trail; empty where the database keeps no schema per tenant. Two
185
+ round trips, however many tenants there are.
186
+ """
187
+ tenants = [schema for schema in await tenant_schemas(database) if schema]
188
+ if not tenants:
189
+ return {}
190
+ async with connections.engine(database).connect() as connection:
191
+ trails = set(
192
+ (
193
+ await connection.execute(
194
+ _TENANT_TRAILS, {"log": audit_log.name, "schemas": tenants}
195
+ )
196
+ ).scalars()
197
+ )
198
+ found = await connection.execute(
199
+ _TENANT_TRIGGERS,
200
+ {"log": audit_log.name, "seals": audit_seals.name, "schemas": tenants},
201
+ )
143
202
  present = {
144
- (row.relname, row.tgname)
203
+ (row.nspname, row.relname, row.tgname)
145
204
  for row in found
146
- if row.enabled in FIRING
147
- and row.plain
148
- and row.lanname == "plpgsql"
149
- and PROTECTED.get((row.relname, row.tgname))
150
- == (row.tgtype, row.proname, " ".join(row.prosrc.split()))
205
+ if _as_protect_made(row)
151
206
  }
152
- return sorted(name for table, name in PROTECTED.keys() - present)
207
+ return {
208
+ f"{database}/{schema}": missing
209
+ for schema in sorted(trails)
210
+ if (
211
+ missing := sorted(
212
+ name
213
+ for table, name in PROTECTED
214
+ if (schema, table, name) not in present
215
+ )
216
+ )
217
+ }
218
+
219
+
220
+ def _as_protect_made(row: Any) -> bool: # noqa: ANN401 - a row of either query.
221
+ """Whether a trigger fires, and runs, as ``protect()`` made it."""
222
+ return bool(
223
+ row.enabled in FIRING
224
+ and row.plain
225
+ and row.lanname == "plpgsql"
226
+ and PROTECTED.get((row.relname, row.tgname))
227
+ == (row.tgtype, row.proname, " ".join(row.prosrc.split()))
228
+ )
153
229
 
154
230
 
155
231
  async def protection_problems() -> list[str]:
@@ -159,6 +235,8 @@ async def protection_problems() -> list[str]:
159
235
  try:
160
236
  async with asyncio.timeout(PROBE_TIMEOUT):
161
237
  missing = await missing_triggers(database)
238
+ by_trail = {database: missing} if missing else {}
239
+ by_trail |= await missing_in_tenant_trails(database)
162
240
  except (SQLAlchemyError, OSError, TimeoutError) as exc:
163
241
  problems.append(
164
242
  _problem(
@@ -169,18 +247,29 @@ async def protection_problems() -> list[str]:
169
247
  )
170
248
  )
171
249
  continue
172
- if missing:
173
- problems.append(
174
- _problem(
175
- 5,
176
- f"The audit trail in {database!r} is not append-only: triggers "
177
- f"{', '.join(missing)} are missing, disabled, or changed. Run "
178
- "'manage.py migrate', which makes them.",
179
- )
250
+ problems.extend(
251
+ _problem(
252
+ 5,
253
+ f"The audit trail in {trail!r} is not append-only: triggers "
254
+ f"{', '.join(lacking)} are missing, disabled, or changed. Run "
255
+ f"'manage.py {_migrate(trail)}', which makes them.",
180
256
  )
257
+ for trail, lacking in by_trail.items()
258
+ )
181
259
  return problems
182
260
 
183
261
 
262
+ def _migrate(trail: str) -> str:
263
+ """The command that makes a trail's triggers: a tenant's is migrated as it."""
264
+ _, _, schema = trail.partition("/")
265
+ config = settings.TENANCY
266
+ if not schema or config is None:
267
+ return "migrate"
268
+ prefix, _, suffix = config.SCHEMA.partition("{tenant}")
269
+ tenant = schema.removeprefix(prefix).removesuffix(suffix)
270
+ return f"migrate --tenant {tenant}"
271
+
272
+
184
273
  async def check_at_startup() -> None:
185
274
  """Warn, or refuse with ``AUDIT.REQUIRE_BASELINE``, in staging and production.
186
275
 
@@ -262,17 +262,19 @@ class Command(ActionCommand):
262
262
  before = clock.now() - timedelta(days=keep_days)
263
263
  async with self.recorded("auditprune", keep_days=keep_days) as record:
264
264
  record["rows"] = 0
265
- for alias in (database,) if database else audited_databases():
265
+ aliases = (database,) if database else audited_databases()
266
+ for alias, schema in await trails(aliases):
266
267
  try:
267
- pruned = await prune(alias, before=before, ledger=ledger)
268
+ with in_trail(schema):
269
+ pruned = await prune(alias, before=before, ledger=ledger)
268
270
  except PruneRefused as exc:
269
271
  raise CommandError(str(exc)) from None
270
272
  record["rows"] = int(str(record["rows"])) + pruned.rows
271
273
  if pruned.checkpoint is None:
272
- self.write(f"{alias}: nothing to prune.")
274
+ self.write(f"{pruned.database}: nothing to prune.")
273
275
  else:
274
276
  self.write(
275
- f"{alias}: pruned {pruned.rows} "
277
+ f"{pruned.database}: pruned {pruned.rows} "
276
278
  f"row{'' if pruned.rows == 1 else 's'} below seal "
277
279
  f"#{pruned.checkpoint.seq}."
278
280
  )