accrete 0.0.143__tar.gz → 0.0.145__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 (293) hide show
  1. {accrete-0.0.143 → accrete-0.0.145}/.gitignore +2 -1
  2. {accrete-0.0.143 → accrete-0.0.145}/PKG-INFO +2 -2
  3. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/admin.py +1 -1
  4. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/tasks.py +4 -5
  5. accrete-0.0.145/accrete/contrib/ui/__init__.py +19 -0
  6. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/filter.py +22 -13
  7. accrete-0.0.145/accrete/contrib/ui/response.py +353 -0
  8. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/css/accrete.css +69 -12
  9. accrete-0.0.145/accrete/contrib/ui/static/css/accrete.css.map +7 -0
  10. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/css/accrete.scss +370 -300
  11. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/content_right.html +2 -2
  12. accrete-0.0.145/accrete/contrib/ui/templates/ui/detail.html +11 -0
  13. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/filter/filter.html +5 -5
  14. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/filter/query_tags.html +1 -1
  15. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/layout.html +69 -64
  16. accrete-0.0.145/accrete/contrib/ui/templates/ui/list.html +45 -0
  17. accrete-0.0.145/accrete/contrib/ui/templates/ui/list_update.html +9 -0
  18. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/message.html +1 -1
  19. accrete-0.0.145/accrete/contrib/ui/templates/ui/modal.html +48 -0
  20. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/table_row_update.html +2 -2
  21. accrete-0.0.145/accrete/contrib/ui/templates/ui/templatetags/field.html +19 -0
  22. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +7 -7
  23. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +3 -3
  24. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templatetags/ui.py +24 -2
  25. accrete-0.0.145/accrete/contrib/user/templates/user/password_forgotten.html +1 -0
  26. accrete-0.0.145/accrete/contrib/user/templates/user/user_preferences.html +43 -0
  27. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/views.py +36 -37
  28. accrete-0.0.145/accrete/migrations/0008_alter_member_access_groups_and_more.py +23 -0
  29. accrete-0.0.145/accrete/migrations/__init__.py +0 -0
  30. {accrete-0.0.143 → accrete-0.0.145}/accrete/utils/__init__.py +1 -0
  31. {accrete-0.0.143 → accrete-0.0.145}/accrete/utils/forms.py +11 -3
  32. {accrete-0.0.143 → accrete-0.0.145}/accrete/utils/views.py +1 -2
  33. {accrete-0.0.143 → accrete-0.0.145}/accrete/views.py +2 -3
  34. {accrete-0.0.143 → accrete-0.0.145}/pyproject.toml +2 -2
  35. accrete-0.0.143/accrete/contrib/ui/__init__.py +0 -18
  36. accrete-0.0.143/accrete/contrib/ui/context.py +0 -123
  37. accrete-0.0.143/accrete/contrib/ui/static/css/.sass-cache/15adf1eed05371361b08787c918a7f18fc15be79/accrete.scssc +0 -0
  38. accrete-0.0.143/accrete/contrib/ui/static/css/accrete.css.map +0 -7
  39. accrete-0.0.143/accrete/contrib/ui/templates/ui/list.html +0 -43
  40. accrete-0.0.143/accrete/contrib/ui/templates/ui/list_update.html +0 -3
  41. accrete-0.0.143/accrete/contrib/ui/templates/ui/modal.html +0 -39
  42. accrete-0.0.143/accrete/contrib/ui/templates/ui/templatetags/field.html +0 -6
  43. accrete-0.0.143/accrete/contrib/ui/utils.py +0 -88
  44. accrete-0.0.143/accrete/contrib/user/templates/user/user_form.html +0 -58
  45. {accrete-0.0.143 → accrete-0.0.145}/LICENSE +0 -0
  46. {accrete-0.0.143 → accrete-0.0.145}/README.md +0 -0
  47. {accrete-0.0.143 → accrete-0.0.145}/accrete/__init__.py +0 -0
  48. {accrete-0.0.143 → accrete-0.0.145}/accrete/admin.py +0 -0
  49. {accrete-0.0.143 → accrete-0.0.145}/accrete/apps.py +0 -0
  50. {accrete-0.0.143 → accrete-0.0.145}/accrete/config.py +0 -0
  51. {accrete-0.0.143 → accrete-0.0.145}/accrete/context_processors.py +0 -0
  52. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/__init__.py +0 -0
  53. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/__init__.py +0 -0
  54. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/admin.py +0 -0
  55. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/apps.py +0 -0
  56. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  57. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  58. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  59. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/migrations/__init__.py +0 -0
  60. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/country/models.py +0 -0
  61. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/__init__.py +0 -0
  62. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/apps.py +0 -0
  63. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/config.py +0 -0
  64. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/helper.py +0 -0
  65. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  66. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  67. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  68. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  69. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  70. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/migrations/__init__.py +0 -0
  71. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/models.py +0 -0
  72. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/queries.py +0 -0
  73. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/signals.py +0 -0
  74. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/tests.py +0 -0
  75. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/log/views.py +0 -0
  76. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/__init__.py +0 -0
  77. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/admin.py +0 -0
  78. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/apps.py +0 -0
  79. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/forms.py +0 -0
  80. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  81. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  82. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  83. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  84. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/models.py +0 -0
  85. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/queries.py +0 -0
  86. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/tests.py +0 -0
  87. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/sequence/views.py +0 -0
  88. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/__init__.py +0 -0
  89. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/admin.py +0 -0
  90. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/apps.py +0 -0
  91. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/forms.py +0 -0
  92. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  93. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  94. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/models.py +0 -0
  95. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/tests.py +0 -0
  96. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/system_mail/views.py +0 -0
  97. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/admin.py +0 -0
  98. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/apps.py +0 -0
  99. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/middleware.py +0 -0
  100. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/migrations/__init__.py +0 -0
  101. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/models.py +0 -0
  102. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  103. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/README.md +0 -0
  104. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  105. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  106. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  107. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  108. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  109. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  110. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  111. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  112. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  113. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  114. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  115. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  116. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  117. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  118. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  119. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  120. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/package.json +0 -0
  121. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  122. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  123. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  124. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  125. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  126. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  127. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  128. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  129. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  130. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  131. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  132. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  133. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  134. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  135. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  136. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  137. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  138. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  139. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  140. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  141. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  142. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  143. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  144. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  145. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  146. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  147. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  148. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  149. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  150. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  151. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  152. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  153. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  154. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  155. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  156. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  157. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  158. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  159. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  160. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  161. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  162. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  163. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  164. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  165. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  166. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  167. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  168. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  169. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  170. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  171. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  172. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  173. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  174. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  175. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  176. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  177. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  178. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  179. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  180. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  181. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  182. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  183. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  184. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  185. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  186. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  187. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  188. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  189. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  190. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  191. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  192. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  193. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  194. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  195. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  196. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  197. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  198. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/css/fa.css +0 -0
  199. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/css/icons.css +0 -0
  200. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  201. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  202. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
  203. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
  204. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
  205. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/js/filter.js +0 -0
  206. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  207. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  208. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  209. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  210. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  211. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  212. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  213. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  214. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  215. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  216. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  217. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  218. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  219. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
  220. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  221. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  222. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  223. /accrete-0.0.143/accrete/contrib/ui/templatetags/__init__.py → /accrete-0.0.145/accrete/contrib/ui/templates/ui/content.html +0 -0
  224. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/favicon.html +0 -0
  225. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  226. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  227. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  228. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/form_error.html +0 -0
  229. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/oob.html +0 -0
  230. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/table.html +0 -0
  231. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  232. {accrete-0.0.143/accrete/contrib/user → accrete-0.0.145/accrete/contrib/ui/templatetags}/__init__.py +0 -0
  233. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/tests.py +0 -0
  234. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/urls.py +0 -0
  235. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/views.py +0 -0
  236. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/widgets/__init__.py +0 -0
  237. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/ui/widgets/search_select.py +0 -0
  238. {accrete-0.0.143/accrete/contrib/user/migrations → accrete-0.0.145/accrete/contrib/user}/__init__.py +0 -0
  239. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/admin.py +0 -0
  240. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/apps.py +0 -0
  241. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/auth_backends.py +0 -0
  242. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/forms.py +0 -0
  243. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  244. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  245. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/middleware.py +0 -0
  246. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  247. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  248. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
  249. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
  250. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
  251. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
  252. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
  253. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +0 -0
  254. {accrete-0.0.143/accrete/contrib/user_registration → accrete-0.0.145/accrete/contrib/user/migrations}/__init__.py +0 -0
  255. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/models.py +0 -0
  256. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
  257. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/templates/user/change_email.html +0 -0
  258. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/templates/user/change_password.html +0 -0
  259. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/templates/user/login.html +0 -0
  260. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/tests.py +0 -0
  261. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user/urls.py +0 -0
  262. {accrete-0.0.143/accrete/contrib/user_registration/migrations → accrete-0.0.145/accrete/contrib/user_registration}/__init__.py +0 -0
  263. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/admin.py +0 -0
  264. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/apps.py +0 -0
  265. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/config.py +0 -0
  266. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/forms.py +0 -0
  267. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  268. {accrete-0.0.143/accrete → accrete-0.0.145/accrete/contrib/user_registration}/migrations/__init__.py +0 -0
  269. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/models.py +0 -0
  270. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  271. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  272. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/tests.py +0 -0
  273. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/urls.py +0 -0
  274. {accrete-0.0.143 → accrete-0.0.145}/accrete/contrib/user_registration/views.py +0 -0
  275. {accrete-0.0.143 → accrete-0.0.145}/accrete/fields.py +0 -0
  276. {accrete-0.0.143 → accrete-0.0.145}/accrete/forms.py +0 -0
  277. {accrete-0.0.143 → accrete-0.0.145}/accrete/managers.py +0 -0
  278. {accrete-0.0.143 → accrete-0.0.145}/accrete/middleware.py +0 -0
  279. {accrete-0.0.143 → accrete-0.0.145}/accrete/migrations/0001_initial.py +0 -0
  280. {accrete-0.0.143 → accrete-0.0.145}/accrete/migrations/0002_initial.py +0 -0
  281. {accrete-0.0.143 → accrete-0.0.145}/accrete/migrations/0003_remove_member_name.py +0 -0
  282. {accrete-0.0.143 → accrete-0.0.145}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
  283. {accrete-0.0.143 → accrete-0.0.145}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
  284. {accrete-0.0.143 → accrete-0.0.145}/accrete/migrations/0006_alter_member_user.py +0 -0
  285. {accrete-0.0.143 → accrete-0.0.145}/accrete/migrations/0007_accessgroup_description.py +0 -0
  286. {accrete-0.0.143 → accrete-0.0.145}/accrete/models.py +0 -0
  287. {accrete-0.0.143 → accrete-0.0.145}/accrete/storage.py +0 -0
  288. {accrete-0.0.143 → accrete-0.0.145}/accrete/tenant.py +0 -0
  289. {accrete-0.0.143 → accrete-0.0.145}/accrete/tests.py +0 -0
  290. {accrete-0.0.143 → accrete-0.0.145}/accrete/urls.py +0 -0
  291. {accrete-0.0.143 → accrete-0.0.145}/accrete/utils/dates.py +0 -0
  292. {accrete-0.0.143 → accrete-0.0.145}/accrete/utils/log.py +0 -0
  293. {accrete-0.0.143 → accrete-0.0.145}/accrete/utils/models.py +0 -0
@@ -5,4 +5,5 @@ build/
5
5
  accrete.egg-info/
6
6
  *.py[cod]
7
7
  *.log
8
- *.sqlite3
8
+ *.sqlite3
9
+ *.scssc
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.143
3
+ Version: 0.0.145
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
@@ -31,7 +31,7 @@ Classifier: Operating System :: OS Independent
31
31
  Classifier: Programming Language :: Python :: 3
32
32
  Classifier: Topic :: Internet :: WWW/HTTP
33
33
  Requires-Python: >=3.10
34
- Requires-Dist: django>=5.1
34
+ Requires-Dist: django>=5.2
35
35
  Provides-Extra: contrib
36
36
  Requires-Dist: celery>=5.3.4; extra == 'contrib'
37
37
  Requires-Dist: django-celery-beat; extra == 'contrib'
@@ -44,4 +44,4 @@ class LogAdmin(admin.ModelAdmin):
44
44
 
45
45
 
46
46
  admin.site.register(models.LogConfig, LogConfigAdmin)
47
- admin.site.register(models.Log, LogAdmin)
47
+ admin.site.register(models.Log, LogAdmin)
@@ -36,8 +36,7 @@ def run_mail_queue():
36
36
  _logger.error(f'Failed to send system mail\n{error_str}')
37
37
  email.error = error_str
38
38
  email.save()
39
- continue
40
-
41
- email.sent = True
42
- email.error = None
43
- email.save()
39
+ else:
40
+ email.sent = True
41
+ email.error = None
42
+ email.save()
@@ -0,0 +1,19 @@
1
+ from . import widgets
2
+ from .filter import Filter
3
+ from .response import (
4
+ Response,
5
+ WindowResponse,
6
+ ListResponse,
7
+ ListEntryResponse,
8
+ TableResponse,
9
+ TableRowResponse,
10
+ DetailResponse,
11
+ ModalResponse,
12
+ OobResponse,
13
+ TriggerResponse,
14
+ ClientTrigger,
15
+ search_select_response,
16
+ message_response,
17
+ add_trigger,
18
+ update
19
+ )
@@ -46,12 +46,21 @@ class Filter:
46
46
  TYPES_TIME = ['TimeField']
47
47
 
48
48
  def __init__(
49
- self, model, query: QueryDict, default_lookup: str = None
49
+ self,
50
+ model,
51
+ query_dict: QueryDict,
52
+ default_lookup: str = None,
53
+ query: Q = None,
54
+ select_related: list[str] = None,
55
+ prefetch_related: list[str] = None
50
56
  ):
51
57
  self.model = model
52
- self.query = query
58
+ self.query_dict = query_dict
53
59
  self.model_name = f'{self.model._meta.app_label}.{self.model._meta.model_name}'
54
- seen_models = query.get('models', '').split(',')
60
+ self.query = query or Q()
61
+ self.select_related = select_related
62
+ self.prefetch_related = prefetch_related
63
+ seen_models = query_dict.get('models', '').split(',')
55
64
  self.seen_models = [
56
65
  model for model in seen_models
57
66
  if model and model != self.model_name
@@ -67,14 +76,14 @@ class Filter:
67
76
  ) -> paginator.Page:
68
77
  return page_from_querystring(
69
78
  self.model,
70
- self.query,
71
- select_related=select_related,
72
- prefetch_related=prefetch_related,
73
- query=query
79
+ self.query_dict,
80
+ select_related=select_related or self.select_related,
81
+ prefetch_related=prefetch_related or self.prefetch_related,
82
+ query=query or self.query
74
83
  )
75
84
 
76
85
  def get_queryset(self) -> QuerySet:
77
- return filter_from_querystring(self.model, self.query)
86
+ return filter_from_querystring(self.model, self.query_dict)
78
87
 
79
88
  def query_params(self):
80
89
  fields = filter(
@@ -82,7 +91,7 @@ class Filter:
82
91
  self.model._meta.get_fields()
83
92
  )
84
93
  params = []
85
- path = self.query.get('path', '')
94
+ path = self.query_dict.get('path', '')
86
95
  for field in fields:
87
96
  field_params = self._get_field_params(field)
88
97
  if not field.is_relation or field_params['model_name'] not in self.seen_models:
@@ -115,7 +124,7 @@ class Filter:
115
124
  if not lookup:
116
125
  ctx = {
117
126
  'verbose_lookup': str(_('Select an attribute')),
118
- 'query_dict': self.query,
127
+ 'query_dict': self.query_dict,
119
128
  'model_name': self.model_name
120
129
  }
121
130
  return render_to_string('ui/filter/query_input.html', ctx)
@@ -133,14 +142,14 @@ class Filter:
133
142
  'lookup': prefix + lookup,
134
143
  'input': input_params,
135
144
  'lookup_operator': lookup_operator,
136
- 'query_dict': self.query,
145
+ 'query_dict': self.query_dict,
137
146
  'model_name': self.model_name
138
147
  }
139
148
  return render_to_string('ui/filter/query_input.html', ctx)
140
149
 
141
150
  def query_tags(self, query: list | dict = None, operator: str = None):
142
151
  if not query:
143
- query = json.loads(self.query.get('q', '[]'))
152
+ query = json.loads(self.query_dict.get('q', '[]'))
144
153
  if isinstance(query, dict):
145
154
  query = [query]
146
155
  operator = operator or '&'
@@ -291,7 +300,7 @@ class Filter:
291
300
  return str(labels[lookup])
292
301
 
293
302
  def _get_field_params(self, field):
294
- path = self.query.get('path', '')
303
+ path = self.query_dict.get('path', '')
295
304
  label = ''
296
305
  name = field.name
297
306
  if path:
@@ -0,0 +1,353 @@
1
+ import re
2
+ import ast
3
+ import json
4
+ from dataclasses import dataclass
5
+
6
+ from django.core import paginator
7
+ from django.db.models import Model
8
+ from django.http import HttpResponse
9
+ from django.template.loader import render_to_string
10
+ from django.utils.translation import gettext_lazy as _
11
+ from accrete.contrib.ui import Filter
12
+
13
+
14
+ class Response:
15
+
16
+ def __init__(self, *, template: str, context: dict):
17
+ self.template = template
18
+ self.context = context
19
+
20
+ @staticmethod
21
+ def add_trigger(response):
22
+ pass
23
+
24
+ def render(self, request) -> str:
25
+ return render_to_string(
26
+ template_name=self.template, context=self.context, request=request
27
+ )
28
+
29
+ def response(self, request, extra_content: str = None, replace_body: bool = False) -> HttpResponse:
30
+ extra_content = extra_content or ''
31
+ res = HttpResponse(content=(
32
+ self.render(request)
33
+ + render_to_string('ui/message.html', request=request)
34
+ + extra_content
35
+ ))
36
+ self.add_trigger(res)
37
+ if replace_body:
38
+ res.headers['HX-Retarget'] = 'body'
39
+ res.headers['HX-Reswap'] = 'innerHTML'
40
+ res.headers['HX-Push-Url'] = request.path
41
+ return res
42
+
43
+
44
+ class OobResponse(Response):
45
+
46
+ oob_template = 'ui/oob.html'
47
+
48
+ def __init__(self, *, template: str, context: dict, swap: str, tag: str = 'div'):
49
+ super().__init__(template=self.oob_template, context=context)
50
+ self.context.update({'oob': {
51
+ 'template': template,
52
+ 'swap': swap,
53
+ 'tag': tag
54
+ }})
55
+
56
+
57
+ class WindowResponse(Response):
58
+
59
+ base_template = 'ui/layout.html'
60
+
61
+ def __init__(
62
+ self, *,
63
+ title: str,
64
+ context: dict,
65
+ overview_template: str = None,
66
+ header_template: str = None,
67
+ panel_template: str = None,
68
+ is_centered: bool = False
69
+ ):
70
+ super().__init__(template=self.base_template, context=context)
71
+ self.panel_template = panel_template
72
+ if 'has_panel' not in self.context.keys():
73
+ self.context.update(has_panel=self._has_panel())
74
+ self.context.update({
75
+ 'title': title,
76
+ 'overview_template': overview_template,
77
+ 'header_template': header_template,
78
+ 'panel_template': panel_template,
79
+ 'is_centered': is_centered
80
+ })
81
+
82
+ def _has_panel(self):
83
+ return bool(self.panel_template)
84
+
85
+ def response(self, request, extra_content: str = None, replace_body: bool = True) -> HttpResponse:
86
+ return super().response(request, extra_content, replace_body)
87
+
88
+
89
+ class ListResponse(WindowResponse):
90
+
91
+ def __init__(
92
+ self, *,
93
+ title: str,
94
+ context: dict,
95
+ list_entry_template: str = None,
96
+ page: paginator.Page = None,
97
+ ui_filter: Filter = None,
98
+ endless_scroll: bool = True,
99
+ header_template: str = None,
100
+ panel_template: str = None,
101
+ column_count: int = 1,
102
+ column_height: str = '150px',
103
+ overview_template: str = 'ui/list.html'
104
+ ):
105
+ assert page is not None or ui_filter is not None, _(
106
+ 'Argument page or ui_filter must be supplied'
107
+ )
108
+ self.ui_filter = ui_filter
109
+ self.overview_template = overview_template
110
+ super().__init__(
111
+ title=title,
112
+ context=context,
113
+ overview_template=self.overview_template,
114
+ header_template=header_template,
115
+ panel_template=panel_template,
116
+ )
117
+ if ui_filter and not page:
118
+ page = ui_filter.get_page()
119
+ self.context.update({
120
+ 'list_entry_template': list_entry_template,
121
+ 'page': page,
122
+ 'ui_filter': ui_filter,
123
+ 'endless_scroll': endless_scroll,
124
+ 'column_count': column_count,
125
+ 'column_height': column_height
126
+ })
127
+
128
+ def _has_panel(self):
129
+ return bool(self.panel_template or self.ui_filter)
130
+
131
+ def response(self, request, extra_content: str = None, replace_body: bool = False) -> HttpResponse:
132
+ return super().response(request, extra_content, replace_body)
133
+
134
+
135
+ class ListEntryResponse(Response):
136
+
137
+ base_template = 'ui/list_update.html'
138
+
139
+ def __init__(
140
+ self, *,
141
+ instance: Model,
142
+ list_entry_template: str,
143
+ context: dict = None,
144
+ page: paginator.Page,
145
+ is_new: bool,
146
+ column_count: int = 1,
147
+ column_height: str = '150px',
148
+ ):
149
+ self.page = page
150
+ super().__init__(template=self.base_template, context=context or {})
151
+ self.context.update({
152
+ 'instance': instance,
153
+ 'list_entry_template': list_entry_template,
154
+ 'is_new': is_new,
155
+ 'column_count': column_count,
156
+ 'column_height': column_height
157
+ })
158
+
159
+ def render(self, request) -> str:
160
+ res = super().render(request)
161
+ if self.page:
162
+ pagination_update = OobResponse(
163
+ template='ui/layout.html#pagination',
164
+ swap='innerHTML:#pagination',
165
+ context=dict(page=self.page)
166
+ ).render(request)
167
+ res += pagination_update
168
+ return res
169
+
170
+
171
+ class TableResponse(WindowResponse):
172
+
173
+ def __init__(
174
+ self, *,
175
+ title: str,
176
+ context: dict,
177
+ object_label: str,
178
+ fields: list[str],
179
+ footer: dict = None,
180
+ page: paginator.Page = None,
181
+ ui_filter: Filter = None,
182
+ endless_scroll: bool = True,
183
+ header_template: str = None,
184
+ panel_template: str = None,
185
+ overview_template: str = 'ui/table.html'
186
+ ):
187
+ assert page is not None or ui_filter is not None, _(
188
+ 'Argument page or ui_filter must be supplied'
189
+ )
190
+ self.ui_filter = ui_filter
191
+ self.overview_template = overview_template
192
+ super().__init__(
193
+ title=title,
194
+ context=context,
195
+ overview_template=self.overview_template,
196
+ header_template=header_template,
197
+ panel_template=panel_template
198
+ )
199
+ if ui_filter and not page:
200
+ page = ui_filter.get_page()
201
+ self.context.update({
202
+ 'page': page,
203
+ 'ui_filter': ui_filter,
204
+ 'endless_scroll': endless_scroll,
205
+ 'fields': fields,
206
+ 'object_label': object_label,
207
+ 'footer': footer
208
+ })
209
+
210
+ def _has_panel(self):
211
+ return bool(self.panel_template or self.ui_filter)
212
+
213
+ def response(self, request, extra_content: str = None, replace_body: bool = False) -> HttpResponse:
214
+ return super().response(request, extra_content, replace_body)
215
+
216
+
217
+ class TableRowResponse(Response):
218
+
219
+ base_template = 'ui/table_row_update.html'
220
+
221
+ def __init__(
222
+ self, *,
223
+ instance: Model,
224
+ fields: list[str],
225
+ footer: dict = None,
226
+ page: paginator.Page = None,
227
+ ):
228
+ self.page = page
229
+ context = {
230
+ 'instance': instance,
231
+ 'fields': fields,
232
+ 'footer': footer,
233
+ }
234
+ super().__init__(template=self.base_template, context=context)
235
+
236
+ def render(self, request) -> str:
237
+ res = super().render(request)
238
+ if self.page:
239
+ pagination_update = OobResponse(
240
+ template='ui/layout.html#pagination',
241
+ swap='innerHTML:#pagination',
242
+ context=dict(page=self.page)
243
+ ).render(request)
244
+ res += pagination_update
245
+ return res
246
+
247
+
248
+ class DetailResponse(Response):
249
+
250
+ base_template = 'ui/detail.html'
251
+
252
+ def __init__(
253
+ self, *,
254
+ context: dict,
255
+ detail_header_template: str = None,
256
+ detail_data_template: str = None
257
+ ):
258
+ super().__init__(template=self.base_template, context=context)
259
+ self.context.update({
260
+ 'detail_header_template': detail_header_template,
261
+ 'detail_data_template': detail_data_template
262
+ })
263
+
264
+ @staticmethod
265
+ def add_trigger(response):
266
+ add_trigger(response, 'activate-detail')
267
+
268
+
269
+ class ModalResponse(Response):
270
+
271
+ def __init__(
272
+ self, *,
273
+ modal_id: str,
274
+ template: str,
275
+ context: dict,
276
+ title: str = None,
277
+ is_update: bool = False,
278
+ is_blocking: bool = False,
279
+ modal_width: str = None
280
+
281
+ ):
282
+ super().__init__(template=template, context=context)
283
+ self.context.update({
284
+ 'title': title,
285
+ 'modal_id': re.sub(r'[^A-Za-z-]+', '', modal_id).strip('-'),
286
+ 'is_update': is_update,
287
+ 'is_blocking': is_blocking,
288
+ 'modal_width': modal_width
289
+ })
290
+
291
+
292
+ @dataclass
293
+ class ClientTrigger:
294
+
295
+ trigger: dict | str
296
+ header: str = 'HX-Trigger'
297
+
298
+
299
+ class TriggerResponse:
300
+
301
+ def __init__(self, trigger: list[ClientTrigger]):
302
+ self.trigger = trigger
303
+
304
+ def response(self):
305
+ res = HttpResponse()
306
+ res.headers['HX-Reswap'] = 'None'
307
+ for trigger in self.trigger:
308
+ add_trigger(res, trigger.trigger, trigger.header)
309
+ return res
310
+
311
+
312
+ def search_select_response(queryset) -> HttpResponse:
313
+ return HttpResponse(render_to_string(
314
+ 'ui/widgets/model_search_select_options.html',
315
+ {'options': queryset}
316
+ ))
317
+
318
+
319
+ def message_response(request, persistent: bool = False):
320
+ return HttpResponse(content=(render_to_string(
321
+ 'ui/message.html', context={'persistent': persistent}, request=request
322
+ )))
323
+
324
+
325
+ def add_trigger(
326
+ response: HttpResponse,
327
+ trigger: dict | str,
328
+ header: str = 'HX-Trigger'
329
+ ) -> HttpResponse:
330
+ if isinstance(trigger, str):
331
+ trigger = {trigger: ''}
332
+ res_trigger = response.headers.get(header)
333
+ if not res_trigger:
334
+ response.headers[header] = json.dumps(trigger)
335
+ return response
336
+ try:
337
+ res_trigger = ast.literal_eval(response.headers.get(header, '{}'))
338
+ except SyntaxError:
339
+ res_trigger = {response.headers[header]: ''}
340
+ res_trigger.update(trigger)
341
+ response.headers[header] = json.dumps(res_trigger)
342
+ return response
343
+
344
+
345
+ def update(request, ui_responses: list[Response]) -> HttpResponse:
346
+ response = HttpResponse()
347
+ content = ''
348
+ for res in ui_responses:
349
+ content += res.render(request)
350
+ res.add_trigger(response)
351
+ content += render_to_string('ui/message.html', request=request)
352
+ response.content = content
353
+ return response
@@ -3,11 +3,12 @@
3
3
  --bulma-body-size: .9em;
4
4
  --bulma-navbar-height: 40px;
5
5
  --bulma-menu-item-selected-h: --bulma-success-h;
6
- --accrete-content-right-width: 500px;
6
+ --accrete-detail-width: 500px;
7
7
  --accrete-action-panel-width: 320px;
8
8
  --bulma-input-icon-focus-color: var(--bulma-success);
9
9
  --bulma-input-arrow: var(--bulma-success);
10
10
  --bulma-arrow-color: var(--bulma-success);
11
+ --bulma-menu-nested-list-margin: .5em 0 0.5em 0.75em;
11
12
  --bulma-navbar-burger-color: var(--bulma-success);
12
13
  --accrete-hover-color: #F0F2F4; }
13
14
 
@@ -18,10 +19,12 @@ html[data-theme='light'] {
18
19
  --bulma-menu-item-background-l: 50%;
19
20
  --bulma-menu-item-color-l: 10%;
20
21
  --bulma-navbar-burger-color: var(--bulma-success);
22
+ --bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
21
23
  --accrete-hover-color: #F0F2F4; }
22
24
 
23
25
  html[data-theme='dark'] {
24
26
  --bulma-navbar-burger-color: var(--bulma-success);
27
+ --bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
25
28
  --accrete-hover-color: #1E2128; }
26
29
  html[data-theme='dark'] .button.is-light {
27
30
  --bulma-button-h: var(--bulma-dark-h);
@@ -45,12 +48,18 @@ a {
45
48
  color: inherit;
46
49
  text-decoration: inherit; }
47
50
 
51
+ .label {
52
+ font-weight: normal; }
53
+
48
54
  .navbar-burger {
49
55
  color: black; }
50
56
 
51
57
  .button.is-subtle {
52
58
  box-shadow: none;
53
- border: none; }
59
+ border-top-color: transparent;
60
+ border-right-color: transparent;
61
+ border-bottom-color: transparent;
62
+ border-left-color: transparent; }
54
63
 
55
64
  .input {
56
65
  border-top: none;
@@ -60,12 +69,20 @@ a {
60
69
  border-top-right-radius: 0;
61
70
  border-bottom-right-radius: 0;
62
71
  border-bottom-left-radius: 0;
63
- box-shadow: none; }
72
+ box-shadow: none;
73
+ font-weight: bold; }
64
74
 
65
75
  .input:focus, .input:focus-within {
66
76
  box-shadow: none;
67
77
  border-bottom: 1px solid var(--bulma-success); }
68
78
 
79
+ input[disabled] {
80
+ background-color: transparent !important;
81
+ cursor: unset !important; }
82
+
83
+ input[disabled] ~ .helptext {
84
+ font-weight: normal !important; }
85
+
69
86
  textarea {
70
87
  border-top: transparent !important;
71
88
  border-right: transparent !important;
@@ -94,15 +111,16 @@ select {
94
111
  border-right: transparent !important;
95
112
  border-left: transparent !important;
96
113
  border-radius: 0 !important;
97
- box-shadow: none !important; }
114
+ box-shadow: none !important;
115
+ font-weight: bold; }
98
116
 
99
117
  select:focus {
100
118
  box-shadow: none;
101
119
  border-bottom: 1px solid var(--bulma-success) !important; }
102
120
 
103
- #content-right-container {
121
+ #detail-container {
104
122
  flex-shrink: 0;
105
- width: var(--accrete-content-right-width);
123
+ width: var(--accrete-detail-width);
106
124
  border-top-left-radius: var(--bulma-radius-medium);
107
125
  border-bottom-left-radius: var(--bulma-radius-medium);
108
126
  box-shadow: -2px 0 20px 0 var(--bulma-grey-light);
@@ -111,8 +129,8 @@ select:focus {
111
129
  .responsive-heading {
112
130
  display: none; }
113
131
 
114
- #content-left-container {
115
- container-name: content-left-container;
132
+ #overview-container {
133
+ container-name: overview-container;
116
134
  container-type: inline-size; }
117
135
 
118
136
  .htmx-indicator {
@@ -124,6 +142,24 @@ select:focus {
124
142
  .modal-request-overlay.htmx-request {
125
143
  pointer-events: auto; }
126
144
 
145
+ #detail-indicator {
146
+ position: fixed;
147
+ background: rgba(47, 47, 62, 0.2);
148
+ height: 100%;
149
+ width: 100%;
150
+ z-index: -100; }
151
+
152
+ #detail-indicator.htmx-request {
153
+ z-index: 999;
154
+ transition-delay: 300ms;
155
+ transition-property: opacity; }
156
+
157
+ #detail-indicator > .progress {
158
+ position: fixed;
159
+ top: 50%;
160
+ margin-left: 3%;
161
+ max-width: calc(var(--accrete-detail-width) - 6%); }
162
+
127
163
  .list-entry > .box:hover, .box.selected {
128
164
  outline: 2px solid var(--bulma-success); }
129
165
 
@@ -135,7 +171,11 @@ select:focus {
135
171
  font-weight: var(--bulma-weight-normal);
136
172
  line-height: 1.25; }
137
173
 
138
- @container content-left-container (max-width: 768px) {
174
+ .container {
175
+ padding-left: 0.5rem;
176
+ padding-right: 0.5rem; }
177
+
178
+ @container overview-container (max-width: 768px) {
139
179
  table.can-compact * td {
140
180
  width: 100%;
141
181
  float: left;
@@ -168,8 +208,11 @@ select:focus {
168
208
 
169
209
  .list-entry {
170
210
  height: fit-content !important; } }
211
+ @media screen and (min-width: 769px) {
212
+ .modal-card {
213
+ max-width: 100%; } }
171
214
  @media screen and (max-width: 768px) {
172
- #content-right-container {
215
+ #detail-container {
173
216
  flex-grow: 1;
174
217
  flex-shrink: 1;
175
218
  width: auto;
@@ -177,7 +220,16 @@ select:focus {
177
220
  border-bottom-left-radius: 0; }
178
221
 
179
222
  .level > .level-item.box {
180
- width: 100%; } }
223
+ width: 100%; }
224
+
225
+ .modal {
226
+ padding-top: 0 !important;
227
+ padding-bottom: 0 !important;
228
+ justify-content: center !important; }
229
+
230
+ .modal-card {
231
+ width: 100% !important;
232
+ max-height: 100svh; } }
181
233
  #action-panel {
182
234
  max-width: var(--accrete-action-panel-width);
183
235
  min-width: var(--accrete-action-panel-width);
@@ -188,7 +240,7 @@ select:focus {
188
240
  #action-panel {
189
241
  position: absolute;
190
242
  background: var(--bulma-scheme-main);
191
- z-index: 999;
243
+ z-index: 40;
192
244
  box-shadow: 2px 0 20px 0 var(--bulma-grey-light); } }
193
245
  .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 {
194
246
  --bulma-menu-item-h: var(--bulma-success-h);
@@ -235,4 +287,9 @@ input[type=number] {
235
287
  padding-left: 0;
236
288
  border-left: none !important; }
237
289
 
290
+ .header-items > * {
291
+ margin-right: 0.4rem;
292
+ margin-bottom: 0.5rem;
293
+ margin-left: 0.4rem; }
294
+
238
295
  /*# sourceMappingURL=accrete.css.map */