accrete 0.0.138__tar.gz → 0.0.140__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.140}/PKG-INFO +1 -1
  2. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/__init__.py +2 -1
  3. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/context.py +7 -0
  4. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/filter.py +0 -2
  5. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/form_error.html +1 -1
  6. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/layout.html +1 -1
  7. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/list.html +5 -5
  8. accrete-0.0.140/accrete/contrib/ui/templates/ui/message.html +14 -0
  9. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/modal.html +2 -2
  10. accrete-0.0.140/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +23 -0
  11. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/models.py +10 -10
  12. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/views.py +2 -2
  13. accrete-0.0.140/accrete/migrations/0006_alter_member_user.py +21 -0
  14. accrete-0.0.140/accrete/migrations/0007_accessgroup_description.py +18 -0
  15. {accrete-0.0.138 → accrete-0.0.140}/accrete/models.py +7 -1
  16. {accrete-0.0.138 → accrete-0.0.140}/accrete/tenant.py +10 -6
  17. {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/views.py +3 -6
  18. {accrete-0.0.138 → accrete-0.0.140}/accrete/views.py +17 -9
  19. {accrete-0.0.138 → accrete-0.0.140}/pyproject.toml +1 -1
  20. accrete-0.0.138/accrete/contrib/ui/templates/ui/message.html +0 -13
  21. {accrete-0.0.138 → accrete-0.0.140}/.gitignore +0 -0
  22. {accrete-0.0.138 → accrete-0.0.140}/LICENSE +0 -0
  23. {accrete-0.0.138 → accrete-0.0.140}/README.md +0 -0
  24. {accrete-0.0.138 → accrete-0.0.140}/accrete/__init__.py +0 -0
  25. {accrete-0.0.138 → accrete-0.0.140}/accrete/admin.py +0 -0
  26. {accrete-0.0.138 → accrete-0.0.140}/accrete/apps.py +0 -0
  27. {accrete-0.0.138 → accrete-0.0.140}/accrete/config.py +0 -0
  28. {accrete-0.0.138 → accrete-0.0.140}/accrete/context_processors.py +0 -0
  29. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/__init__.py +0 -0
  30. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/__init__.py +0 -0
  31. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/admin.py +0 -0
  32. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/apps.py +0 -0
  33. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  34. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  35. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  36. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/migrations/__init__.py +0 -0
  37. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/country/models.py +0 -0
  38. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/__init__.py +0 -0
  39. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/admin.py +0 -0
  40. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/apps.py +0 -0
  41. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/config.py +0 -0
  42. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/helper.py +0 -0
  43. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  44. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  45. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  46. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  47. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  48. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/migrations/__init__.py +0 -0
  49. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/models.py +0 -0
  50. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/queries.py +0 -0
  51. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/signals.py +0 -0
  52. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/tests.py +0 -0
  53. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/log/views.py +0 -0
  54. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/__init__.py +0 -0
  55. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/admin.py +0 -0
  56. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/apps.py +0 -0
  57. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/forms.py +0 -0
  58. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  59. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  60. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  61. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  62. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/models.py +0 -0
  63. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/queries.py +0 -0
  64. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/tests.py +0 -0
  65. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/sequence/views.py +0 -0
  66. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/__init__.py +0 -0
  67. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/admin.py +0 -0
  68. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/apps.py +0 -0
  69. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/forms.py +0 -0
  70. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  71. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  72. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/models.py +0 -0
  73. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/tasks.py +0 -0
  74. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/tests.py +0 -0
  75. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/system_mail/views.py +0 -0
  76. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/admin.py +0 -0
  77. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/apps.py +0 -0
  78. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/middleware.py +0 -0
  79. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/migrations/__init__.py +0 -0
  80. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/models.py +0 -0
  81. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  82. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/README.md +0 -0
  83. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  84. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  85. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  86. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  87. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  88. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  89. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  90. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  91. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  92. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  93. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  94. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  95. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  96. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  97. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  98. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  99. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/package.json +0 -0
  100. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  101. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  102. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  103. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  104. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  105. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  106. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  107. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  108. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  109. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  110. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  111. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  112. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  113. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  114. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  115. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  116. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  117. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  118. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  119. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  120. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  121. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  122. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  123. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  124. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  125. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  126. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  127. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  128. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  129. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  130. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  131. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  132. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  133. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  134. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  135. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  136. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  137. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  138. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  139. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  140. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  141. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  142. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  143. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  144. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  145. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  146. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  147. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  148. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  149. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  150. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  151. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  152. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  153. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  154. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  155. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  156. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  157. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  158. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  159. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  160. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  161. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  162. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  163. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  164. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  165. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  166. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  167. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  168. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  169. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  170. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  171. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  172. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  173. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  174. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  175. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  176. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  177. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/.sass-cache/15adf1eed05371361b08787c918a7f18fc15be79/accrete.scssc +0 -0
  178. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/accrete.css +0 -0
  179. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/accrete.css.map +0 -0
  180. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/accrete.scss +0 -0
  181. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/fa.css +0 -0
  182. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/css/icons.css +0 -0
  183. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  184. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  185. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
  186. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
  187. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
  188. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/filter.js +0 -0
  189. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  190. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  191. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  192. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  193. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  194. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  195. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  196. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  197. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  198. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  199. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  200. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  201. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  202. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
  203. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  204. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  205. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  206. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
  207. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
  208. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  209. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  210. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  211. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
  212. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
  213. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/oob.html +0 -0
  214. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/table.html +0 -0
  215. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
  216. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/templatetags/field.html +0 -0
  217. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +0 -0
  218. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +0 -0
  219. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  220. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templatetags/__init__.py +0 -0
  221. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/templatetags/ui.py +0 -0
  222. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/tests.py +0 -0
  223. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/urls.py +0 -0
  224. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/utils.py +0 -0
  225. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/views.py +0 -0
  226. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/widgets/__init__.py +0 -0
  227. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/ui/widgets/search_select.py +0 -0
  228. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/__init__.py +0 -0
  229. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/admin.py +0 -0
  230. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/apps.py +0 -0
  231. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/auth_backends.py +0 -0
  232. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/forms.py +0 -0
  233. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  234. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  235. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/middleware.py +0 -0
  236. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  237. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  238. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
  239. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
  240. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
  241. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
  242. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
  243. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/migrations/__init__.py +0 -0
  244. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
  245. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/change_email.html +0 -0
  246. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/change_password.html +0 -0
  247. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/login.html +0 -0
  248. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/templates/user/user_form.html +0 -0
  249. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/tests.py +0 -0
  250. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user/urls.py +0 -0
  251. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/__init__.py +0 -0
  252. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/admin.py +0 -0
  253. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/apps.py +0 -0
  254. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/config.py +0 -0
  255. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/forms.py +0 -0
  256. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  257. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
  258. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/models.py +0 -0
  259. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  260. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  261. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/tests.py +0 -0
  262. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/urls.py +0 -0
  263. {accrete-0.0.138 → accrete-0.0.140}/accrete/contrib/user_registration/views.py +0 -0
  264. {accrete-0.0.138 → accrete-0.0.140}/accrete/fields.py +0 -0
  265. {accrete-0.0.138 → accrete-0.0.140}/accrete/forms.py +0 -0
  266. {accrete-0.0.138 → accrete-0.0.140}/accrete/managers.py +0 -0
  267. {accrete-0.0.138 → accrete-0.0.140}/accrete/middleware.py +0 -0
  268. {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0001_initial.py +0 -0
  269. {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0002_initial.py +0 -0
  270. {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0003_remove_member_name.py +0 -0
  271. {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
  272. {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
  273. {accrete-0.0.138 → accrete-0.0.140}/accrete/migrations/__init__.py +0 -0
  274. {accrete-0.0.138 → accrete-0.0.140}/accrete/storage.py +0 -0
  275. {accrete-0.0.138 → accrete-0.0.140}/accrete/tests.py +0 -0
  276. {accrete-0.0.138 → accrete-0.0.140}/accrete/urls.py +0 -0
  277. {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/__init__.py +0 -0
  278. {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/dates.py +0 -0
  279. {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/forms.py +0 -0
  280. {accrete-0.0.138 → accrete-0.0.140}/accrete/utils/log.py +0 -0
  281. {accrete-0.0.138 → accrete-0.0.140}/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.140
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
@@ -33,8 +33,6 @@ class Filter:
33
33
  LABEL_OR = _('Or')
34
34
  LABEL_XOR = _('Not Or')
35
35
 
36
- # EXCLUDE = ['tenant']
37
-
38
36
  DATE_FORMAT = '%Y-%m-%d'
39
37
 
40
38
  TYPES_INTEGER = [
@@ -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',
@@ -99,10 +98,6 @@ class User(AbstractBaseUser, PermissionsMixin):
99
98
  )
100
99
  ]
101
100
 
102
- filter_exclude = [
103
- 'password'
104
- ]
105
-
106
101
  username_validator = UnicodeUsernameValidator()
107
102
  login_validator = validate_member_login
108
103
 
@@ -178,7 +173,8 @@ class User(AbstractBaseUser, PermissionsMixin):
178
173
  verbose_name=_('Language'),
179
174
  max_length=10,
180
175
  null=True,
181
- blank=True
176
+ blank=True,
177
+ default=default_language_code
182
178
  )
183
179
 
184
180
  theme = models.CharField(
@@ -211,3 +207,7 @@ class User(AbstractBaseUser, PermissionsMixin):
211
207
  def all_tenants(self):
212
208
  tenants = Tenant.objects.filter(members__user=self)
213
209
  return tenants
210
+
211
+ @staticmethod
212
+ def exclude_from_filter():
213
+ return ['password']
@@ -80,7 +80,7 @@ def user_change_password(request):
80
80
  + f'?{request.GET.urlencode()}'
81
81
  )
82
82
  ctx.update(form=form)
83
- return ui.modal_response(request, 'user/change_password.html', ctx)
83
+ return ui.modal_response(request, 'user/change_password.html', ctx, update=True)
84
84
  return render(request, 'user/change_password.html', ctx)
85
85
 
86
86
 
@@ -103,5 +103,5 @@ def user_change_email(request):
103
103
  if form.is_saved:
104
104
  return redirect('user:detail')
105
105
  ctx.update(form=form)
106
- return ui.modal_response(request, 'user/change_email.html', ctx)
106
+ return ui.modal_response(request, 'user/change_email.html', ctx, update=True)
107
107
  return render(request, 'user/change_email.html', ctx)
@@ -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
@@ -1,29 +1,34 @@
1
1
  import os
2
- from enum import Enum
3
2
  from functools import wraps
4
3
  from django.http import HttpResponse, HttpResponseNotFound
5
4
  from django.contrib.auth.mixins import LoginRequiredMixin
6
5
  from django.contrib.auth.views import login_required
7
6
  from django.core.exceptions import ImproperlyConfigured
8
- from django.shortcuts import redirect, get_object_or_404
7
+ from django.shortcuts import redirect, get_object_or_404, resolve_url
9
8
  from django.conf import settings
10
9
  from accrete.models import Tenant, Member
11
10
  from accrete.tenant import get_tenant, tenant_has_group, member_has_group
12
- from . import config
11
+ from accrete import config
13
12
 
14
13
 
15
14
  class TenantRequiredMixin(LoginRequiredMixin):
16
15
 
16
+ # Redirect to the specified url if the group check fails
17
17
  TENANT_NOT_SET_URL = None
18
18
  GROUP_NOT_SET_URL = None
19
+
20
+ # If set, one of the supplied groups must be present on the
21
+ # tenant or member respectively. If the list item is of type tuple,
22
+ # all the groups in the tuple must be present.
19
23
  TENANT_GROUPS: list[str | tuple[str]] = []
20
24
  MEMBER_GROUPS: list[str | tuple[str]] = []
21
25
 
22
26
  def dispatch(self, request, *args, **kwargs):
23
27
  res = super().dispatch(request, *args, **kwargs)
24
- tenant = self.get_tenant()
25
- if not tenant:
28
+ if not self.get_tenant():
26
29
  return self.handle_tenant_not_set()
30
+ if self.request.user.is_superuser:
31
+ return res
27
32
  if not self.check_tenant_group():
28
33
  return self.handle_tenant_group_not_set()
29
34
  if not self.check_member_group():
@@ -31,7 +36,10 @@ class TenantRequiredMixin(LoginRequiredMixin):
31
36
  return res
32
37
 
33
38
  def handle_tenant_not_set(self):
34
- return redirect(self.get_tenant_not_set_url())
39
+ return redirect(
40
+ resolve_url(self.get_tenant_not_set_url())
41
+ + f'?next={self.request.get_full_path_info()}'
42
+ )
35
43
 
36
44
  def handle_tenant_group_not_set(self):
37
45
  return redirect(self.get_group_not_set_url())
@@ -41,8 +49,8 @@ class TenantRequiredMixin(LoginRequiredMixin):
41
49
 
42
50
  def get_tenant_not_set_url(self):
43
51
  tenant_not_set_url = (
44
- self.TENANT_NOT_SET_URL
45
- or settings.ACCRETE_TENANT_NOT_SET_URL
52
+ self.TENANT_NOT_SET_URL
53
+ or config.ACCRETE_TENANT_NOT_SET_URL
46
54
  )
47
55
  if not tenant_not_set_url:
48
56
  cls_name = self.__class__.__name__
@@ -57,7 +65,7 @@ class TenantRequiredMixin(LoginRequiredMixin):
57
65
  def get_group_not_set_url(self):
58
66
  group_not_set_url = (
59
67
  self.GROUP_NOT_SET_URL
60
- or settings.ACCRETE_GROUP_NOT_SET_URL
68
+ or config.ACCRETE_GROUP_NOT_SET_URL
61
69
  )
62
70
  if not group_not_set_url:
63
71
  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.140'
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