accrete 0.0.146__tar.gz → 0.0.148__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 (287) hide show
  1. {accrete-0.0.146 → accrete-0.0.148}/PKG-INFO +1 -1
  2. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/response.py +152 -69
  3. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/css/accrete.css +1 -5
  4. accrete-0.0.148/accrete/contrib/ui/static/css/accrete.css.map +7 -0
  5. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/css/accrete.scss +1 -5
  6. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/layout.html +6 -3
  7. accrete-0.0.148/accrete/contrib/ui/templates/ui/list.html +42 -0
  8. accrete-0.0.148/accrete/contrib/ui/templates/ui/table.html +75 -0
  9. accrete-0.0.148/accrete/contrib/ui/templates/ui/table_row_update.html +14 -0
  10. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/templatetags/field.html +9 -1
  11. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +1 -1
  12. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templatetags/ui.py +7 -3
  13. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/templates/user/change_email.html +2 -2
  14. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/templates/user/change_password.html +3 -3
  15. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/templates/user/user_preferences.html +6 -6
  16. {accrete-0.0.146 → accrete-0.0.148}/pyproject.toml +1 -1
  17. accrete-0.0.146/accrete/contrib/ui/static/css/accrete.css.map +0 -7
  18. accrete-0.0.146/accrete/contrib/ui/templates/ui/list.html +0 -45
  19. accrete-0.0.146/accrete/contrib/ui/templates/ui/table.html +0 -77
  20. accrete-0.0.146/accrete/contrib/ui/templates/ui/table_row_update.html +0 -14
  21. {accrete-0.0.146 → accrete-0.0.148}/.gitignore +0 -0
  22. {accrete-0.0.146 → accrete-0.0.148}/LICENSE +0 -0
  23. {accrete-0.0.146 → accrete-0.0.148}/README.md +0 -0
  24. {accrete-0.0.146 → accrete-0.0.148}/accrete/__init__.py +0 -0
  25. {accrete-0.0.146 → accrete-0.0.148}/accrete/admin.py +0 -0
  26. {accrete-0.0.146 → accrete-0.0.148}/accrete/apps.py +0 -0
  27. {accrete-0.0.146 → accrete-0.0.148}/accrete/config.py +0 -0
  28. {accrete-0.0.146 → accrete-0.0.148}/accrete/context_processors.py +0 -0
  29. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/__init__.py +0 -0
  30. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/__init__.py +0 -0
  31. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/admin.py +0 -0
  32. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/apps.py +0 -0
  33. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  34. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  35. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  36. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/migrations/__init__.py +0 -0
  37. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/country/models.py +0 -0
  38. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/__init__.py +0 -0
  39. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/admin.py +0 -0
  40. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/apps.py +0 -0
  41. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/config.py +0 -0
  42. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/helper.py +0 -0
  43. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  44. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  45. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  46. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  47. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  48. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/migrations/__init__.py +0 -0
  49. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/models.py +0 -0
  50. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/queries.py +0 -0
  51. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/signals.py +0 -0
  52. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/tests.py +0 -0
  53. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/log/views.py +0 -0
  54. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/__init__.py +0 -0
  55. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/admin.py +0 -0
  56. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/apps.py +0 -0
  57. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/forms.py +0 -0
  58. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  59. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  60. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  61. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  62. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/models.py +0 -0
  63. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/queries.py +0 -0
  64. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/tests.py +0 -0
  65. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/sequence/views.py +0 -0
  66. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/__init__.py +0 -0
  67. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/admin.py +0 -0
  68. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/apps.py +0 -0
  69. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/forms.py +0 -0
  70. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  71. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  72. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/models.py +0 -0
  73. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/tasks.py +0 -0
  74. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/tests.py +0 -0
  75. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/system_mail/views.py +0 -0
  76. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/__init__.py +0 -0
  77. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/admin.py +0 -0
  78. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/apps.py +0 -0
  79. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/filter.py +0 -0
  80. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/middleware.py +0 -0
  81. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/migrations/__init__.py +0 -0
  82. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/models.py +0 -0
  83. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  84. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/README.md +0 -0
  85. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  86. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  87. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  88. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  89. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  90. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  91. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  92. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  93. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  94. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  95. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  96. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  97. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  98. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  99. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  100. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  101. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/package.json +0 -0
  102. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  103. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  104. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  105. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  106. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  107. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  108. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  109. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  110. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  111. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  112. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  113. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  114. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  115. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  116. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  117. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  118. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  119. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  120. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  121. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  122. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  123. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  124. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  125. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  126. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  127. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  128. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  129. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  130. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  131. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  132. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  133. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  134. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  135. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  136. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  137. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  138. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  139. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  140. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  141. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  142. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  143. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  144. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  145. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  146. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  147. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  148. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  149. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  150. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  151. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  152. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  153. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  154. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  155. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  156. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  157. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  158. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  159. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  160. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  161. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  162. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  163. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  164. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  165. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  166. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  167. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  168. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  169. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  170. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  171. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  172. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  173. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  174. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  175. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  176. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  177. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  178. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  179. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/css/fa.css +0 -0
  180. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/css/icons.css +0 -0
  181. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  182. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  183. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
  184. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
  185. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
  186. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/js/filter.js +0 -0
  187. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  188. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  189. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  190. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  191. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  192. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  193. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  194. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  195. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  196. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  197. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  198. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  199. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  200. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
  201. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  202. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  203. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  204. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/content.html +0 -0
  205. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
  206. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/detail.html +0 -0
  207. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/favicon.html +0 -0
  208. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
  209. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  210. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  211. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  212. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
  213. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/form_error.html +0 -0
  214. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
  215. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/message.html +0 -0
  216. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/modal.html +0 -0
  217. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/oob.html +0 -0
  218. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +0 -0
  219. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  220. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/templatetags/__init__.py +0 -0
  221. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/tests.py +0 -0
  222. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/urls.py +0 -0
  223. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/views.py +0 -0
  224. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/widgets/__init__.py +0 -0
  225. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/ui/widgets/search_select.py +0 -0
  226. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/__init__.py +0 -0
  227. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/admin.py +0 -0
  228. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/apps.py +0 -0
  229. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/auth_backends.py +0 -0
  230. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/forms.py +0 -0
  231. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  232. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  233. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/middleware.py +0 -0
  234. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  235. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  236. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
  237. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
  238. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
  239. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
  240. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
  241. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +0 -0
  242. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/migrations/__init__.py +0 -0
  243. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/models.py +0 -0
  244. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
  245. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/templates/user/login.html +0 -0
  246. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/templates/user/password_forgotten.html +0 -0
  247. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/tests.py +0 -0
  248. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/urls.py +0 -0
  249. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user/views.py +0 -0
  250. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/__init__.py +0 -0
  251. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/admin.py +0 -0
  252. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/apps.py +0 -0
  253. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/config.py +0 -0
  254. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/forms.py +0 -0
  255. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  256. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
  257. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/models.py +0 -0
  258. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  259. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  260. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/tests.py +0 -0
  261. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/urls.py +0 -0
  262. {accrete-0.0.146 → accrete-0.0.148}/accrete/contrib/user_registration/views.py +0 -0
  263. {accrete-0.0.146 → accrete-0.0.148}/accrete/fields.py +0 -0
  264. {accrete-0.0.146 → accrete-0.0.148}/accrete/forms.py +0 -0
  265. {accrete-0.0.146 → accrete-0.0.148}/accrete/managers.py +0 -0
  266. {accrete-0.0.146 → accrete-0.0.148}/accrete/middleware.py +0 -0
  267. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0001_initial.py +0 -0
  268. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0002_initial.py +0 -0
  269. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0003_remove_member_name.py +0 -0
  270. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
  271. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
  272. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0006_alter_member_user.py +0 -0
  273. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0007_accessgroup_description.py +0 -0
  274. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/0008_alter_member_access_groups_and_more.py +0 -0
  275. {accrete-0.0.146 → accrete-0.0.148}/accrete/migrations/__init__.py +0 -0
  276. {accrete-0.0.146 → accrete-0.0.148}/accrete/models.py +0 -0
  277. {accrete-0.0.146 → accrete-0.0.148}/accrete/storage.py +0 -0
  278. {accrete-0.0.146 → accrete-0.0.148}/accrete/tenant.py +0 -0
  279. {accrete-0.0.146 → accrete-0.0.148}/accrete/tests.py +0 -0
  280. {accrete-0.0.146 → accrete-0.0.148}/accrete/urls.py +0 -0
  281. {accrete-0.0.146 → accrete-0.0.148}/accrete/utils/__init__.py +0 -0
  282. {accrete-0.0.146 → accrete-0.0.148}/accrete/utils/dates.py +0 -0
  283. {accrete-0.0.146 → accrete-0.0.148}/accrete/utils/forms.py +0 -0
  284. {accrete-0.0.146 → accrete-0.0.148}/accrete/utils/log.py +0 -0
  285. {accrete-0.0.146 → accrete-0.0.148}/accrete/utils/models.py +0 -0
  286. {accrete-0.0.146 → accrete-0.0.148}/accrete/utils/views.py +0 -0
  287. {accrete-0.0.146 → accrete-0.0.148}/accrete/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.146
3
+ Version: 0.0.148
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
@@ -21,9 +21,12 @@ class Response:
21
21
  def add_trigger(response):
22
22
  pass
23
23
 
24
+ def get_context(self):
25
+ return self.context
26
+
24
27
  def render(self, request) -> str:
25
28
  return render_to_string(
26
- template_name=self.template, context=self.context, request=request
29
+ template_name=self.template, context=self.get_context(), request=request
27
30
  )
28
31
 
29
32
  def response(self, request, extra_content: str = None, replace_body: bool = False) -> HttpResponse:
@@ -47,11 +50,18 @@ class OobResponse(Response):
47
50
 
48
51
  def __init__(self, *, template: str, context: dict, swap: str, tag: str = 'div'):
49
52
  super().__init__(template=self.oob_template, context=context)
50
- self.context.update({'oob': {
51
- 'template': template,
52
- 'swap': swap,
53
- 'tag': tag
53
+ self.include_template = template
54
+ self.swap = swap
55
+ self.tag = tag
56
+
57
+ def get_context(self):
58
+ context = super().get_context()
59
+ context.update({'oob': {
60
+ 'template': self.include_template,
61
+ 'swap': self.swap,
62
+ 'tag': self.tag
54
63
  }})
64
+ return context
55
65
 
56
66
 
57
67
  class WindowResponse(Response):
@@ -68,20 +78,29 @@ class WindowResponse(Response):
68
78
  is_centered: bool = False
69
79
  ):
70
80
  super().__init__(template=self.base_template, context=context)
81
+ self.title = title
82
+ self.overview_template = overview_template
83
+ self.header_template = header_template
71
84
  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
- })
85
+ self.panel_template = panel_template
86
+ self.is_centered = is_centered
81
87
 
82
88
  def _has_panel(self):
83
89
  return bool(self.panel_template)
84
90
 
91
+ def get_context(self):
92
+ context = super().get_context()
93
+ if 'has_panel' not in context.keys():
94
+ context.update(has_panel=self._has_panel())
95
+ context.update({
96
+ 'title': self.title,
97
+ 'overview_template': self.overview_template,
98
+ 'header_template': self.header_template,
99
+ 'panel_template': self.panel_template,
100
+ 'is_centered': self.is_centered
101
+ })
102
+ return context
103
+
85
104
  def response(self, request, extra_content: str = None, replace_body: bool = True) -> HttpResponse:
86
105
  return super().response(request, extra_content, replace_body)
87
106
 
@@ -100,34 +119,50 @@ class ListResponse(WindowResponse):
100
119
  panel_template: str = None,
101
120
  column_count: int = 1,
102
121
  column_height: str = '150px',
103
- overview_template: str = 'ui/list.html'
122
+ overview_template: str = 'ui/list.html',
123
+ detail_header_template: str = None,
124
+ detail_data_template: str = None
104
125
  ):
105
126
  assert page is not None or ui_filter is not None, _(
106
127
  'Argument page or ui_filter must be supplied'
107
128
  )
108
- self.ui_filter = ui_filter
109
- self.overview_template = overview_template
110
129
  super().__init__(
111
130
  title=title,
112
131
  context=context,
113
- overview_template=self.overview_template,
132
+ overview_template=overview_template,
114
133
  header_template=header_template,
115
134
  panel_template=panel_template,
116
135
  )
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
- })
136
+ self.page = page or (ui_filter and ui_filter.get_page())
137
+ self.list_entry_template = list_entry_template
138
+ self.page = page
139
+ self.ui_filter = ui_filter
140
+ self.endless_scroll = endless_scroll
141
+ self.column_count = column_count
142
+ self.column_height = column_height
143
+ self.detail_header_template = detail_header_template
144
+ self.detail_data_template = detail_data_template
127
145
 
128
146
  def _has_panel(self):
129
147
  return bool(self.panel_template or self.ui_filter)
130
148
 
149
+ def get_context(self):
150
+ context = super().get_context()
151
+ context.update({
152
+ 'list_entry_template': self.list_entry_template,
153
+ 'page': self.page,
154
+ 'ui_filter': self.ui_filter,
155
+ 'endless_scroll': self.endless_scroll,
156
+ 'column_count': self.column_count,
157
+ 'column_height': self.column_height,
158
+ 'detail_header_template': self.detail_header_template,
159
+ 'detail_data_template': self.detail_data_template,
160
+ 'show_content_right': str(bool(
161
+ self.detail_header_template or self.detail_data_template
162
+ )).lower(),
163
+ })
164
+ return context
165
+
131
166
  def response(self, request, extra_content: str = None, replace_body: bool = False) -> HttpResponse:
132
167
  return super().response(request, extra_content, replace_body)
133
168
 
@@ -146,15 +181,24 @@ class ListEntryResponse(Response):
146
181
  column_count: int = 1,
147
182
  column_height: str = '150px',
148
183
  ):
149
- self.page = page
150
184
  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
185
+ self.instance = instance
186
+ self.list_entry_template = list_entry_template
187
+ self.page = page
188
+ self.is_new = is_new
189
+ self.column_count = column_count
190
+ self.column_height = column_height
191
+
192
+ def get_context(self):
193
+ context = super().get_context()
194
+ context.update({
195
+ 'instance': self.instance,
196
+ 'list_entry_template': self.list_entry_template,
197
+ 'is_new': self.is_new,
198
+ 'column_count': self.column_count,
199
+ 'column_height': self.column_height
157
200
  })
201
+ return context
158
202
 
159
203
  def render(self, request) -> str:
160
204
  res = super().render(request)
@@ -174,7 +218,7 @@ class TableResponse(WindowResponse):
174
218
  self, *,
175
219
  title: str,
176
220
  context: dict,
177
- object_label: str,
221
+ instance_label: str,
178
222
  fields: list[str],
179
223
  footer: dict = None,
180
224
  page: paginator.Page = None,
@@ -182,34 +226,49 @@ class TableResponse(WindowResponse):
182
226
  endless_scroll: bool = True,
183
227
  header_template: str = None,
184
228
  panel_template: str = None,
185
- overview_template: str = 'ui/table.html'
229
+ overview_template: str = 'ui/table.html',
230
+ detail_header_template: str = None,
231
+ detail_data_template: str = None
186
232
  ):
187
233
  assert page is not None or ui_filter is not None, _(
188
234
  'Argument page or ui_filter must be supplied'
189
235
  )
190
- self.ui_filter = ui_filter
191
- self.overview_template = overview_template
192
236
  super().__init__(
193
237
  title=title,
194
238
  context=context,
195
- overview_template=self.overview_template,
239
+ overview_template=overview_template,
196
240
  header_template=header_template,
197
241
  panel_template=panel_template
198
242
  )
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
- })
243
+ self.instance_label = instance_label
244
+ self.fields = fields
245
+ self.footer = footer
246
+ self.page = page or (ui_filter and ui_filter.get_page())
247
+ self.ui_filter = ui_filter
248
+ self.endless_scroll = endless_scroll
249
+ self.detail_header_template = detail_header_template
250
+ self.detail_data_template = detail_data_template
209
251
 
210
252
  def _has_panel(self):
211
253
  return bool(self.panel_template or self.ui_filter)
212
254
 
255
+ def get_context(self):
256
+ context = super().get_context()
257
+ context.update({
258
+ 'page': self.page,
259
+ 'ui_filter': self.ui_filter,
260
+ 'endless_scroll': self.endless_scroll,
261
+ 'fields': self.fields,
262
+ 'instance_label': self.instance_label,
263
+ 'footer': self.footer,
264
+ 'detail_header_template': self.detail_header_template,
265
+ 'detail_data_template': self.detail_data_template,
266
+ 'show_content_right': str(bool(
267
+ self.detail_header_template or self.detail_data_template
268
+ )).lower()
269
+ })
270
+ return context
271
+
213
272
  def response(self, request, extra_content: str = None, replace_body: bool = False) -> HttpResponse:
214
273
  return super().response(request, extra_content, replace_body)
215
274
 
@@ -225,13 +284,21 @@ class TableRowResponse(Response):
225
284
  footer: dict = None,
226
285
  page: paginator.Page = None,
227
286
  ):
287
+ super().__init__(template=self.base_template, context={})
288
+ self.instance = instance
289
+ self.fields = fields
290
+ self.footer = footer
228
291
  self.page = page
229
- context = {
230
- 'instance': instance,
231
- 'fields': fields,
232
- 'footer': footer,
233
- }
234
- super().__init__(template=self.base_template, context=context)
292
+
293
+ def get_context(self):
294
+ context = super().get_context()
295
+ context.update({
296
+ 'instance': self.instance,
297
+ 'fields': self.fields,
298
+ 'footer': self.footer,
299
+ 'page': self.page
300
+ })
301
+ return context
235
302
 
236
303
  def render(self, request) -> str:
237
304
  res = super().render(request)
@@ -252,19 +319,26 @@ class DetailResponse(Response):
252
319
  def __init__(
253
320
  self, *,
254
321
  context: dict,
255
- detail_header_template: str = None,
256
- detail_data_template: str = None
322
+ header_template: str = None,
323
+ data_template: str = None
257
324
  ):
258
325
  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
- })
326
+ self.header_template = header_template
327
+ self.data_template = data_template
328
+ self.context.update()
263
329
 
264
330
  @staticmethod
265
331
  def add_trigger(response):
266
332
  add_trigger(response, 'activate-detail')
267
333
 
334
+ def get_context(self):
335
+ context = super().get_context()
336
+ context.update({
337
+ 'detail_header_template': self.header_template,
338
+ 'detail_data_template': self.data_template
339
+ })
340
+ return context
341
+
268
342
 
269
343
  class ModalResponse(Response):
270
344
 
@@ -280,13 +354,22 @@ class ModalResponse(Response):
280
354
 
281
355
  ):
282
356
  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
357
+ self.modal_id = modal_id
358
+ self.title = title
359
+ self.is_update = is_update
360
+ self.is_blocking = is_blocking
361
+ self.modal_width = modal_width
362
+
363
+ def get_context(self):
364
+ context = super().get_context()
365
+ context.update({
366
+ 'title': self.title,
367
+ 'modal_id': re.sub(r'[^A-Za-z-]+', '', self.modal_id).strip('-'),
368
+ 'is_update': self.is_update,
369
+ 'is_blocking': self.is_blocking,
370
+ 'modal_width': self.modal_width
289
371
  })
372
+ return context
290
373
 
291
374
 
292
375
  @dataclass
@@ -303,7 +386,7 @@ class TriggerResponse:
303
386
 
304
387
  def response(self):
305
388
  res = HttpResponse()
306
- res.headers['HX-Reswap'] = 'None'
389
+ res.headers['HX-Reswap'] = 'none'
307
390
  for trigger in self.trigger:
308
391
  add_trigger(res, trigger.trigger, trigger.header)
309
392
  return res
@@ -84,10 +84,6 @@ input[disabled] ~ .helptext {
84
84
  font-weight: normal !important; }
85
85
 
86
86
  textarea {
87
- border-top: transparent !important;
88
- border-right: transparent !important;
89
- border-left: transparent !important;
90
- border-radius: 0 !important;
91
87
  box-shadow: none !important; }
92
88
 
93
89
  textarea:focus {
@@ -161,7 +157,7 @@ select:focus {
161
157
  max-width: calc(var(--accrete-detail-width) - 6%); }
162
158
 
163
159
  .list-entry > .box:hover, .box.selected {
164
- outline: 2px solid var(--bulma-success); }
160
+ box-shadow: 0 0 5px 2px var(--bulma-success); }
165
161
 
166
162
  .helptext {
167
163
  font-style: italic !important;
@@ -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
+ }
@@ -106,10 +106,6 @@ input[disabled] ~ .helptext {
106
106
  }
107
107
 
108
108
  textarea {
109
- border-top: transparent!important;
110
- border-right: transparent!important;
111
- border-left: transparent!important;
112
- border-radius: 0!important;
113
109
  box-shadow: none!important;
114
110
  }
115
111
 
@@ -199,7 +195,7 @@ select:focus {
199
195
  }
200
196
 
201
197
  .list-entry > .box:hover, .box.selected {
202
- outline: 2px solid var(--bulma-success);
198
+ box-shadow: 0 0 5px 2px var(--bulma-success);
203
199
  }
204
200
 
205
201
  .helptext {
@@ -42,6 +42,7 @@
42
42
  }
43
43
  })
44
44
  </script>
45
+ {% if script_template %}{% include script_template %}{% endif %}
45
46
  <title>{% block title %}{{ title }}{% endblock %}</title>
46
47
  {% endblock %}
47
48
  </head>
@@ -137,7 +138,7 @@
137
138
  {% endfor %}
138
139
  </div>
139
140
 
140
- <div x-data="{showContentRight: false}"
141
+ <div x-data="{showContentRight: {{ show_content_right|default_if_falsy:'false' }}}"
141
142
  @activate-detail.window="showContentRight = true;"
142
143
  @deactivate-detail.window="showContentRight = false;"
143
144
  class="is-flex is-flex-direction-row"
@@ -197,7 +198,7 @@
197
198
  </div>
198
199
  </div>
199
200
 
200
- <div id="detail-container" x-show="showContentRight" style="display: none;"
201
+ <div id="detail-container" x-show="showContentRight" {% if show_content_right != 'true' %}style="display: none;"{% endif %}
201
202
  x-transition:enter.duration.200ms x-transition:leave.duration.50ms
202
203
  >
203
204
  <div id="detail-indicator" class="htmx-indicator">
@@ -208,7 +209,9 @@
208
209
  <div id="detail-header" class="is-flex is-flex-wrap-wrap is-flex-grow-1">
209
210
  {% if detail_header_template %}{% include detail_header_template %}{% endif %}
210
211
  </div>
211
- <button class="button is-light is-align-self-baseline" style="border-radius: var(--bulma-radius-medium)" x-on:click="showContentRight = false;">
212
+ <button class="button is-light is-align-self-baseline" style="border-radius: var(--bulma-radius-medium)"
213
+ x-on:click="showContentRight = false; const url = new URL(window.location); url.searchParams.delete('detail'); history.replaceState(null, '', url);"
214
+ >
212
215
  <span class="icon"><i class="fa fa-xmark"></i></span>
213
216
  </button>
214
217
  </div>
@@ -0,0 +1,42 @@
1
+ {% load i18n %}
2
+ {% load ui %}
3
+ {% load partials %}
4
+
5
+ <div class="fixed-grid has-{{ column_count }}-cols has-1-cols-mobile m-2">
6
+ <div id="list-grid" class="grid m-0">
7
+ {% for instance in page.object_list %}
8
+ {% partialdef entry inline=True %}
9
+ <div id="list-entry-{{ instance.pk }}" class="list-entry cell pb-0" style="height: {{ column_height }}">
10
+ <div class="box p-3"
11
+ style="word-break: break-word; height: 100%; overflow-y: auto; {% if instance.get_absolute_url %}cursor:pointer;{% endif %}"
12
+ {% if instance.get_absolute_url %}
13
+ hx-get="{{ instance.get_absolute_url }}{% querystring %}" hx-swap="none" hx-indicator="#detail-indicator" hx-replace-url="{% querystring detail=instance.pk %}"
14
+ x-on:click="$dispatch('unselect-list-entry'); selected = true; $nextTick(() => { $el.scrollIntoView({block: 'nearest'}) });" x-bind:class="selected ? 'selected' : ''"
15
+ {% endif %}
16
+ x-data="{selected: false}" @unselect-list-entry.window="selected = false"
17
+ >
18
+ <div id="list-data-{{ instance.pk }}">
19
+ {% if list_entry_template %}
20
+ {% include list_entry_template %}
21
+ {% else %}
22
+ {{ instance }}
23
+ {% endif %}
24
+ </div>
25
+ </div>
26
+ </div>
27
+ {% endpartialdef %}
28
+ {% endfor %}
29
+ </div>
30
+ {% if endless_scroll and page.has_next %}
31
+ <div id="endless-scroller"
32
+ hx-get="{% querystring page=page.next_page_number %}"
33
+ hx-target="#list-grid"
34
+ hx-trigger="intersect once"
35
+ hx-select=".list-entry"
36
+ hx-select-oob="#pagination-next-button,#pagination-end-index,#endless-scroller"
37
+ hx-swap="beforeend"
38
+ hx-replace-url="true"
39
+ hx-indicator="#endless-scroll-indicator"></div>
40
+ <progress id="endless-scroll-indicator" class="htmx-indicator progress is-small is-success" max="100">15%</progress>
41
+ {% endif %}
42
+ </div>
@@ -0,0 +1,75 @@
1
+ {% load i18n %}
2
+ {% load ui %}
3
+ {% load partials %}
4
+
5
+ <table id="content-table" class="table can-compact is-fullwidth is-hoverable is-narrow my-0" hx-indicator=".htmx-indicator" x-data="">
6
+ <thead style="position: sticky; top: 0; z-index: 10; background-color: var(--bulma-scheme-main)">
7
+ <tr>
8
+ <th>{{ instance_label }}</th>
9
+ {% for field in fields %}
10
+ <th style="text-align: {{ page.object_list|table_alignment:field }}">{{ page.object_list|verbose_field_name:field }}</th>
11
+ {% endfor %}
12
+ </tr>
13
+ </thead>
14
+ <tbody id="content-table-body" style="z-index: 9" x-ref="tbody">
15
+ {% for instance in page.object_list %}
16
+ {% partialdef tr inline=True %}
17
+ <tr id="tr-{{ instance.pk }}"
18
+ {% if instance.get_absolute_url %}
19
+ style="cursor: pointer;"
20
+ hx-get="{{ instance.get_absolute_url }}{% querystring %}" hx-swap="none"
21
+ hx-replace-url="{% querystring detail=instance.pk %}"
22
+ x-data="{selected: false}" @unselect-tr.window="selected = false"
23
+ x-on:click="$dispatch('unselect-tr'); selected = true; $nextTick(() => { $el.scrollIntoView( {block: 'nearest'} ) });" x-bind:class="selected ? 'is-success' : ''"
24
+ {% endif %}
25
+ >
26
+ {% partialdef td inline=True %}
27
+ <td>{{ instance }}</td>
28
+ {% for field in fields %}
29
+ <td style="text-align: {{ instance|table_alignment:field }}">
30
+ <span class="">
31
+ <span class="responsive-heading has-text-weight-light" style="margin-right: .2rem">{{ instance|verbose_field_name:field }}:</span>
32
+ {{ instance|table_display:field|default_if_none:'' }}
33
+ </span>
34
+ </td>
35
+ {% endfor %}
36
+ {% endpartialdef %}
37
+ </tr>
38
+ {% endpartialdef %}
39
+ {% endfor %}
40
+ </tbody>
41
+ <tfoot style="position: sticky; bottom: 0; z-index: 10; background-color: var(--bulma-scheme-main);" class="has-text-weight-bold">
42
+ <tr id="tf-row">
43
+ {% partialdef tf inline=True %}
44
+ <td class="p-0"></td>
45
+ {% for field in fields %}
46
+ {% if field in footer %}
47
+ <td style="text-align: {{ page.object_list|table_alignment:field }}">
48
+ <span class="">
49
+ <span class="responsive-heading has-text-weight-light" style="margin-right: .2rem">{{ page.object_list|verbose_field_name:field }}:</span>
50
+ {{ footer|get_item:field }}
51
+ </span>
52
+ </td>
53
+ {% else %}
54
+ <td class="p-0"></td>
55
+ {% endif %}
56
+ {% endfor %}
57
+ {% endpartialdef %}
58
+ </tr>
59
+ </tfoot>
60
+ </table>
61
+
62
+ <div id="endless-scroller"
63
+ {% if page.has_next %}
64
+ hx-get="{% querystring page=page.next_page_number %}"
65
+ hx-trigger="intersect once"
66
+ hx-select="tbody > tr"
67
+ hx-target="#content-table-body"
68
+ hx-swap="beforeend"
69
+ hx-select-oob="#pagination-next-button,#pagination-end-index,#endless-scroller"
70
+ hx-indicator="#endless-scroll-indicator"
71
+ hx-replace-url="true"
72
+ {% endif %}
73
+ >
74
+ </div>
75
+ <progress id="endless-scroll-indicator" class="htmx-indicator progress is-small is-success" max="100">15%</progress>
@@ -0,0 +1,14 @@
1
+ <table>
2
+ <tbody>
3
+ <tr hx-swap-oob="innerHTML:#tr-{{ instance.pk }}">
4
+ {% include 'ui/table.html#td' with instance=instance fields=fields page=page %}
5
+ </tr>
6
+ </tbody>
7
+ {% if footer %}
8
+ <tfoot>
9
+ <tr hx-swap-oob="innerHTML:#tf-row">
10
+ {% include 'ui/table.html#tf' with instance=instance fields=fields page=page %}
11
+ </tr>
12
+ </tfoot>
13
+ {% endif %}
14
+ </table>
@@ -5,7 +5,15 @@
5
5
  <label class="label mt-2 mb-5">
6
6
  {{ field }}
7
7
  <span class="has-text-danger is-size-6">{{ field.errors }}</span>
8
- <p class="helptext {% if field.field.required %}has-text-weight-bold{% endif %}">{% if label %}{{ label }}{% else %}{{ field.help_text|default_if_falsy:field.label }}{% endif %}</p>
8
+ <span class="helptext {% if field.field.required %}has-text-weight-bold{% endif %}">{% if label %}{{ label }}{% else %}{{ field.help_text|default_if_falsy:field.label }}{% endif %}</span>
9
+ </label>
10
+ {% endpartialdef %}
11
+
12
+ {% partialdef textarea %}
13
+ <label class="label mt-2 mb-5">
14
+ <span class="helptext {% if field.field.required %}has-text-weight-bold{% endif %}">{% if label %}{{ label }}{% else %}{{ field.help_text|default_if_falsy:field.label }}{% endif %}</span>
15
+ <span class="has-text-danger is-size-6">{{ field.errors }}</span>
16
+ {{ field }}
9
17
  </label>
10
18
  {% endpartialdef %}
11
19
 
@@ -13,7 +13,7 @@
13
13
  <div id="{{ widget.attrs.id }}_display" class="input select py-1 pl-1" tabindex="0" x-ref="inputDisplay" aria-label="inputDisplay"
14
14
  style="padding-right: 30px; border-radius: 0; border-top: 0; border-right:0; border-left: 0; min-height: var(--bulma-control-height); height: fit-content; width: 100%"
15
15
  x-on:keydown="if (![9, 27, 38, 40].includes($event.keyCode)) {$refs.searchInput.focus();}"
16
- x-on:mousedown.stop="if (!$event.target.classList.contains('delete')) {if (open) {open = false; } else {open = true; $refs.searchInput.focus();}}"
16
+ x-on:click.stop="if (!$event.target.classList.contains('delete')) {if (open) {open = false; } else {open = true; $refs.searchInput.focus();}}"
17
17
  >
18
18
  <div class="tags" x-ref="inputDisplayTags"
19
19
  x-on:click="
@@ -8,6 +8,7 @@ from django.db.models import Manager, DecimalField, IntegerField, FloatField, Mo
8
8
  from django.apps import apps
9
9
  from django.template.loader import render_to_string
10
10
  from django.utils.safestring import mark_safe
11
+ from django.forms import widgets
11
12
 
12
13
  _logger = logging.getLogger(__name__)
13
14
  register = template.Library()
@@ -149,8 +150,11 @@ def x_ref_save(param: str):
149
150
  return re.sub(r'[^A-Za-z]+','', param)
150
151
 
151
152
 
152
- @register.filter(name='wrap_label')
153
- def wrap_label(field, label=None):
153
+ @register.filter(name='wrap_form_field')
154
+ def wrap_form_fields(field, label=None):
155
+ if isinstance(field.field.widget, widgets.Textarea):
156
+ html = render_to_string('ui/templatetags/field.html#textarea', {'field': field, 'label': label})
157
+ return mark_safe(html)
154
158
  html = render_to_string('ui/templatetags/field.html#form_field', {'field': field, 'label': label})
155
159
  return mark_safe(html)
156
160
 
@@ -158,7 +162,7 @@ def wrap_label(field, label=None):
158
162
  @register.filter(name='wrap_model_field')
159
163
  def wrap_model_field(instance, field_name):
160
164
  field = instance._meta.get_field(field_name)
161
- if field_name == 'invoicing_period' and field.choices:
165
+ if field.choices:
162
166
  value = getattr(instance, f'get_{field_name}_display')()
163
167
  else:
164
168
  value = getattr(instance, field_name)
@@ -5,8 +5,8 @@
5
5
  {% block modal_content %}
6
6
  <form id="{{ modal_id }}-form" hx-post="{% url 'user:change_email' %}">
7
7
  {% csrf_token %}
8
- {{ form.email|wrap_label }}
9
- {{ form.password|wrap_label }}
8
+ {{ form.email|wrap_form_field }}
9
+ {{ form.password|wrap_form_field }}
10
10
  </form>
11
11
  {% endblock %}
12
12