obox-builder 1.0.2__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 (250) hide show
  1. obox_builder-1.0.2/.gitignore +32 -0
  2. obox_builder-1.0.2/LICENSE +21 -0
  3. obox_builder-1.0.2/PKG-INFO +182 -0
  4. obox_builder-1.0.2/README.md +136 -0
  5. obox_builder-1.0.2/obox_builder/__init__.py +155 -0
  6. obox_builder-1.0.2/obox_builder/actions.py +425 -0
  7. obox_builder-1.0.2/obox_builder/auth/__init__.py +20 -0
  8. obox_builder-1.0.2/obox_builder/auth/base.py +195 -0
  9. obox_builder-1.0.2/obox_builder/auth/oauth.py +146 -0
  10. obox_builder-1.0.2/obox_builder/auth/password.py +193 -0
  11. obox_builder-1.0.2/obox_builder/base.py +2527 -0
  12. obox_builder-1.0.2/obox_builder/contrib/__init__.py +0 -0
  13. obox_builder-1.0.2/obox_builder/contrib/beanie/__init__.py +9 -0
  14. obox_builder-1.0.2/obox_builder/contrib/beanie/admin.py +5 -0
  15. obox_builder-1.0.2/obox_builder/contrib/beanie/converters.py +232 -0
  16. obox_builder-1.0.2/obox_builder/contrib/beanie/fields.py +15 -0
  17. obox_builder-1.0.2/obox_builder/contrib/beanie/filters.py +559 -0
  18. obox_builder-1.0.2/obox_builder/contrib/beanie/helpers.py +186 -0
  19. obox_builder-1.0.2/obox_builder/contrib/beanie/view.py +480 -0
  20. obox_builder-1.0.2/obox_builder/contrib/mongoengine/__init__.py +9 -0
  21. obox_builder-1.0.2/obox_builder/contrib/mongoengine/admin.py +49 -0
  22. obox_builder-1.0.2/obox_builder/contrib/mongoengine/converters.py +282 -0
  23. obox_builder-1.0.2/obox_builder/contrib/mongoengine/exceptions.py +5 -0
  24. obox_builder-1.0.2/obox_builder/contrib/mongoengine/fields.py +87 -0
  25. obox_builder-1.0.2/obox_builder/contrib/mongoengine/filters.py +542 -0
  26. obox_builder-1.0.2/obox_builder/contrib/mongoengine/helpers.py +105 -0
  27. obox_builder-1.0.2/obox_builder/contrib/mongoengine/view.py +587 -0
  28. obox_builder-1.0.2/obox_builder/contrib/sqla/__init__.py +9 -0
  29. obox_builder-1.0.2/obox_builder/contrib/sqla/admin.py +146 -0
  30. obox_builder-1.0.2/obox_builder/contrib/sqla/converters.py +535 -0
  31. obox_builder-1.0.2/obox_builder/contrib/sqla/exceptions.py +17 -0
  32. obox_builder-1.0.2/obox_builder/contrib/sqla/ext/__init__.py +0 -0
  33. obox_builder-1.0.2/obox_builder/contrib/sqla/ext/pydantic.py +63 -0
  34. obox_builder-1.0.2/obox_builder/contrib/sqla/fields.py +106 -0
  35. obox_builder-1.0.2/obox_builder/contrib/sqla/filters.py +451 -0
  36. obox_builder-1.0.2/obox_builder/contrib/sqla/helpers.py +80 -0
  37. obox_builder-1.0.2/obox_builder/contrib/sqla/middleware.py +154 -0
  38. obox_builder-1.0.2/obox_builder/contrib/sqla/types.py +7 -0
  39. obox_builder-1.0.2/obox_builder/contrib/sqla/view.py +1034 -0
  40. obox_builder-1.0.2/obox_builder/contrib/sqlmodel/__init__.py +9 -0
  41. obox_builder-1.0.2/obox_builder/contrib/sqlmodel/admin.py +5 -0
  42. obox_builder-1.0.2/obox_builder/contrib/sqlmodel/view.py +136 -0
  43. obox_builder-1.0.2/obox_builder/contrib/tortoise/__init__.py +9 -0
  44. obox_builder-1.0.2/obox_builder/contrib/tortoise/admin.py +5 -0
  45. obox_builder-1.0.2/obox_builder/contrib/tortoise/converters.py +208 -0
  46. obox_builder-1.0.2/obox_builder/contrib/tortoise/exceptions.py +9 -0
  47. obox_builder-1.0.2/obox_builder/contrib/tortoise/fields.py +12 -0
  48. obox_builder-1.0.2/obox_builder/contrib/tortoise/filters.py +494 -0
  49. obox_builder-1.0.2/obox_builder/contrib/tortoise/helpers.py +54 -0
  50. obox_builder-1.0.2/obox_builder/contrib/tortoise/view.py +538 -0
  51. obox_builder-1.0.2/obox_builder/converters.py +268 -0
  52. obox_builder-1.0.2/obox_builder/cookies.py +47 -0
  53. obox_builder-1.0.2/obox_builder/events.py +455 -0
  54. obox_builder-1.0.2/obox_builder/exceptions.py +47 -0
  55. obox_builder-1.0.2/obox_builder/export/__init__.py +108 -0
  56. obox_builder-1.0.2/obox_builder/export/base.py +491 -0
  57. obox_builder-1.0.2/obox_builder/export/csv.py +65 -0
  58. obox_builder-1.0.2/obox_builder/export/helpers.py +107 -0
  59. obox_builder-1.0.2/obox_builder/export/json.py +26 -0
  60. obox_builder-1.0.2/obox_builder/export/pdf.py +111 -0
  61. obox_builder-1.0.2/obox_builder/export/tablib.py +89 -0
  62. obox_builder-1.0.2/obox_builder/fields.py +2768 -0
  63. obox_builder-1.0.2/obox_builder/filters/__init__.py +35 -0
  64. obox_builder-1.0.2/obox_builder/filters/array.py +67 -0
  65. obox_builder-1.0.2/obox_builder/filters/base.py +166 -0
  66. obox_builder-1.0.2/obox_builder/filters/boolean.py +22 -0
  67. obox_builder-1.0.2/obox_builder/filters/date.py +136 -0
  68. obox_builder-1.0.2/obox_builder/filters/enum.py +49 -0
  69. obox_builder-1.0.2/obox_builder/filters/generic.py +42 -0
  70. obox_builder-1.0.2/obox_builder/filters/numeric.py +106 -0
  71. obox_builder-1.0.2/obox_builder/filters/registry.py +126 -0
  72. obox_builder-1.0.2/obox_builder/filters/string.py +36 -0
  73. obox_builder-1.0.2/obox_builder/flash.py +123 -0
  74. obox_builder-1.0.2/obox_builder/helpers.py +617 -0
  75. obox_builder-1.0.2/obox_builder/i18n.py +333 -0
  76. obox_builder-1.0.2/obox_builder/importers/__init__.py +88 -0
  77. obox_builder-1.0.2/obox_builder/importers/base.py +142 -0
  78. obox_builder-1.0.2/obox_builder/importers/csv.py +49 -0
  79. obox_builder-1.0.2/obox_builder/importers/json.py +29 -0
  80. obox_builder-1.0.2/obox_builder/importers/tablib.py +61 -0
  81. obox_builder-1.0.2/obox_builder/logging.py +94 -0
  82. obox_builder-1.0.2/obox_builder/plugins.py +146 -0
  83. obox_builder-1.0.2/obox_builder/py.typed +0 -0
  84. obox_builder-1.0.2/obox_builder/routing.py +41 -0
  85. obox_builder-1.0.2/obox_builder/security/__init__.py +3 -0
  86. obox_builder-1.0.2/obox_builder/security/csrf.py +144 -0
  87. obox_builder-1.0.2/obox_builder/static/css/inline-edit.css +126 -0
  88. obox_builder-1.0.2/obox_builder/static/css/jsoneditor_overrides.css +9 -0
  89. obox_builder-1.0.2/obox_builder/static/css/panel_widget.css +10 -0
  90. obox_builder-1.0.2/obox_builder/static/css/select2-tabler.css +125 -0
  91. obox_builder-1.0.2/obox_builder/static/css/vendor/flatpickr.min.css +13 -0
  92. obox_builder-1.0.2/obox_builder/static/css/vendor/fontawesome.min.css +9 -0
  93. obox_builder-1.0.2/obox_builder/static/css/vendor/img/jsoneditor-icons.svg +749 -0
  94. obox_builder-1.0.2/obox_builder/static/css/vendor/jquery.json-viewer.css +8 -0
  95. obox_builder-1.0.2/obox_builder/static/css/vendor/jsoneditor.min.css +6 -0
  96. obox_builder-1.0.2/obox_builder/static/css/vendor/select2.min.css +1 -0
  97. obox_builder-1.0.2/obox_builder/static/css/vendor/tabler-theme.min.css +7 -0
  98. obox_builder-1.0.2/obox_builder/static/css/vendor/tabler.min.css +8 -0
  99. obox_builder-1.0.2/obox_builder/static/i18n/flatpickr/de.js +7 -0
  100. obox_builder-1.0.2/obox_builder/static/i18n/flatpickr/fr.js +7 -0
  101. obox_builder-1.0.2/obox_builder/static/i18n/flatpickr/pt.js +7 -0
  102. obox_builder-1.0.2/obox_builder/static/i18n/flatpickr/ru.js +7 -0
  103. obox_builder-1.0.2/obox_builder/static/i18n/flatpickr/tr.js +7 -0
  104. obox_builder-1.0.2/obox_builder/static/i18n/flatpickr/zh.js +7 -0
  105. obox_builder-1.0.2/obox_builder/static/js/actions.js +204 -0
  106. obox_builder-1.0.2/obox_builder/static/js/alerts.js +63 -0
  107. obox_builder-1.0.2/obox_builder/static/js/chart_widget.js +16 -0
  108. obox_builder-1.0.2/obox_builder/static/js/detail.js +1 -0
  109. obox_builder-1.0.2/obox_builder/static/js/filter-builder.js +519 -0
  110. obox_builder-1.0.2/obox_builder/static/js/form.js +330 -0
  111. obox_builder-1.0.2/obox_builder/static/js/import.js +379 -0
  112. obox_builder-1.0.2/obox_builder/static/js/list.js +606 -0
  113. obox_builder-1.0.2/obox_builder/static/js/sa-dom.js +42 -0
  114. obox_builder-1.0.2/obox_builder/static/js/stat_widget.js +39 -0
  115. obox_builder-1.0.2/obox_builder/static/js/tabs_widget.js +23 -0
  116. obox_builder-1.0.2/obox_builder/static/js/utils.js +60 -0
  117. obox_builder-1.0.2/obox_builder/static/js/vendor/apexcharts.min.js +5 -0
  118. obox_builder-1.0.2/obox_builder/static/js/vendor/countUp.umd.js +1 -0
  119. obox_builder-1.0.2/obox_builder/static/js/vendor/flatpickr.min.js +2 -0
  120. obox_builder-1.0.2/obox_builder/static/js/vendor/fslightbox.js +1 -0
  121. obox_builder-1.0.2/obox_builder/static/js/vendor/jquery.json-viewer.js +8 -0
  122. obox_builder-1.0.2/obox_builder/static/js/vendor/jquery.min.js +2 -0
  123. obox_builder-1.0.2/obox_builder/static/js/vendor/js.cookie.min.js +2 -0
  124. obox_builder-1.0.2/obox_builder/static/js/vendor/jsoneditor.min.js +49 -0
  125. obox_builder-1.0.2/obox_builder/static/js/vendor/select2.min.js +2 -0
  126. obox_builder-1.0.2/obox_builder/static/js/vendor/tabler.min.js +12 -0
  127. obox_builder-1.0.2/obox_builder/static/webfonts/fa-brands-400.woff2 +0 -0
  128. obox_builder-1.0.2/obox_builder/static/webfonts/fa-regular-400.woff2 +0 -0
  129. obox_builder-1.0.2/obox_builder/static/webfonts/fa-solid-900.woff2 +0 -0
  130. obox_builder-1.0.2/obox_builder/static/webfonts/fa-v4compatibility.woff2 +0 -0
  131. obox_builder-1.0.2/obox_builder/storage/__init__.py +23 -0
  132. obox_builder-1.0.2/obox_builder/storage/base.py +225 -0
  133. obox_builder-1.0.2/obox_builder/storage/local.py +104 -0
  134. obox_builder-1.0.2/obox_builder/storage/s3.py +199 -0
  135. obox_builder-1.0.2/obox_builder/templates/_column_header.html +51 -0
  136. obox_builder-1.0.2/obox_builder/templates/_filter_bar.html +20 -0
  137. obox_builder-1.0.2/obox_builder/templates/_filter_builder.html +142 -0
  138. obox_builder-1.0.2/obox_builder/templates/_form_footer.html +18 -0
  139. obox_builder-1.0.2/obox_builder/templates/_list_row.html +53 -0
  140. obox_builder-1.0.2/obox_builder/templates/_pagination.html +85 -0
  141. obox_builder-1.0.2/obox_builder/templates/_sa_templates.html +20 -0
  142. obox_builder-1.0.2/obox_builder/templates/actions/export_form.html +64 -0
  143. obox_builder-1.0.2/obox_builder/templates/actions.html +43 -0
  144. obox_builder-1.0.2/obox_builder/templates/base.html +158 -0
  145. obox_builder-1.0.2/obox_builder/templates/create.html +71 -0
  146. obox_builder-1.0.2/obox_builder/templates/detail.html +175 -0
  147. obox_builder-1.0.2/obox_builder/templates/edit.html +71 -0
  148. obox_builder-1.0.2/obox_builder/templates/error.html +35 -0
  149. obox_builder-1.0.2/obox_builder/templates/fields/_copy_button.html +9 -0
  150. obox_builder-1.0.2/obox_builder/templates/fields/detail/_empty.html +2 -0
  151. obox_builder-1.0.2/obox_builder/templates/fields/detail/_null.html +2 -0
  152. obox_builder-1.0.2/obox_builder/templates/fields/detail/boolean.html +9 -0
  153. obox_builder-1.0.2/obox_builder/templates/fields/detail/collection.html +16 -0
  154. obox_builder-1.0.2/obox_builder/templates/fields/detail/color.html +9 -0
  155. obox_builder-1.0.2/obox_builder/templates/fields/detail/email.html +9 -0
  156. obox_builder-1.0.2/obox_builder/templates/fields/detail/file.html +8 -0
  157. obox_builder-1.0.2/obox_builder/templates/fields/detail/image.html +14 -0
  158. obox_builder-1.0.2/obox_builder/templates/fields/detail/json.html +7 -0
  159. obox_builder-1.0.2/obox_builder/templates/fields/detail/list.html +7 -0
  160. obox_builder-1.0.2/obox_builder/templates/fields/detail/relation.html +5 -0
  161. obox_builder-1.0.2/obox_builder/templates/fields/detail/tags.html +7 -0
  162. obox_builder-1.0.2/obox_builder/templates/fields/detail/text.html +9 -0
  163. obox_builder-1.0.2/obox_builder/templates/fields/detail/textarea.html +11 -0
  164. obox_builder-1.0.2/obox_builder/templates/fields/detail/tinymce.html +1 -0
  165. obox_builder-1.0.2/obox_builder/templates/fields/detail/url.html +9 -0
  166. obox_builder-1.0.2/obox_builder/templates/fields/form/_delete.html +14 -0
  167. obox_builder-1.0.2/obox_builder/templates/fields/form/_error.html +3 -0
  168. obox_builder-1.0.2/obox_builder/templates/fields/form/_label.html +2 -0
  169. obox_builder-1.0.2/obox_builder/templates/fields/form/boolean.html +13 -0
  170. obox_builder-1.0.2/obox_builder/templates/fields/form/collection.html +14 -0
  171. obox_builder-1.0.2/obox_builder/templates/fields/form/computed.html +4 -0
  172. obox_builder-1.0.2/obox_builder/templates/fields/form/enum.html +22 -0
  173. obox_builder-1.0.2/obox_builder/templates/fields/form/file.html +18 -0
  174. obox_builder-1.0.2/obox_builder/templates/fields/form/image.html +15 -0
  175. obox_builder-1.0.2/obox_builder/templates/fields/form/input.html +26 -0
  176. obox_builder-1.0.2/obox_builder/templates/fields/form/json.html +10 -0
  177. obox_builder-1.0.2/obox_builder/templates/fields/form/list.html +48 -0
  178. obox_builder-1.0.2/obox_builder/templates/fields/form/relation.html +18 -0
  179. obox_builder-1.0.2/obox_builder/templates/fields/form/slug.html +23 -0
  180. obox_builder-1.0.2/obox_builder/templates/fields/form/tags.html +16 -0
  181. obox_builder-1.0.2/obox_builder/templates/fields/form/textarea.html +9 -0
  182. obox_builder-1.0.2/obox_builder/templates/fields/list/_truncated.html +8 -0
  183. obox_builder-1.0.2/obox_builder/templates/fields/list/boolean.html +12 -0
  184. obox_builder-1.0.2/obox_builder/templates/fields/list/collection.html +7 -0
  185. obox_builder-1.0.2/obox_builder/templates/fields/list/color.html +22 -0
  186. obox_builder-1.0.2/obox_builder/templates/fields/list/email.html +20 -0
  187. obox_builder-1.0.2/obox_builder/templates/fields/list/file.html +12 -0
  188. obox_builder-1.0.2/obox_builder/templates/fields/list/image.html +8 -0
  189. obox_builder-1.0.2/obox_builder/templates/fields/list/json.html +8 -0
  190. obox_builder-1.0.2/obox_builder/templates/fields/list/list.html +9 -0
  191. obox_builder-1.0.2/obox_builder/templates/fields/list/relation.html +8 -0
  192. obox_builder-1.0.2/obox_builder/templates/fields/list/tags.html +8 -0
  193. obox_builder-1.0.2/obox_builder/templates/fields/list/text.html +14 -0
  194. obox_builder-1.0.2/obox_builder/templates/fields/list/url.html +20 -0
  195. obox_builder-1.0.2/obox_builder/templates/index.html +16 -0
  196. obox_builder-1.0.2/obox_builder/templates/inline-edit/field.html +11 -0
  197. obox_builder-1.0.2/obox_builder/templates/inline-edit/popover.html +15 -0
  198. obox_builder-1.0.2/obox_builder/templates/inline-edit/popover_body.html +43 -0
  199. obox_builder-1.0.2/obox_builder/templates/inline.html +38 -0
  200. obox_builder-1.0.2/obox_builder/templates/inline_detail.html +47 -0
  201. obox_builder-1.0.2/obox_builder/templates/inline_row.html +34 -0
  202. obox_builder-1.0.2/obox_builder/templates/layout.html +243 -0
  203. obox_builder-1.0.2/obox_builder/templates/list.html +284 -0
  204. obox_builder-1.0.2/obox_builder/templates/login.html +151 -0
  205. obox_builder-1.0.2/obox_builder/templates/macros/views.html +76 -0
  206. obox_builder-1.0.2/obox_builder/templates/modals/actions.html +37 -0
  207. obox_builder-1.0.2/obox_builder/templates/modals/import.html +232 -0
  208. obox_builder-1.0.2/obox_builder/templates/modals/loading.html +18 -0
  209. obox_builder-1.0.2/obox_builder/templates/row-actions.html +110 -0
  210. obox_builder-1.0.2/obox_builder/templates/widgets/card_row_widget.html +5 -0
  211. obox_builder-1.0.2/obox_builder/templates/widgets/chart_widget.html +15 -0
  212. obox_builder-1.0.2/obox_builder/templates/widgets/column_widget.html +5 -0
  213. obox_builder-1.0.2/obox_builder/templates/widgets/divider_widget.html +1 -0
  214. obox_builder-1.0.2/obox_builder/templates/widgets/fieldset_widget.html +4 -0
  215. obox_builder-1.0.2/obox_builder/templates/widgets/form_field_widget.html +8 -0
  216. obox_builder-1.0.2/obox_builder/templates/widgets/grid_widget.html +5 -0
  217. obox_builder-1.0.2/obox_builder/templates/widgets/html_widget.html +1 -0
  218. obox_builder-1.0.2/obox_builder/templates/widgets/panel_widget.html +18 -0
  219. obox_builder-1.0.2/obox_builder/templates/widgets/row_widget.html +5 -0
  220. obox_builder-1.0.2/obox_builder/templates/widgets/stat_widget.html +36 -0
  221. obox_builder-1.0.2/obox_builder/templates/widgets/table_widget.html +33 -0
  222. obox_builder-1.0.2/obox_builder/templates/widgets/tabs_widget.html +28 -0
  223. obox_builder-1.0.2/obox_builder/templates/widgets/text_widget.html +7 -0
  224. obox_builder-1.0.2/obox_builder/theme.py +346 -0
  225. obox_builder-1.0.2/obox_builder/tools/__init__.py +7 -0
  226. obox_builder-1.0.2/obox_builder/tools/iter.py +51 -0
  227. obox_builder-1.0.2/obox_builder/translations/de/LC_MESSAGES/admin.mo +0 -0
  228. obox_builder-1.0.2/obox_builder/translations/de/LC_MESSAGES/admin.po +995 -0
  229. obox_builder-1.0.2/obox_builder/translations/en/LC_MESSAGES/admin.mo +0 -0
  230. obox_builder-1.0.2/obox_builder/translations/en/LC_MESSAGES/admin.po +1011 -0
  231. obox_builder-1.0.2/obox_builder/translations/fr/LC_MESSAGES/admin.mo +0 -0
  232. obox_builder-1.0.2/obox_builder/translations/fr/LC_MESSAGES/admin.po +1004 -0
  233. obox_builder-1.0.2/obox_builder/translations/pt/LC_MESSAGES/admin.mo +0 -0
  234. obox_builder-1.0.2/obox_builder/translations/pt/LC_MESSAGES/admin.po +990 -0
  235. obox_builder-1.0.2/obox_builder/translations/ru/LC_MESSAGES/admin.mo +0 -0
  236. obox_builder-1.0.2/obox_builder/translations/ru/LC_MESSAGES/admin.po +989 -0
  237. obox_builder-1.0.2/obox_builder/translations/tr/LC_MESSAGES/admin.mo +0 -0
  238. obox_builder-1.0.2/obox_builder/translations/tr/LC_MESSAGES/admin.po +985 -0
  239. obox_builder-1.0.2/obox_builder/translations/zh/LC_MESSAGES/admin.mo +0 -0
  240. obox_builder-1.0.2/obox_builder/translations/zh/LC_MESSAGES/admin.po +976 -0
  241. obox_builder-1.0.2/obox_builder/translations/zh_Hant/LC_MESSAGES/admin.mo +0 -0
  242. obox_builder-1.0.2/obox_builder/translations/zh_Hant/LC_MESSAGES/admin.po +976 -0
  243. obox_builder-1.0.2/obox_builder/types.py +141 -0
  244. obox_builder-1.0.2/obox_builder/utils/__init__.py +0 -0
  245. obox_builder-1.0.2/obox_builder/utils/countries.py +251 -0
  246. obox_builder-1.0.2/obox_builder/utils/timezones.py +436 -0
  247. obox_builder-1.0.2/obox_builder/validators.py +728 -0
  248. obox_builder-1.0.2/obox_builder/views.py +3329 -0
  249. obox_builder-1.0.2/obox_builder/widgets.py +809 -0
  250. obox_builder-1.0.2/pyproject.toml +269 -0
@@ -0,0 +1,32 @@
1
+ *.pyc
2
+ env*
3
+ .mypy_cache
4
+ .vscode
5
+ .idea
6
+ .venv
7
+ poetry.lock
8
+ dist
9
+ htmlcov
10
+ *.egg-info
11
+ .coverage*
12
+ coverage.xml
13
+ site
14
+ *.db
15
+ *.db-wal
16
+ *.db-shm
17
+ *.sqlite
18
+ .cache
19
+ __pycache__/
20
+ .pytest_cache/
21
+ upload*/
22
+ CLAUDE.md
23
+ .DS_Store
24
+
25
+ docs/locales/*/content/assets/
26
+ docs/locales/*/content/javascripts/
27
+ docs/locales/*/content/stylesheets/
28
+ docs/locales/*/content/changelog.md
29
+ docs/locales/*/content/community.md
30
+ docs/locales/*/content/blog/.authors.yml
31
+
32
+ zensical.*.toml
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 Jocelin Hounon
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,182 @@
1
+ Metadata-Version: 2.5
2
+ Name: obox-builder
3
+ Version: 1.0.2
4
+ Summary: Fast, beautiful and extensible administrative interface framework for FastAPI & Starlette applications
5
+ Project-URL: Homepage, https://github.com/vinhgiga/obox-builder
6
+ Project-URL: Documentation, https://vinhgiga.github.io/obox-builder
7
+ Project-URL: Repository, https://github.com/vinhgiga/obox-builder
8
+ Project-URL: Changelog, https://vinhgiga.github.io/obox-builder/changelog/
9
+ Project-URL: Upstream, https://github.com/jowilf/starlette-admin
10
+ Author: vinhgiga
11
+ License-Expression: MIT
12
+ License-File: LICENSE
13
+ Keywords: admin,admin-dashboard,admin-panel,asgi,beanie,crud,dashboard,fastapi,mongodb,mongoengine,odm,orm,sqlalchemy,sqlmodel,starlette,tortoise-orm
14
+ Classifier: Development Status :: 4 - Beta
15
+ Classifier: Environment :: Web Environment
16
+ Classifier: Framework :: AsyncIO
17
+ Classifier: Framework :: FastAPI
18
+ Classifier: Intended Audience :: Developers
19
+ Classifier: License :: OSI Approved :: MIT License
20
+ Classifier: Operating System :: OS Independent
21
+ Classifier: Programming Language :: Python
22
+ Classifier: Programming Language :: Python :: 3
23
+ Classifier: Programming Language :: Python :: 3.11
24
+ Classifier: Programming Language :: Python :: 3.12
25
+ Classifier: Programming Language :: Python :: 3.13
26
+ Classifier: Programming Language :: Python :: 3.14
27
+ Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
28
+ Classifier: Topic :: Software Development :: Libraries :: Python Modules
29
+ Classifier: Typing :: Typed
30
+ Requires-Python: >=3.11
31
+ Requires-Dist: itsdangerous<2.3.0,>=2.2.0
32
+ Requires-Dist: jinja2<4.0.0,>=3.0.0
33
+ Requires-Dist: python-multipart>=0.0.18
34
+ Requires-Dist: starlette>=0.40.0
35
+ Provides-Extra: email
36
+ Requires-Dist: email-validator>=2.0.0; extra == 'email'
37
+ Provides-Extra: i18n
38
+ Requires-Dist: babel>=2.17.0; extra == 'i18n'
39
+ Provides-Extra: pdf
40
+ Requires-Dist: reportlab>=4.5.1; extra == 'pdf'
41
+ Provides-Extra: s3
42
+ Requires-Dist: aiobotocore>=2.5.0; extra == 's3'
43
+ Provides-Extra: tinymce
44
+ Requires-Dist: nh3>=0.2.14; extra == 'tinymce'
45
+ Description-Content-Type: text/markdown
46
+
47
+ # obox-builder
48
+
49
+ *An extensible administrative interface framework for FastAPI and Starlette applications.*
50
+
51
+ > **obox-builder** is a fork of [starlette-admin](https://github.com/jowilf/starlette-admin), originally created by
52
+ > [Jocelin Hounon](https://github.com/jowilf) and licensed under the MIT License. This fork uses the distribution name
53
+ > `obox-builder` on PyPI and the import package `obox_builder`.
54
+
55
+ <p align="center">
56
+ <a href="https://github.com/vinhgiga/obox-builder/actions/workflows/test.yml">
57
+ <img src="https://github.com/vinhgiga/obox-builder/actions/workflows/test.yml/badge.svg" alt="Tests">
58
+ </a>
59
+ <a href="https://codecov.io/gh/vinhgiga/obox-builder">
60
+ <img src="https://codecov.io/gh/vinhgiga/obox-builder/branch/main/graph/badge.svg" alt="Coverage">
61
+ </a>
62
+ <a href="https://pypi.org/project/obox-builder/">
63
+ <img src="https://badge.fury.io/py/obox-builder.svg" alt="PyPI version">
64
+ </a>
65
+ <a href="https://pypi.org/project/obox-builder/">
66
+ <img src="https://img.shields.io/pypi/pyversions/obox-builder?color=2334D058" alt="Python versions">
67
+ </a>
68
+ </p>
69
+
70
+ ![Admin panel](https://raw.githubusercontent.com/vinhgiga/obox-builder/refs/heads/main/docs/shared/assets/images/list-preview.png)
71
+
72
+ ## Installation
73
+ ```sh
74
+ # Using uv
75
+ uv add obox-builder
76
+
77
+ # Using pip
78
+ pip install obox-builder
79
+ ```
80
+
81
+ ## Quickstart
82
+
83
+ Get a fully functional administrative dashboard up and running in minutes. This example demonstrates an integration with FastAPI and SQLAlchemy.
84
+
85
+ ```python
86
+ from contextlib import asynccontextmanager
87
+ from datetime import datetime, timezone
88
+
89
+ from fastapi import FastAPI
90
+ from sqlalchemy import create_engine
91
+ from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
92
+ from obox_builder.contrib.sqla import Admin, ModelView
93
+
94
+ engine = create_engine("sqlite:///blog.db", connect_args={"check_same_thread": False})
95
+
96
+
97
+ class Base(DeclarativeBase):
98
+ pass
99
+
100
+
101
+ class Post(Base):
102
+ __tablename__ = "posts"
103
+
104
+ id: Mapped[int] = mapped_column(primary_key=True)
105
+ title: Mapped[str]
106
+ content: Mapped[str]
107
+ published: Mapped[bool] = mapped_column(default=False)
108
+ created_at: Mapped[datetime] = mapped_column(
109
+ default=lambda: datetime.now(timezone.utc)
110
+ )
111
+
112
+
113
+ class PostView(ModelView):
114
+ fields = ["id", "title", "content", "published", "created_at"]
115
+ searchable_fields = ("title", "content")
116
+
117
+
118
+ @asynccontextmanager
119
+ async def lifespan(app: FastAPI):
120
+ Base.metadata.create_all(engine)
121
+ yield
122
+
123
+
124
+ app = FastAPI(lifespan=lifespan)
125
+ admin = Admin(engine, title="Blog Admin", secret_key="change-me")
126
+ admin.add_view(PostView(Post, icon="fa fa-newspaper"))
127
+ admin.mount_to(app)
128
+ ```
129
+
130
+ Run with `fastapi dev` and open [http://127.0.0.1:8000/admin](http://127.0.0.1:8000/admin).
131
+
132
+ ## Features
133
+
134
+ - Generated CRUD pages for your models
135
+ - Pagination, sorting, search, and shareable URLs
136
+ - Nested AND/OR filter builder
137
+ - Inline editing for related models
138
+ - Bulk actions and custom row actions
139
+ - CSV, Excel, JSON, and PDF export
140
+ - CSV, JSON and Excel import with dry-run validation
141
+ - Local and S3-compatible file storage (Amazon S3, MinIO, ...)
142
+ - Event hooks before and after CRUD operations
143
+ - Pluggable authentication, storage, fields, actions, and model views
144
+ - Theme customization, dark mode, internationalization, and timezone support
145
+
146
+
147
+
148
+ ## Supported ORMs & Backends
149
+
150
+ `obox-builder` is built to be agnostic. It ships with built-in support for popular ORMs and databases:
151
+
152
+ | Backend | Package Path |
153
+ | --- | --- |
154
+ | **SQLAlchemy** | `obox_builder.contrib.sqla` |
155
+ | **SQLModel** | `obox_builder.contrib.sqlmodel` |
156
+ | **Tortoise ORM** | `obox_builder.contrib.tortoise` |
157
+ | **Beanie (MongoDB)** | `obox_builder.contrib.beanie` |
158
+ | **MongoEngine** | `obox_builder.contrib.mongoengine` |
159
+ | **Custom Data Sources** | Subclass `BaseModelView` |
160
+
161
+ ---
162
+
163
+ ## Documentation & Resources
164
+
165
+ * **[Full Documentation](https://vinhgiga.github.io/obox-builder)**
166
+ * **[Quickstart Guide](https://vinhgiga.github.io/obox-builder/getting-started/quickstart/)**
167
+ * **[User Guide](https://vinhgiga.github.io/obox-builder/user-guide/views/)** (Covers views, fields, filters, actions, and auth)
168
+ * **[API Reference](https://vinhgiga.github.io/obox-builder/api/admin/)**
169
+
170
+ ## Live Demo
171
+
172
+ Explore the upstream interface in action: **[starlette-admin-demo.jowilf.com](https://starlette-admin-demo.jowilf.com/)**
173
+
174
+ ## Contributing
175
+
176
+ Contributions are always welcome! Whether it is reporting a bug, discussing improvements, or submitting a pull request, your input helps make this project better.
177
+
178
+ Please review our **[CONTRIBUTING.md](https://github.com/vinhgiga/obox-builder/blob/main/CONTRIBUTING.md)** guidelines before opening a pull request.
179
+
180
+ ## License
181
+
182
+ This project is licensed under the **MIT License**.
@@ -0,0 +1,136 @@
1
+ # obox-builder
2
+
3
+ *An extensible administrative interface framework for FastAPI and Starlette applications.*
4
+
5
+ > **obox-builder** is a fork of [starlette-admin](https://github.com/jowilf/starlette-admin), originally created by
6
+ > [Jocelin Hounon](https://github.com/jowilf) and licensed under the MIT License. This fork uses the distribution name
7
+ > `obox-builder` on PyPI and the import package `obox_builder`.
8
+
9
+ <p align="center">
10
+ <a href="https://github.com/vinhgiga/obox-builder/actions/workflows/test.yml">
11
+ <img src="https://github.com/vinhgiga/obox-builder/actions/workflows/test.yml/badge.svg" alt="Tests">
12
+ </a>
13
+ <a href="https://codecov.io/gh/vinhgiga/obox-builder">
14
+ <img src="https://codecov.io/gh/vinhgiga/obox-builder/branch/main/graph/badge.svg" alt="Coverage">
15
+ </a>
16
+ <a href="https://pypi.org/project/obox-builder/">
17
+ <img src="https://badge.fury.io/py/obox-builder.svg" alt="PyPI version">
18
+ </a>
19
+ <a href="https://pypi.org/project/obox-builder/">
20
+ <img src="https://img.shields.io/pypi/pyversions/obox-builder?color=2334D058" alt="Python versions">
21
+ </a>
22
+ </p>
23
+
24
+ ![Admin panel](https://raw.githubusercontent.com/vinhgiga/obox-builder/refs/heads/main/docs/shared/assets/images/list-preview.png)
25
+
26
+ ## Installation
27
+ ```sh
28
+ # Using uv
29
+ uv add obox-builder
30
+
31
+ # Using pip
32
+ pip install obox-builder
33
+ ```
34
+
35
+ ## Quickstart
36
+
37
+ Get a fully functional administrative dashboard up and running in minutes. This example demonstrates an integration with FastAPI and SQLAlchemy.
38
+
39
+ ```python
40
+ from contextlib import asynccontextmanager
41
+ from datetime import datetime, timezone
42
+
43
+ from fastapi import FastAPI
44
+ from sqlalchemy import create_engine
45
+ from sqlalchemy.orm import DeclarativeBase, Mapped, mapped_column
46
+ from obox_builder.contrib.sqla import Admin, ModelView
47
+
48
+ engine = create_engine("sqlite:///blog.db", connect_args={"check_same_thread": False})
49
+
50
+
51
+ class Base(DeclarativeBase):
52
+ pass
53
+
54
+
55
+ class Post(Base):
56
+ __tablename__ = "posts"
57
+
58
+ id: Mapped[int] = mapped_column(primary_key=True)
59
+ title: Mapped[str]
60
+ content: Mapped[str]
61
+ published: Mapped[bool] = mapped_column(default=False)
62
+ created_at: Mapped[datetime] = mapped_column(
63
+ default=lambda: datetime.now(timezone.utc)
64
+ )
65
+
66
+
67
+ class PostView(ModelView):
68
+ fields = ["id", "title", "content", "published", "created_at"]
69
+ searchable_fields = ("title", "content")
70
+
71
+
72
+ @asynccontextmanager
73
+ async def lifespan(app: FastAPI):
74
+ Base.metadata.create_all(engine)
75
+ yield
76
+
77
+
78
+ app = FastAPI(lifespan=lifespan)
79
+ admin = Admin(engine, title="Blog Admin", secret_key="change-me")
80
+ admin.add_view(PostView(Post, icon="fa fa-newspaper"))
81
+ admin.mount_to(app)
82
+ ```
83
+
84
+ Run with `fastapi dev` and open [http://127.0.0.1:8000/admin](http://127.0.0.1:8000/admin).
85
+
86
+ ## Features
87
+
88
+ - Generated CRUD pages for your models
89
+ - Pagination, sorting, search, and shareable URLs
90
+ - Nested AND/OR filter builder
91
+ - Inline editing for related models
92
+ - Bulk actions and custom row actions
93
+ - CSV, Excel, JSON, and PDF export
94
+ - CSV, JSON and Excel import with dry-run validation
95
+ - Local and S3-compatible file storage (Amazon S3, MinIO, ...)
96
+ - Event hooks before and after CRUD operations
97
+ - Pluggable authentication, storage, fields, actions, and model views
98
+ - Theme customization, dark mode, internationalization, and timezone support
99
+
100
+
101
+
102
+ ## Supported ORMs & Backends
103
+
104
+ `obox-builder` is built to be agnostic. It ships with built-in support for popular ORMs and databases:
105
+
106
+ | Backend | Package Path |
107
+ | --- | --- |
108
+ | **SQLAlchemy** | `obox_builder.contrib.sqla` |
109
+ | **SQLModel** | `obox_builder.contrib.sqlmodel` |
110
+ | **Tortoise ORM** | `obox_builder.contrib.tortoise` |
111
+ | **Beanie (MongoDB)** | `obox_builder.contrib.beanie` |
112
+ | **MongoEngine** | `obox_builder.contrib.mongoengine` |
113
+ | **Custom Data Sources** | Subclass `BaseModelView` |
114
+
115
+ ---
116
+
117
+ ## Documentation & Resources
118
+
119
+ * **[Full Documentation](https://vinhgiga.github.io/obox-builder)**
120
+ * **[Quickstart Guide](https://vinhgiga.github.io/obox-builder/getting-started/quickstart/)**
121
+ * **[User Guide](https://vinhgiga.github.io/obox-builder/user-guide/views/)** (Covers views, fields, filters, actions, and auth)
122
+ * **[API Reference](https://vinhgiga.github.io/obox-builder/api/admin/)**
123
+
124
+ ## Live Demo
125
+
126
+ Explore the upstream interface in action: **[starlette-admin-demo.jowilf.com](https://starlette-admin-demo.jowilf.com/)**
127
+
128
+ ## Contributing
129
+
130
+ Contributions are always welcome! Whether it is reporting a bug, discussing improvements, or submitting a pull request, your input helps make this project better.
131
+
132
+ Please review our **[CONTRIBUTING.md](https://github.com/vinhgiga/obox-builder/blob/main/CONTRIBUTING.md)** guidelines before opening a pull request.
133
+
134
+ ## License
135
+
136
+ This project is licensed under the **MIT License**.
@@ -0,0 +1,155 @@
1
+ __version__ = "1.0.2"
2
+
3
+ from .actions import ActionSelection as ActionSelection
4
+ from .actions import action as action
5
+ from .actions import link_row_action as link_row_action
6
+ from .actions import row_action as row_action
7
+ from .base import BaseAdmin as BaseAdmin
8
+ from .fields import ArrowField as ArrowField
9
+ from .fields import BaseField as BaseField
10
+ from .fields import BooleanField as BooleanField
11
+ from .fields import CollectionField as CollectionField
12
+ from .fields import ColorField as ColorField
13
+ from .fields import ComputedField as ComputedField
14
+ from .fields import CountryField as CountryField
15
+ from .fields import CurrencyField as CurrencyField
16
+ from .fields import DateField as DateField
17
+ from .fields import DateTimeField as DateTimeField
18
+ from .fields import DecimalField as DecimalField
19
+ from .fields import EmailField as EmailField
20
+ from .fields import EnumField as EnumField
21
+ from .fields import FileField as FileField
22
+ from .fields import FloatField as FloatField
23
+ from .fields import HasMany as HasMany
24
+ from .fields import HasOne as HasOne
25
+ from .fields import ImageField as ImageField
26
+ from .fields import IntegerField as IntegerField
27
+ from .fields import IPAddressField as IPAddressField
28
+ from .fields import JSONField as JSONField
29
+ from .fields import ListField as ListField
30
+ from .fields import NumberField as NumberField
31
+ from .fields import PasswordField as PasswordField
32
+ from .fields import PhoneField as PhoneField
33
+ from .fields import RelationField as RelationField
34
+ from .fields import SlugField as SlugField
35
+ from .fields import StringField as StringField
36
+ from .fields import TagsField as TagsField
37
+ from .fields import TextAreaField as TextAreaField
38
+ from .fields import TimeField as TimeField
39
+ from .fields import TimeZoneField as TimeZoneField
40
+ from .fields import TinyMCEEditorField as TinyMCEEditorField
41
+ from .fields import URLField as URLField
42
+ from .fields import UUIDField as UUIDField
43
+ from .flash import flash as flash
44
+ from .flash import get_flashed_messages as get_flashed_messages
45
+ from .i18n import I18nConfig as I18nConfig
46
+ from .i18n import TimezoneConfig as TimezoneConfig
47
+ from .plugins import BasePlugin as BasePlugin
48
+ from .plugins import PluginError as PluginError
49
+ from .routing import route as route
50
+ from .theme import BaseTheme as BaseTheme
51
+ from .theme import DefaultTheme as DefaultTheme
52
+ from .theme import TablerSettings as TablerSettings
53
+ from .types import RequestAction as RequestAction
54
+ from .types import RowActionsDisplayType as RowActionsDisplayType
55
+ from .types import RowActionsPosition as RowActionsPosition
56
+ from .views import BaseModelView as BaseModelView
57
+ from .views import CustomView as CustomView
58
+ from .views import DefaultIndexView as DefaultIndexView
59
+ from .views import DropDown as DropDown
60
+ from .views import InlineModelView as InlineModelView
61
+ from .views import Link as Link
62
+ from .widgets import BaseWidget as BaseWidget
63
+ from .widgets import Breakpoints as Breakpoints
64
+ from .widgets import CardRowWidget as CardRowWidget
65
+ from .widgets import ChartWidget as ChartWidget
66
+ from .widgets import Col as Col
67
+ from .widgets import ColumnWidget as ColumnWidget
68
+ from .widgets import DividerWidget as DividerWidget
69
+ from .widgets import FieldRef as FieldRef
70
+ from .widgets import FieldsetWidget as FieldsetWidget
71
+ from .widgets import GridWidget as GridWidget
72
+ from .widgets import HtmlWidget as HtmlWidget
73
+ from .widgets import PanelWidget as PanelWidget
74
+ from .widgets import RowWidget as RowWidget
75
+ from .widgets import StatWidget as StatWidget
76
+ from .widgets import TableWidget as TableWidget
77
+ from .widgets import TabsWidget as TabsWidget
78
+ from .widgets import TextWidget as TextWidget
79
+
80
+ __all__ = [
81
+ "ActionSelection",
82
+ "ArrowField",
83
+ "BaseAdmin",
84
+ "BaseField",
85
+ "BaseModelView",
86
+ "BaseTheme",
87
+ "BaseWidget",
88
+ "BooleanField",
89
+ "Breakpoints",
90
+ "CardRowWidget",
91
+ "ChartWidget",
92
+ "Col",
93
+ "CollectionField",
94
+ "ColorField",
95
+ "ColumnWidget",
96
+ "ComputedField",
97
+ "CountryField",
98
+ "CurrencyField",
99
+ "CustomView",
100
+ "DateField",
101
+ "DateTimeField",
102
+ "DecimalField",
103
+ "DefaultIndexView",
104
+ "DefaultTheme",
105
+ "DividerWidget",
106
+ "DropDown",
107
+ "EmailField",
108
+ "EnumField",
109
+ "FieldRef",
110
+ "FieldsetWidget",
111
+ "FileField",
112
+ "FloatField",
113
+ "GridWidget",
114
+ "HasMany",
115
+ "HasOne",
116
+ "HtmlWidget",
117
+ "I18nConfig",
118
+ "IPAddressField",
119
+ "ImageField",
120
+ "InlineModelView",
121
+ "IntegerField",
122
+ "JSONField",
123
+ "Link",
124
+ "ListField",
125
+ "NumberField",
126
+ "PanelWidget",
127
+ "PasswordField",
128
+ "PhoneField",
129
+ "RelationField",
130
+ "RequestAction",
131
+ "RowActionsDisplayType",
132
+ "RowActionsPosition",
133
+ "RowWidget",
134
+ "SlugField",
135
+ "StatWidget",
136
+ "StringField",
137
+ "TableWidget",
138
+ "TablerSettings",
139
+ "TabsWidget",
140
+ "TagsField",
141
+ "TextAreaField",
142
+ "TextWidget",
143
+ "TimeField",
144
+ "TimeZoneField",
145
+ "TimezoneConfig",
146
+ "TinyMCEEditorField",
147
+ "URLField",
148
+ "UUIDField",
149
+ "action",
150
+ "flash",
151
+ "get_flashed_messages",
152
+ "link_row_action",
153
+ "route",
154
+ "row_action",
155
+ ]