accrete 0.0.124__tar.gz → 0.0.126__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 (266) hide show
  1. {accrete-0.0.124 → accrete-0.0.126}/PKG-INFO +1 -1
  2. {accrete-0.0.124 → accrete-0.0.126}/accrete/admin.py +4 -3
  3. {accrete-0.0.124 → accrete-0.0.126}/accrete/config.py +5 -0
  4. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/helper.py +1 -1
  5. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/forms.py +2 -1
  6. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/models.py +1 -0
  7. accrete-0.0.126/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +42 -0
  8. {accrete-0.0.124 → accrete-0.0.126}/accrete/models.py +10 -19
  9. {accrete-0.0.124 → accrete-0.0.126}/accrete/tenant.py +13 -0
  10. {accrete-0.0.124 → accrete-0.0.126}/accrete/utils/forms.py +9 -2
  11. {accrete-0.0.124 → accrete-0.0.126}/accrete/views.py +60 -1
  12. {accrete-0.0.124 → accrete-0.0.126}/pyproject.toml +1 -1
  13. {accrete-0.0.124 → accrete-0.0.126}/.gitignore +0 -0
  14. {accrete-0.0.124 → accrete-0.0.126}/LICENSE +0 -0
  15. {accrete-0.0.124 → accrete-0.0.126}/README.md +0 -0
  16. {accrete-0.0.124 → accrete-0.0.126}/accrete/__init__.py +0 -0
  17. {accrete-0.0.124 → accrete-0.0.126}/accrete/apps.py +0 -0
  18. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/__init__.py +0 -0
  19. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/__init__.py +0 -0
  20. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/admin.py +0 -0
  21. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/apps.py +0 -0
  22. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  23. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  24. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  25. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/migrations/__init__.py +0 -0
  26. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/country/models.py +0 -0
  27. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/__init__.py +0 -0
  28. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/admin.py +0 -0
  29. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/apps.py +0 -0
  30. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/config.py +0 -0
  31. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  32. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  33. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  34. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  35. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  36. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/migrations/__init__.py +0 -0
  37. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/models.py +0 -0
  38. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/queries.py +0 -0
  39. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/signals.py +0 -0
  40. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/tests.py +0 -0
  41. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/log/views.py +0 -0
  42. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/__init__.py +0 -0
  43. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/admin.py +0 -0
  44. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/apps.py +0 -0
  45. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/forms.py +0 -0
  46. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  47. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  48. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  49. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  50. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/models.py +0 -0
  51. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/queries.py +0 -0
  52. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/tests.py +0 -0
  53. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/sequence/views.py +0 -0
  54. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/__init__.py +0 -0
  55. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/admin.py +0 -0
  56. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/apps.py +0 -0
  57. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  58. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  59. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/models.py +0 -0
  60. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/tasks.py +0 -0
  61. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/tests.py +0 -0
  62. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/system_mail/views.py +0 -0
  63. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/__init__.py +0 -0
  64. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/admin.py +0 -0
  65. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/apps.py +0 -0
  66. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/context.py +0 -0
  67. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/filter.py +0 -0
  68. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/middleware.py +0 -0
  69. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/migrations/__init__.py +0 -0
  70. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/models.py +0 -0
  71. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  72. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/README.md +0 -0
  73. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  74. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  75. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  76. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  77. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  78. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  79. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  80. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  81. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  82. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  83. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  84. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  85. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  86. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  87. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  88. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  89. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/package.json +0 -0
  90. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  91. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  92. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  93. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  94. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  95. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  96. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  97. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  98. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  99. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  100. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  101. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  102. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  103. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  104. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  105. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  106. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  107. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  108. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  109. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  110. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  111. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  112. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  113. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  114. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  115. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  116. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  117. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  118. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  119. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  120. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  121. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  122. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  123. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  124. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  125. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  126. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  127. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  128. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  129. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  130. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  131. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  132. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  133. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  134. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  135. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  136. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  137. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  138. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  139. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  140. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  141. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  142. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  143. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  144. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  145. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  146. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  147. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  148. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  149. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  150. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  151. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  152. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  153. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  154. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  155. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  156. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  157. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  158. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  159. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  160. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  161. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  162. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  163. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  164. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  165. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  166. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  167. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/css/.sass-cache/15adf1eed05371361b08787c918a7f18fc15be79/accrete.scssc +0 -0
  168. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/css/accrete.css +0 -0
  169. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/css/accrete.css.map +0 -0
  170. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/css/accrete.scss +0 -0
  171. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/css/fa.css +0 -0
  172. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/css/icons.css +0 -0
  173. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  174. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  175. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/js/alpine-sort3.14.1.js +0 -0
  176. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/js/alpine3.14.1.js +0 -0
  177. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/js/filter.js +0 -0
  178. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  179. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  180. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  181. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  182. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  183. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  184. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  185. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  186. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  187. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  188. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  189. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  190. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  191. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
  192. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  193. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  194. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  195. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
  196. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
  197. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  198. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  199. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  200. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
  201. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/form_error.html +0 -0
  202. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/layout.html +0 -0
  203. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/list.html +0 -0
  204. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
  205. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/message.html +0 -0
  206. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/modal.html +0 -0
  207. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/oob.html +0 -0
  208. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/table.html +0 -0
  209. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
  210. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +0 -0
  211. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +0 -0
  212. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  213. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templatetags/__init__.py +0 -0
  214. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/templatetags/ui.py +0 -0
  215. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/tests.py +0 -0
  216. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/urls.py +0 -0
  217. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/views.py +0 -0
  218. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/widgets/__init__.py +0 -0
  219. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/ui/widgets/search_select.py +0 -0
  220. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/__init__.py +0 -0
  221. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/admin.py +0 -0
  222. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/apps.py +0 -0
  223. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/forms.py +0 -0
  224. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  225. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  226. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/middleware.py +0 -0
  227. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  228. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  229. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/migrations/__init__.py +0 -0
  230. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
  231. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/templates/user/change_email.html +0 -0
  232. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/templates/user/change_password.html +0 -0
  233. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/templates/user/login.html +0 -0
  234. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/templates/user/user_form.html +0 -0
  235. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/tests.py +0 -0
  236. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/urls.py +0 -0
  237. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user/views.py +0 -0
  238. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/__init__.py +0 -0
  239. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/admin.py +0 -0
  240. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/apps.py +0 -0
  241. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/config.py +0 -0
  242. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/forms.py +0 -0
  243. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  244. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
  245. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/models.py +0 -0
  246. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  247. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  248. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/tests.py +0 -0
  249. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/urls.py +0 -0
  250. {accrete-0.0.124 → accrete-0.0.126}/accrete/contrib/user_registration/views.py +0 -0
  251. {accrete-0.0.124 → accrete-0.0.126}/accrete/fields.py +0 -0
  252. {accrete-0.0.124 → accrete-0.0.126}/accrete/forms.py +0 -0
  253. {accrete-0.0.124 → accrete-0.0.126}/accrete/managers.py +0 -0
  254. {accrete-0.0.124 → accrete-0.0.126}/accrete/middleware.py +0 -0
  255. {accrete-0.0.124 → accrete-0.0.126}/accrete/migrations/0001_initial.py +0 -0
  256. {accrete-0.0.124 → accrete-0.0.126}/accrete/migrations/0002_initial.py +0 -0
  257. {accrete-0.0.124 → accrete-0.0.126}/accrete/migrations/0003_remove_member_name.py +0 -0
  258. {accrete-0.0.124 → accrete-0.0.126}/accrete/migrations/__init__.py +0 -0
  259. {accrete-0.0.124 → accrete-0.0.126}/accrete/storage.py +0 -0
  260. {accrete-0.0.124 → accrete-0.0.126}/accrete/tests.py +0 -0
  261. {accrete-0.0.124 → accrete-0.0.126}/accrete/urls.py +0 -0
  262. {accrete-0.0.124 → accrete-0.0.126}/accrete/utils/__init__.py +0 -0
  263. {accrete-0.0.124 → accrete-0.0.126}/accrete/utils/dates.py +0 -0
  264. {accrete-0.0.124 → accrete-0.0.126}/accrete/utils/log.py +0 -0
  265. {accrete-0.0.124 → accrete-0.0.126}/accrete/utils/models.py +0 -0
  266. {accrete-0.0.124 → accrete-0.0.126}/accrete/utils/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.124
3
+ Version: 0.0.126
4
4
  Summary: Django Shared Schema Multi Tenant
5
5
  Author-email: Benedikt Jilek <benedikt.jilek@pm.me>
6
6
  License: Copyright (c) 2023 Benedikt Jilek
@@ -9,12 +9,12 @@ class MemberInLine(admin.TabularInline):
9
9
 
10
10
  class TenantAccessGroupInLine(admin.TabularInline):
11
11
 
12
- model = models.TenantAccessGroup
12
+ model = models.TenantAccessGroupRel
13
13
 
14
14
 
15
15
  class AccessGroupMemberInLine(admin.TabularInline):
16
16
 
17
- model = models.AccessGroupMember
17
+ model = models.MemberAccessGroupRel
18
18
 
19
19
 
20
20
  class TenantAdmin(admin.ModelAdmin):
@@ -46,4 +46,5 @@ class AccessGroupAdmin(admin.ModelAdmin):
46
46
  admin.site.register(models.Tenant, TenantAdmin)
47
47
  admin.site.register(models.Member, MemberAdmin)
48
48
  admin.site.register(models.AccessGroup, AccessGroupAdmin)
49
- admin.site.register(models.AccessGroupMember)
49
+ admin.site.register(models.MemberAccessGroupRel)
50
+ admin.site.register(models.TenantAccessGroupRel)
@@ -8,6 +8,11 @@ ACCRETE_TENANT_NOT_SET_URL = getattr(
8
8
  False
9
9
  )
10
10
 
11
+ ACCRETE_GROUP_NOT_SET_URL = getattr(
12
+ settings, 'ACCRETE_GROUP_NOT_SET_URL',
13
+ False
14
+ )
15
+
11
16
  if not ACCRETE_TENANT_NOT_SET_URL:
12
17
  _logger.warning(
13
18
  'Setting ACCRETE_TENANT_NOT_SET_URL missing.'
@@ -46,7 +46,7 @@ def log_state_to_dict(logs: RawQuerySet) -> tuple[dict, dict]:
46
46
  return state, info
47
47
 
48
48
 
49
- def log_value_to_instance_value(log: Log):
49
+ def log_value_to_instance_value(log: Log) -> bool | int | None:
50
50
  if log.new_value_type == 'bool':
51
51
  return bool(log.new_value == 'True')
52
52
 
@@ -23,7 +23,8 @@ class SystemMailCreateForm(forms.ModelForm):
23
23
  def clean_to_addr(self):
24
24
  emails = self.cleaned_data['to_addr']
25
25
  for email in emails.split(','):
26
- validate_email(email)
26
+ if email:
27
+ validate_email(email)
27
28
  return emails
28
29
 
29
30
  def save(self, commit=True):
@@ -35,6 +35,7 @@ class UserManager(BaseUserManager):
35
35
  def create_user(self, email, password=None, username=None, **extra_fields):
36
36
  extra_fields.setdefault('is_staff', False)
37
37
  extra_fields.setdefault('is_superuser', False)
38
+ extra_fields.setdefault('is_active', False)
38
39
  return self._create_user(email, password, username, **extra_fields)
39
40
 
40
41
  def create_superuser(self, email, password, username=None, **extra_fields):
@@ -0,0 +1,42 @@
1
+ # Generated by Django 5.1.4 on 2025-02-24 17:54
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('accrete', '0003_remove_member_name'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.RenameModel(
14
+ old_name='AccessGroupMember',
15
+ new_name='MemberAccessGroupRel',
16
+ ),
17
+ migrations.RenameModel(
18
+ old_name='TenantAccessGroup',
19
+ new_name='TenantAccessGroupRel',
20
+ ),
21
+ migrations.AlterModelOptions(
22
+ name='memberaccessgrouprel',
23
+ options={'ordering': ['member'], 'verbose_name': 'Member Access Group Relation', 'verbose_name_plural': 'Member Access Group Relations'},
24
+ ),
25
+ migrations.AlterModelOptions(
26
+ name='tenantaccessgrouprel',
27
+ options={'ordering': ['tenant'], 'verbose_name': 'Tenant Access Group Relation', 'verbose_name_plural': 'Tenant Access Groups Relations'},
28
+ ),
29
+ migrations.RemoveField(
30
+ model_name='accessgroup',
31
+ name='is_public',
32
+ ),
33
+ migrations.AlterField(
34
+ model_name='accessgroup',
35
+ name='code',
36
+ field=models.CharField(max_length=100, verbose_name='Code'),
37
+ ),
38
+ migrations.AlterModelTable(
39
+ name='memberaccessgrouprel',
40
+ table='accrete_member_access_group_rel',
41
+ ),
42
+ ]
@@ -1,7 +1,6 @@
1
1
  from django.db import models
2
2
  from django.conf import settings
3
3
  from django.utils.translation import gettext_lazy as _
4
- from django.contrib.auth.validators import UnicodeUsernameValidator
5
4
  from accrete.tenant import get_tenant
6
5
  from accrete.managers import TenantManager, MemberManager
7
6
 
@@ -70,7 +69,7 @@ class Tenant(models.Model):
70
69
 
71
70
  access_groups = models.ManyToManyField(
72
71
  to='accrete.AccessGroup',
73
- through='accrete.TenantAccessGroup',
72
+ through='accrete.TenantAccessGroupRel',
74
73
  through_fields=('tenant', 'access_group')
75
74
  )
76
75
 
@@ -105,7 +104,7 @@ class Member(models.Model):
105
104
 
106
105
  access_groups = models.ManyToManyField(
107
106
  to='accrete.AccessGroup',
108
- through='accrete.AccessGroupMember',
107
+ through='accrete.MemberAccessGroupRel',
109
108
  through_fields=('member', 'access_group')
110
109
  )
111
110
 
@@ -136,28 +135,20 @@ class AccessGroup(models.Model):
136
135
 
137
136
  code = models.CharField(
138
137
  verbose_name=_('Code'),
139
- max_length=50
140
- )
141
-
142
- is_public = models.BooleanField(
143
- verbose_name=_('Is Public'),
144
- default=True,
145
- help_text=_(
146
- 'If set, members from all tenants can be assigned to this group.'
147
- )
138
+ max_length=100
148
139
  )
149
140
 
150
141
  def __str__(self):
151
142
  return self.name
152
143
 
153
144
 
154
- class AccessGroupMember(models.Model):
145
+ class MemberAccessGroupRel(models.Model):
155
146
 
156
147
  class Meta:
157
- verbose_name = _('Access Group Member')
158
- verbose_name_plural = _('Access Group Members')
148
+ verbose_name = _('Member Access Group Relation')
149
+ verbose_name_plural = _('Member Access Group Relations')
159
150
  ordering = ['member']
160
- db_table = 'accrete_access_group_member_rel'
151
+ db_table = 'accrete_member_access_group_rel'
161
152
  constraints = [
162
153
  models.UniqueConstraint(
163
154
  name='unique_member_per_group',
@@ -179,11 +170,11 @@ class AccessGroupMember(models.Model):
179
170
  return f'{self.member} - {self.access_group}'
180
171
 
181
172
 
182
- class TenantAccessGroup(models.Model):
173
+ class TenantAccessGroupRel(models.Model):
183
174
 
184
175
  class Meta:
185
- verbose_name = _('Tenant Access Group')
186
- verbose_name_plural = _('Tenant Access Groups')
176
+ verbose_name = _('Tenant Access Group Relation')
177
+ verbose_name_plural = _('Tenant Access Groups Relations')
187
178
  ordering = ['tenant']
188
179
  db_table = 'accrete_tenant_access_group_rel'
189
180
  constraints = [
@@ -73,3 +73,16 @@ def per_tenant(include: Q = None, exclude: Q = None):
73
73
  return wrapper
74
74
  return decorator
75
75
 
76
+
77
+ def tenant_has_group(access_group_code: str) -> bool:
78
+ tenant = get_tenant()
79
+ if not tenant:
80
+ return False
81
+ return tenant.access_groups.filter(code__in=[access_group_code]).exists()
82
+
83
+
84
+ def member_has_group(access_group_code: str) -> bool:
85
+ member = get_member()
86
+ if not member:
87
+ return False
88
+ return member.access_groups.filter(code__in=[access_group_code]).exists()
@@ -9,13 +9,16 @@ _logger = logging.getLogger(__name__)
9
9
 
10
10
 
11
11
  def save_form(form: [Form|ModelForm], commit=True, reraise=False) -> [Form|ModelForm]:
12
+ if not hasattr(form, 'save'):
13
+ raise AttributeError('Form must have method "save" implemented.')
12
14
  form.is_saved = False
13
15
  form.save_error = None
14
16
  form.save_error_id = None
17
+ form.res = None
15
18
  try:
16
19
  if form.is_valid():
17
20
  with transaction.atomic():
18
- form.save(commit=commit)
21
+ form.res = form.save(commit=commit)
19
22
  form.is_saved = True
20
23
  except Exception as e:
21
24
  form.save_error = repr(e)
@@ -35,9 +38,13 @@ def save_forms(form, inline_formsets: list = None, commit=True, reraise: bool =
35
38
  _logger.exception(f'{error_id}: {error}')
36
39
  form.save_error_id = error_id
37
40
 
41
+ if not hasattr(form, 'save'):
42
+ raise AttributeError('Form must have method "save" implemented.')
43
+
38
44
  form.is_saved = False
39
45
  form.save_error = None
40
46
  form.save_error_id = None
47
+ form.res = None
41
48
  form.inline_forms = inline_formsets
42
49
 
43
50
  try:
@@ -56,7 +63,7 @@ def save_forms(form, inline_formsets: list = None, commit=True, reraise: bool =
56
63
 
57
64
  try:
58
65
  with transaction.atomic():
59
- form.save(commit=commit)
66
+ form.res = form.save(commit=commit)
60
67
  for inline_formset in inline_formsets:
61
68
  inline_formset.save(commit=commit)
62
69
  except Exception as e:
@@ -1,4 +1,5 @@
1
1
  import os
2
+ from enum import Enum
2
3
  from functools import wraps
3
4
  from django.http import HttpResponse, HttpResponseNotFound
4
5
  from django.contrib.auth.mixins import LoginRequiredMixin
@@ -7,24 +8,43 @@ from django.core.exceptions import ImproperlyConfigured
7
8
  from django.shortcuts import redirect, get_object_or_404
8
9
  from django.conf import settings
9
10
  from accrete.models import Tenant, Member
10
- from accrete.tenant import get_tenant
11
+ from accrete.tenant import get_tenant, tenant_has_group, member_has_group
11
12
  from . import config
12
13
 
13
14
 
15
+ class GroupType(Enum):
16
+
17
+ TENANT: str = 'tenant'
18
+ MEMBER: str = 'member'
19
+
20
+
14
21
  class TenantRequiredMixin(LoginRequiredMixin):
15
22
 
16
23
  TENANT_NOT_SET_URL = None
24
+ GROUP_NOT_SET_URL = None
25
+ TENANT_GROUPS = []
26
+ MEMBER_GROUPS = []
17
27
 
18
28
  def dispatch(self, request, *args, **kwargs):
19
29
  res = super().dispatch(request, *args, **kwargs)
20
30
  tenant = self.get_tenant()
21
31
  if not tenant:
22
32
  return self.handle_tenant_not_set()
33
+ if not self.check_tenant_group():
34
+ return self.handle_tenant_group_not_set()
35
+ if not self.check_member_group():
36
+ return self.handle_member_group_not_set()
23
37
  return res
24
38
 
25
39
  def handle_tenant_not_set(self):
26
40
  return redirect(self.get_tenant_not_set_url())
27
41
 
42
+ def handle_tenant_group_not_set(self):
43
+ return redirect(self.get_group_not_set_url(GroupType.TENANT))
44
+
45
+ def handle_member_group_not_set(self):
46
+ return redirect(self.get_group_not_set_url(GroupType.MEMBER))
47
+
28
48
  def get_tenant_not_set_url(self):
29
49
  tenant_not_set_url = (
30
50
  self.TENANT_NOT_SET_URL
@@ -40,12 +60,45 @@ class TenantRequiredMixin(LoginRequiredMixin):
40
60
  )
41
61
  return tenant_not_set_url
42
62
 
63
+ def get_group_not_set_url(self, group_type: GroupType):
64
+ group_not_set_url = (
65
+ self.GROUP_NOT_SET_URL
66
+ or settings.ACCRETE_GROUP_NOT_SET_URL
67
+ )
68
+ if not group_not_set_url:
69
+ cls_name = self.__class__.__name__
70
+ raise ImproperlyConfigured(
71
+ f"{cls_name} is missing the group_not_set_url attribute. "
72
+ f"Define {cls_name}.GROUP_NOT_SET_URL, "
73
+ f"settings.ACCRETE_GROUP_NOT_SET_URL, or override "
74
+ f"{cls_name}.get_group_not_set_url()."
75
+ )
76
+ return group_not_set_url
77
+
78
+ def check_tenant_group(self) -> bool:
79
+ if not self.TENANT_GROUPS:
80
+ return True
81
+ for group in self.TENANT_GROUPS:
82
+ if tenant_has_group(group):
83
+ return True
84
+ return False
85
+
86
+ def check_member_group(self) -> bool:
87
+ if not self.MEMBER_GROUPS:
88
+ return True
89
+ for group in self.MEMBER_GROUPS:
90
+ if member_has_group(group):
91
+ return True
92
+ return False
93
+
43
94
  @staticmethod
44
95
  def get_tenant():
45
96
  return get_tenant()
46
97
 
47
98
 
48
99
  def tenant_required(
100
+ tenant_groups: list[str] = None,
101
+ member_groups: list[str] = None,
49
102
  redirect_field_name: str = None,
50
103
  login_url: str = None
51
104
  ):
@@ -59,6 +112,12 @@ def tenant_required(
59
112
  tenant = request.tenant
60
113
  if not tenant:
61
114
  return redirect(config.ACCRETE_TENANT_NOT_SET_URL)
115
+ for tenant_group in (tenant_groups or []):
116
+ if not any([tenant_has_group(tenant_group)]):
117
+ return redirect(config.ACCRETE_GROUP_NOT_SET_URL)
118
+ for member_group in (member_groups or []):
119
+ if not any([member_has_group(member_group)]):
120
+ return redirect(config.ACCRETE_GROUP_NOT_SET_URL)
62
121
  return f(request, *args, **kwargs)
63
122
  return _wrapped_view
64
123
  return decorator
@@ -4,7 +4,7 @@ build-backend = 'hatchling.build'
4
4
 
5
5
  [project]
6
6
  name = 'accrete'
7
- version = '0.0.124'
7
+ version = '0.0.126'
8
8
  authors = [
9
9
  { name='Benedikt Jilek', email='benedikt.jilek@pm.me' },
10
10
  ]
File without changes
File without changes
File without changes
File without changes
File without changes