accrete 0.0.138__tar.gz → 0.0.139__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 (281) hide show
  1. {accrete-0.0.138 → accrete-0.0.139}/PKG-INFO +1 -1
  2. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/__init__.py +2 -1
  3. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/context.py +7 -0
  4. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/form_error.html +1 -1
  5. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/layout.html +1 -1
  6. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/list.html +5 -5
  7. accrete-0.0.139/accrete/contrib/ui/templates/ui/message.html +14 -0
  8. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/modal.html +2 -2
  9. accrete-0.0.139/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +23 -0
  10. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/models.py +6 -6
  11. accrete-0.0.139/accrete/migrations/0006_alter_member_user.py +21 -0
  12. accrete-0.0.139/accrete/migrations/0007_accessgroup_description.py +18 -0
  13. {accrete-0.0.138 → accrete-0.0.139}/accrete/models.py +7 -1
  14. {accrete-0.0.138 → accrete-0.0.139}/accrete/tenant.py +10 -6
  15. {accrete-0.0.138 → accrete-0.0.139}/accrete/utils/views.py +3 -6
  16. {accrete-0.0.138 → accrete-0.0.139}/accrete/views.py +9 -4
  17. {accrete-0.0.138 → accrete-0.0.139}/pyproject.toml +1 -1
  18. accrete-0.0.138/accrete/contrib/ui/templates/ui/message.html +0 -13
  19. {accrete-0.0.138 → accrete-0.0.139}/.gitignore +0 -0
  20. {accrete-0.0.138 → accrete-0.0.139}/LICENSE +0 -0
  21. {accrete-0.0.138 → accrete-0.0.139}/README.md +0 -0
  22. {accrete-0.0.138 → accrete-0.0.139}/accrete/__init__.py +0 -0
  23. {accrete-0.0.138 → accrete-0.0.139}/accrete/admin.py +0 -0
  24. {accrete-0.0.138 → accrete-0.0.139}/accrete/apps.py +0 -0
  25. {accrete-0.0.138 → accrete-0.0.139}/accrete/config.py +0 -0
  26. {accrete-0.0.138 → accrete-0.0.139}/accrete/context_processors.py +0 -0
  27. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/__init__.py +0 -0
  28. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/__init__.py +0 -0
  29. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/admin.py +0 -0
  30. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/apps.py +0 -0
  31. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  32. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  33. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  34. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/migrations/__init__.py +0 -0
  35. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/country/models.py +0 -0
  36. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/__init__.py +0 -0
  37. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/admin.py +0 -0
  38. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/apps.py +0 -0
  39. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/config.py +0 -0
  40. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/helper.py +0 -0
  41. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  42. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  43. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  44. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  45. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  46. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/migrations/__init__.py +0 -0
  47. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/models.py +0 -0
  48. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/queries.py +0 -0
  49. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/signals.py +0 -0
  50. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/tests.py +0 -0
  51. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/log/views.py +0 -0
  52. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/__init__.py +0 -0
  53. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/admin.py +0 -0
  54. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/apps.py +0 -0
  55. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/forms.py +0 -0
  56. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  57. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  58. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  59. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  60. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/models.py +0 -0
  61. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/queries.py +0 -0
  62. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/tests.py +0 -0
  63. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/sequence/views.py +0 -0
  64. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/__init__.py +0 -0
  65. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/admin.py +0 -0
  66. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/apps.py +0 -0
  67. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/forms.py +0 -0
  68. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  69. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  70. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/models.py +0 -0
  71. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/tasks.py +0 -0
  72. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/tests.py +0 -0
  73. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/system_mail/views.py +0 -0
  74. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/admin.py +0 -0
  75. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/apps.py +0 -0
  76. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/filter.py +0 -0
  77. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/middleware.py +0 -0
  78. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/migrations/__init__.py +0 -0
  79. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/models.py +0 -0
  80. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  81. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/README.md +0 -0
  82. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  83. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  84. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  85. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  86. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  87. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  88. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  89. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  90. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  91. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  92. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  93. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  94. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  95. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  96. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  97. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  98. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/package.json +0 -0
  99. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  100. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  101. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  102. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  103. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  104. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  105. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  106. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  107. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  108. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  109. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  110. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  111. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  112. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  113. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  114. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  115. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  116. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  117. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  118. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  119. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  120. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  121. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  122. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  123. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  124. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  125. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  126. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  127. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  128. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  129. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  130. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  131. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  132. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  133. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  134. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  135. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  136. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  137. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  138. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  139. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  140. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  141. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  142. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  143. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  144. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  145. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  146. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  147. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  148. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  149. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  150. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  151. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  152. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  153. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  154. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  155. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  156. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  157. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  158. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  159. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  160. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  161. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  162. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  163. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  164. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  165. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  166. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  167. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  168. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  169. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  170. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  171. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  172. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  173. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  174. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  175. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  176. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/css/.sass-cache/15adf1eed05371361b08787c918a7f18fc15be79/accrete.scssc +0 -0
  177. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/css/accrete.css +0 -0
  178. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/css/accrete.css.map +0 -0
  179. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/css/accrete.scss +0 -0
  180. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/css/fa.css +0 -0
  181. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/css/icons.css +0 -0
  182. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  183. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  184. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
  185. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
  186. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
  187. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/js/filter.js +0 -0
  188. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  189. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  190. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  191. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  192. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  193. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  194. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  195. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  196. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  197. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  198. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  199. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  200. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  201. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
  202. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  203. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  204. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  205. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
  206. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
  207. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  208. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  209. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  210. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
  211. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
  212. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/oob.html +0 -0
  213. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/table.html +0 -0
  214. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
  215. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/templatetags/field.html +0 -0
  216. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +0 -0
  217. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +0 -0
  218. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  219. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templatetags/__init__.py +0 -0
  220. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/templatetags/ui.py +0 -0
  221. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/tests.py +0 -0
  222. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/urls.py +0 -0
  223. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/utils.py +0 -0
  224. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/views.py +0 -0
  225. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/widgets/__init__.py +0 -0
  226. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/ui/widgets/search_select.py +0 -0
  227. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/__init__.py +0 -0
  228. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/admin.py +0 -0
  229. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/apps.py +0 -0
  230. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/auth_backends.py +0 -0
  231. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/forms.py +0 -0
  232. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  233. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  234. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/middleware.py +0 -0
  235. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  236. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  237. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
  238. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
  239. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
  240. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
  241. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
  242. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/migrations/__init__.py +0 -0
  243. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
  244. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/templates/user/change_email.html +0 -0
  245. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/templates/user/change_password.html +0 -0
  246. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/templates/user/login.html +0 -0
  247. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/templates/user/user_form.html +0 -0
  248. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/tests.py +0 -0
  249. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/urls.py +0 -0
  250. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user/views.py +0 -0
  251. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/__init__.py +0 -0
  252. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/admin.py +0 -0
  253. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/apps.py +0 -0
  254. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/config.py +0 -0
  255. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/forms.py +0 -0
  256. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  257. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
  258. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/models.py +0 -0
  259. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  260. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  261. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/tests.py +0 -0
  262. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/urls.py +0 -0
  263. {accrete-0.0.138 → accrete-0.0.139}/accrete/contrib/user_registration/views.py +0 -0
  264. {accrete-0.0.138 → accrete-0.0.139}/accrete/fields.py +0 -0
  265. {accrete-0.0.138 → accrete-0.0.139}/accrete/forms.py +0 -0
  266. {accrete-0.0.138 → accrete-0.0.139}/accrete/managers.py +0 -0
  267. {accrete-0.0.138 → accrete-0.0.139}/accrete/middleware.py +0 -0
  268. {accrete-0.0.138 → accrete-0.0.139}/accrete/migrations/0001_initial.py +0 -0
  269. {accrete-0.0.138 → accrete-0.0.139}/accrete/migrations/0002_initial.py +0 -0
  270. {accrete-0.0.138 → accrete-0.0.139}/accrete/migrations/0003_remove_member_name.py +0 -0
  271. {accrete-0.0.138 → accrete-0.0.139}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
  272. {accrete-0.0.138 → accrete-0.0.139}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
  273. {accrete-0.0.138 → accrete-0.0.139}/accrete/migrations/__init__.py +0 -0
  274. {accrete-0.0.138 → accrete-0.0.139}/accrete/storage.py +0 -0
  275. {accrete-0.0.138 → accrete-0.0.139}/accrete/tests.py +0 -0
  276. {accrete-0.0.138 → accrete-0.0.139}/accrete/urls.py +0 -0
  277. {accrete-0.0.138 → accrete-0.0.139}/accrete/utils/__init__.py +0 -0
  278. {accrete-0.0.138 → accrete-0.0.139}/accrete/utils/dates.py +0 -0
  279. {accrete-0.0.138 → accrete-0.0.139}/accrete/utils/forms.py +0 -0
  280. {accrete-0.0.138 → accrete-0.0.139}/accrete/utils/log.py +0 -0
  281. {accrete-0.0.138 → accrete-0.0.139}/accrete/utils/models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.138
3
+ Version: 0.0.139
4
4
  Summary: Django Shared Schema Multi Tenant
5
5
  Author-email: Benedikt Jilek <benedikt.jilek@pm.me>
6
6
  License: Copyright (c) 2025 Benedikt Jilek
@@ -7,6 +7,7 @@ from . context import (
7
7
  TableContext,
8
8
  TableRowContext,
9
9
  ModalContext,
10
- OobContext
10
+ OobContext,
11
+ MessageContext
11
12
  )
12
13
  from .utils import modal_response, add_trigger
@@ -116,3 +116,10 @@ class OobContext(BaseContext):
116
116
  'tag': self.tag
117
117
  }})
118
118
  return res
119
+
120
+
121
+ @dataclass(kw_only=True)
122
+ class MessageContext(BaseContext):
123
+
124
+ persistent: bool = False
125
+ append: bool = False
@@ -1,7 +1,7 @@
1
1
  {% load i18n %}
2
2
 
3
3
  {% if form.non_field_errors or form.save_error %}
4
- <div class="notification is-danger is-light">
4
+ <div class="notification is-danger is-light" style="word-wrap: break-word;">
5
5
  {{ form.non_field_errors }}
6
6
  {% if form.save_error %}
7
7
  <p>{{ form.save_error }}</p>
@@ -203,7 +203,7 @@
203
203
  <div id="content-right-header" class="is-flex is-flex-wrap-wrap">
204
204
  {% block header_right %}{% endblock %}
205
205
  </div>
206
- <button class="button is-subtle is-align-self-baseline m-1" style="border-radius: var(--bulma-radius-rounded)" x-on:click="showContentRight = false;">
206
+ <button class="button is-light is-align-self-baseline m-1" style="border-radius: var(--bulma-radius-medium)" x-on:click="showContentRight = false;">
207
207
  <span class="icon"><i class="fa fa-xmark"></i></span>
208
208
  </button>
209
209
  </div>
@@ -10,11 +10,11 @@
10
10
  <div id="list-entry-{{ object.pk }}" class="list-entry cell pb-0" style="height: {{ column_height }}{{ column_height_unit }}">
11
11
  <div class="box p-3"
12
12
  style="word-break: break-word; height: 100%; overflow-y: auto; {% if object.get_absolute_url %}cursor:pointer;{% endif %}"
13
- {% if object.get_absolute_url %}
14
- hx-get="{{ object.get_absolute_url }}{% querystring %}" hx-target="#content-right-header" hx-select="#content-right-header" hx-select-oob="#content-right" hx-swap="outerHTML"
15
- {% if detail_enabled %}
16
- x-on:click="$dispatch('unselect-list-entry'); showContentRight = true; selected = true; $nextTick(() => { $el.scrollIntoView( {block: 'nearest'} ) });" x-bind:class="selected ? 'box selected' : ''"
17
- {% endif %}
13
+ {% if object.get_absolute_url and detail_enabled %}
14
+ hx-get="{{ object.get_absolute_url }}{% querystring %}" hx-target="#content-right-header" hx-select="#content-right-header" hx-select-oob="#content-right" hx-swap="outerHTML"
15
+ x-on:click="$dispatch('unselect-list-entry'); showContentRight = true; selected = true; $nextTick(() => { $el.scrollIntoView( {block: 'nearest'} ) });" x-bind:class="selected ? 'box selected' : ''"
16
+ {% elif object.get_absolute_url and not detail_enabled %}
17
+ hx-get="{{ object.get_absolute_url }}{% querystring %}" hx-target="body" hx-push-url="true"
18
18
  {% endif %}
19
19
  x-data="{selected: false}" @unselect-list-entry.window="selected = false"
20
20
  >
@@ -0,0 +1,14 @@
1
+ {% load ui %}
2
+
3
+ {% if messages %}
4
+ {% for message in messages %}
5
+ <div hx-swap-oob="{% if append %}beforeend:#message{% else %}innerHTML:#message{% endif %}">
6
+ <div class="mb-2" style="min-width: 340px; max-width: 340px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; {% if not persistent %}setTimeout(() => show = false, 4000){% endif %}" x-transition.duration.200ms>
7
+ <div class="notification has-text-centered {{ message|message_class }}">
8
+ {% if persistent %}<button class="delete" x-on:click="show = false;"></button>{% endif %}
9
+ {{ message }}
10
+ </div>
11
+ </div>
12
+ </div>
13
+ {% endfor %}
14
+ {% endif %}
@@ -12,10 +12,10 @@
12
12
  <button id="{{ modal_id }}-background" class="modal-background" @click="$dispatch('close-modal-{{ modal_id }}')" style="cursor: default"></button>
13
13
  <div class="modal-card" x-show="showModal" x-transition.duration.200ms x-init="$nextTick(() => {showModal = true;})" >
14
14
  <header class="modal-card-head">
15
- <p class="modal-card-title">
15
+ <p class="modal-card-title is-flex-shrink-1">
16
16
  {{ title }}
17
17
  </p>
18
- <button class="delete" aria-label="close" @click="$dispatch('close-modal-{{ modal_id }}')"></button>
18
+ <button class="delete is-align-self-baseline" aria-label="close" @click="$dispatch('close-modal-{{ modal_id }}')"></button>
19
19
  </header>
20
20
  <section class="modal-card-body">
21
21
  {% block modal_content %}{% endblock %}
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.1.7 on 2025-03-23 08:11
2
+
3
+ import accrete.contrib.user.models
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('user', '0007_user_managed_login'),
11
+ ]
12
+
13
+ operations = [
14
+ migrations.RemoveConstraint(
15
+ model_name='user',
16
+ name='no_email_for_managed_user',
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='user',
20
+ name='language_code',
21
+ field=models.CharField(blank=True, default=accrete.contrib.user.models.default_language_code, max_length=10, null=True, verbose_name='Language'),
22
+ ),
23
+ ]
@@ -35,6 +35,10 @@ def validate_member_login(login: str) -> None:
35
35
  raise ValidationError(message)
36
36
 
37
37
 
38
+ def default_language_code():
39
+ return settings.LANGUAGE_CODE
40
+
41
+
38
42
  class UserManager(BaseUserManager):
39
43
  use_in_migrations = True
40
44
 
@@ -87,11 +91,6 @@ class User(AbstractBaseUser, PermissionsMixin):
87
91
  name='email_or_login_set',
88
92
  violation_error_message='E-Mail or Login must be set'
89
93
  ),
90
- models.CheckConstraint(
91
- condition=Q(is_managed=False, email__isnull=False) | Q(is_managed=True, email__isnull=True),
92
- name='no_email_for_managed_user',
93
- violation_error_message='Managed users must not have an E-Mail address'
94
- ),
95
94
  models.CheckConstraint(
96
95
  condition=Q(is_managed=True, login__isnull=False) | Q(is_managed=False),
97
96
  name='managed_login',
@@ -178,7 +177,8 @@ class User(AbstractBaseUser, PermissionsMixin):
178
177
  verbose_name=_('Language'),
179
178
  max_length=10,
180
179
  null=True,
181
- blank=True
180
+ blank=True,
181
+ default=default_language_code
182
182
  )
183
183
 
184
184
  theme = models.CharField(
@@ -0,0 +1,21 @@
1
+ # Generated by Django 5.1.7 on 2025-03-23 10:21
2
+
3
+ import django.db.models.deletion
4
+ from django.conf import settings
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ dependencies = [
11
+ ('accrete', '0005_accessgroup_apply_on_alter_member_access_groups_and_more'),
12
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterField(
17
+ model_name='member',
18
+ name='user',
19
+ field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='memberships', to=settings.AUTH_USER_MODEL),
20
+ ),
21
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.1.7 on 2025-03-31 20:23
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('accrete', '0006_alter_member_user'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='accessgroup',
15
+ name='description',
16
+ field=models.TextField(blank=True, null=True, verbose_name='Description'),
17
+ ),
18
+ ]
@@ -90,7 +90,7 @@ class Member(models.Model):
90
90
  user = models.ForeignKey(
91
91
  to=settings.AUTH_USER_MODEL,
92
92
  related_name='memberships',
93
- on_delete=models.PROTECT
93
+ on_delete=models.CASCADE
94
94
  )
95
95
 
96
96
  tenant = models.ForeignKey(
@@ -136,6 +136,12 @@ class AccessGroup(models.Model):
136
136
  max_length=255
137
137
  )
138
138
 
139
+ description = models.TextField(
140
+ verbose_name=_('Description'),
141
+ null=True,
142
+ blank=True
143
+ )
144
+
139
145
  code = models.CharField(
140
146
  verbose_name=_('Code'),
141
147
  max_length=100
@@ -39,11 +39,6 @@ class Unscoped:
39
39
  self.tenant = tenant
40
40
 
41
41
  def __enter__(self):
42
- if self.tenant is None:
43
- _logger.warning(
44
- 'Entering unscoped context manager with tenant already set to None!',
45
- stack_info=True
46
- )
47
42
  set_tenant(False)
48
43
 
49
44
  def __exit__(self, exc_type, exc_val, exc_tb):
@@ -57,7 +52,7 @@ def unscoped():
57
52
  def per_tenant(include: Q = None, exclude: Q = None):
58
53
  def decorator(f):
59
54
  def wrapper(*args, **kwargs):
60
- tenants: QuerySet = apps.get_model('accrete', 'Tenant').objects.all()
55
+ tenants = apps.get_model('accrete', 'Tenant').objects.all()
61
56
  if include is not None:
62
57
  tenants = tenants.filter(include)
63
58
  if exclude is not None:
@@ -74,6 +69,15 @@ def per_tenant(include: Q = None, exclude: Q = None):
74
69
  return decorator
75
70
 
76
71
 
72
+ def unscope():
73
+ def decorator(f):
74
+ def wrapper(*args, **kwargs):
75
+ with unscoped():
76
+ f(*args, **kwargs)
77
+ return wrapper
78
+ return decorator
79
+
80
+
77
81
  def tenant_has_group(access_group_code: str) -> bool:
78
82
  tenant = get_tenant()
79
83
  if not tenant:
@@ -141,8 +141,7 @@ def method_not_allowed(method: str, allowed: list[str]) -> HttpResponseNotAllowe
141
141
  def render_templates(
142
142
  templates: list[str | tuple[str, dict]],
143
143
  context: dict = None,
144
- request=None,
145
- log_not_found: bool = False
144
+ request=None
146
145
  ) -> str:
147
146
  context = {} if context is None else context
148
147
  content = ''
@@ -150,13 +149,11 @@ def render_templates(
150
149
  if isinstance(template, tuple):
151
150
  template_name, template_context = template
152
151
  else:
153
- template_name = template
154
- template_context = context
152
+ template_name, template_context = template, context
155
153
  try:
156
154
  content += render_to_string(template_name, template_context, request)
157
155
  except TemplateDoesNotExist as e:
158
- if log_not_found:
159
- _logger.warning(repr(e))
156
+ _logger.warning(repr(e))
160
157
  except Exception as e:
161
158
  _logger.exception(repr(e))
162
159
  raise e
@@ -9,13 +9,18 @@ from django.shortcuts import redirect, get_object_or_404
9
9
  from django.conf import settings
10
10
  from accrete.models import Tenant, Member
11
11
  from accrete.tenant import get_tenant, tenant_has_group, member_has_group
12
- from . import config
12
+ from accrete import config
13
13
 
14
14
 
15
15
  class TenantRequiredMixin(LoginRequiredMixin):
16
16
 
17
+ # Redirect to the specified url if the group check fails
17
18
  TENANT_NOT_SET_URL = None
18
19
  GROUP_NOT_SET_URL = None
20
+
21
+ # If set, one of the supplied groups must be present on the
22
+ # tenant or member respectively. If the list item is of type tuple,
23
+ # all the groups in the tuple must be present.
19
24
  TENANT_GROUPS: list[str | tuple[str]] = []
20
25
  MEMBER_GROUPS: list[str | tuple[str]] = []
21
26
 
@@ -41,8 +46,8 @@ class TenantRequiredMixin(LoginRequiredMixin):
41
46
 
42
47
  def get_tenant_not_set_url(self):
43
48
  tenant_not_set_url = (
44
- self.TENANT_NOT_SET_URL
45
- or settings.ACCRETE_TENANT_NOT_SET_URL
49
+ self.TENANT_NOT_SET_URL
50
+ or config.ACCRETE_TENANT_NOT_SET_URL
46
51
  )
47
52
  if not tenant_not_set_url:
48
53
  cls_name = self.__class__.__name__
@@ -57,7 +62,7 @@ class TenantRequiredMixin(LoginRequiredMixin):
57
62
  def get_group_not_set_url(self):
58
63
  group_not_set_url = (
59
64
  self.GROUP_NOT_SET_URL
60
- or settings.ACCRETE_GROUP_NOT_SET_URL
65
+ or config.ACCRETE_GROUP_NOT_SET_URL
61
66
  )
62
67
  if not group_not_set_url:
63
68
  cls_name = self.__class__.__name__
@@ -4,7 +4,7 @@ build-backend = 'hatchling.build'
4
4
 
5
5
  [project]
6
6
  name = 'accrete'
7
- version = '0.0.138'
7
+ version = '0.0.139'
8
8
  authors = [
9
9
  { name='Benedikt Jilek', email='benedikt.jilek@pm.me' },
10
10
  ]
@@ -1,13 +0,0 @@
1
- {% load ui %}
2
-
3
- {% if messages %}
4
- {% for message in messages %}
5
- <div hx-swap-oob="beforeend:#message">
6
- <div class="mb-2" style="min-width: 330px; max-width: 330px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; setTimeout(() => show = false, 4000)" x-transition.duration.200ms>
7
- <div class="notification has-text-centered is-light {{ message|message_class }}">
8
- <p>{{ message }}</p>
9
- </div>
10
- </div>
11
- </div>
12
- {% endfor %}
13
- {% endif %}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes