accrete 0.0.149__tar.gz → 0.0.151__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 (301) hide show
  1. {accrete-0.0.149 → accrete-0.0.151}/PKG-INFO +1 -1
  2. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/queries.py +3 -1
  3. accrete-0.0.151/accrete/contrib/ui/admin.py +11 -0
  4. accrete-0.0.151/accrete/contrib/ui/forms.py +57 -0
  5. accrete-0.0.151/accrete/contrib/ui/migrations/0001_initial.py +39 -0
  6. accrete-0.0.151/accrete/contrib/ui/migrations/0002_alter_theme_color_danger_alter_theme_color_link_and_more.py +38 -0
  7. accrete-0.0.151/accrete/contrib/ui/migrations/0003_alter_theme_check_user_or_tenant.py +21 -0
  8. accrete-0.0.151/accrete/contrib/ui/migrations/0004_theme_force_tenant_theme.py +18 -0
  9. accrete-0.0.151/accrete/contrib/ui/models.py +117 -0
  10. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/response.py +14 -5
  11. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/css/accrete.css +23 -57
  12. accrete-0.0.151/accrete/contrib/ui/static/css/accrete.css.map +7 -0
  13. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/css/accrete.scss +76 -55
  14. accrete-0.0.151/accrete/contrib/ui/templates/django/forms/widgets/input.html +1 -0
  15. accrete-0.0.151/accrete/contrib/ui/templates/ui/custom_theme.html +19 -0
  16. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/layout.html +9 -9
  17. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/list.html +2 -2
  18. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/message.html +2 -2
  19. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/modal.html +3 -3
  20. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/table.html +5 -5
  21. accrete-0.0.151/accrete/contrib/ui/templates/ui/templatetags/field.html +66 -0
  22. accrete-0.0.151/accrete/contrib/ui/templates/ui/widgets/date_weekday.html +10 -0
  23. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/widgets/model_search_select.html +4 -3
  24. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/widgets/model_search_select_multi.html +5 -4
  25. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templatetags/ui.py +37 -5
  26. accrete-0.0.151/accrete/contrib/ui/views.py +123 -0
  27. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/widgets/__init__.py +1 -0
  28. accrete-0.0.151/accrete/contrib/ui/widgets/date_weekday.py +6 -0
  29. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/widgets/search_select.py +2 -2
  30. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/forms.py +1 -1
  31. accrete-0.0.151/accrete/contrib/user/migrations/0009_alter_user_theme.py +18 -0
  32. accrete-0.0.151/accrete/contrib/user/migrations/0010_alter_user_theme.py +18 -0
  33. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/models.py +5 -3
  34. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/templates/user/login.html +3 -11
  35. accrete-0.0.151/accrete/contrib/user/templates/user/user_preferences.html +55 -0
  36. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/views.py +7 -2
  37. {accrete-0.0.149 → accrete-0.0.151}/accrete/fields.py +4 -2
  38. {accrete-0.0.149 → accrete-0.0.151}/accrete/managers.py +9 -0
  39. accrete-0.0.151/accrete/migrations/0009_alter_accessgroup_name.py +30 -0
  40. {accrete-0.0.149 → accrete-0.0.151}/accrete/models.py +6 -4
  41. {accrete-0.0.149 → accrete-0.0.151}/accrete/views.py +32 -20
  42. {accrete-0.0.149 → accrete-0.0.151}/pyproject.toml +1 -1
  43. accrete-0.0.149/accrete/contrib/ui/admin.py +0 -3
  44. accrete-0.0.149/accrete/contrib/ui/models.py +0 -3
  45. accrete-0.0.149/accrete/contrib/ui/static/css/accrete.css.map +0 -7
  46. accrete-0.0.149/accrete/contrib/ui/templates/django/forms/widgets/input.html +0 -1
  47. accrete-0.0.149/accrete/contrib/ui/templates/ui/templatetags/field.html +0 -27
  48. accrete-0.0.149/accrete/contrib/ui/views.py +0 -35
  49. accrete-0.0.149/accrete/contrib/user/templates/user/user_preferences.html +0 -43
  50. {accrete-0.0.149 → accrete-0.0.151}/.gitignore +0 -0
  51. {accrete-0.0.149 → accrete-0.0.151}/LICENSE +0 -0
  52. {accrete-0.0.149 → accrete-0.0.151}/README.md +0 -0
  53. {accrete-0.0.149 → accrete-0.0.151}/accrete/__init__.py +0 -0
  54. {accrete-0.0.149 → accrete-0.0.151}/accrete/admin.py +0 -0
  55. {accrete-0.0.149 → accrete-0.0.151}/accrete/apps.py +0 -0
  56. {accrete-0.0.149 → accrete-0.0.151}/accrete/config.py +0 -0
  57. {accrete-0.0.149 → accrete-0.0.151}/accrete/context_processors.py +0 -0
  58. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/__init__.py +0 -0
  59. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/__init__.py +0 -0
  60. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/admin.py +0 -0
  61. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/apps.py +0 -0
  62. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/migrations/0001_initial.py +0 -0
  63. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/migrations/0002_auto_20250219_1759.py +0 -0
  64. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/migrations/0003_alter_country_options.py +0 -0
  65. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/migrations/__init__.py +0 -0
  66. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/country/models.py +0 -0
  67. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/__init__.py +0 -0
  68. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/admin.py +0 -0
  69. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/apps.py +0 -0
  70. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/config.py +0 -0
  71. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/helper.py +0 -0
  72. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/migrations/0001_initial.py +0 -0
  73. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/migrations/0002_log_user_alter_log_new_value_type_and_more.py +0 -0
  74. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/migrations/0003_alter_log_tenant.py +0 -0
  75. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/migrations/0004_logconfig_logconfigfield.py +0 -0
  76. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/migrations/0005_logconfig_exclude_fields_and_more.py +0 -0
  77. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/migrations/__init__.py +0 -0
  78. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/models.py +0 -0
  79. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/signals.py +0 -0
  80. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/tests.py +0 -0
  81. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/log/views.py +0 -0
  82. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/__init__.py +0 -0
  83. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/admin.py +0 -0
  84. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/apps.py +0 -0
  85. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/forms.py +0 -0
  86. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/migrations/0001_initial.py +0 -0
  87. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/migrations/0002_alter_sequence_name.py +0 -0
  88. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/migrations/0003_alter_sequence_tenant.py +0 -0
  89. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/migrations/__init__.py +0 -0
  90. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/models.py +0 -0
  91. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/queries.py +0 -0
  92. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/tests.py +0 -0
  93. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/sequence/views.py +0 -0
  94. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/__init__.py +0 -0
  95. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/admin.py +0 -0
  96. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/apps.py +0 -0
  97. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/forms.py +0 -0
  98. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/migrations/0001_initial.py +0 -0
  99. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/migrations/__init__.py +0 -0
  100. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/models.py +0 -0
  101. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/tasks.py +0 -0
  102. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/tests.py +0 -0
  103. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/system_mail/views.py +0 -0
  104. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/__init__.py +0 -0
  105. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/apps.py +0 -0
  106. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/filter.py +0 -0
  107. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/middleware.py +0 -0
  108. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/migrations/__init__.py +0 -0
  109. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/LICENSE +0 -0
  110. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/README.md +0 -0
  111. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/bulma.scss +0 -0
  112. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/bulma.css +0 -0
  113. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/bulma.css.map +0 -0
  114. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/bulma.min.css +0 -0
  115. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css +0 -0
  116. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.css.map +0 -0
  117. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-dark-mode.min.css +0 -0
  118. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css +0 -0
  119. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.css.map +0 -0
  120. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers-prefixed.min.css +0 -0
  121. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css +0 -0
  122. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.css.map +0 -0
  123. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-no-helpers.min.css +0 -0
  124. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css +0 -0
  125. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.css.map +0 -0
  126. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/css/versions/bulma-prefixed.min.css +0 -0
  127. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/package.json +0 -0
  128. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/_index.scss +0 -0
  129. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/_index.scss +0 -0
  130. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/animations.scss +0 -0
  131. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/generic.scss +0 -0
  132. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/minireset.scss +0 -0
  133. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/base/skeleton.scss +0 -0
  134. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/_index.scss +0 -0
  135. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/breadcrumb.scss +0 -0
  136. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/card.scss +0 -0
  137. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/dropdown.scss +0 -0
  138. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/menu.scss +0 -0
  139. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/message.scss +0 -0
  140. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/modal.scss +0 -0
  141. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/navbar.scss +0 -0
  142. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/pagination.scss +0 -0
  143. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/panel.scss +0 -0
  144. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/components/tabs.scss +0 -0
  145. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/_index.scss +0 -0
  146. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/block.scss +0 -0
  147. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/box.scss +0 -0
  148. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/button.scss +0 -0
  149. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/content.scss +0 -0
  150. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/delete.scss +0 -0
  151. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/icon.scss +0 -0
  152. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/image.scss +0 -0
  153. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/loader.scss +0 -0
  154. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/notification.scss +0 -0
  155. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/progress.scss +0 -0
  156. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/table.scss +0 -0
  157. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/tag.scss +0 -0
  158. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/elements/title.scss +0 -0
  159. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/_index.scss +0 -0
  160. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/checkbox-radio.scss +0 -0
  161. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/file.scss +0 -0
  162. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/input-textarea.scss +0 -0
  163. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/select.scss +0 -0
  164. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/shared.scss +0 -0
  165. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/form/tools.scss +0 -0
  166. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/grid/_index.scss +0 -0
  167. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/grid/columns.scss +0 -0
  168. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/grid/grid.scss +0 -0
  169. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/_index.scss +0 -0
  170. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/aspect-ratio.scss +0 -0
  171. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/border.scss +0 -0
  172. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/color.scss +0 -0
  173. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/flexbox.scss +0 -0
  174. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/float.scss +0 -0
  175. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/gap.scss +0 -0
  176. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/other.scss +0 -0
  177. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/overflow.scss +0 -0
  178. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/position.scss +0 -0
  179. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/spacing.scss +0 -0
  180. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/typography.scss +0 -0
  181. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/helpers/visibility.scss +0 -0
  182. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/_index.scss +0 -0
  183. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/container.scss +0 -0
  184. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/footer.scss +0 -0
  185. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/hero.scss +0 -0
  186. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/level.scss +0 -0
  187. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/media.scss +0 -0
  188. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/layout/section.scss +0 -0
  189. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/_index.scss +0 -0
  190. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/dark.scss +0 -0
  191. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/light.scss +0 -0
  192. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/themes/setup.scss +0 -0
  193. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/_index.scss +0 -0
  194. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/controls.scss +0 -0
  195. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/css-variables.scss +0 -0
  196. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/derived-variables.scss +0 -0
  197. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/extends.scss +0 -0
  198. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/functions.scss +0 -0
  199. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.scss +0 -0
  200. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/sass/utilities/mixins.scss +0 -0
  201. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-no-dark-mode.scss +0 -0
  202. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers-prefixed.scss +0 -0
  203. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-no-helpers.scss +0 -0
  204. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/bulma/versions/bulma-prefixed.scss +0 -0
  205. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/css/fa.css +0 -0
  206. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/css/icons.css +0 -0
  207. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/icons/Logo.svg +0 -0
  208. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/icons/accrete.svg +0 -0
  209. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/js/alpine-3.14.9.js +0 -0
  210. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/js/alpine-focus-3.14.9.js +0 -0
  211. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/js/alpine-sort-3.14.9.js +0 -0
  212. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/js/filter.js +0 -0
  213. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/js/htmx.min.js +0 -0
  214. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-brands-400.ttf +0 -0
  215. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-brands-400.woff2 +0 -0
  216. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-regular-400.ttf +0 -0
  217. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-regular-400.woff2 +0 -0
  218. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-solid-900.ttf +0 -0
  219. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-solid-900.woff2 +0 -0
  220. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.ttf +0 -0
  221. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/static/webfonts/fa-v4compatibility.woff2 +0 -0
  222. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/attrs.html +0 -0
  223. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/date.html +0 -0
  224. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/email.html +0 -0
  225. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/file.html +0 -0
  226. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/select.html +0 -0
  227. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/text.html +0 -0
  228. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/django/forms/widgets/textarea.html +0 -0
  229. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/content.html +0 -0
  230. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/content_right.html +0 -0
  231. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/detail.html +0 -0
  232. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/favicon.html +0 -0
  233. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/filter.html +0 -0
  234. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_input.html +0 -0
  235. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_operator.html +0 -0
  236. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_params.html +0 -0
  237. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/filter/query_tags.html +0 -0
  238. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/form_error.html +0 -0
  239. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/list_update.html +0 -0
  240. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/oob.html +0 -0
  241. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/table_row_update.html +0 -0
  242. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templates/ui/widgets/model_search_select_options.html +0 -0
  243. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/templatetags/__init__.py +0 -0
  244. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/tests.py +0 -0
  245. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/ui/urls.py +0 -0
  246. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/__init__.py +0 -0
  247. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/admin.py +0 -0
  248. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/apps.py +0 -0
  249. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/auth_backends.py +0 -0
  250. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/locale/de/LC_MESSAGES/django.mo +0 -0
  251. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/locale/de/LC_MESSAGES/django.po +0 -0
  252. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/middleware.py +0 -0
  253. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0001_initial.py +0 -0
  254. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0002_user_theme.py +0 -0
  255. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0003_alter_user_email.py +0 -0
  256. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0004_user_login_alter_user_email_user_email_or_login_set.py +0 -0
  257. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0005_remove_user_email_or_login_set_and_more.py +0 -0
  258. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0006_remove_user_email_or_login_set_user_is_managed_and_more.py +0 -0
  259. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0007_user_managed_login.py +0 -0
  260. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/0008_remove_user_no_email_for_managed_user_and_more.py +0 -0
  261. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/migrations/__init__.py +0 -0
  262. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html +0 -0
  263. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/templates/user/change_email.html +0 -0
  264. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/templates/user/change_password.html +0 -0
  265. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/templates/user/password_forgotten.html +0 -0
  266. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/tests.py +0 -0
  267. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user/urls.py +0 -0
  268. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/__init__.py +0 -0
  269. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/admin.py +0 -0
  270. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/apps.py +0 -0
  271. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/config.py +0 -0
  272. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/forms.py +0 -0
  273. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/migrations/0001_initial.py +0 -0
  274. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/migrations/__init__.py +0 -0
  275. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/models.py +0 -0
  276. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/templates/user_registration/mail_templates/confirmation_mail.html +0 -0
  277. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/templates/user_registration/registration.html +0 -0
  278. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/tests.py +0 -0
  279. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/urls.py +0 -0
  280. {accrete-0.0.149 → accrete-0.0.151}/accrete/contrib/user_registration/views.py +0 -0
  281. {accrete-0.0.149 → accrete-0.0.151}/accrete/forms.py +0 -0
  282. {accrete-0.0.149 → accrete-0.0.151}/accrete/middleware.py +0 -0
  283. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0001_initial.py +0 -0
  284. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0002_initial.py +0 -0
  285. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0003_remove_member_name.py +0 -0
  286. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0004_rename_accessgroupmember_memberaccessgrouprel_and_more.py +0 -0
  287. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0005_accessgroup_apply_on_alter_member_access_groups_and_more.py +0 -0
  288. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0006_alter_member_user.py +0 -0
  289. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0007_accessgroup_description.py +0 -0
  290. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/0008_alter_member_access_groups_and_more.py +0 -0
  291. {accrete-0.0.149 → accrete-0.0.151}/accrete/migrations/__init__.py +0 -0
  292. {accrete-0.0.149 → accrete-0.0.151}/accrete/storage.py +0 -0
  293. {accrete-0.0.149 → accrete-0.0.151}/accrete/tenant.py +0 -0
  294. {accrete-0.0.149 → accrete-0.0.151}/accrete/tests.py +0 -0
  295. {accrete-0.0.149 → accrete-0.0.151}/accrete/urls.py +0 -0
  296. {accrete-0.0.149 → accrete-0.0.151}/accrete/utils/__init__.py +0 -0
  297. {accrete-0.0.149 → accrete-0.0.151}/accrete/utils/dates.py +0 -0
  298. {accrete-0.0.149 → accrete-0.0.151}/accrete/utils/forms.py +0 -0
  299. {accrete-0.0.149 → accrete-0.0.151}/accrete/utils/log.py +0 -0
  300. {accrete-0.0.149 → accrete-0.0.151}/accrete/utils/models.py +0 -0
  301. {accrete-0.0.149 → accrete-0.0.151}/accrete/utils/views.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: accrete
3
- Version: 0.0.149
3
+ Version: 0.0.151
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,10 @@
1
+ from django.db.models.query import RawQuerySet
2
+
1
3
  from .models import Log
2
4
  from accrete.tenant import get_tenant
3
5
 
4
6
 
5
- def current_log_state(model: str, object_id: int):
7
+ def current_log_state(model: str, object_id: int) -> RawQuerySet:
6
8
  tenant = get_tenant()
7
9
  tenant_id = tenant and tenant.id or None
8
10
  logs = Log.objects.raw("""
@@ -0,0 +1,11 @@
1
+ from django.contrib import admin
2
+ from .models import Theme
3
+
4
+
5
+ class ThemeAdmin(admin.ModelAdmin):
6
+ model = Theme
7
+ list_display = ('pk', 'user', 'tenant')
8
+ search_fields = ('pk', 'user', 'tenant')
9
+
10
+
11
+ admin.site.register(Theme, ThemeAdmin)
@@ -0,0 +1,57 @@
1
+ from django import forms
2
+ from django.db.models import Q
3
+ from django.utils.translation import gettext_lazy as _
4
+ from . models import Theme
5
+
6
+
7
+ class ThemeForm(forms.ModelForm):
8
+
9
+ class Meta:
10
+ model = Theme
11
+ fields = [
12
+ 'user',
13
+ 'tenant',
14
+ 'color_primary',
15
+ 'color_success',
16
+ 'color_link',
17
+ 'color_warning',
18
+ 'color_danger'
19
+ ]
20
+ widgets = {
21
+ 'color_primary': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
22
+ 'color_success': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
23
+ 'color_link': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
24
+ 'color_warning': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
25
+ 'color_danger': forms.widgets.TextInput(attrs={'type': 'color', 'autocomplete': 'off'}),
26
+ 'user': forms.widgets.HiddenInput(),
27
+ 'tenant': forms.widgets.HiddenInput()
28
+ }
29
+
30
+ def _clean_color(self, hex_color: str):
31
+ if not hex_color.startswith('#'):
32
+ hex_color = f'#{hex_color}'
33
+ if len(hex_color) != 7:
34
+ raise forms.ValidationError(_(
35
+ 'Color must be of length 7 and including the starting "#"'
36
+ ))
37
+ return hex_color
38
+
39
+ def clean_color_primary(self):
40
+ color = self._clean_color(self.cleaned_data.get('color_primary'))
41
+ return color
42
+
43
+ def clean_color_success(self):
44
+ color = self._clean_color(self.cleaned_data.get('color_success'))
45
+ return color
46
+
47
+ def clean_color_link(self):
48
+ color = self._clean_color(self.cleaned_data.get('color_link'))
49
+ return color
50
+
51
+ def clean_color_warning(self):
52
+ color = self._clean_color(self.cleaned_data.get('color_warning'))
53
+ return color
54
+
55
+ def clean_color_danger(self):
56
+ color = self._clean_color(self.cleaned_data.get('color_danger'))
57
+ return color
@@ -0,0 +1,39 @@
1
+ # Generated by Django 5.2.1 on 2025-08-07 16:18
2
+
3
+ import django.db.models.deletion
4
+ from django.conf import settings
5
+ from django.db import migrations, models
6
+
7
+
8
+ class Migration(migrations.Migration):
9
+
10
+ initial = True
11
+
12
+ dependencies = [
13
+ ('accrete', '0009_alter_accessgroup_name'),
14
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
15
+ ]
16
+
17
+ operations = [
18
+ migrations.CreateModel(
19
+ name='Theme',
20
+ fields=[
21
+ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
22
+ ('color_primary', models.CharField(max_length=7, verbose_name='Primary Color')),
23
+ ('color_success', models.CharField(max_length=7, verbose_name='Success Color')),
24
+ ('color_link', models.CharField(max_length=7, verbose_name='Link Color')),
25
+ ('color_warning', models.CharField(max_length=7, verbose_name='Warning Color')),
26
+ ('color_danger', models.CharField(max_length=7, verbose_name='Danger Color')),
27
+ ('theme_markup', models.TextField(blank=True, null=True, verbose_name='Theme Markup')),
28
+ ('tenant', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='tenant_themes', to='accrete.tenant', verbose_name='Tenant')),
29
+ ('user', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, related_name='user_themes', to=settings.AUTH_USER_MODEL, verbose_name='User')),
30
+ ],
31
+ options={
32
+ 'verbose_name': 'Theme',
33
+ 'verbose_name_plural': 'Themes',
34
+ 'db_table': 'accrete_theme',
35
+ 'ordering': ['pk'],
36
+ 'constraints': [models.CheckConstraint(condition=models.Q(('user__isnull', True), ('tenant__isnull', True), _connector='XOR'), name='check_user_or_tenant', violation_error_message='')],
37
+ },
38
+ ),
39
+ ]
@@ -0,0 +1,38 @@
1
+ # Generated by Django 5.2.1 on 2025-08-07 17:11
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('ui', '0001_initial'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AlterField(
14
+ model_name='theme',
15
+ name='color_danger',
16
+ field=models.CharField(default='#FF6584', max_length=7, verbose_name='Danger Color'),
17
+ ),
18
+ migrations.AlterField(
19
+ model_name='theme',
20
+ name='color_link',
21
+ field=models.CharField(default='#65D0FE', max_length=7, verbose_name='Link Color'),
22
+ ),
23
+ migrations.AlterField(
24
+ model_name='theme',
25
+ name='color_primary',
26
+ field=models.CharField(default='#46C68D', max_length=7, verbose_name='Primary Color'),
27
+ ),
28
+ migrations.AlterField(
29
+ model_name='theme',
30
+ name='color_success',
31
+ field=models.CharField(default='#46C68D', max_length=7, verbose_name='Success Color'),
32
+ ),
33
+ migrations.AlterField(
34
+ model_name='theme',
35
+ name='color_warning',
36
+ field=models.CharField(default='#FEB600', max_length=7, verbose_name='Warning Color'),
37
+ ),
38
+ ]
@@ -0,0 +1,21 @@
1
+ # Generated by Django 5.2.1 on 2025-08-08 06:13
2
+
3
+ from django.conf import settings
4
+ from django.db import migrations, models
5
+
6
+
7
+ class Migration(migrations.Migration):
8
+
9
+ dependencies = [
10
+ ('accrete', '0009_alter_accessgroup_name'),
11
+ ('ui', '0002_alter_theme_color_danger_alter_theme_color_link_and_more'),
12
+ migrations.swappable_dependency(settings.AUTH_USER_MODEL),
13
+ ]
14
+
15
+ operations = [
16
+ migrations.AlterConstraint(
17
+ model_name='theme',
18
+ name='check_user_or_tenant',
19
+ constraint=models.CheckConstraint(condition=models.Q(('user__isnull', True), ('tenant__isnull', True), _connector='XOR'), name='check_user_or_tenant', violation_error_message='A theme must be assigned either to a user or a tenant.'),
20
+ ),
21
+ ]
@@ -0,0 +1,18 @@
1
+ # Generated by Django 5.2.1 on 2025-08-08 06:27
2
+
3
+ from django.db import migrations, models
4
+
5
+
6
+ class Migration(migrations.Migration):
7
+
8
+ dependencies = [
9
+ ('ui', '0003_alter_theme_check_user_or_tenant'),
10
+ ]
11
+
12
+ operations = [
13
+ migrations.AddField(
14
+ model_name='theme',
15
+ name='force_tenant_theme',
16
+ field=models.BooleanField(default=False, help_text='Apply this theme regardless of user preferences', verbose_name='Force Tenant Theme'),
17
+ ),
18
+ ]
@@ -0,0 +1,117 @@
1
+ import colorsys
2
+
3
+ from django.conf import settings
4
+ from django.db import models
5
+ from django.utils.translation import gettext_lazy as _
6
+ from django.template.loader import render_to_string
7
+
8
+
9
+ class Theme(models.Model):
10
+
11
+ class Meta:
12
+ verbose_name = _('Theme')
13
+ verbose_name_plural = _('Themes')
14
+ db_table = 'accrete_theme'
15
+ ordering = ['pk']
16
+ constraints = [
17
+ models.CheckConstraint(
18
+ name='check_user_or_tenant',
19
+ violation_error_message=_(
20
+ 'A theme must be assigned either to a user or a tenant.'
21
+ ),
22
+ condition=(
23
+ models.Q(user__isnull=True) ^ models.Q(tenant__isnull=True)
24
+ )
25
+ )
26
+ ]
27
+
28
+ user = models.ForeignKey(
29
+ verbose_name=_('User'),
30
+ to=settings.AUTH_USER_MODEL,
31
+ on_delete=models.CASCADE,
32
+ related_name='user_themes',
33
+ null=True,
34
+ blank=True
35
+ )
36
+
37
+ tenant = models.ForeignKey(
38
+ verbose_name=_('Tenant'),
39
+ to='accrete.Tenant',
40
+ on_delete=models.CASCADE,
41
+ related_name='tenant_themes',
42
+ null=True,
43
+ blank=True
44
+ )
45
+
46
+ force_tenant_theme = models.BooleanField(
47
+ verbose_name=_('Force Tenant Theme'),
48
+ default=False,
49
+ help_text=_('Apply this theme regardless of user preferences')
50
+ )
51
+
52
+ color_primary = models.CharField(
53
+ verbose_name=_('Primary Color'),
54
+ max_length=7,
55
+ default='#46C68D'
56
+ )
57
+
58
+ color_success = models.CharField(
59
+ verbose_name=_('Success Color'),
60
+ max_length=7,
61
+ default='#46C68D'
62
+ )
63
+
64
+ color_link = models.CharField(
65
+ verbose_name=_('Link Color'),
66
+ max_length=7,
67
+ default='#65D0FE'
68
+ )
69
+
70
+ color_warning = models.CharField(
71
+ verbose_name=_('Warning Color'),
72
+ max_length=7,
73
+ default='#FEB600'
74
+ )
75
+
76
+ color_danger = models.CharField(
77
+ verbose_name=_('Danger Color'),
78
+ max_length=7,
79
+ default='#FF6584'
80
+ )
81
+
82
+ theme_markup = models.TextField(
83
+ verbose_name=_('Theme Markup'),
84
+ null=True,
85
+ blank=True
86
+ )
87
+
88
+ def generate_markup(self) -> str:
89
+ def hex_to_hsl(hex_color: str) -> dict:
90
+ hex_color = hex_color.removeprefix('#')
91
+ rgb = tuple(int(hex_color[i:i+2], 16) for i in (0, 2, 4))
92
+ rgb = [x/255.0 for x in rgb]
93
+ h, l, s = colorsys.rgb_to_hls(*rgb)
94
+
95
+ return {
96
+ 'h': round(h * 360),
97
+ 's': round(s * 100),
98
+ 'l': round(l * 100)
99
+ }
100
+ ctx = {
101
+ 'primary': hex_to_hsl(self.color_primary),
102
+ 'success': hex_to_hsl(self.color_success),
103
+ 'link': hex_to_hsl(self.color_link),
104
+ 'warning': hex_to_hsl(self.color_warning),
105
+ 'danger': hex_to_hsl(self.color_danger)
106
+ }
107
+ return render_to_string('ui/custom_theme.html', ctx)
108
+
109
+ def save(
110
+ self,
111
+ force_insert=False,
112
+ force_update=False,
113
+ using=None,
114
+ update_fields=None,
115
+ ):
116
+ self.theme_markup = self.generate_markup()
117
+ super().save(force_insert, force_update, using, update_fields)
@@ -8,6 +8,7 @@ from django.db.models import Model
8
8
  from django.http import HttpResponse
9
9
  from django.template.loader import render_to_string
10
10
  from django.utils.translation import gettext_lazy as _
11
+ from django.utils.functional import Promise
11
12
  from accrete.contrib.ui import Filter
12
13
 
13
14
 
@@ -121,7 +122,8 @@ class ListResponse(WindowResponse):
121
122
  column_height: str = '150px',
122
123
  overview_template: str = 'ui/list.html',
123
124
  detail_header_template: str = None,
124
- detail_data_template: str = None
125
+ detail_data_template: str = None,
126
+ detail_enabled: bool = True
125
127
  ):
126
128
  assert page is not None or ui_filter is not None, _(
127
129
  'Argument page or ui_filter must be supplied'
@@ -141,6 +143,7 @@ class ListResponse(WindowResponse):
141
143
  self.column_height = column_height
142
144
  self.detail_header_template = detail_header_template
143
145
  self.detail_data_template = detail_data_template
146
+ self.detail_enabled = detail_enabled
144
147
 
145
148
  def _has_panel(self):
146
149
  return bool(self.panel_template or self.ui_filter)
@@ -154,6 +157,7 @@ class ListResponse(WindowResponse):
154
157
  'endless_scroll': self.endless_scroll,
155
158
  'column_count': self.column_count,
156
159
  'column_height': self.column_height,
160
+ 'detail_enabled': self.detail_enabled,
157
161
  'detail_header_template': self.detail_header_template,
158
162
  'detail_data_template': self.detail_data_template,
159
163
  'show_content_right': str(bool(
@@ -215,10 +219,10 @@ class TableResponse(WindowResponse):
215
219
 
216
220
  def __init__(
217
221
  self, *,
218
- title: str,
222
+ title: str | Promise,
219
223
  context: dict,
220
- instance_label: str,
221
224
  fields: list[str],
225
+ instance_label: str | Promise | None = None,
222
226
  footer: dict = None,
223
227
  page: paginator.Page = None,
224
228
  ui_filter: Filter = None,
@@ -280,12 +284,14 @@ class TableRowResponse(Response):
280
284
  self, *,
281
285
  instance: Model,
282
286
  fields: list[str],
287
+ instance_label: str | Promise | None = None,
283
288
  footer: dict = None,
284
289
  page: paginator.Page = None,
285
290
  ):
286
291
  super().__init__(template=self.base_template, context={})
287
292
  self.instance = instance
288
293
  self.fields = fields
294
+ self.instance_label = instance_label
289
295
  self.footer = footer
290
296
  self.page = page
291
297
 
@@ -294,6 +300,7 @@ class TableRowResponse(Response):
294
300
  context.update({
295
301
  'instance': self.instance,
296
302
  'fields': self.fields,
303
+ 'instance_label': self.instance_label,
297
304
  'footer': self.footer,
298
305
  'page': self.page
299
306
  })
@@ -346,7 +353,7 @@ class ModalResponse(Response):
346
353
  modal_id: str,
347
354
  template: str,
348
355
  context: dict,
349
- title: str = None,
356
+ title: str | Promise = None,
350
357
  is_update: bool = False,
351
358
  is_blocking: bool = False,
352
359
  modal_width: str = None
@@ -424,7 +431,7 @@ def add_trigger(
424
431
  return response
425
432
 
426
433
 
427
- def update(request, ui_responses: list[Response]) -> HttpResponse:
434
+ def update(request, ui_responses: list[Response], trigger: list[ClientTrigger] = None) -> HttpResponse:
428
435
  response = HttpResponse()
429
436
  content = ''
430
437
  for res in ui_responses:
@@ -432,4 +439,6 @@ def update(request, ui_responses: list[Response]) -> HttpResponse:
432
439
  res.add_trigger(response)
433
440
  content += render_to_string('ui/message.html', request=request)
434
441
  response.content = content
442
+ for t in trigger or []:
443
+ add_trigger(response, t.trigger, t.header)
435
444
  return response
@@ -1,30 +1,18 @@
1
- @import url(../bulma/css/bulma.css);
1
+ @import url(../bulma/css/bulma.min.css);
2
2
  :root {
3
3
  --bulma-body-size: .9em;
4
4
  --bulma-navbar-height: 40px;
5
- --bulma-menu-item-selected-h: --bulma-success-h;
6
- --accrete-detail-width: 500px;
5
+ --bulma-menu-item-selected-h: var(--bulma-primary-h);
6
+ --accrete-detail-width: 35em;
7
+ --bulma-primary-h: 153.28deg;
8
+ --bulma-primary-s: 52.89%;
9
+ --bulma-primary-l: 52.55%;
7
10
  --accrete-action-panel-width: 320px;
8
- --bulma-input-icon-focus-color: var(--bulma-success);
9
- --bulma-input-arrow: var(--bulma-success);
10
- --bulma-arrow-color: var(--bulma-success);
11
- --bulma-menu-nested-list-margin: .5em 0 0.5em 0.75em;
12
- --bulma-navbar-burger-color: var(--bulma-success);
13
- --accrete-hover-color: #F0F2F4; }
14
-
15
- html[data-theme='light'] {
16
- --bulma-menu-item-h: var(--bulma-success-h);
17
- --bulma-menu-item-s: var(--bulma-success-s);
18
- --bulma-menu-item-l: var(--bulma-success-l);
19
- --bulma-menu-item-background-l: 50%;
20
- --bulma-menu-item-color-l: 10%;
21
- --bulma-navbar-burger-color: var(--bulma-success);
22
- --bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
11
+ --bulma-input-arrow: var(--bulma-primary);
12
+ --bulma-arrow-color: var(--bulma-primary);
23
13
  --accrete-hover-color: #F0F2F4; }
24
14
 
25
15
  html[data-theme='dark'] {
26
- --bulma-navbar-burger-color: var(--bulma-success);
27
- --bulma-input-disabled-border-color: var(--bulma-input-border-color) !important;
28
16
  --accrete-hover-color: #1E2128; }
29
17
  html[data-theme='dark'] .button.is-light {
30
18
  --bulma-button-h: var(--bulma-dark-h);
@@ -61,20 +49,9 @@ a {
61
49
  border-bottom-color: transparent;
62
50
  border-left-color: transparent; }
63
51
 
64
- .input {
65
- border-top: none;
66
- border-right: none;
67
- border-left: none;
68
- border-top-left-radius: 0;
69
- border-top-right-radius: 0;
70
- border-bottom-right-radius: 0;
71
- border-bottom-left-radius: 0;
72
- box-shadow: none;
73
- font-weight: bold; }
74
-
75
52
  .input:focus, .input:focus-within {
76
53
  box-shadow: none;
77
- border-bottom: 1px solid var(--bulma-success); }
54
+ border: 1px solid var(--bulma-primary); }
78
55
 
79
56
  input[disabled] {
80
57
  background-color: transparent !important;
@@ -87,32 +64,21 @@ textarea {
87
64
  box-shadow: none !important; }
88
65
 
89
66
  textarea:focus {
90
- border-color: var(--bulma-success) !important; }
67
+ border-color: var(--bulma-primary) !important; }
91
68
 
92
69
  .is-small.textarea, .is-small.input {
93
70
  border-radius: 0;
94
71
  font-size: var(--bulma-size-small); }
95
72
 
96
73
  td > .input, td * .input, td * select, td * .select {
97
- border-top: none !important;
98
- border-right: none !important;
99
- border-bottom: none !important;
100
- border-left: none !important; }
101
-
102
- td:has(.input:focus) {
103
- border-bottom: 1px solid var(--bulma-success) !important; }
74
+ border-radius: 0; }
104
75
 
105
76
  select {
106
- border-top: transparent !important;
107
- border-right: transparent !important;
108
- border-left: transparent !important;
109
- border-radius: 0 !important;
110
- box-shadow: none !important;
111
- font-weight: bold; }
77
+ box-shadow: none !important; }
112
78
 
113
79
  select:focus {
114
80
  box-shadow: none;
115
- border-bottom: 1px solid var(--bulma-success) !important; }
81
+ border: 1px solid var(--bulma-primary) !important; }
116
82
 
117
83
  #detail-container {
118
84
  flex-shrink: 0;
@@ -157,7 +123,7 @@ select:focus {
157
123
  max-width: calc(var(--accrete-detail-width) - 6%); }
158
124
 
159
125
  .list-entry > .box:hover, .box.selected {
160
- box-shadow: 0 0 5px 2px var(--bulma-success); }
126
+ box-shadow: 0 0 5px 2px var(--bulma-primary); }
161
127
 
162
128
  .helptext {
163
129
  font-style: italic !important;
@@ -190,11 +156,11 @@ select:focus {
190
156
  table.can-compact * tr:first-child {
191
157
  border-top: 1px solid var(--bulma-grey-light); }
192
158
 
193
- table.can-compact * tr.is-success {
194
- background-color: var(--bulma-success); }
159
+ table.can-compact * tr.is-primary {
160
+ background-color: var(--bulma-primary); }
195
161
 
196
- table.can-compact * tr.is-success:hover {
197
- background-color: var(--bulma-success) !important; }
162
+ table.can-compact * tr.is-primary:hover {
163
+ background-color: var(--bulma-primary) !important; }
198
164
 
199
165
  table.can-compact > thead {
200
166
  display: none; }
@@ -239,11 +205,11 @@ select:focus {
239
205
  z-index: 40;
240
206
  box-shadow: 2px 0 20px 0 var(--bulma-grey-light); } }
241
207
  .menu-list a.is-active, .menu-list a.is-selected, .menu-list button.is-active, .menu-list button.is-selected, .menu-list .menu-item.is-active, .menu-list .menu-item.is-selected {
242
- --bulma-menu-item-h: var(--bulma-success-h);
243
- --bulma-menu-item-s: var(--bulma-success-s);
244
- --bulma-menu-item-l: var(--bulma-success-l);
245
- --bulma-menu-item-background-l: var(--bulma-success-l);
246
- --bulma-menu-item-color-l: var(--bulma-success-invert-l); }
208
+ --bulma-menu-item-h: var(--bulma-primary-h);
209
+ --bulma-menu-item-s: var(--bulma-primary-s);
210
+ --bulma-menu-item-l: var(--bulma-primary-l);
211
+ --bulma-menu-item-background-l: var(--bulma-primary-l);
212
+ --bulma-menu-item-color-l: var(--bulma-primary-invert-l); }
247
213
 
248
214
  .hoverable *:hover {
249
215
  background-color: var(--accrete-hover-color); }
@@ -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
+ }