accrete 0.0.156__tar.gz → 0.0.158__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (307) hide show
  1. {accrete-0.0.156 → accrete-0.0.158}/PKG-INFO +1 -1
  2. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/helper.py +11 -2
  3. accrete-0.0.158/accrete/contrib/log/migrations/0007_alter_log_new_value_type_alter_log_old_value_type.py +23 -0
  4. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/models.py +4 -2
  5. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/queries.py +1 -1
  6. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/__init__.py +2 -1
  7. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/response.py +7 -0
  8. accrete-0.0.158/accrete/contrib/ui/templates/django/forms/widgets/radio.html +5 -0
  9. accrete-0.0.158/accrete/contrib/ui/templates/ui/form_error.html +13 -0
  10. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/layout.html +1 -1
  11. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/list.html +1 -1
  12. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/message.html +1 -1
  13. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/templatetags/field.html +19 -26
  14. accrete-0.0.158/accrete/contrib/ui/templates/ui/templatetags/tenant_quick_switch.html +14 -0
  15. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templatetags/ui.py +7 -1
  16. accrete-0.0.158/accrete/contrib/user/migrations/0011_alter_user_theme.py +18 -0
  17. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/models.py +6 -4
  18. {accrete-0.0.156 → accrete-0.0.158}/accrete/utils/models.py +19 -0
  19. {accrete-0.0.156 → accrete-0.0.158}/pyproject.toml +1 -1
  20. accrete-0.0.156/accrete/contrib/ui/templates/ui/form_error.html +0 -11
  21. accrete-0.0.156/accrete/contrib/ui/templates/ui/templatetags/tenant_quick_switch.html +0 -14
  22. {accrete-0.0.156 → accrete-0.0.158}/.gitignore +0 -0
  23. {accrete-0.0.156 → accrete-0.0.158}/LICENSE +0 -0
  24. {accrete-0.0.156 → accrete-0.0.158}/README.md +0 -0
  25. {accrete-0.0.156 → accrete-0.0.158}/accrete/__init__.py +0 -0
  26. {accrete-0.0.156 → accrete-0.0.158}/accrete/admin.py +0 -0
  27. {accrete-0.0.156 → accrete-0.0.158}/accrete/apps.py +0 -0
  28. {accrete-0.0.156 → accrete-0.0.158}/accrete/channels.py +0 -0
  29. {accrete-0.0.156 → accrete-0.0.158}/accrete/config.py +0 -0
  30. {accrete-0.0.156 → accrete-0.0.158}/accrete/consumer.py +0 -0
  31. {accrete-0.0.156 → accrete-0.0.158}/accrete/context_processors.py +0 -0
  32. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/__init__.py +0 -0
  33. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/__init__.py +0 -0
  34. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/admin.py +0 -0
  35. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/apps.py +0 -0
  36. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  37. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  38. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  39. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/migrations/__init__.py +0 -0
  40. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/country/models.py +0 -0
  41. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/__init__.py +0 -0
  42. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/admin.py +0 -0
  43. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/apps.py +0 -0
  44. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/config.py +0 -0
  45. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  46. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  47. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  48. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  49. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  50. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/migrations/0006_remove_log_accrete_log_model_cf888c_idx_and_more.py +0 -0
  51. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/migrations/__init__.py +0 -0
  52. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/queries.py +0 -0
  53. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/signals.py +0 -0
  54. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/tests.py +0 -0
  55. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/log/views.py +0 -0
  56. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/__init__.py +0 -0
  57. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/admin.py +0 -0
  58. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/apps.py +0 -0
  59. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/forms.py +0 -0
  60. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  61. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  62. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  63. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  64. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/models.py +0 -0
  65. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/tests.py +0 -0
  66. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/sequence/views.py +0 -0
  67. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/__init__.py +0 -0
  68. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/admin.py +0 -0
  69. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/apps.py +0 -0
  70. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/forms.py +0 -0
  71. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  72. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  73. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/models.py +0 -0
  74. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/tasks.py +0 -0
  75. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/tests.py +0 -0
  76. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/system_mail/views.py +0 -0
  77. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/admin.py +0 -0
  78. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/apps.py +0 -0
  79. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/config.py +0 -0
  80. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/filter.py +0 -0
  81. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/forms.py +0 -0
  82. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/middleware.py +0 -0
  83. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/migrations/0001_initial.py +0 -0
  84. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/migrations/0002_alter_theme_color_danger_alter_theme_color_link_and_more.py +0 -0
  85. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/migrations/0003_alter_theme_check_user_or_tenant.py +0 -0
  86. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/migrations/0004_theme_force_tenant_theme.py +0 -0
  87. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/migrations/0005_theme_base_theme.py +0 -0
  88. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/migrations/__init__.py +0 -0
  89. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/models.py +0 -0
  90. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  91. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/README.md +0 -0
  92. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  93. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  94. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  95. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  96. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  97. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  98. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  99. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  100. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  101. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  102. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  103. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  104. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  105. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  106. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  107. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  108. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/package.json +0 -0
  109. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  110. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  111. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  112. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  113. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  114. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  115. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  116. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  117. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  118. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  119. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  120. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  121. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  122. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  123. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  124. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  125. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  126. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  127. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  128. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  129. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  130. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  131. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  132. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  133. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  134. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  135. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  136. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  137. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  138. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  139. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  140. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  141. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  142. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  143. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  144. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  145. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  146. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  147. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  148. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  149. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  150. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  151. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  152. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  153. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  154. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  155. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  156. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  157. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  158. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  159. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  160. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  161. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  162. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  163. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  164. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  165. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  166. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  167. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  168. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  169. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  170. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  171. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  172. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  173. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  174. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  175. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  176. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  177. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  178. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  179. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  180. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  181. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  182. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  183. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  184. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  185. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  186. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/css/accrete.css +0 -0
  187. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/css/accrete.css.map +0 -0
  188. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/css/accrete.scss +0 -0
  189. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/css/fa.css +0 -0
  190. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/css/icons.css +0 -0
  191. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  192. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  193. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
  194. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
  195. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
  196. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/js/filter.js +0 -0
  197. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  198. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/js/ws.js +0 -0
  199. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  200. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  201. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  202. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  203. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  204. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  205. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  206. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  207. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  208. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  209. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  210. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  211. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -0
  212. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  213. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  214. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  215. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/content.html +0 -0
  216. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
  217. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/custom_theme.html +0 -0
  218. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/detail.html +0 -0
  219. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/favicon.html +0 -0
  220. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
  221. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  222. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  223. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  224. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
  225. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
  226. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/modal.html +0 -0
  227. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/oob.html +0 -0
  228. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/table.html +0 -0
  229. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
  230. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/widgets/date_weekday.html +0 -0
  231. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +0 -0
  232. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +0 -0
  233. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  234. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/templatetags/__init__.py +0 -0
  235. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/tests.py +0 -0
  236. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/urls.py +0 -0
  237. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/views.py +0 -0
  238. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/widgets/__init__.py +0 -0
  239. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/widgets/date_weekday.py +0 -0
  240. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/ui/widgets/search_select.py +0 -0
  241. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/__init__.py +0 -0
  242. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/admin.py +0 -0
  243. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/apps.py +0 -0
  244. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/auth_backends.py +0 -0
  245. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/forms.py +0 -0
  246. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  247. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  248. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/middleware.py +0 -0
  249. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  250. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  251. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
  252. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
  253. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
  254. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
  255. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
  256. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +0 -0
  257. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0009_alter_user_theme.py +0 -0
  258. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/0010_alter_user_theme.py +0 -0
  259. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/migrations/__init__.py +0 -0
  260. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
  261. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/templates/user/change_email.html +0 -0
  262. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/templates/user/change_password.html +0 -0
  263. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/templates/user/login.html +0 -0
  264. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/templates/user/password_forgotten.html +0 -0
  265. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/templates/user/user_preferences.html +0 -0
  266. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/tests.py +0 -0
  267. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/urls.py +0 -0
  268. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user/views.py +0 -0
  269. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/__init__.py +0 -0
  270. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/admin.py +0 -0
  271. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/apps.py +0 -0
  272. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/config.py +0 -0
  273. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/forms.py +0 -0
  274. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  275. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
  276. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/models.py +0 -0
  277. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  278. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  279. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/tests.py +0 -0
  280. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/urls.py +0 -0
  281. {accrete-0.0.156 → accrete-0.0.158}/accrete/contrib/user_registration/views.py +0 -0
  282. {accrete-0.0.156 → accrete-0.0.158}/accrete/fields.py +0 -0
  283. {accrete-0.0.156 → accrete-0.0.158}/accrete/forms.py +0 -0
  284. {accrete-0.0.156 → accrete-0.0.158}/accrete/managers.py +0 -0
  285. {accrete-0.0.156 → accrete-0.0.158}/accrete/middleware.py +0 -0
  286. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0001_initial.py +0 -0
  287. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0002_initial.py +0 -0
  288. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0003_remove_member_name.py +0 -0
  289. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
  290. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
  291. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0006_alter_member_user.py +0 -0
  292. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0007_accessgroup_description.py +0 -0
  293. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0008_alter_member_access_groups_and_more.py +0 -0
  294. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0009_alter_accessgroup_name.py +0 -0
  295. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/0010_alter_accessgroup_description.py +0 -0
  296. {accrete-0.0.156 → accrete-0.0.158}/accrete/migrations/__init__.py +0 -0
  297. {accrete-0.0.156 → accrete-0.0.158}/accrete/models.py +0 -0
  298. {accrete-0.0.156 → accrete-0.0.158}/accrete/storage.py +0 -0
  299. {accrete-0.0.156 → accrete-0.0.158}/accrete/tenant.py +0 -0
  300. {accrete-0.0.156 → accrete-0.0.158}/accrete/tests.py +0 -0
  301. {accrete-0.0.156 → accrete-0.0.158}/accrete/urls.py +0 -0
  302. {accrete-0.0.156 → accrete-0.0.158}/accrete/utils/__init__.py +0 -0
  303. {accrete-0.0.156 → accrete-0.0.158}/accrete/utils/dates.py +0 -0
  304. {accrete-0.0.156 → accrete-0.0.158}/accrete/utils/forms.py +0 -0
  305. {accrete-0.0.156 → accrete-0.0.158}/accrete/utils/log.py +0 -0
  306. {accrete-0.0.156 → accrete-0.0.158}/accrete/utils/views.py +0 -0
  307. {accrete-0.0.156 → accrete-0.0.158}/accrete/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.156
3
+ Version: 0.0.158
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
@@ -1,8 +1,11 @@
1
+ import json
2
+
1
3
  from django.db import models
2
4
  from django.db.models.query import RawQuerySet
3
- from django.forms import model_to_dict
4
5
 
5
6
  from .models import Log, LogConfig
7
+ from accrete.fields import TranslatedCharField, TranslatedTextField
8
+ from accrete.utils.models import model_to_dict
6
9
 
7
10
  TYPES_FK = ['AutoField', 'BigAutoField', 'ForeignKey']
8
11
  TYPES_INT = ['IntegerField', 'PositiveSmallIntegerField']
@@ -13,6 +16,7 @@ TYPES_BOOL = ['BooleanField']
13
16
  TYPES_DATETIME = ['DateTimeField']
14
17
  TYPES_DATE = ['DateField']
15
18
  TYPES_TIME = ['TimeField']
19
+ TYPES_JSON = ['JSONField']
16
20
 
17
21
 
18
22
  def internal_type_to_log_type(field: models.Field):
@@ -33,6 +37,8 @@ def internal_type_to_log_type(field: models.Field):
33
37
  return 'date'
34
38
  if internal_type in TYPES_DATETIME:
35
39
  return 'datetime'
40
+ if internal_type in TYPES_JSON:
41
+ return 'json'
36
42
 
37
43
 
38
44
  def log_state_to_dict(logs: RawQuerySet) -> tuple[dict, dict]:
@@ -71,9 +77,12 @@ def get_instance_state(instance: models.Model):
71
77
  fields_to_log = log_config.fields.all().values_list('field_name', flat=True)
72
78
 
73
79
  for f, v in state.items():
74
- if isinstance(v, (list, tuple, dict)):
80
+ if isinstance(v, (list, tuple)):
75
81
  continue
76
82
  if f not in fields_to_log:
77
83
  continue
84
+ if isinstance(v, dict) and isinstance(instance._meta.get_field(f), (TranslatedCharField, TranslatedTextField)):
85
+ cleaned_state.update({f: json.dumps(v)})
86
+ continue
78
87
  cleaned_state.update({f: v})
79
88
  return cleaned_state
@@ -0,0 +1,23 @@
1
+ # Generated by Django 5.2.7 on 2025-10-06 18:59
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('log', '0006_remove_log_accrete_log_model_cf888c_idx_and_more'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='log',
15
+ name='new_value_type',
16
+ field=models.CharField(choices=[('fk', 'Foreign Key'), ('int', 'Integer'), ('float', 'Float'), ('decimal', 'Decimal'), ('bool', 'Boolean'), ('str', 'String'), ('date', 'Date'), ('datetime', 'Date Time'), ('json', 'JSON')], max_length=100, verbose_name='New Value Type'),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='log',
20
+ name='old_value_type',
21
+ field=models.CharField(choices=[('fk', 'Foreign Key'), ('int', 'Integer'), ('float', 'Float'), ('decimal', 'Decimal'), ('bool', 'Boolean'), ('str', 'String'), ('date', 'Date'), ('datetime', 'Date Time'), ('json', 'JSON')], max_length=100, verbose_name='Old Value Type'),
22
+ ),
23
+ ]
@@ -63,7 +63,8 @@ class Log(models.Model):
63
63
  ('bool', 'Boolean'),
64
64
  ('str', 'String'),
65
65
  ('date', 'Date'),
66
- ('datetime', 'Date Time')
66
+ ('datetime', 'Date Time'),
67
+ ('json', 'JSON')
67
68
  ],
68
69
  max_length=100,
69
70
  )
@@ -78,7 +79,8 @@ class Log(models.Model):
78
79
  ('bool', 'Boolean'),
79
80
  ('str', 'String'),
80
81
  ('date', 'Date'),
81
- ('datetime', 'Date Time')
82
+ ('datetime', 'Date Time'),
83
+ ('json', 'JSON')
82
84
  ],
83
85
  max_length=100
84
86
  )
@@ -5,7 +5,7 @@ from accrete.tenant import get_tenant
5
5
  from .models import Sequence
6
6
 
7
7
 
8
- def get_nextval(name, create_if_none=True):
8
+ def get_nextval(name: str, create_if_none:bool = True) -> int:
9
9
  tenant = get_tenant()
10
10
  with transaction.atomic():
11
11
  seq = Sequence.objects.filter(
@@ -16,5 +16,6 @@ from .response import (
16
16
  message_response,
17
17
  add_trigger,
18
18
  update,
19
- WindowResponseConfig
19
+ WindowResponseConfig,
20
+ redirect_response
20
21
  )
@@ -465,3 +465,10 @@ def update(request, ui_responses: list[Response], trigger: list[ClientTrigger] =
465
465
  for t in trigger or []:
466
466
  add_trigger(response, t.trigger, t.header)
467
467
  return response
468
+
469
+
470
+ def redirect_response(url: str, reload: bool = True):
471
+ res = HttpResponse()
472
+ header = 'HX-Redirect' if reload else 'HX-Location'
473
+ res[header] = url
474
+ return res
@@ -0,0 +1,5 @@
1
+ {% with id=widget.attrs.id %}<div{% if id %} id="{{ id }}"{% endif %}{% if widget.attrs.class %} class="{{ widget.attrs.class }}"{% endif %}>{% for group, options, index in widget.optgroups %}{% if group %}
2
+ <div><label class="has-text-weight-medium">{{ group }}</label>{% endif %}<div style="display: flex; flex-direction: row; flex-wrap: wrap">{% for option in options %}<div class="mr-2" style="white-space: nowrap">
3
+ {% include option.template_name with widget=option %}</div>{% endfor %}</div>{% if group %}
4
+ </div>{% endif %}{% endfor %}
5
+ </div>{% endwith %}
@@ -0,0 +1,13 @@
1
+ {% load i18n %}
2
+
3
+ {% if form.non_field_errors or form.save_error %}
4
+ <div class="message is-danger" style="word-wrap: break-word;">
5
+ <div class="message-body">
6
+ {{ form.non_field_errors }}
7
+ {% if form.save_error %}
8
+ <p>{{ form.save_error }}</p>
9
+ {% if form.save_error_id %}<span>{% translate 'Error ID' %}: {{ form.save_error_id }}</span>{% endif %}
10
+ {% endif %}
11
+ </div>
12
+ </div>
13
+ {% endif %}
@@ -146,7 +146,7 @@
146
146
  <div id="message" class="" style="position: fixed; top: calc(var(--bulma-navbar-height) + 5px); left: 50%; transform: translateX(-50%); z-index: 999">
147
147
  {% for message in messages %}
148
148
  <div class="mb-2" style="min-width: 330px; max-width: 330px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; setTimeout(() => show = false, 4000)" x-transition.duration.200ms>
149
- <article class="message {{ message|message_class }}" style="box-shadow: 2px 2px 5px">
149
+ <article class="message {{ message|message_class }}">
150
150
  <div class="message-body">
151
151
  {{ message }}
152
152
  <button class="delete" x-on:click="show = false;" style="position: absolute; top: 5px; right: 5px"></button>
@@ -7,7 +7,7 @@
7
7
  <div id="list-grid" class="grid m-0">
8
8
  {% for instance in page.object_list %}
9
9
  {% partialdef entry inline=True %}
10
- <div id="list-entry-{{ instance.pk }}" class="list-entry cell pb-0" style="{% if column_height %}min-height: {{ column_height }}{% endif %}">
10
+ <div id="list-entry-{{ instance.pk }}" class="list-entry cell pb-0" style="{% if column_height %}height: {{ column_height }}{% endif %}">
11
11
  <div class="box p-3"
12
12
  style="word-break: break-word; height: 100%; overflow-y: auto; {% if instance.get_absolute_url and detail_enabled %}cursor:pointer;{% endif %}"
13
13
  {% if instance.get_absolute_url and detail_enabled %}
@@ -4,7 +4,7 @@
4
4
  {% for message in messages %}
5
5
  <div hx-swap-oob="{% if append %}beforeend:#message{% else %}innerHTML:#message{% endif %}">
6
6
  <div class="mb-2" style="min-width: 340px; max-width: 340px" x-data="{ show: false }" x-show="show" x-cloak="" x-init="show = true; {% if not persistent %}setTimeout(() => show = false, 4000){% endif %}" x-transition.duration.200ms>
7
- <article class="message {{ message|message_class }}" style="box-shadow: 2px 2px 5px">
7
+ <article class="message {{ message|message_class }}">
8
8
  <div class="message-body">
9
9
  {{ message }}
10
10
  <button class="delete" x-on:click="show = false;" style="position: absolute; top: 5px; right: 5px"></button>
@@ -1,28 +1,9 @@
1
1
  {% load ui %}
2
2
  {% load partials %}
3
3
 
4
- {#{% partialdef form_field %}#}
5
- {# <label class="label mt-2 mb-5">#}
6
- {# {{ field.label }}#}
7
- {# {{ field }}#}
8
- {# <span class="has-text-danger is-size-6">{{ field.errors }}</span>#}
9
- {# <span class="helptext is-size-7">{{ field.help_text }}</span>#}
10
- {# <span class="helptext is-size-7">{% if label %}{{ label }}{% else %}{{ field.help_text|default_if_falsy:field.label }}{% endif %}</span>#}
11
- {# </label>#}
12
- {#{% endpartialdef %}#}
13
-
14
- {#{% partialdef form_field %}#}
15
- {# <label class="label mt-2 mb-5" style="border: 1px solid; border-radius: var(--bulma-radius);">#}
16
- {# <span style="justify-content: left" class="is-fullwidth button is-static helptext is-size-7 {% if field.field.required %}has-text-weight-bold{% endif %}">{% if label %}{{ label }}{% else %}{{ field.help_text|default_if_falsy:field.label }}{% endif %}</span>#}
17
- {# {{ field }}#}
18
- {# <span class="has-text-danger is-size-6">{{ field.errors }}Testmessage</span>#}
19
- {##}
20
- {# </label>#}
21
- {#{% endpartialdef %}#}
22
-
23
4
  {% partialdef form_field %}
24
5
  <div class="mb-5">
25
- <label class="label mb-0 {% if field.field.required %}has-text-weight-medium{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
6
+ <label class="label mb-0 {% if field.field.required %}has-text-weight-bold{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
26
7
  <div class="field has-addons mb-0">
27
8
  {% if icon %}
28
9
  <p class="control">
@@ -36,6 +17,24 @@
36
17
  </div>
37
18
  {% endpartialdef %}
38
19
 
20
+ {% partialdef form_checkbox %}
21
+ <div class="mb-5">
22
+ <div class="level" style="display: flex; flex-direction: row; justify-content: start">
23
+ <div class="field has-addons mb-0">
24
+ {% if icon %}
25
+ <p class="control">
26
+ <button tabindex="-1" type="button" class="button is-static"><span class="icon"><i class="{{ icon }}"></i></span></button>
27
+ </p>
28
+ {% endif %}
29
+ <div class="control is-expanded">{{ field }}</div>
30
+ </div>
31
+ <label class="label mb-0 {% if field.field.required %}has-text-weight-bold{% endif %}" for="{{ field.id_for_label }}">{{ field.label }}</label>
32
+ </div>
33
+ <span class="has-text-danger is-size-6">{{ field.errors }}</span>
34
+ <span class="helptext is-size-7">{{ field.help_text|default_if_falsy:'' }}</span>
35
+ </div>
36
+ {% endpartialdef %}
37
+
39
38
  {% partialdef textarea %}
40
39
  <label class="label mt-2 mb-5">
41
40
  <span class="{% if field.field.required %}has-text-weight-normal{% endif %}">{{ field.label }}</span>
@@ -45,12 +44,6 @@
45
44
  {% endpartialdef %}
46
45
 
47
46
  {% partialdef model_field %}
48
- {# <label class="label mt-2 mb-5">#}
49
- {# <span class="field has-addons mb-0">#}
50
- {# <span class="control input has-text-weight-bold">{{ value|default_if_none:'' }}</span>#}
51
- {# </span>#}
52
- {# <span class="helptext">{{ label }}</span>#}
53
- {# </label>#}
54
47
  <div class="mb-5">
55
48
  <label class="label mb-0 {% if field.field.required %}has-text-weight-bold{% endif %}" for="{{ field.id_for_label }}">{{ label }}</label>
56
49
  <div class="field has-addons mb-0">
@@ -0,0 +1,14 @@
1
+ <div class="navbar-item is-unselectable has-text-weight-bold" style="{% if switch_url %}cursor: pointer;{% endif %}" x-on:click="showQuickSwitch = !showQuickSwitch;">
2
+ {{ tenant.name }}
3
+ </div>
4
+ {% if tenants and switch_url %}
5
+ <article class="box p-1" style="position: fixed; top: var(--bulma-navbar-height); left: 0; min-width: 150px; border-top-left-radius: 0; border-top-right-radius: 0;"
6
+ x-show="showQuickSwitch" x-cloak="" x-on:click.outside="showQuickSwitch = false"
7
+ >
8
+ <ul class="hoverable mr-1">
9
+ {% for t in tenants %}
10
+ <li class="navbar-item" style="cursor: pointer; border-radius: var(--bulma-radius);"><a href="{{ switch_url }}?tenant_id={{ t.pk }}" hx-boost="false" style="width: 100%; display: inline-block">{{ t.name }}</a></li>
11
+ {% endfor %}
12
+ </ul>
13
+ </article>
14
+ {% endif %}
@@ -163,13 +163,19 @@ def x_ref_save(param: str):
163
163
 
164
164
 
165
165
  @register.filter(name='wrap_form_field')
166
- def wrap_form_fields(field, icon=None):
166
+ def wrap_form_field(field, icon=None):
167
167
  if isinstance(field.field.widget, widgets.Textarea):
168
168
  html = render_to_string(
169
169
  'ui/templatetags/field.html#textarea',
170
170
  {'field': field, 'icon': None}
171
171
  )
172
172
  return mark_safe(html)
173
+ if isinstance(field.field.widget, widgets.CheckboxInput):
174
+ html = render_to_string(
175
+ 'ui/templatetags/field.html#form_checkbox',
176
+ {'field': field, 'icon': None}
177
+ )
178
+ return mark_safe(html)
173
179
  html = render_to_string(
174
180
  'ui/templatetags/field.html#form_field',
175
181
  {'field': field, 'icon': icon}
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.7 on 2025-10-08 18:11
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('user', '0010_alter_user_theme'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='user',
15
+ name='theme',
16
+ field=models.CharField(choices=[(None, [('preset', 'Preset'), ('light', 'Light'), ('dark', 'Dark'), ('custom', 'Custom')])], default='preset', max_length=50, verbose_name='Theme'),
17
+ ),
18
+ ]
@@ -181,10 +181,12 @@ class User(AbstractBaseUser, PermissionsMixin):
181
181
  verbose_name=_('Theme'),
182
182
  max_length=50,
183
183
  choices=[
184
- ('preset', _('Preset')),
185
- ('light', _('Light')),
186
- ('dark', _('Dark')),
187
- ('custom', _('Custom'))
184
+ (None, (
185
+ ('preset', _('Preset')),
186
+ ('light', _('Light')),
187
+ ('dark', _('Dark')),
188
+ ('custom', _('Custom'))
189
+ ))
188
190
  ],
189
191
  default='preset'
190
192
  )
@@ -1,6 +1,9 @@
1
1
  import json
2
2
  from django.db import connection
3
3
  from django.db.models import Model, Field
4
+ from django.forms import model_to_dict as mtd
5
+
6
+ from accrete.fields import TranslatedCharField, TranslatedTextField
4
7
 
5
8
 
6
9
  def get_related_model(model: type[Model], rel_path: str) -> tuple[Model, list[str]]:
@@ -43,3 +46,19 @@ def translated_db_value(instance: Model, field: str) -> dict:
43
46
  row = row and row[0]
44
47
  db_value = row and json.loads(row) or dict()
45
48
  return db_value
49
+
50
+
51
+ def model_to_dict(instance, fields=None, exclude=None, translated=True):
52
+ """
53
+ Extends django.forms.model_to_dict with the option to get the
54
+ translation dict instead of the translated string for the active language
55
+ """
56
+ data = mtd(instance, fields=fields, exclude=exclude)
57
+ if translated:
58
+ return data
59
+ updates = {}
60
+ for f, v in data.items():
61
+ if isinstance(instance._meta.get_field(f), (TranslatedCharField, TranslatedTextField)):
62
+ updates.update({f: translated_db_value(instance, f)})
63
+ data.update(updates)
64
+ return data
@@ -4,7 +4,7 @@ build-backend = 'hatchling.build'
4
4
 
5
5
  [project]
6
6
  name = 'accrete'
7
- version = '0.0.156'
7
+ version = '0.0.158'
8
8
  authors = [
9
9
  { name='Benedikt Jilek', email='benedikt.jilek@pm.me' },
10
10
  ]
@@ -1,11 +0,0 @@
1
- {% load i18n %}
2
-
3
- {% if form.non_field_errors or form.save_error %}
4
- <div class="notification is-danger is-light" style="word-wrap: break-word;">
5
- {{ form.non_field_errors }}
6
- {% if form.save_error %}
7
- <p>{{ form.save_error }}</p>
8
- {% if form.save_error_id %}<span>{% translate 'Error ID' %}: {{ form.save_error_id }}</span>{% endif %}
9
- {% endif %}
10
- </div>
11
- {% endif %}
@@ -1,14 +0,0 @@
1
- <div class="navbar-item is-unselectable has-text-weight-bold" style="{% if switch_url %}cursor: pointer;{% endif %}" x-on:click="showQuickSwitch = !showQuickSwitch;">
2
- {{ tenant.name }}
3
- </div>
4
- {% if tenants and switch_url %}
5
- <article class="p-1 has-text-weight-bold" style="background-color: var(--bulma-body-background-color); position: fixed; top: var(--bulma-navbar-height); left: 0; box-shadow: 2px 2px 5px; border-bottom-right-radius: var(--bulma-radius); min-width: 150px;"
6
- x-show="showQuickSwitch" x-cloak="" x-on:click.outside="showQuickSwitch = false"
7
- >
8
- <ul class="hoverable mr-1">
9
- {% for t in tenants %}
10
- <li class="title is-6 mb-1 p-2" style="cursor: pointer; border-radius: var(--bulma-radius);"><a href="{{ switch_url }}?tenant_id={{ t.pk }}" hx-boost="false" style="width: 100%; display: inline-block">{{ t.name }}</a></li>
11
- {% endfor %}
12
- </ul>
13
- </article>
14
- {% endif %}
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes