accrete 0.0.158__tar.gz → 0.0.160__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 (307) hide show
  1. {accrete-0.0.158 → accrete-0.0.160}/PKG-INFO +1 -1
  2. {accrete-0.0.158 → accrete-0.0.160}/accrete/consumer.py +5 -2
  3. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/queries.py +2 -2
  4. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/response.py +16 -2
  5. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/css/accrete.css +10 -11
  6. accrete-0.0.160/accrete/contrib/ui/static/css/accrete.css.map +7 -0
  7. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/css/accrete.scss +12 -12
  8. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/layout.html +4 -4
  9. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/list.html +1 -1
  10. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/modal.html +1 -1
  11. accrete-0.0.160/accrete/contrib/ui/templates/ui/oob.html +3 -0
  12. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/table.html +15 -14
  13. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/templatetags/tenant_quick_switch.html +2 -2
  14. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +4 -6
  15. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +8 -6
  16. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templatetags/ui.py +22 -3
  17. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/widgets/search_select.py +0 -6
  18. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +1 -1
  19. {accrete-0.0.158 → accrete-0.0.160}/accrete/managers.py +1 -1
  20. {accrete-0.0.158 → accrete-0.0.160}/accrete/middleware.py +8 -3
  21. {accrete-0.0.158 → accrete-0.0.160}/accrete/models.py +2 -2
  22. {accrete-0.0.158 → accrete-0.0.160}/pyproject.toml +1 -1
  23. accrete-0.0.158/accrete/contrib/ui/static/css/accrete.css.map +0 -7
  24. accrete-0.0.158/accrete/contrib/ui/templates/ui/oob.html +0 -3
  25. {accrete-0.0.158 → accrete-0.0.160}/.gitignore +0 -0
  26. {accrete-0.0.158 → accrete-0.0.160}/LICENSE +0 -0
  27. {accrete-0.0.158 → accrete-0.0.160}/README.md +0 -0
  28. {accrete-0.0.158 → accrete-0.0.160}/accrete/__init__.py +0 -0
  29. {accrete-0.0.158 → accrete-0.0.160}/accrete/admin.py +0 -0
  30. {accrete-0.0.158 → accrete-0.0.160}/accrete/apps.py +0 -0
  31. {accrete-0.0.158 → accrete-0.0.160}/accrete/channels.py +0 -0
  32. {accrete-0.0.158 → accrete-0.0.160}/accrete/config.py +0 -0
  33. {accrete-0.0.158 → accrete-0.0.160}/accrete/context_processors.py +0 -0
  34. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/__init__.py +0 -0
  35. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/__init__.py +0 -0
  36. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/admin.py +0 -0
  37. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/apps.py +0 -0
  38. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  39. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  40. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  41. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/migrations/__init__.py +0 -0
  42. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/country/models.py +0 -0
  43. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/__init__.py +0 -0
  44. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/admin.py +0 -0
  45. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/apps.py +0 -0
  46. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/config.py +0 -0
  47. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/helper.py +0 -0
  48. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  49. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  50. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  51. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  52. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  53. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/0006_remove_log_accrete_log_model_cf888c_idx_and_more.py +0 -0
  54. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/0007_alter_log_new_value_type_alter_log_old_value_type.py +0 -0
  55. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/migrations/__init__.py +0 -0
  56. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/models.py +0 -0
  57. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/queries.py +0 -0
  58. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/signals.py +0 -0
  59. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/tests.py +0 -0
  60. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/log/views.py +0 -0
  61. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/__init__.py +0 -0
  62. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/admin.py +0 -0
  63. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/apps.py +0 -0
  64. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/forms.py +0 -0
  65. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  66. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  67. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  68. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  69. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/models.py +0 -0
  70. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/tests.py +0 -0
  71. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/sequence/views.py +0 -0
  72. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/__init__.py +0 -0
  73. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/admin.py +0 -0
  74. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/apps.py +0 -0
  75. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/forms.py +0 -0
  76. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  77. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  78. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/models.py +0 -0
  79. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/tasks.py +0 -0
  80. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/tests.py +0 -0
  81. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/system_mail/views.py +0 -0
  82. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/__init__.py +0 -0
  83. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/admin.py +0 -0
  84. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/apps.py +0 -0
  85. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/config.py +0 -0
  86. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/filter.py +0 -0
  87. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/forms.py +0 -0
  88. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/middleware.py +0 -0
  89. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/migrations/0001_initial.py +0 -0
  90. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/migrations/0002_alter_theme_color_danger_alter_theme_color_link_and_more.py +0 -0
  91. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/migrations/0003_alter_theme_check_user_or_tenant.py +0 -0
  92. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/migrations/0004_theme_force_tenant_theme.py +0 -0
  93. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/migrations/0005_theme_base_theme.py +0 -0
  94. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/migrations/__init__.py +0 -0
  95. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/models.py +0 -0
  96. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  97. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/README.md +0 -0
  98. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  99. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  100. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  101. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  102. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  103. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  104. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  105. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  106. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  107. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  108. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  109. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  110. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  111. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  112. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  113. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  114. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/package.json +0 -0
  115. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  116. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  117. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  118. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  119. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  120. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  121. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  122. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  123. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  124. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  125. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  126. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  127. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  128. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  129. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  130. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  131. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  132. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  133. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  134. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  135. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  136. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  137. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  138. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  139. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  140. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  141. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  142. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  143. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  144. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  145. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  146. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  147. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  148. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  149. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  150. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  151. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  152. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  153. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  154. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  155. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  156. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  157. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  158. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  159. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  160. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  161. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  162. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  163. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  164. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  165. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  166. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  167. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  168. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  169. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  170. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  171. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  172. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  173. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  174. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  175. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  176. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  177. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  178. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  179. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  180. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  181. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  182. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  183. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  184. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  185. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  186. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  187. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  188. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  189. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  190. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  191. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  192. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/css/fa.css +0 -0
  193. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/css/icons.css +0 -0
  194. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  195. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  196. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
  197. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
  198. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
  199. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/js/filter.js +0 -0
  200. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  201. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/js/ws.js +0 -0
  202. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  203. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  204. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  205. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  206. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  207. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  208. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  209. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  210. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  211. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  212. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  213. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  214. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
  215. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/radio.html +0 -0
  216. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  217. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  218. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  219. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/content.html +0 -0
  220. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
  221. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/custom_theme.html +0 -0
  222. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/detail.html +0 -0
  223. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/favicon.html +0 -0
  224. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
  225. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  226. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  227. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  228. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
  229. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/form_error.html +0 -0
  230. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
  231. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/message.html +0 -0
  232. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
  233. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/templatetags/field.html +0 -0
  234. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/widgets/date_weekday.html +0 -0
  235. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  236. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/templatetags/__init__.py +0 -0
  237. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/tests.py +0 -0
  238. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/urls.py +0 -0
  239. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/views.py +0 -0
  240. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/widgets/__init__.py +0 -0
  241. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/ui/widgets/date_weekday.py +0 -0
  242. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/__init__.py +0 -0
  243. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/admin.py +0 -0
  244. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/apps.py +0 -0
  245. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/auth_backends.py +0 -0
  246. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/forms.py +0 -0
  247. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  248. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  249. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/middleware.py +0 -0
  250. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  251. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  252. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
  253. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
  254. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
  255. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
  256. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
  257. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +0 -0
  258. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0009_alter_user_theme.py +0 -0
  259. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0010_alter_user_theme.py +0 -0
  260. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/0011_alter_user_theme.py +0 -0
  261. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/migrations/__init__.py +0 -0
  262. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/models.py +0 -0
  263. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/templates/user/change_email.html +0 -0
  264. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/templates/user/change_password.html +0 -0
  265. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/templates/user/login.html +0 -0
  266. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/templates/user/password_forgotten.html +0 -0
  267. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/templates/user/user_preferences.html +0 -0
  268. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/tests.py +0 -0
  269. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/urls.py +0 -0
  270. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user/views.py +0 -0
  271. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/__init__.py +0 -0
  272. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/admin.py +0 -0
  273. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/apps.py +0 -0
  274. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/config.py +0 -0
  275. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/forms.py +0 -0
  276. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  277. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
  278. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/models.py +0 -0
  279. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  280. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  281. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/tests.py +0 -0
  282. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/urls.py +0 -0
  283. {accrete-0.0.158 → accrete-0.0.160}/accrete/contrib/user_registration/views.py +0 -0
  284. {accrete-0.0.158 → accrete-0.0.160}/accrete/fields.py +0 -0
  285. {accrete-0.0.158 → accrete-0.0.160}/accrete/forms.py +0 -0
  286. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0001_initial.py +0 -0
  287. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0002_initial.py +0 -0
  288. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0003_remove_member_name.py +0 -0
  289. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
  290. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
  291. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0006_alter_member_user.py +0 -0
  292. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0007_accessgroup_description.py +0 -0
  293. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0008_alter_member_access_groups_and_more.py +0 -0
  294. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0009_alter_accessgroup_name.py +0 -0
  295. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/0010_alter_accessgroup_description.py +0 -0
  296. {accrete-0.0.158 → accrete-0.0.160}/accrete/migrations/__init__.py +0 -0
  297. {accrete-0.0.158 → accrete-0.0.160}/accrete/storage.py +0 -0
  298. {accrete-0.0.158 → accrete-0.0.160}/accrete/tenant.py +0 -0
  299. {accrete-0.0.158 → accrete-0.0.160}/accrete/tests.py +0 -0
  300. {accrete-0.0.158 → accrete-0.0.160}/accrete/urls.py +0 -0
  301. {accrete-0.0.158 → accrete-0.0.160}/accrete/utils/__init__.py +0 -0
  302. {accrete-0.0.158 → accrete-0.0.160}/accrete/utils/dates.py +0 -0
  303. {accrete-0.0.158 → accrete-0.0.160}/accrete/utils/forms.py +0 -0
  304. {accrete-0.0.158 → accrete-0.0.160}/accrete/utils/log.py +0 -0
  305. {accrete-0.0.158 → accrete-0.0.160}/accrete/utils/models.py +0 -0
  306. {accrete-0.0.158 → accrete-0.0.160}/accrete/utils/views.py +0 -0
  307. {accrete-0.0.158 → accrete-0.0.160}/accrete/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.158
3
+ Version: 0.0.160
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
@@ -14,5 +14,8 @@ class WebsocketTenantConsumer(WebsocketConsumer):
14
14
 
15
15
  class JsonWebsocketTenantConsumer(JsonWebsocketConsumer):
16
16
 
17
- pass
18
-
17
+ def websocket_connect(self, message):
18
+ tenant = get_tenant()
19
+ if tenant is None:
20
+ raise ValueError('Tenant must be set.')
21
+ super().websocket_connect(message)
@@ -9,13 +9,13 @@ def get_nextval(name: str, create_if_none:bool = True) -> int:
9
9
  tenant = get_tenant()
10
10
  with transaction.atomic():
11
11
  seq = Sequence.objects.filter(
12
- tenant=tenant, name=name
12
+ tenant_id=tenant.pk, name=name
13
13
  ).select_for_update().first()
14
14
 
15
15
  if seq is None and not create_if_none:
16
16
  raise ValueError(f'Sequence "{name}" does not exist.')
17
17
  elif seq is None:
18
- seq = Sequence(name=name, tenant=tenant)
18
+ seq = Sequence(name=name, tenant_id=tenant.pk)
19
19
  seq.save()
20
20
 
21
21
  nextval = seq.nextval
@@ -58,18 +58,20 @@ class OobResponse(Response):
58
58
 
59
59
  oob_template = 'ui/oob.html'
60
60
 
61
- def __init__(self, *, template: str, context: dict, swap: str, tag: str = 'div'):
61
+ def __init__(self, *, template: str, context: dict, swap: str, tag: str = 'div', attrs: dict = None):
62
62
  super().__init__(template=self.oob_template, context=context)
63
63
  self.include_template = template
64
64
  self.swap = swap
65
65
  self.tag = tag
66
+ self.attrs = attrs or {}
66
67
 
67
68
  def get_context(self):
68
69
  context = super().get_context()
69
70
  context.update({'oob': {
70
71
  'template': self.include_template,
71
72
  'swap': self.swap,
72
- 'tag': self.tag
73
+ 'tag': self.tag,
74
+ 'attrs': self.attrs
73
75
  }})
74
76
  return context
75
77
 
@@ -207,6 +209,7 @@ class ListEntryResponse(Response):
207
209
  ):
208
210
  super().__init__(template=self.base_template, context=context or {})
209
211
  self.instance = instance
212
+ self.instance.refresh_from_db()
210
213
  self.list_entry_template = list_entry_template
211
214
  self.page = page
212
215
  self.is_new = is_new
@@ -244,6 +247,7 @@ class TableResponse(WindowResponse):
244
247
  context: dict,
245
248
  fields: list[str],
246
249
  instance_label: str | Promise | None = None,
250
+ active_instance: Model = None,
247
251
  footer: dict = None,
248
252
  page: paginator.Page = None,
249
253
  ui_filter: Filter = None,
@@ -253,6 +257,8 @@ class TableResponse(WindowResponse):
253
257
  overview_template: str = 'ui/table.html',
254
258
  detail_header_template: str = None,
255
259
  detail_data_template: str = None,
260
+ detail_enabled: bool = True,
261
+ can_compact: bool = True,
256
262
  config: WindowResponseConfig = None
257
263
  ):
258
264
  assert page is not None or ui_filter is not None, _(
@@ -267,6 +273,7 @@ class TableResponse(WindowResponse):
267
273
  config=config
268
274
  )
269
275
  self.instance_label = instance_label
276
+ self.active_instance = active_instance
270
277
  self.fields = fields
271
278
  self.footer = footer
272
279
  self.page = page or (ui_filter and ui_filter.get_page())
@@ -274,6 +281,8 @@ class TableResponse(WindowResponse):
274
281
  self.endless_scroll = endless_scroll
275
282
  self.detail_header_template = detail_header_template
276
283
  self.detail_data_template = detail_data_template
284
+ self.detail_enabled = detail_enabled
285
+ self.can_compact = can_compact
277
286
 
278
287
  def _has_panel(self):
279
288
  return bool(self.panel_template or self.ui_filter)
@@ -286,9 +295,12 @@ class TableResponse(WindowResponse):
286
295
  'endless_scroll': self.endless_scroll,
287
296
  'fields': self.fields,
288
297
  'instance_label': self.instance_label,
298
+ 'active_instance': self.active_instance,
289
299
  'footer': self.footer,
290
300
  'detail_header_template': self.detail_header_template,
291
301
  'detail_data_template': self.detail_data_template,
302
+ 'detail_enabled': self.detail_enabled,
303
+ 'can_compact': self.can_compact,
292
304
  'show_content_right': str(bool(
293
305
  self.detail_header_template or self.detail_data_template
294
306
  )).lower()
@@ -313,6 +325,7 @@ class TableRowResponse(Response):
313
325
  ):
314
326
  super().__init__(template=self.base_template, context={})
315
327
  self.instance = instance
328
+ self.instance.refresh_from_db()
316
329
  self.fields = fields
317
330
  self.instance_label = instance_label
318
331
  self.footer = footer
@@ -322,6 +335,7 @@ class TableRowResponse(Response):
322
335
  context = super().get_context()
323
336
  context.update({
324
337
  'instance': self.instance,
338
+ 'row_object': self.instance,
325
339
  'fields': self.fields,
326
340
  'instance_label': self.instance_label,
327
341
  'footer': self.footer,
@@ -3,11 +3,11 @@
3
3
  --bulma-body-size: .9em;
4
4
  --bulma-navbar-height: 40px;
5
5
  --bulma-menu-item-selected-h: var(--bulma-primary-h);
6
- --accrete-detail-width: 40em;
6
+ --accrete-detail-width: 38em;
7
+ --accrete-action-panel-width: 20em;
7
8
  --bulma-primary-h: 153.28deg;
8
9
  --bulma-primary-s: 52.89%;
9
10
  --bulma-primary-l: 52.55%;
10
- --accrete-action-panel-width: 320px;
11
11
  --bulma-input-arrow: var(--bulma-primary);
12
12
  --bulma-arrow-color: var(--bulma-primary);
13
13
  --accrete-hover-color: #F0F2F4; }
@@ -52,17 +52,23 @@ a {
52
52
  border-bottom-color: transparent;
53
53
  border-left-color: transparent; }
54
54
 
55
+ .button.is-static.is-primary {
56
+ background-color: var(--bulma-primary);
57
+ color: var(--bulma-button-disabled-border-color); }
58
+
55
59
  .input:focus, .input:focus-within {
56
60
  box-shadow: none;
57
61
  border: 1px solid var(--bulma-primary); }
58
62
 
59
63
  input[disabled] {
60
- background-color: transparent !important;
61
- cursor: unset !important; }
64
+ cursor: default !important; }
62
65
 
63
66
  input[disabled] ~ .helptext {
64
67
  font-weight: normal !important; }
65
68
 
69
+ select[disabled] {
70
+ cursor: default !important; }
71
+
66
72
  textarea {
67
73
  box-shadow: none !important; }
68
74
 
@@ -202,13 +208,6 @@ select:focus {
202
208
  background: var(--bulma-scheme-main);
203
209
  z-index: 40;
204
210
  box-shadow: 2px 0 20px 0 var(--bulma-grey-light); } }
205
- .menu-list a.is-active, .menu-list a.is-selected, .menu-list button.is-active, .menu-list button.is-selected, .menu-list .menu-item.is-active, .menu-list .menu-item.is-selected {
206
- --bulma-menu-item-h: var(--bulma-primary-h);
207
- --bulma-menu-item-s: var(--bulma-primary-s);
208
- --bulma-menu-item-l: var(--bulma-primary-l);
209
- --bulma-menu-item-background-l: var(--bulma-primary-l);
210
- --bulma-menu-item-color-l: var(--bulma-primary-invert-l); }
211
-
212
211
  .hoverable *:hover {
213
212
  background-color: var(--accrete-hover-color); }
214
213
 
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "mappings": "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",
4
+ "sources": ["accrete.scss"],
5
+ "names": [],
6
+ "file": "accrete.css"
7
+ }
@@ -4,11 +4,11 @@
4
4
  --bulma-body-size: .9em;
5
5
  --bulma-navbar-height: 40px;
6
6
  --bulma-menu-item-selected-h: var(--bulma-primary-h);
7
- --accrete-detail-width: 40em;
7
+ --accrete-detail-width: 38em;
8
+ --accrete-action-panel-width: 20em;
8
9
  --bulma-primary-h: 153.28deg;
9
10
  --bulma-primary-s: 52.89%;
10
11
  --bulma-primary-l: 52.55%;
11
- --accrete-action-panel-width: 320px;
12
12
  --bulma-input-arrow: var(--bulma-primary);
13
13
  --bulma-arrow-color: var(--bulma-primary);
14
14
  --accrete-hover-color: #F0F2F4;
@@ -70,20 +70,28 @@ a {
70
70
  border-left-color: transparent;
71
71
  }
72
72
 
73
+ .button.is-static.is-primary {
74
+ background-color: var(--bulma-primary);
75
+ color: var(--bulma-button-disabled-border-color);
76
+ }
77
+
73
78
  .input:focus, .input:focus-within {
74
79
  box-shadow: none;
75
80
  border: 1px solid var(--bulma-primary);
76
81
  }
77
82
 
78
83
  input[disabled] {
79
- background-color: transparent !important;
80
- cursor: unset !important;
84
+ cursor: default !important;
81
85
  }
82
86
 
83
87
  input[disabled] ~ .helptext {
84
88
  font-weight: normal !important;
85
89
  }
86
90
 
91
+ select[disabled] {
92
+ cursor: default !important;
93
+ }
94
+
87
95
  textarea {
88
96
  box-shadow: none!important;
89
97
  }
@@ -263,14 +271,6 @@ select:focus {
263
271
  }
264
272
  }
265
273
 
266
- .menu-list a.is-active, .menu-list a.is-selected, .menu-list button.is-active, .menu-list button.is-selected, .menu-list .menu-item.is-active, .menu-list .menu-item.is-selected {
267
- --bulma-menu-item-h: var(--bulma-primary-h);
268
- --bulma-menu-item-s: var(--bulma-primary-s);
269
- --bulma-menu-item-l: var(--bulma-primary-l);
270
- --bulma-menu-item-background-l: var(--bulma-primary-l);
271
- --bulma-menu-item-color-l: var(--bulma-primary-invert-l);
272
- }
273
-
274
274
  .hoverable *:hover {
275
275
  background-color: var(--accrete-hover-color);
276
276
  }
@@ -11,7 +11,7 @@
11
11
  <meta charset="utf-8">
12
12
  <meta name="viewport" content="width=device-width, initial-scale=1">
13
13
  {% include 'ui/favicon.html' %}
14
- <link rel="stylesheet" type="text/css" href="{% static "css/accrete.css" %}?v=0.0.154">
14
+ <link rel="stylesheet" type="text/css" href="{% static "css/accrete.css" %}?v=0.0.159">
15
15
  <link rel="stylesheet" type="text/css" href="{% static "css/icons.css" %}">
16
16
  <link rel="stylesheet" type="text/css" href="{% static "css/fa.css" %}">
17
17
  {% if style_template %}{% include style_template %}{% endif %}
@@ -166,7 +166,7 @@
166
166
  {% if config.display_header %}
167
167
  <div id="overview-header">
168
168
  <div class="is-flex is-justify-content-space-between is-flex-wrap-wrap {% if is_centered %}container{% endif %}">
169
- <div class="is-flex is-flex-wrap-wrap is-flex-grow-5 is-align-self-center py-2 mx-1 header-items">
169
+ <div id="overview-header-items" class="is-flex is-flex-wrap-wrap is-flex-grow-5 is-align-self-center py-2 mx-1 header-items">
170
170
  {% block overview_header %}
171
171
  <div class="" style="align-self: center">
172
172
  <p class="title is-5">{{ title }}</p>
@@ -199,7 +199,7 @@
199
199
  <button id="pagination-next-button" class="button"
200
200
  hx-get="{% if page.has_next %}{% querystring page=page.next_page_number %}{% else %}{% querystring page=1 %}{% endif %}"
201
201
  hx-replace-url="true"
202
- hx-select-oob="#overview,#pagination,#overview-buttons"
202
+ hx-select-oob="#overview-header-items,#overview,#pagination,#overview-buttons"
203
203
  >
204
204
  &gt;
205
205
  </button>
@@ -221,7 +221,7 @@
221
221
  x-transition:enter.duration.200ms x-transition:leave.duration.50ms
222
222
  >
223
223
  <div id="detail-indicator" class="htmx-indicator">
224
- <progress class="progress is-success" max="100"></progress>
224
+ <progress class="progress is-primary" max="100"></progress>
225
225
  </div>
226
226
  <div class="is-flex is-flex-direction-column" style="height: 100%">
227
227
  <div class="is-flex is-flex-wrap-nowrap is-justify-content-space-between m-2">
@@ -38,7 +38,7 @@
38
38
  hx-swap="beforeend"
39
39
  hx-replace-url="true"
40
40
  hx-indicator="#endless-scroll-indicator"></div>
41
- <progress id="endless-scroll-indicator" class="htmx-indicator progress is-small is-success" max="100">15%</progress>
41
+ <progress id="endless-scroll-indicator" class="htmx-indicator progress is-small is-primary" max="100">15%</progress>
42
42
  {% endif %}
43
43
  </div>
44
44
  {% endblock %}
@@ -41,7 +41,7 @@
41
41
  {% endblock %}
42
42
  </footer>
43
43
  <div id="{{ modal_id }}-indicator" x-ref="{{ modal_id|xrefsave }}Indicator" class="htmx-indicator modal-request-overlay" style="position: absolute; inset: 0; background: rgba(47, 47, 62, 0.2)">
44
- <progress class="progress is-success" max="100" style="position: absolute; inset: 0; min-width: 300px; max-width: 20vw; margin: auto;"></progress>
44
+ <progress class="progress is-primary" max="100" style="position: absolute; inset: 0; min-width: 300px; max-width: 20vw; margin: auto;"></progress>
45
45
  </div>
46
46
  </div>
47
47
  </div>
@@ -0,0 +1,3 @@
1
+ <{{ oob.tag|default_if_none:'div' }} hx-swap-oob="{{ oob.swap|default_if_none:'true' }}" {% for k, v in oob.attrs.items %}{{ k }}="{{ v }}"{% endfor %}>
2
+ {% include oob.template %}
3
+ </{{ oob.tag|default_if_none:'div' }}>
@@ -3,7 +3,7 @@
3
3
  {% load partials %}
4
4
 
5
5
  {% block table %}
6
- <table id="content-table" class="table can-compact is-fullwidth is-hoverable is-narrow my-0" hx-indicator=".htmx-indicator" x-data="">
6
+ <table id="content-table" class="table is-fullwidth is-hoverable is-narrow my-0 {% if can_compact %}can-compact{% endif %}" style="{% if not can_compact %}white-space: nowrap{% endif %}" hx-indicator=".htmx-indicator" x-data="">
7
7
  <thead style="position: sticky; top: 0; z-index: 10; background-color: var(--bulma-scheme-main)">
8
8
  <tr>
9
9
  {% if instance_label %}<th>{{ instance_label }}</th>{% endif %}
@@ -13,24 +13,24 @@
13
13
  </tr>
14
14
  </thead>
15
15
  <tbody id="content-table-body" style="z-index: 9" x-ref="tbody">
16
- {% for instance in page.object_list %}
16
+ {% for row_object in page.object_list %}
17
17
  {% partialdef tr inline=True %}
18
- <tr id="tr-{{ instance.pk }}"
19
- {% if instance.get_absolute_url %}
18
+ <tr id="tr-{{ row_object.pk }}"
19
+ {% if row_object.get_absolute_url and detail_enabled %}
20
20
  style="cursor: pointer;"
21
- hx-get="{{ instance.get_absolute_url }}{% querystring %}" hx-swap="none"
22
- hx-replace-url="{% querystring detail=instance.pk %}"
23
- x-data="{selected: false}" @unselect-tr.window="selected = false"
21
+ hx-get="{{ row_object.get_absolute_url }}{% querystring %}" hx-swap="none"
22
+ hx-replace-url="{% querystring detail=row_object.pk %}"
23
+ x-data="{selected: {% if row_object == active_instance %}true{% else %}false{% endif %}}" @unselect-tr.window="selected = false"
24
24
  x-on:click="$dispatch('unselect-tr'); selected = true; $nextTick(() => { $el.scrollIntoView( {block: 'nearest'} ) });" x-bind:class="selected ? 'is-primary' : ''"
25
25
  {% endif %}
26
26
  >
27
27
  {% partialdef td inline=True %}
28
- {% if instance_label %}<td>{{ instance }}</td>{% endif %}
28
+ {% if instance_label %}<td><span class="has-text-weight-bold">{{ row_object }}</span></td>{% endif %}
29
29
  {% for field in fields %}
30
- <td style="text-align: {{ instance|table_alignment:field }}">
30
+ <td style="text-align: {{ row_object|table_alignment:field }}">
31
31
  <span>
32
- <span class="responsive-heading has-text-weight-light" style="margin-right: .2rem">{{ instance|verbose_field_name:field }}:</span>
33
- {{ instance|table_display:field|default_if_none:'' }}
32
+ {% if can_compact %}<span class="responsive-heading has-text-weight-medium mr-2" style="margin-right: .2rem">{{ row_object|verbose_field_name:field }}:</span>{% endif %}
33
+ <span>{{ row_object|table_display:field|default_if_none:'' }}</span>
34
34
  </span>
35
35
  </td>
36
36
  {% endfor %}
@@ -59,19 +59,20 @@
59
59
  </tr>
60
60
  </tfoot>
61
61
  </table>
62
-
62
+ {% if endless_scroll %}
63
63
  <div id="endless-scroller"
64
64
  {% if page.has_next %}
65
65
  hx-get="{% querystring page=page.next_page_number %}"
66
66
  hx-trigger="intersect once"
67
- hx-select="tbody > tr"
67
+ hx-select="#content-table > tbody > tr"
68
68
  hx-target="#content-table-body"
69
69
  hx-swap="beforeend"
70
- hx-select-oob="#pagination-next-button,#pagination-end-index,#endless-scroller"
70
+ hx-select-oob="#overview-header-items,#pagination-next-button,#pagination-end-index,#endless-scroller"
71
71
  hx-indicator="#endless-scroll-indicator"
72
72
  hx-replace-url="true"
73
73
  {% endif %}
74
74
  >
75
75
  </div>
76
76
  <progress id="endless-scroll-indicator" class="htmx-indicator progress is-small is-primary" max="100">15%</progress>
77
+ {% endif %}
77
78
  {% endblock %}
@@ -5,9 +5,9 @@
5
5
  <article class="box p-1" style="position: fixed; top: var(--bulma-navbar-height); left: 0; min-width: 150px; border-top-left-radius: 0; border-top-right-radius: 0;"
6
6
  x-show="showQuickSwitch" x-cloak="" x-on:click.outside="showQuickSwitch = false"
7
7
  >
8
- <ul class="hoverable mr-1">
8
+ <ul class="hoverable">
9
9
  {% for t in tenants %}
10
- <li class="navbar-item" style="cursor: pointer; border-radius: var(--bulma-radius);"><a href="{{ switch_url }}?tenant_id={{ t.pk }}" hx-boost="false" style="width: 100%; display: inline-block">{{ t.name }}</a></li>
10
+ <li class="navbar-item has-text-weight-medium" style="cursor: pointer; border-radius: var(--bulma-radius); color: unset;"><a href="{{ switch_url }}?tenant_id={{ t.pk }}" hx-boost="false" style="width: 100%; display: inline-block">{{ t.name }}</a></li>
11
11
  {% endfor %}
12
12
  </ul>
13
13
  </article>
@@ -18,13 +18,11 @@
18
18
  <div style="position: relative; top: .5rem; z-index: 90;">
19
19
  <div x-show="open" x-effect="if (open) {$nextTick(() => { $refs.dropdownContent.scrollIntoView(true) });}" x-cloak="" class="box pt-3 px-3 mb-2" x-ref="dropdownContent" tabindex="-1" x-transition style="position: absolute; width: 100%">
20
20
  <input id="id_{{ widget.name }}_search" type="search" autocomplete="off" class="input my-2" x-ref="searchInput" aria-label="search"
21
- name="{{ widget.search_parameter }}"
22
- placeholder="{% translate 'Type to search' %}"
23
- hx-get="{{ widget.search_url }}"
24
- hx-trigger="input changed delay:500ms, search"
25
- hx-target="#{{ widget.name }}_dropdown_items"
21
+ name="{{ widget.search_parameter }}" placeholder="{% translate 'Type to search' %}" hx-get="{{ widget.search_url }}"
22
+ hx-trigger="input changed delay:500ms, search" hx-target="#{{ widget.name }}_dropdown_items"
23
+ style="border-radius: 0; border-top: none; border-right: none; border-left: none"
26
24
  >
27
- <div x-on:click="$refs.inputValue.setAttribute('value', $event.target.value); $refs.inputDisplay.value = $event.target.innerText; htmx.trigger($refs.inputValue, 'submit'); open = false; {% if widget.hx_trigger_on_change %}htmx.trigger('#id_{{ widget.name }}_value', 'change');{% endif %}"
25
+ <div x-on:click="$refs.inputValue.setAttribute('value', $event.target.value); $refs.inputDisplay.value = $event.target.innerText; htmx.trigger($refs.inputValue, 'submit'); open = false; htmx.trigger('#id_{{ widget.name }}_value', 'change');"
28
26
  x-on:keydown="if (![9, 27, 38, 40].includes($event.keyCode)) {$refs.searchInput.focus();}"
29
27
  @keyup.escape="if (open) {$event.stopPropagation();} open = false;"
30
28
  >
@@ -1,7 +1,7 @@
1
1
  {% load i18n %}
2
2
  {% load ui %}
3
3
 
4
- <div class="is-fullwidth" x-data="{open: false}"
4
+ <div class="is-fullwidth" x-data="{open: false, changed: false}"
5
5
  @click.outside="open = false" hx-disinherit="*" @keyup.escape="if (open) {$event.stopPropagation();} open = false;"
6
6
  x-on:keydown="if (!open && [38, 40].includes($event.keyCode)) {open = true};"
7
7
  >
@@ -21,7 +21,10 @@
21
21
  let val = $event.target.getAttribute('data-value');
22
22
  $refs.inputValue.querySelector(`option[value=${CSS.escape(val)}]`).remove();
23
23
  $event.target.parentElement.remove();
24
- $dispatch('change');
24
+ changed = true;
25
+ if (!open) {
26
+ htmx.trigger('#{{ widget.attrs.id }}', 'change');
27
+ }
25
28
  }
26
29
  "
27
30
  >
@@ -34,7 +37,7 @@
34
37
  </div>
35
38
  </div>
36
39
  <div style="position: relative; top: .5rem; z-index: 9">
37
- <div x-show="open" x-effect="if (open) {$nextTick(() => { $refs.dropdownContent.scrollIntoView(true) });}" class="box pt-3 px-3 mb-2" x-ref="dropdownContent" x-cloak="" tabindex="-1" x-transition style="position: absolute; width: 100%">
40
+ <div x-show="open" x-effect="if (open) {$nextTick(() => { $refs.dropdownContent.scrollIntoView(true) });} if(!open & changed) {htmx.trigger('#{{ widget.attrs.id }}', 'change');}" class="box pt-3 px-3 mb-2" x-ref="dropdownContent" x-cloak="" tabindex="-1" x-transition style="position: absolute; width: 100%">
38
41
  <input id="id_{{ widget.uuid }}_search" type="search" autocomplete="off" class="input mb-2" x-ref="searchInput" aria-label="search"
39
42
  name="{{ widget.search_parameter }}"
40
43
  placeholder="{% translate 'Type to search' %}"
@@ -42,7 +45,7 @@
42
45
  hx-trigger="input changed delay:300ms, search"
43
46
  hx-target="#id_{{ widget.uuid }}_dropdown_items"
44
47
  hx-swap="innerHTML"
45
- style="border-radius: var(--bulma-radius)"
48
+ style="border-radius: 0; border-top: none; border-right: none; border-left: none"
46
49
  x-on:keydown="if (![9, 27, 38, 40].includes($event.keyCode)) {$refs.searchInput.focus();}"
47
50
  @change.stop=""
48
51
  >
@@ -63,10 +66,9 @@
63
66
  tag.appendChild(delButton);
64
67
  $refs.inputValue.appendChild(option);
65
68
  $refs.inputDisplayTags.appendChild(tag);
66
- $dispatch('change');
69
+ changed = true;
67
70
  }
68
71
  $refs.inputDisplay.focus();
69
- {% if widget.hx_trigger_on_change %}htmx.trigger('#{{ widget.attrs.id }}_value', 'change');{% endif %}
70
72
  "
71
73
  x-on:keydown="
72
74
  if ($event.keyCode == 27) {$event.stopPropagation; document.activeElement.blur()}
@@ -7,7 +7,8 @@ from django.shortcuts import resolve_url
7
7
  from django.utils.translation import gettext_lazy as _
8
8
  from django import template
9
9
  from django.db.models import (
10
- Manager, DecimalField, IntegerField, FloatField, Model, Q
10
+ Manager, DecimalField, IntegerField, FloatField, Model,
11
+ ManyToManyRel, ManyToManyField
11
12
  )
12
13
  from django.apps import apps
13
14
  from django.template.loader import render_to_string
@@ -62,6 +63,8 @@ def get_attr_from_string(param: object, value: str):
62
63
  except (AttributeError,):
63
64
  _logger.warning(f'Object {param} has no attribute {value}')
64
65
  attribute = None
66
+ if attribute and callable(attribute):
67
+ attribute = attribute()
65
68
  return return_save(attribute)
66
69
 
67
70
 
@@ -85,9 +88,18 @@ def verbose_field_name(param: object, value: str):
85
88
  if not param:
86
89
  return ''
87
90
  if isinstance(param, Model):
88
- name = param._meta.get_field(value).verbose_name
91
+ field = param._meta.get_field(value)
92
+ if isinstance(field, ManyToManyRel):
93
+ name = field.related_model._meta.verbose_name_plural
94
+ else:
95
+ name = param._meta.get_field(value).verbose_name
89
96
  else:
90
- name = getattr(param.model, value).field.verbose_name
97
+ field = getattr(param.model, value).field
98
+ if isinstance(field, ManyToManyField):
99
+ name = field.model._meta.verbose_name_plural
100
+ else:
101
+ name = getattr(param.model, value).field.verbose_name
102
+
91
103
  return name
92
104
 
93
105
 
@@ -102,6 +114,13 @@ def table_display(param: object, value: str):
102
114
  </div>
103
115
  </span>
104
116
  """)
117
+ try:
118
+ has_choices = param._meta.get_field(value).choices
119
+ except Exception as e:
120
+ _logger.error(repr(e))
121
+ has_choices = False
122
+ if has_choices:
123
+ value = f'get_{value}_display'
105
124
  return get_attr_from_string(param, value)
106
125
 
107
126
 
@@ -14,7 +14,6 @@ class ModelSearchSelect(widgets.NumberInput):
14
14
  search_kwargs: dict = None,
15
15
  search_parameter: str = 'search',
16
16
  limit: int | None = 5,
17
- hx_trigger_on_change: bool = False,
18
17
  choices=()
19
18
  ):
20
19
  super().__init__()
@@ -22,7 +21,6 @@ class ModelSearchSelect(widgets.NumberInput):
22
21
  self.search_kwargs = search_kwargs or {}
23
22
  self.search_parameter = search_parameter
24
23
  self.limit = limit
25
- self.hx_trigger_on_change = hx_trigger_on_change # trigger htmx request on change
26
24
  self.choices = choices
27
25
 
28
26
  def get_context(self, name, value, attrs):
@@ -42,7 +40,6 @@ class ModelSearchSelect(widgets.NumberInput):
42
40
  "template_name": self.template_name,
43
41
  'search_url': resolve_url(self.search_url, **self.search_kwargs),
44
42
  'search_parameter': self.search_parameter,
45
- 'hx_trigger_on_change': self.hx_trigger_on_change,
46
43
  'uuid': uuid
47
44
  },
48
45
  'options': qs
@@ -74,7 +71,6 @@ class ModelSearchSelectMulti(widgets.SelectMultiple):
74
71
  search_kwargs: dict = None,
75
72
  search_parameter: str = 'search',
76
73
  limit: int | None = 5,
77
- hx_trigger_on_change: bool = False,
78
74
  choices=()
79
75
  ):
80
76
  super().__init__()
@@ -82,7 +78,6 @@ class ModelSearchSelectMulti(widgets.SelectMultiple):
82
78
  self.search_kwargs = search_kwargs or {}
83
79
  self.search_parameter = search_parameter
84
80
  self.limit = limit
85
- self.hx_trigger_on_change = hx_trigger_on_change # trigger 'change' event on the actual input field
86
81
  self.choices = choices
87
82
 
88
83
  def get_context(self, name, value, attrs):
@@ -101,7 +96,6 @@ class ModelSearchSelectMulti(widgets.SelectMultiple):
101
96
  "template_name": self.template_name,
102
97
  'search_url': resolve_url(self.search_url, **self.search_kwargs),
103
98
  'search_parameter': self.search_parameter,
104
- 'hx_trigger_on_change': self.hx_trigger_on_change,
105
99
  'uuid': uuid
106
100
  },
107
101
  'options': qs,
@@ -1,6 +1,6 @@
1
1
  {% load i18n %}
2
2
 
3
- <a class="navbar-item" href="{% url 'user:detail' %}" hx-boost="false">{% translate 'Preferences' %}</a>
3
+ <a class="navbar-item" href="{% url 'user:detail' %}?tenant_id={{ request.tenant.pk }}" hx-boost="false">{% translate 'Preferences' %}</a>
4
4
  {% if request.user.is_staff %}
5
5
  <a class="navbar-item" hx-boost="false" href="/admin/">Admin</a>
6
6
  {% endif %}
@@ -8,7 +8,7 @@ class TenantManager(models.Manager):
8
8
  queryset = super().get_queryset()
9
9
  tenant = get_tenant()
10
10
  if tenant:
11
- queryset = queryset.filter(tenant=tenant)
11
+ queryset = queryset.filter(tenant_id=tenant.pk)
12
12
  return queryset
13
13
 
14
14
  def bulk_create(
@@ -45,7 +45,7 @@ class TenantMiddleware(MiddlewareMixin):
45
45
  request.member = memberships.first()
46
46
  request.tenant = request.member.tenant
47
47
  set_member(request.member)
48
- self.update_post_data(request)
48
+ self.update_request_data(request)
49
49
  return
50
50
  if membership_count > 1:
51
51
  set_member(None)
@@ -54,13 +54,18 @@ class TenantMiddleware(MiddlewareMixin):
54
54
  set_member(None)
55
55
  set_tenant(tenant)
56
56
  request.tenant = tenant
57
+ self.update_request_data(request)
57
58
  return
58
59
  set_member(None)
59
60
  return
60
61
 
61
62
  @staticmethod
62
- def update_post_data(request):
63
- if request.POST and not request.POST.get('tenant') and request.tenant:
63
+ def update_request_data(request):
64
+ if not request.tenant:
65
+ return
66
+ request.GET = request.GET.copy()
67
+ request.GET['tenant_id'] = request.tenant.pk
68
+ if request.POST and not request.POST.get('tenant'):
64
69
  request.POST = request.POST.copy()
65
70
  request.POST['tenant'] = request.tenant.pk
66
71
 
@@ -29,7 +29,7 @@ class TenantModel(models.Model):
29
29
  update_fields=None
30
30
  ):
31
31
  tenant = get_tenant()
32
- if self.pk and tenant and self.tenant != tenant:
32
+ if self.pk and tenant and self.tenant_id != tenant.pk:
33
33
  raise ValueError('Current tenant differs from tenant of the record!')
34
34
  if self.pk and not self.tenant and not tenant:
35
35
  raise ValueError(
@@ -38,7 +38,7 @@ class TenantModel(models.Model):
38
38
  'or set the tenant explicitly on the instance.'
39
39
  )
40
40
  if tenant:
41
- self.tenant = tenant
41
+ self.tenant_id = tenant.pk
42
42
  super().save(
43
43
  force_insert=force_insert,
44
44
  force_update=force_update,