django-handyhelpers 0.3.20__py3-none-any.whl → 0.3.35__py3-none-any.whl

Sign up to get free protection for your applications and to get access to all the features.
Files changed (571) hide show
  1. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/METADATA +16 -6
  2. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/RECORD +562 -75
  3. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/WHEEL +1 -1
  4. handyhelpers/__init__.py +6 -6
  5. handyhelpers/forms.py +9 -1
  6. handyhelpers/mixins/form_mixins.py +61 -0
  7. handyhelpers/mixins/model_mixins.py +21 -0
  8. handyhelpers/mixins/serializer_mixins.py +35 -0
  9. handyhelpers/mixins/view_mixins.py +5 -2
  10. handyhelpers/serializers.py +23 -3
  11. handyhelpers/static/handyhelpers/css/table_sortable.css +17 -0
  12. handyhelpers/static/handyhelpers/js/sidebar.js +8 -4
  13. handyhelpers/static/handyhelpers/js/table_sortable.js +119 -0
  14. handyhelpers/static/node_modules/.bin/acorn +4 -0
  15. handyhelpers/static/node_modules/.bin/css-b64-images +13 -0
  16. handyhelpers/static/node_modules/.bin/esbuild +0 -0
  17. handyhelpers/static/node_modules/.bin/html-minifier-terser +308 -0
  18. handyhelpers/static/node_modules/.bin/minify +98 -0
  19. handyhelpers/static/node_modules/.bin/terser +21 -0
  20. handyhelpers/static/node_modules/.bin/uglifyjs +624 -0
  21. handyhelpers/static/node_modules/.package-lock.json +750 -0
  22. handyhelpers/static/node_modules/@esbuild/linux-x64/README.md +3 -0
  23. handyhelpers/static/node_modules/@esbuild/linux-x64/bin/esbuild +0 -0
  24. handyhelpers/static/node_modules/@esbuild/linux-x64/package.json +20 -0
  25. handyhelpers/static/node_modules/@jridgewell/gen-mapping/LICENSE +19 -0
  26. handyhelpers/static/node_modules/@jridgewell/gen-mapping/README.md +227 -0
  27. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs +230 -0
  28. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.mjs.map +1 -0
  29. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js +246 -0
  30. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/gen-mapping.umd.js.map +1 -0
  31. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/types/gen-mapping.d.ts +88 -0
  32. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/types/sourcemap-segment.d.ts +12 -0
  33. handyhelpers/static/node_modules/@jridgewell/gen-mapping/dist/types/types.d.ts +36 -0
  34. handyhelpers/static/node_modules/@jridgewell/gen-mapping/package.json +76 -0
  35. handyhelpers/static/node_modules/@jridgewell/resolve-uri/LICENSE +19 -0
  36. handyhelpers/static/node_modules/@jridgewell/resolve-uri/README.md +40 -0
  37. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs +232 -0
  38. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.mjs.map +1 -0
  39. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js +240 -0
  40. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/resolve-uri.umd.js.map +1 -0
  41. handyhelpers/static/node_modules/@jridgewell/resolve-uri/dist/types/resolve-uri.d.ts +4 -0
  42. handyhelpers/static/node_modules/@jridgewell/resolve-uri/package.json +69 -0
  43. handyhelpers/static/node_modules/@jridgewell/set-array/LICENSE +19 -0
  44. handyhelpers/static/node_modules/@jridgewell/set-array/README.md +37 -0
  45. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.mjs +69 -0
  46. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.mjs.map +1 -0
  47. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.umd.js +83 -0
  48. handyhelpers/static/node_modules/@jridgewell/set-array/dist/set-array.umd.js.map +1 -0
  49. handyhelpers/static/node_modules/@jridgewell/set-array/dist/types/set-array.d.ts +32 -0
  50. handyhelpers/static/node_modules/@jridgewell/set-array/package.json +65 -0
  51. handyhelpers/static/node_modules/@jridgewell/source-map/LICENSE +19 -0
  52. handyhelpers/static/node_modules/@jridgewell/source-map/README.md +184 -0
  53. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.cjs +95 -0
  54. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.cjs.map +1 -0
  55. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.mjs +90 -0
  56. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.mjs.map +1 -0
  57. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.umd.js +1242 -0
  58. handyhelpers/static/node_modules/@jridgewell/source-map/dist/source-map.umd.js.map +1 -0
  59. handyhelpers/static/node_modules/@jridgewell/source-map/dist/types/source-map.d.ts +35 -0
  60. handyhelpers/static/node_modules/@jridgewell/source-map/package.json +71 -0
  61. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/LICENSE +21 -0
  62. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/README.md +264 -0
  63. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs +424 -0
  64. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.mjs.map +1 -0
  65. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js +439 -0
  66. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/sourcemap-codec.umd.js.map +1 -0
  67. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/scopes.d.ts +49 -0
  68. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/sourcemap-codec.d.ts +8 -0
  69. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/strings.d.ts +15 -0
  70. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/dist/types/vlq.d.ts +6 -0
  71. handyhelpers/static/node_modules/@jridgewell/sourcemap-codec/package.json +75 -0
  72. handyhelpers/static/node_modules/@jridgewell/trace-mapping/LICENSE +19 -0
  73. handyhelpers/static/node_modules/@jridgewell/trace-mapping/README.md +257 -0
  74. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs +580 -0
  75. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.mjs.map +1 -0
  76. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js +600 -0
  77. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/trace-mapping.umd.js.map +1 -0
  78. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/any-map.d.ts +8 -0
  79. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/binary-search.d.ts +32 -0
  80. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/by-source.d.ts +7 -0
  81. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/resolve.d.ts +1 -0
  82. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/sort.d.ts +2 -0
  83. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/sourcemap-segment.d.ts +16 -0
  84. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/strip-filename.d.ts +4 -0
  85. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/trace-mapping.d.ts +79 -0
  86. handyhelpers/static/node_modules/@jridgewell/trace-mapping/dist/types/types.d.ts +99 -0
  87. handyhelpers/static/node_modules/@jridgewell/trace-mapping/package.json +77 -0
  88. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/enums.js +1 -1
  89. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-base.js +12 -170
  90. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-base.js.map +1 -1
  91. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-lite.js +14 -184
  92. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper-lite.js.map +1 -1
  93. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper.js +14 -197
  94. handyhelpers/static/node_modules/@popperjs/core/dist/cjs/popper.js.map +1 -1
  95. handyhelpers/static/node_modules/@popperjs/core/dist/esm/createPopper.js +6 -66
  96. handyhelpers/static/node_modules/@popperjs/core/dist/esm/modifiers/arrow.js +1 -12
  97. handyhelpers/static/node_modules/@popperjs/core/dist/esm/modifiers/computeStyles.js +2 -14
  98. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/computeAutoPlacement.js +0 -4
  99. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/userAgent.js +1 -1
  100. handyhelpers/static/node_modules/@popperjs/core/dist/umd/enums.js +1 -1
  101. handyhelpers/static/node_modules/@popperjs/core/dist/umd/enums.min.js +1 -1
  102. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.js +12 -170
  103. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.js.map +1 -1
  104. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.min.js +2 -2
  105. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-base.min.js.map +1 -1
  106. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.js +14 -184
  107. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.js.map +1 -1
  108. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.min.js +2 -2
  109. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper-lite.min.js.map +1 -1
  110. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.js +14 -197
  111. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.js.map +1 -1
  112. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.min.js +2 -2
  113. handyhelpers/static/node_modules/@popperjs/core/dist/umd/popper.min.js.map +1 -1
  114. handyhelpers/static/node_modules/@popperjs/core/lib/createPopper.js +6 -66
  115. handyhelpers/static/node_modules/@popperjs/core/lib/createPopper.js.flow +2 -80
  116. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/arrow.js +1 -12
  117. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/arrow.js.flow +0 -22
  118. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/computeStyles.js +2 -14
  119. handyhelpers/static/node_modules/@popperjs/core/lib/modifiers/computeStyles.js.flow +3 -33
  120. handyhelpers/static/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js +0 -4
  121. handyhelpers/static/node_modules/@popperjs/core/lib/utils/computeAutoPlacement.js.flow +0 -12
  122. handyhelpers/static/node_modules/@popperjs/core/lib/utils/userAgent.js +1 -1
  123. handyhelpers/static/node_modules/@popperjs/core/lib/utils/userAgent.js.flow +1 -1
  124. handyhelpers/static/node_modules/@popperjs/core/package.json +1 -1
  125. handyhelpers/static/node_modules/@putout/minify/LICENSE +21 -0
  126. handyhelpers/static/node_modules/@putout/minify/README.md +110 -0
  127. handyhelpers/static/node_modules/@putout/minify/bundle/minify.min.js +52 -0
  128. handyhelpers/static/node_modules/@putout/minify/package.json +112 -0
  129. handyhelpers/static/node_modules/@swc/core/Visitor.d.ts +218 -0
  130. handyhelpers/static/node_modules/@swc/core/Visitor.js +1407 -0
  131. handyhelpers/static/node_modules/@swc/core/binding.d.ts +56 -0
  132. handyhelpers/static/node_modules/@swc/core/binding.js +351 -0
  133. handyhelpers/static/node_modules/@swc/core/index.d.ts +118 -0
  134. handyhelpers/static/node_modules/@swc/core/index.js +439 -0
  135. handyhelpers/static/node_modules/@swc/core/package.json +114 -0
  136. handyhelpers/static/node_modules/@swc/core/postinstall.js +148 -0
  137. handyhelpers/static/node_modules/@swc/core/spack.d.ts +51 -0
  138. handyhelpers/static/node_modules/@swc/core/spack.js +87 -0
  139. handyhelpers/static/node_modules/@swc/core/util.d.ts +1 -0
  140. handyhelpers/static/node_modules/@swc/core/util.js +104 -0
  141. handyhelpers/static/node_modules/@swc/core-linux-x64-gnu/README.md +3 -0
  142. handyhelpers/static/node_modules/@swc/core-linux-x64-gnu/package.json +45 -0
  143. handyhelpers/static/node_modules/@swc/core-linux-x64-gnu/swc.linux-x64-gnu.node +0 -0
  144. handyhelpers/static/node_modules/@swc/counter/CHANGELOG.md +7 -0
  145. handyhelpers/static/node_modules/@swc/counter/README.md +7 -0
  146. handyhelpers/static/node_modules/@swc/counter/index.js +1 -0
  147. handyhelpers/static/node_modules/@swc/counter/package.json +27 -0
  148. handyhelpers/static/node_modules/@swc/types/LICENSE +201 -0
  149. handyhelpers/static/node_modules/@swc/types/README.md +4 -0
  150. handyhelpers/static/node_modules/@swc/types/assumptions.d.ts +92 -0
  151. handyhelpers/static/node_modules/@swc/types/assumptions.js +2 -0
  152. handyhelpers/static/node_modules/@swc/types/index.d.ts +1977 -0
  153. handyhelpers/static/node_modules/@swc/types/index.js +2 -0
  154. handyhelpers/static/node_modules/@swc/types/package.json +39 -0
  155. handyhelpers/static/node_modules/acorn/CHANGELOG.md +928 -0
  156. handyhelpers/static/node_modules/acorn/LICENSE +21 -0
  157. handyhelpers/static/node_modules/acorn/README.md +282 -0
  158. handyhelpers/static/node_modules/acorn/bin/acorn +4 -0
  159. handyhelpers/static/node_modules/acorn/dist/acorn.d.mts +866 -0
  160. handyhelpers/static/node_modules/acorn/dist/acorn.d.ts +866 -0
  161. handyhelpers/static/node_modules/acorn/dist/acorn.js +6174 -0
  162. handyhelpers/static/node_modules/acorn/dist/acorn.mjs +6145 -0
  163. handyhelpers/static/node_modules/acorn/dist/bin.js +90 -0
  164. handyhelpers/static/node_modules/acorn/package.json +50 -0
  165. handyhelpers/static/node_modules/buffer-from/LICENSE +21 -0
  166. handyhelpers/static/node_modules/buffer-from/index.js +72 -0
  167. handyhelpers/static/node_modules/buffer-from/package.json +19 -0
  168. handyhelpers/static/node_modules/buffer-from/readme.md +69 -0
  169. handyhelpers/static/node_modules/camel-case/LICENSE +21 -0
  170. handyhelpers/static/node_modules/camel-case/README.md +47 -0
  171. handyhelpers/static/node_modules/camel-case/dist/index.d.ts +5 -0
  172. handyhelpers/static/node_modules/camel-case/dist/index.js +23 -0
  173. handyhelpers/static/node_modules/camel-case/dist/index.js.map +1 -0
  174. handyhelpers/static/node_modules/camel-case/dist/index.spec.d.ts +1 -0
  175. handyhelpers/static/node_modules/camel-case/dist/index.spec.js +26 -0
  176. handyhelpers/static/node_modules/camel-case/dist/index.spec.js.map +1 -0
  177. handyhelpers/static/node_modules/camel-case/dist.es2015/index.d.ts +5 -0
  178. handyhelpers/static/node_modules/camel-case/dist.es2015/index.js +17 -0
  179. handyhelpers/static/node_modules/camel-case/dist.es2015/index.js.map +1 -0
  180. handyhelpers/static/node_modules/camel-case/dist.es2015/index.spec.d.ts +1 -0
  181. handyhelpers/static/node_modules/camel-case/dist.es2015/index.spec.js +24 -0
  182. handyhelpers/static/node_modules/camel-case/dist.es2015/index.spec.js.map +1 -0
  183. handyhelpers/static/node_modules/camel-case/package.json +89 -0
  184. handyhelpers/static/node_modules/clean-css/History.md +1504 -0
  185. handyhelpers/static/node_modules/clean-css/LICENSE +19 -0
  186. handyhelpers/static/node_modules/clean-css/README.md +987 -0
  187. handyhelpers/static/node_modules/clean-css/index.js +1 -0
  188. handyhelpers/static/node_modules/clean-css/package.json +48 -0
  189. handyhelpers/static/node_modules/commander/LICENSE +22 -0
  190. handyhelpers/static/node_modules/commander/Readme.md +1134 -0
  191. handyhelpers/static/node_modules/commander/esm.mjs +16 -0
  192. handyhelpers/static/node_modules/commander/index.js +27 -0
  193. handyhelpers/static/node_modules/commander/package-support.json +16 -0
  194. handyhelpers/static/node_modules/commander/package.json +80 -0
  195. handyhelpers/static/node_modules/commander/typings/index.d.ts +889 -0
  196. handyhelpers/static/node_modules/css-b64-images/.npmignore +15 -0
  197. handyhelpers/static/node_modules/css-b64-images/.travis.yml +5 -0
  198. handyhelpers/static/node_modules/css-b64-images/README.md +78 -0
  199. handyhelpers/static/node_modules/css-b64-images/bin/css-b64-images +13 -0
  200. handyhelpers/static/node_modules/css-b64-images/draft.png +0 -0
  201. handyhelpers/static/node_modules/css-b64-images/draft.xcf +0 -0
  202. handyhelpers/static/node_modules/css-b64-images/package.json +30 -0
  203. handyhelpers/static/node_modules/css-b64-images/test/css-b64-images-test.js +38 -0
  204. handyhelpers/static/node_modules/css-b64-images/test/fixture/css/style.css +52 -0
  205. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.eot +0 -0
  206. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.svg +248 -0
  207. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.ttf +0 -0
  208. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/callunasansregular-webfont.woff +0 -0
  209. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.eot +0 -0
  210. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.svg +245 -0
  211. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.ttf +0 -0
  212. handyhelpers/static/node_modules/css-b64-images/test/fixture/fonts/maven_pro_medium-webfont.woff +0 -0
  213. handyhelpers/static/node_modules/css-b64-images/test/fixture/img/background-pattern.gif +0 -0
  214. handyhelpers/static/node_modules/css-b64-images/test/fixture/img/dots.svg +6 -0
  215. handyhelpers/static/node_modules/css-b64-images/test/fixture/img/mixit-banner.png +0 -0
  216. handyhelpers/static/node_modules/debug/LICENSE +20 -0
  217. handyhelpers/static/node_modules/debug/README.md +481 -0
  218. handyhelpers/static/node_modules/debug/package.json +65 -0
  219. handyhelpers/static/node_modules/debug/src/browser.js +272 -0
  220. handyhelpers/static/node_modules/debug/src/common.js +292 -0
  221. handyhelpers/static/node_modules/debug/src/index.js +10 -0
  222. handyhelpers/static/node_modules/debug/src/node.js +263 -0
  223. handyhelpers/static/node_modules/dot-case/LICENSE +21 -0
  224. handyhelpers/static/node_modules/dot-case/README.md +37 -0
  225. handyhelpers/static/node_modules/dot-case/dist/index.d.ts +3 -0
  226. handyhelpers/static/node_modules/dot-case/dist/index.js +11 -0
  227. handyhelpers/static/node_modules/dot-case/dist/index.js.map +1 -0
  228. handyhelpers/static/node_modules/dot-case/dist/index.spec.d.ts +1 -0
  229. handyhelpers/static/node_modules/dot-case/dist/index.spec.js +26 -0
  230. handyhelpers/static/node_modules/dot-case/dist/index.spec.js.map +1 -0
  231. handyhelpers/static/node_modules/dot-case/dist.es2015/index.d.ts +3 -0
  232. handyhelpers/static/node_modules/dot-case/dist.es2015/index.js +7 -0
  233. handyhelpers/static/node_modules/dot-case/dist.es2015/index.js.map +1 -0
  234. handyhelpers/static/node_modules/dot-case/dist.es2015/index.spec.d.ts +1 -0
  235. handyhelpers/static/node_modules/dot-case/dist.es2015/index.spec.js +24 -0
  236. handyhelpers/static/node_modules/dot-case/dist.es2015/index.spec.js.map +1 -0
  237. handyhelpers/static/node_modules/dot-case/package.json +89 -0
  238. handyhelpers/static/node_modules/entities/LICENSE +11 -0
  239. handyhelpers/static/node_modules/entities/package.json +90 -0
  240. handyhelpers/static/node_modules/entities/readme.md +122 -0
  241. handyhelpers/static/node_modules/esbuild/LICENSE.md +21 -0
  242. handyhelpers/static/node_modules/esbuild/README.md +3 -0
  243. handyhelpers/static/node_modules/esbuild/bin/esbuild +0 -0
  244. handyhelpers/static/node_modules/esbuild/install.js +286 -0
  245. handyhelpers/static/node_modules/esbuild/package.json +47 -0
  246. handyhelpers/static/node_modules/find-up/index.d.ts +247 -0
  247. handyhelpers/static/node_modules/find-up/index.js +107 -0
  248. handyhelpers/static/node_modules/find-up/license +9 -0
  249. handyhelpers/static/node_modules/find-up/package.json +61 -0
  250. handyhelpers/static/node_modules/find-up/readme.md +160 -0
  251. handyhelpers/static/node_modules/fun-effects/LICENSE +674 -0
  252. handyhelpers/static/node_modules/fun-effects/README.md +10 -0
  253. handyhelpers/static/node_modules/fun-effects/dist/css/background_icons.min.css +1 -0
  254. handyhelpers/static/node_modules/fun-effects/dist/css/blur_group.min.css +1 -0
  255. handyhelpers/static/node_modules/fun-effects/dist/css/fades.min.css +1 -0
  256. handyhelpers/static/node_modules/fun-effects/dist/css/marquee.min.css +1 -0
  257. handyhelpers/static/node_modules/fun-effects/dist/css/scroller.min.css +1 -0
  258. handyhelpers/static/node_modules/fun-effects/dist/index.js +15 -0
  259. handyhelpers/static/node_modules/fun-effects/dist/js/background_icons.min.js +1 -0
  260. handyhelpers/static/node_modules/fun-effects/dist/js/marquee.min.js +1 -0
  261. handyhelpers/static/node_modules/fun-effects/dist/js/scroller.min.js +1 -0
  262. handyhelpers/static/node_modules/fun-effects/package.json +39 -0
  263. handyhelpers/static/node_modules/fun-effects/src/css/background_icons.css +39 -0
  264. handyhelpers/static/node_modules/fun-effects/src/css/blur_group.css +22 -0
  265. handyhelpers/static/node_modules/fun-effects/src/css/fades.css +94 -0
  266. handyhelpers/static/node_modules/fun-effects/src/css/marquee.css +45 -0
  267. handyhelpers/static/node_modules/fun-effects/src/css/scroller.css +144 -0
  268. handyhelpers/static/node_modules/fun-effects/src/index.js +15 -0
  269. handyhelpers/static/node_modules/fun-effects/src/js/background_icons.js +101 -0
  270. handyhelpers/static/node_modules/fun-effects/src/js/marquee.js +81 -0
  271. handyhelpers/static/node_modules/fun-effects/src/js/scroller.js +37 -0
  272. handyhelpers/static/node_modules/html-minifier-terser/LICENSE +22 -0
  273. handyhelpers/static/node_modules/html-minifier-terser/README.md +168 -0
  274. handyhelpers/static/node_modules/html-minifier-terser/cli.js +308 -0
  275. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.cjs +1857 -0
  276. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.esm.bundle.js +57509 -0
  277. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.umd.bundle.js +57520 -0
  278. handyhelpers/static/node_modules/html-minifier-terser/dist/htmlminifier.umd.bundle.min.js +9 -0
  279. handyhelpers/static/node_modules/html-minifier-terser/package.json +105 -0
  280. handyhelpers/static/node_modules/html-minifier-terser/src/htmlminifier.js +1366 -0
  281. handyhelpers/static/node_modules/html-minifier-terser/src/htmlparser.js +565 -0
  282. handyhelpers/static/node_modules/html-minifier-terser/src/tokenchain.js +68 -0
  283. handyhelpers/static/node_modules/html-minifier-terser/src/utils.js +11 -0
  284. handyhelpers/static/node_modules/jju/LICENSE +21 -0
  285. handyhelpers/static/node_modules/jju/Makefile +20 -0
  286. handyhelpers/static/node_modules/jju/README.md +249 -0
  287. handyhelpers/static/node_modules/jju/index.js +32 -0
  288. handyhelpers/static/node_modules/jju/package.json +34 -0
  289. handyhelpers/static/node_modules/jju/package.yaml +36 -0
  290. handyhelpers/static/node_modules/locate-path/index.d.ts +92 -0
  291. handyhelpers/static/node_modules/locate-path/index.js +77 -0
  292. handyhelpers/static/node_modules/locate-path/license +9 -0
  293. handyhelpers/static/node_modules/locate-path/package.json +48 -0
  294. handyhelpers/static/node_modules/locate-path/readme.md +123 -0
  295. handyhelpers/static/node_modules/lower-case/LICENSE +21 -0
  296. handyhelpers/static/node_modules/lower-case/README.md +35 -0
  297. handyhelpers/static/node_modules/lower-case/dist/index.d.ts +8 -0
  298. handyhelpers/static/node_modules/lower-case/dist/index.js +53 -0
  299. handyhelpers/static/node_modules/lower-case/dist/index.js.map +1 -0
  300. handyhelpers/static/node_modules/lower-case/dist/index.spec.d.ts +1 -0
  301. handyhelpers/static/node_modules/lower-case/dist/index.spec.js +36 -0
  302. handyhelpers/static/node_modules/lower-case/dist/index.spec.js.map +1 -0
  303. handyhelpers/static/node_modules/lower-case/dist.es2015/index.d.ts +8 -0
  304. handyhelpers/static/node_modules/lower-case/dist.es2015/index.js +48 -0
  305. handyhelpers/static/node_modules/lower-case/dist.es2015/index.js.map +1 -0
  306. handyhelpers/static/node_modules/lower-case/dist.es2015/index.spec.d.ts +1 -0
  307. handyhelpers/static/node_modules/lower-case/dist.es2015/index.spec.js +34 -0
  308. handyhelpers/static/node_modules/lower-case/dist.es2015/index.spec.js.map +1 -0
  309. handyhelpers/static/node_modules/lower-case/package.json +87 -0
  310. handyhelpers/static/node_modules/minify/ChangeLog +1307 -0
  311. handyhelpers/static/node_modules/minify/LICENSE +22 -0
  312. handyhelpers/static/node_modules/minify/README.md +177 -0
  313. handyhelpers/static/node_modules/minify/bin/minify.js +98 -0
  314. handyhelpers/static/node_modules/minify/deno.json +5 -0
  315. handyhelpers/static/node_modules/minify/help.json +8 -0
  316. handyhelpers/static/node_modules/minify/package.json +65 -0
  317. handyhelpers/static/node_modules/ms/index.js +162 -0
  318. handyhelpers/static/node_modules/ms/license.md +21 -0
  319. handyhelpers/static/node_modules/ms/package.json +38 -0
  320. handyhelpers/static/node_modules/ms/readme.md +59 -0
  321. handyhelpers/static/node_modules/no-case/LICENSE +21 -0
  322. handyhelpers/static/node_modules/no-case/README.md +37 -0
  323. handyhelpers/static/node_modules/no-case/dist/index.d.ts +10 -0
  324. handyhelpers/static/node_modules/no-case/dist/index.js +35 -0
  325. handyhelpers/static/node_modules/no-case/dist/index.js.map +1 -0
  326. handyhelpers/static/node_modules/no-case/dist/index.spec.d.ts +1 -0
  327. handyhelpers/static/node_modules/no-case/dist/index.spec.js +59 -0
  328. handyhelpers/static/node_modules/no-case/dist/index.spec.js.map +1 -0
  329. handyhelpers/static/node_modules/no-case/dist.es2015/index.d.ts +10 -0
  330. handyhelpers/static/node_modules/no-case/dist.es2015/index.js +31 -0
  331. handyhelpers/static/node_modules/no-case/dist.es2015/index.js.map +1 -0
  332. handyhelpers/static/node_modules/no-case/dist.es2015/index.spec.d.ts +1 -0
  333. handyhelpers/static/node_modules/no-case/dist.es2015/index.spec.js +57 -0
  334. handyhelpers/static/node_modules/no-case/dist.es2015/index.spec.js.map +1 -0
  335. handyhelpers/static/node_modules/no-case/package.json +85 -0
  336. handyhelpers/static/node_modules/p-limit/index.d.ts +40 -0
  337. handyhelpers/static/node_modules/p-limit/index.js +68 -0
  338. handyhelpers/static/node_modules/p-limit/license +9 -0
  339. handyhelpers/static/node_modules/p-limit/package.json +54 -0
  340. handyhelpers/static/node_modules/p-limit/readme.md +99 -0
  341. handyhelpers/static/node_modules/p-locate/index.d.ts +49 -0
  342. handyhelpers/static/node_modules/p-locate/index.js +48 -0
  343. handyhelpers/static/node_modules/p-locate/license +9 -0
  344. handyhelpers/static/node_modules/p-locate/package.json +56 -0
  345. handyhelpers/static/node_modules/p-locate/readme.md +91 -0
  346. handyhelpers/static/node_modules/param-case/LICENSE +21 -0
  347. handyhelpers/static/node_modules/param-case/README.md +37 -0
  348. handyhelpers/static/node_modules/param-case/dist/index.d.ts +3 -0
  349. handyhelpers/static/node_modules/param-case/dist/index.js +11 -0
  350. handyhelpers/static/node_modules/param-case/dist/index.js.map +1 -0
  351. handyhelpers/static/node_modules/param-case/dist/index.spec.d.ts +1 -0
  352. handyhelpers/static/node_modules/param-case/dist/index.spec.js +24 -0
  353. handyhelpers/static/node_modules/param-case/dist/index.spec.js.map +1 -0
  354. handyhelpers/static/node_modules/param-case/dist.es2015/index.d.ts +3 -0
  355. handyhelpers/static/node_modules/param-case/dist.es2015/index.js +7 -0
  356. handyhelpers/static/node_modules/param-case/dist.es2015/index.js.map +1 -0
  357. handyhelpers/static/node_modules/param-case/dist.es2015/index.spec.d.ts +1 -0
  358. handyhelpers/static/node_modules/param-case/dist.es2015/index.spec.js +22 -0
  359. handyhelpers/static/node_modules/param-case/dist.es2015/index.spec.js.map +1 -0
  360. handyhelpers/static/node_modules/param-case/package.json +91 -0
  361. handyhelpers/static/node_modules/pascal-case/LICENSE +21 -0
  362. handyhelpers/static/node_modules/pascal-case/README.md +47 -0
  363. handyhelpers/static/node_modules/pascal-case/dist/index.d.ts +5 -0
  364. handyhelpers/static/node_modules/pascal-case/dist/index.js +24 -0
  365. handyhelpers/static/node_modules/pascal-case/dist/index.js.map +1 -0
  366. handyhelpers/static/node_modules/pascal-case/dist/index.spec.d.ts +1 -0
  367. handyhelpers/static/node_modules/pascal-case/dist/index.spec.js +25 -0
  368. handyhelpers/static/node_modules/pascal-case/dist/index.spec.js.map +1 -0
  369. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.d.ts +5 -0
  370. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.js +18 -0
  371. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.js.map +1 -0
  372. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.spec.d.ts +1 -0
  373. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.spec.js +23 -0
  374. handyhelpers/static/node_modules/pascal-case/dist.es2015/index.spec.js.map +1 -0
  375. handyhelpers/static/node_modules/pascal-case/package.json +90 -0
  376. handyhelpers/static/node_modules/path-exists/index.d.ts +31 -0
  377. handyhelpers/static/node_modules/path-exists/index.js +19 -0
  378. handyhelpers/static/node_modules/path-exists/license +9 -0
  379. handyhelpers/static/node_modules/path-exists/package.json +41 -0
  380. handyhelpers/static/node_modules/path-exists/readme.md +52 -0
  381. handyhelpers/static/node_modules/readjson/ChangeLog +110 -0
  382. handyhelpers/static/node_modules/readjson/LICENSE +21 -0
  383. handyhelpers/static/node_modules/readjson/README.md +36 -0
  384. handyhelpers/static/node_modules/readjson/package.json +46 -0
  385. handyhelpers/static/node_modules/relateurl/README.md +159 -0
  386. handyhelpers/static/node_modules/relateurl/license +21 -0
  387. handyhelpers/static/node_modules/relateurl/package.json +46 -0
  388. handyhelpers/static/node_modules/simport/ChangeLog +77 -0
  389. handyhelpers/static/node_modules/simport/LICENSE +21 -0
  390. handyhelpers/static/node_modules/simport/README.md +81 -0
  391. handyhelpers/static/node_modules/simport/fixture/context.js +3 -0
  392. handyhelpers/static/node_modules/simport/fixture/default-frozen-function.mjs +2 -0
  393. handyhelpers/static/node_modules/simport/fixture/default-frozen-object.mjs +2 -0
  394. handyhelpers/static/node_modules/simport/package.json +65 -0
  395. handyhelpers/static/node_modules/simport/simport.js +84 -0
  396. handyhelpers/static/node_modules/simport/simport.mjs +22 -0
  397. handyhelpers/static/node_modules/source-map/CHANGELOG.md +301 -0
  398. handyhelpers/static/node_modules/source-map/LICENSE +28 -0
  399. handyhelpers/static/node_modules/source-map/README.md +742 -0
  400. handyhelpers/static/node_modules/source-map/dist/source-map.debug.js +3234 -0
  401. handyhelpers/static/node_modules/source-map/dist/source-map.js +3233 -0
  402. handyhelpers/static/node_modules/source-map/dist/source-map.min.js +2 -0
  403. handyhelpers/static/node_modules/source-map/dist/source-map.min.js.map +1 -0
  404. handyhelpers/static/node_modules/source-map/package.json +73 -0
  405. handyhelpers/static/node_modules/source-map/source-map.d.ts +98 -0
  406. handyhelpers/static/node_modules/source-map/source-map.js +8 -0
  407. handyhelpers/static/node_modules/source-map-support/LICENSE.md +21 -0
  408. handyhelpers/static/node_modules/source-map-support/README.md +284 -0
  409. handyhelpers/static/node_modules/source-map-support/browser-source-map-support.js +114 -0
  410. handyhelpers/static/node_modules/source-map-support/package.json +31 -0
  411. handyhelpers/static/node_modules/source-map-support/register-hook-require.js +1 -0
  412. handyhelpers/static/node_modules/source-map-support/register.js +1 -0
  413. handyhelpers/static/node_modules/source-map-support/source-map-support.js +625 -0
  414. handyhelpers/static/node_modules/terser/CHANGELOG.md +783 -0
  415. handyhelpers/static/node_modules/terser/LICENSE +27 -0
  416. handyhelpers/static/node_modules/terser/PATRONS.md +15 -0
  417. handyhelpers/static/node_modules/terser/README.md +1421 -0
  418. handyhelpers/static/node_modules/terser/bin/package.json +10 -0
  419. handyhelpers/static/node_modules/terser/bin/terser +21 -0
  420. handyhelpers/static/node_modules/terser/bin/uglifyjs +10 -0
  421. handyhelpers/static/node_modules/terser/dist/.gitkeep +0 -0
  422. handyhelpers/static/node_modules/terser/dist/bundle.min.js +32962 -0
  423. handyhelpers/static/node_modules/terser/dist/package.json +10 -0
  424. handyhelpers/static/node_modules/terser/main.js +27 -0
  425. handyhelpers/static/node_modules/terser/node_modules/commander/CHANGELOG.md +419 -0
  426. handyhelpers/static/node_modules/terser/node_modules/commander/LICENSE +22 -0
  427. handyhelpers/static/node_modules/terser/node_modules/commander/Readme.md +428 -0
  428. handyhelpers/static/node_modules/terser/node_modules/commander/index.js +1224 -0
  429. handyhelpers/static/node_modules/terser/node_modules/commander/package.json +38 -0
  430. handyhelpers/static/node_modules/terser/node_modules/commander/typings/index.d.ts +310 -0
  431. handyhelpers/static/node_modules/terser/package.json +153 -0
  432. handyhelpers/static/node_modules/terser/tools/domprops.js +9026 -0
  433. handyhelpers/static/node_modules/terser/tools/exit.cjs +7 -0
  434. handyhelpers/static/node_modules/terser/tools/props.html +68 -0
  435. handyhelpers/static/node_modules/terser/tools/terser.d.ts +216 -0
  436. handyhelpers/static/node_modules/tippy.js/LICENSE +21 -0
  437. handyhelpers/static/node_modules/tippy.js/README.md +63 -0
  438. handyhelpers/static/node_modules/tippy.js/animations/perspective-extreme.css +1 -0
  439. handyhelpers/static/node_modules/tippy.js/animations/perspective-subtle.css +1 -0
  440. handyhelpers/static/node_modules/tippy.js/animations/perspective.css +1 -0
  441. handyhelpers/static/node_modules/tippy.js/animations/scale-extreme.css +1 -0
  442. handyhelpers/static/node_modules/tippy.js/animations/scale-subtle.css +1 -0
  443. handyhelpers/static/node_modules/tippy.js/animations/scale.css +1 -0
  444. handyhelpers/static/node_modules/tippy.js/animations/shift-away-extreme.css +1 -0
  445. handyhelpers/static/node_modules/tippy.js/animations/shift-away-subtle.css +1 -0
  446. handyhelpers/static/node_modules/tippy.js/animations/shift-away.css +1 -0
  447. handyhelpers/static/node_modules/tippy.js/animations/shift-toward-extreme.css +1 -0
  448. handyhelpers/static/node_modules/tippy.js/animations/shift-toward-subtle.css +1 -0
  449. handyhelpers/static/node_modules/tippy.js/animations/shift-toward.css +1 -0
  450. handyhelpers/static/node_modules/tippy.js/dist/backdrop.css +1 -0
  451. handyhelpers/static/node_modules/tippy.js/dist/border.css +1 -0
  452. handyhelpers/static/node_modules/tippy.js/dist/svg-arrow.css +1 -0
  453. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.js +2516 -0
  454. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.js.map +1 -0
  455. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.min.js +2 -0
  456. handyhelpers/static/node_modules/tippy.js/dist/tippy-bundle.umd.min.js.map +1 -0
  457. handyhelpers/static/node_modules/tippy.js/dist/tippy.cjs.js +2497 -0
  458. handyhelpers/static/node_modules/tippy.js/dist/tippy.cjs.js.map +1 -0
  459. handyhelpers/static/node_modules/tippy.js/dist/tippy.css +1 -0
  460. handyhelpers/static/node_modules/tippy.js/dist/tippy.esm.js +2486 -0
  461. handyhelpers/static/node_modules/tippy.js/dist/tippy.esm.js.map +1 -0
  462. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.js +2496 -0
  463. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.js.map +1 -0
  464. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.min.js +2 -0
  465. handyhelpers/static/node_modules/tippy.js/dist/tippy.umd.min.js.map +1 -0
  466. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.cjs.js +2388 -0
  467. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.cjs.js.map +1 -0
  468. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.esm.js +2377 -0
  469. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.esm.js.map +1 -0
  470. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.js +2382 -0
  471. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.js.map +1 -0
  472. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.min.js +2 -0
  473. handyhelpers/static/node_modules/tippy.js/headless/dist/tippy-headless.umd.min.js.map +1 -0
  474. handyhelpers/static/node_modules/tippy.js/headless/package.json +16 -0
  475. handyhelpers/static/node_modules/tippy.js/index.d.ts +260 -0
  476. handyhelpers/static/node_modules/tippy.js/package.json +157 -0
  477. handyhelpers/static/node_modules/tippy.js/themes/light-border.css +1 -0
  478. handyhelpers/static/node_modules/tippy.js/themes/light.css +1 -0
  479. handyhelpers/static/node_modules/tippy.js/themes/material.css +1 -0
  480. handyhelpers/static/node_modules/tippy.js/themes/translucent.css +1 -0
  481. handyhelpers/static/node_modules/try-catch/ChangeLog +55 -0
  482. handyhelpers/static/node_modules/try-catch/LICENSE +21 -0
  483. handyhelpers/static/node_modules/try-catch/README.md +38 -0
  484. handyhelpers/static/node_modules/try-catch/package.json +34 -0
  485. handyhelpers/static/node_modules/try-to-catch/ChangeLog +64 -0
  486. handyhelpers/static/node_modules/try-to-catch/LICENSE +21 -0
  487. handyhelpers/static/node_modules/try-to-catch/README.md +74 -0
  488. handyhelpers/static/node_modules/try-to-catch/package.json +47 -0
  489. handyhelpers/static/node_modules/tslib/CopyrightNotice.txt +15 -0
  490. handyhelpers/static/node_modules/tslib/LICENSE.txt +12 -0
  491. handyhelpers/static/node_modules/tslib/README.md +164 -0
  492. handyhelpers/static/node_modules/tslib/SECURITY.md +41 -0
  493. handyhelpers/static/node_modules/tslib/modules/index.d.ts +38 -0
  494. handyhelpers/static/node_modules/tslib/modules/index.js +70 -0
  495. handyhelpers/static/node_modules/tslib/modules/package.json +3 -0
  496. handyhelpers/static/node_modules/tslib/package.json +47 -0
  497. handyhelpers/static/node_modules/tslib/tslib.d.ts +460 -0
  498. handyhelpers/static/node_modules/tslib/tslib.es6.html +1 -0
  499. handyhelpers/static/node_modules/tslib/tslib.es6.js +402 -0
  500. handyhelpers/static/node_modules/tslib/tslib.es6.mjs +401 -0
  501. handyhelpers/static/node_modules/tslib/tslib.html +1 -0
  502. handyhelpers/static/node_modules/tslib/tslib.js +484 -0
  503. handyhelpers/static/node_modules/uglify-js/LICENSE +29 -0
  504. handyhelpers/static/node_modules/uglify-js/README.md +1479 -0
  505. handyhelpers/static/node_modules/uglify-js/bin/uglifyjs +624 -0
  506. handyhelpers/static/node_modules/uglify-js/package.json +56 -0
  507. handyhelpers/static/node_modules/uglify-js/tools/domprops.html +456 -0
  508. handyhelpers/static/node_modules/uglify-js/tools/domprops.json +8327 -0
  509. handyhelpers/static/node_modules/uglify-js/tools/exports.js +8 -0
  510. handyhelpers/static/node_modules/uglify-js/tools/node.js +115 -0
  511. handyhelpers/static/node_modules/uglify-js/tools/tty.js +22 -0
  512. handyhelpers/static/node_modules/unicorn-magic/default.js +14 -0
  513. handyhelpers/static/node_modules/unicorn-magic/index.d.ts +29 -0
  514. handyhelpers/static/node_modules/unicorn-magic/license +9 -0
  515. handyhelpers/static/node_modules/unicorn-magic/node.js +7 -0
  516. handyhelpers/static/node_modules/unicorn-magic/package.json +49 -0
  517. handyhelpers/static/node_modules/unicorn-magic/readme.md +25 -0
  518. handyhelpers/static/node_modules/yocto-queue/index.d.ts +61 -0
  519. handyhelpers/static/node_modules/yocto-queue/index.js +78 -0
  520. handyhelpers/static/node_modules/yocto-queue/license +9 -0
  521. handyhelpers/static/node_modules/yocto-queue/package.json +48 -0
  522. handyhelpers/static/node_modules/yocto-queue/readme.md +70 -0
  523. handyhelpers/static/package.json +3 -1
  524. handyhelpers/static/yarn.lock +393 -20
  525. handyhelpers/templates/handyhelpers/generic/bs5/generic_index.html +5 -8
  526. handyhelpers/templates/handyhelpers/handyhelpers_base_bs5.htm +5 -1
  527. handyhelpers/templates/handyhelpers/handyhelpers_with_sidebar.htm +50 -3
  528. handyhelpers/templates/handyhelpers/htmx/bs5/filter_form/generic_modal_swap.htm +48 -0
  529. handyhelpers/templates/handyhelpers/htmx/bs5/form/form_wrapper.htm +48 -0
  530. handyhelpers/templates/handyhelpers/htmx/bs5/form/inline_form.htm +166 -0
  531. handyhelpers/templates/handyhelpers/htmx/bs5/form/inline_form_disabled.htm +125 -0
  532. handyhelpers/templates/handyhelpers/htmx/bs5/generic_modal_swap.htm +2 -3
  533. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/content_title.htm +38 -0
  534. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/controls.htm +21 -0
  535. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/examples/card.htm +17 -0
  536. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/examples/list.htm +11 -0
  537. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/examples/table.htm +21 -0
  538. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/filter_form_modal_swap.htm +48 -0
  539. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/full.html +6 -0
  540. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_card.htm +7 -0
  541. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_list.htm +7 -0
  542. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_minimal.htm +7 -0
  543. handyhelpers/templates/handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_table.htm +18 -0
  544. handyhelpers/templates/handyhelpers/htmx/bs5/index.htm +34 -0
  545. handyhelpers/templates/handyhelpers/report/annual_stats.html +6 -0
  546. handyhelpers/templates/handyhelpers/report/annual_stats_content.htm +43 -0
  547. handyhelpers/templates/handyhelpers/report/chartjs/annual_progress_chart.htm +1 -1
  548. handyhelpers/templates/handyhelpers/report/chartjs/annual_progress_content.htm +40 -39
  549. handyhelpers/templates/handyhelpers/report/chartjs/annual_stats.html +25 -36
  550. handyhelpers/templates/handyhelpers/report/chartjs/annual_trends_content.htm +35 -34
  551. handyhelpers/templates/handyhelpers/report/chartjs/day_count_chart.htm +1 -1
  552. handyhelpers/templates/handyhelpers/report/chartjs/month_count_chart.htm +1 -1
  553. handyhelpers/templates/handyhelpers/report/chartjs/week_count_chart.htm +1 -1
  554. handyhelpers/templates/handyhelpers/report/chartjs/year_count_chart.htm +1 -1
  555. handyhelpers/templatetags/form_tags.py +47 -0
  556. handyhelpers/templatetags/htmx_tags.py +21 -0
  557. handyhelpers/views/action.py +3 -1
  558. handyhelpers/views/calendar.py +33 -14
  559. handyhelpers/views/htmx.py +396 -4
  560. handyhelpers/views/report.py +12 -5
  561. handyhelpers/management/commands/generate_admin.py +0 -110
  562. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/format.js +0 -9
  563. handyhelpers/static/node_modules/@popperjs/core/dist/esm/utils/validateModifiers.js +0 -81
  564. handyhelpers/static/node_modules/@popperjs/core/lib/utils/format.d.ts +0 -1
  565. handyhelpers/static/node_modules/@popperjs/core/lib/utils/format.js +0 -9
  566. handyhelpers/static/node_modules/@popperjs/core/lib/utils/format.js.flow +0 -5
  567. handyhelpers/static/node_modules/@popperjs/core/lib/utils/validateModifiers.d.ts +0 -1
  568. handyhelpers/static/node_modules/@popperjs/core/lib/utils/validateModifiers.js +0 -81
  569. handyhelpers/static/node_modules/@popperjs/core/lib/utils/validateModifiers.js.flow +0 -151
  570. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/LICENSE +0 -0
  571. {django_handyhelpers-0.3.20.dist-info → django_handyhelpers-0.3.35.dist-info}/top_level.txt +0 -0
@@ -1,10 +1,11 @@
1
1
  from django.conf import settings
2
2
  from django.http import HttpResponse
3
3
  from django.template import loader
4
- from django.shortcuts import render
4
+ from django.shortcuts import render, reverse
5
5
  from django.utils import timezone
6
- from django.views.generic import View
7
- from handyhelpers.mixins.view_mixins import HtmxViewMixin
6
+ from django.views.generic import DetailView, View
7
+ from handyhelpers.mixins.view_mixins import FilterByQueryParamsMixin, HtmxViewMixin
8
+ from handyhelpers.views.gui import HandyHelperIndexView
8
9
 
9
10
 
10
11
  class BuildBootstrapModalView(HtmxViewMixin, View):
@@ -103,7 +104,6 @@ class HtmxSidebarItems(HtmxViewMixin, View):
103
104
  return render(request, self.template_name, self.context)
104
105
 
105
106
 
106
-
107
107
  class BuildModelSidebarNav(HtmxViewMixin, View):
108
108
  """Dynamically build a sidebar navigation menu where items included are sourced from application models.
109
109
  This is intended handyhelpers_with_sidebar.htm or similar template.
@@ -149,3 +149,395 @@ class BuildModelSidebarNav(HtmxViewMixin, View):
149
149
  menu_item_list=self.menu_item_list,
150
150
  )
151
151
  return render(request, self.template_name, context)
152
+
153
+
154
+ class ModelDetailBootstrapModalView(BuildBootstrapModalView):
155
+ modal_button_submit = None
156
+ modal_template = None
157
+ model = None
158
+
159
+ def get(self, request, *args, **kwargs):
160
+ context = {}
161
+ context["object"] = self.model.objects.get(pk=kwargs["pk"])
162
+ if self.modal_title == None:
163
+ self.modal_title = f"{self.model._meta.object_name} Details"
164
+ if self.modal_subtitle == None:
165
+ self.modal_subtitle = context["object"]
166
+ self.modal_body = loader.render_to_string(self.modal_template, context=context)
167
+ return super().get(request, *args, **kwargs)
168
+
169
+
170
+ class HtmxPostForm(HtmxViewMixin, View):
171
+
172
+ form = None
173
+ template_name = "handyhelpers/htmx/bs5/form/form_wrapper.htm"
174
+
175
+ def post(self, request, *args, **kwargs):
176
+
177
+ if not self.is_htmx():
178
+ return HttpResponse("Invalid request", status=400)
179
+ context = {}
180
+ form = self.form(request.POST)
181
+ if form.is_valid():
182
+ form.save()
183
+ context["success"] = True
184
+ context["form"] = self.form()
185
+ else:
186
+ context["form"] = form
187
+ return render(request, self.template_name, context)
188
+
189
+
190
+ class CreateModelModalView(BuildBootstrapModalView):
191
+ """ """
192
+
193
+ modal_button_submit = "Create"
194
+ modal_title = None
195
+ form = None
196
+ form_display = "bs5"
197
+
198
+ def get(self, request, *args, **kwargs):
199
+ if not self.is_htmx():
200
+ return HttpResponse("Invalid request", status=400)
201
+ if not self.form:
202
+ return HttpResponse("Invalid request", status=400)
203
+
204
+ form_errors = request.session.get(f"{self.form.__name__}__errors")
205
+ if self.form and form_errors:
206
+ data = request.session.get(f"{self.form.__name__}__data")
207
+ form = self.form()
208
+ form.data = data
209
+ for field, error_message in form_errors.items():
210
+ try:
211
+ form.add_error(field, error_message)
212
+ except:
213
+ pass
214
+ else:
215
+ form = self.form()
216
+
217
+ context = {
218
+ "modal_title": (
219
+ self.modal_title
220
+ if self.modal_title
221
+ else f"Create {self.form.Meta.model._meta.object_name}"
222
+ ),
223
+ "modal_subtitle": self.modal_subtitle,
224
+ "modal_body": self.modal_body,
225
+ "modal_size": self.modal_size,
226
+ "modal_button_close": self.modal_button_close,
227
+ "modal_button_submit": self.modal_button_submit,
228
+ "data": self.data,
229
+ "extra_data": self.extra_data,
230
+ "form": form,
231
+ "form_display": self.form_display,
232
+ }
233
+ return render(request, self.template_name, context)
234
+
235
+ def post(self, request, *args, **kwargs):
236
+ form = self.form(request.POST)
237
+ if form.is_valid():
238
+ obj = form.save()
239
+ response = HttpResponse(status=204)
240
+ response["X-Toast-Message"] = (
241
+ f"""{obj._meta.object_name} '{obj}' created!"""
242
+ )
243
+ del request.session[f"{self.form.__name__}__errors"]
244
+ del request.session[f"{self.form.__name__}__data"]
245
+ return response
246
+ else:
247
+ form_error_dict = {}
248
+ for k, v in form.errors.as_data().items():
249
+ form_error_dict[k] = str(v[0].messages[0])
250
+ request.session[f"{self.form.__name__}__errors"] = form_error_dict
251
+ request.session[f"{self.form.__name__}__data"] = form.data
252
+ response = HttpResponse(status=400)
253
+ response["X-Toast-Message"] = (
254
+ f"""<span class="text-danger">Failed to create new {self.form.Meta.model._meta.object_name}</span>"""
255
+ )
256
+ return response
257
+
258
+
259
+ class HtmxOptionView(HtmxViewMixin, View):
260
+ template_name = None
261
+ htmx_template_name = None
262
+ context = {}
263
+
264
+ def get(self, request):
265
+ if self.is_htmx() and self.template_name:
266
+ template_name = self.htmx_template_name
267
+ else:
268
+ template_name = self.template_name
269
+ return render(request, template_name, self.context)
270
+
271
+
272
+ class HtmxOptionDetailView(HtmxViewMixin, DetailView):
273
+ template_name = None
274
+ htmx_template_name = None
275
+ initialize_tables = None
276
+
277
+ def render_to_response(self, context, **response_kwargs):
278
+ response = super().render_to_response(context, **response_kwargs)
279
+ if self.initialize_tables:
280
+ response["X-Initialize-Tables"] = "initialize-tables"
281
+ return response
282
+
283
+ def get(self, request, *args, **kwargs):
284
+ if self.is_htmx() and self.htmx_template_name:
285
+ self.template_name = self.htmx_template_name
286
+ return super().get(request, *args, **kwargs)
287
+
288
+
289
+ class HtmxOptionMultiView(HtmxViewMixin, View):
290
+ title = None
291
+ subtitle = None
292
+ model = None
293
+ template_name = None
294
+ htmx_template_name = None
295
+ htmx_card_template_name = None
296
+ htmx_custom_template_name = None
297
+ htmx_index_template_name = None
298
+ htmx_list_template_name = None
299
+ htmx_minimal_template_name = None
300
+ htmx_table_template_name = None
301
+ htmx_table_wrapper_template_name = "handyhelpers/htmx/bs5/table_wrapper.htm"
302
+ context = {}
303
+ queryset = None
304
+
305
+ def get(self, request, **kwargs):
306
+ template_name = None
307
+ if self.queryset is not None:
308
+ self.queryset._result_cache = None
309
+ if self.is_htmx():
310
+ display = kwargs.get("display", None)
311
+ if display:
312
+ if display == "card" and self.htmx_card_template_name:
313
+ template_name = self.htmx_card_template_name
314
+ elif display == "custom" and self.htmx_custom_template_name:
315
+ template_name = self.htmx_custom_template_name
316
+ elif display == "index" and self.htmx_index_template_name:
317
+ template_name = self.htmx_index_template_name
318
+ elif display == "list" and self.htmx_list_template_name:
319
+ template_name = self.htmx_list_template_name
320
+ elif display == "minimal" and self.htmx_minimal_template_name:
321
+ template_name = self.htmx_minimal_template_name
322
+ elif display == "table" and self.htmx_table_wrapper_template_name:
323
+ template_name = self.htmx_table_wrapper_template_name
324
+ self.context["table"] = self.htmx_table_template_name
325
+ elif self.htmx_template_name:
326
+ template_name = self.htmx_template_name
327
+ else:
328
+ return HttpResponse("", content_type="text/plain")
329
+ else:
330
+ template_name = self.template_name
331
+ if self.queryset:
332
+ self.context["queryset"] = self.queryset
333
+ elif self.model:
334
+ self.context["queryset"] = self.model.objects.all()
335
+
336
+ if self.title:
337
+ self.context["title"] = self.title
338
+ elif self.model:
339
+ self.context["title"] = self.model._meta.verbose_name_plural.title()
340
+
341
+ self.context["subtitle"] = self.subtitle
342
+ return render(request, template_name, self.context)
343
+
344
+
345
+ class HtmxOptionMultiFilterView(FilterByQueryParamsMixin, HtmxViewMixin, View):
346
+ context = {}
347
+ default_display = "table"
348
+ filter_form = None
349
+ htmx_card_template_name = None
350
+ htmx_card_wrapper_template_name = (
351
+ "handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_card.htm"
352
+ )
353
+ htmx_list_template_name = None
354
+ htmx_list_wrapper_template_name = (
355
+ "handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_list.htm"
356
+ )
357
+ htmx_minimal_template_name = None
358
+ htmx_minimal_wrapper_template_name = (
359
+ "handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_minimal.htm"
360
+ )
361
+ htmx_table_template_name = None
362
+ htmx_table_wrapper_template_name = (
363
+ "handyhelpers/htmx/bs5/htmx_option_multi_filter_view/wrapper_table.htm"
364
+ )
365
+ htmx_template_name = None
366
+ model = None
367
+ queryset = None
368
+ subtitle = None
369
+ template_name = "handyhelpers/htmx/bs5/htmx_option_multi_filter_view/full.html"
370
+ title = None
371
+
372
+ def get(self, request, post_data={}, *args, **kwargs):
373
+ page_description = request.GET.get("page_description", None)
374
+ control_list = []
375
+ display = kwargs.get("display", None)
376
+ if not display:
377
+ display = self.default_display
378
+ root_url = reverse(
379
+ f"{request.resolver_match.app_name}:{request.resolver_match.url_name}"
380
+ ).replace("//", "/")
381
+ query_params = request.GET
382
+ template_name = None
383
+
384
+ if post_data:
385
+ query_string = ""
386
+ url = f"""{root_url}?"""
387
+ for key, value in post_data.items():
388
+ if value:
389
+ url += f"{key}={value}&"
390
+ query_string += f"{key}={value}&"
391
+ elif query_params:
392
+ query_string = query_params.urlencode()
393
+ url = f"{root_url}{display}?{query_string}"
394
+ else:
395
+ query_string = ""
396
+ url = f"{root_url}{display}"
397
+
398
+ if self.queryset is not None:
399
+ self.queryset._result_cache = None
400
+ if self.is_htmx():
401
+ if display == "card" and self.htmx_card_wrapper_template_name:
402
+ template_name = self.htmx_card_wrapper_template_name
403
+ self.context["item_content"] = self.htmx_card_template_name
404
+ elif display == "list" and self.htmx_list_wrapper_template_name:
405
+ template_name = self.htmx_list_wrapper_template_name
406
+ self.context["item_content"] = self.htmx_list_template_name
407
+ elif display == "minimal" and self.htmx_minimal_template_name:
408
+ template_name = self.htmx_minimal_wrapper_template_name
409
+ self.context["item_content"] = self.htmx_minimal_template_name
410
+ elif display == "table" and self.htmx_table_wrapper_template_name:
411
+ template_name = self.htmx_table_wrapper_template_name
412
+ self.context["item_content"] = self.htmx_table_template_name
413
+ elif self.htmx_template_name:
414
+ template_name = self.htmx_template_name
415
+ else:
416
+ template_name = self.template_name
417
+
418
+ # add display controls
419
+ if self.htmx_card_template_name:
420
+ control_list.append(
421
+ {
422
+ "name": "card",
423
+ "icon": """<i class="fa-regular fa-square"></i>""",
424
+ "url": (
425
+ f"{root_url}card/?{query_string}"
426
+ if query_string
427
+ else f"{root_url}card/"
428
+ ),
429
+ }
430
+ )
431
+ if self.htmx_list_template_name:
432
+ control_list.append(
433
+ {
434
+ "name": "list",
435
+ "icon": """<i class="fa-solid fa-list-ul"></i>""",
436
+ "url": (
437
+ f"{root_url}list/?{query_string}"
438
+ if query_string
439
+ else f"{root_url}list/"
440
+ ),
441
+ }
442
+ )
443
+ if self.htmx_minimal_template_name:
444
+ control_list.append(
445
+ {
446
+ "name": "minimal",
447
+ "icon": """<i class="fa-solid fa-compress"></i>""",
448
+ "url": (
449
+ f"{root_url}minimal/?{query_string}"
450
+ if query_string
451
+ else f"{root_url}minimal/"
452
+ ),
453
+ }
454
+ )
455
+ if self.htmx_table_template_name:
456
+ control_list.append(
457
+ {
458
+ "name": "table",
459
+ "icon": """<i class="fa-solid fa-table"></i>""",
460
+ "url": (
461
+ f"{root_url}table/?{query_string}"
462
+ if query_string
463
+ else f"{root_url}table/"
464
+ ),
465
+ }
466
+ )
467
+
468
+ if self.queryset == None and self.model:
469
+ self.queryset = self.model.objects.all()
470
+ if post_data:
471
+ self.queryset = self.queryset.filter(**post_data)
472
+ elif query_params:
473
+ self.queryset = self.filter_by_query_params()
474
+ self.context["queryset"] = self.queryset
475
+ self.context["title"] = self.title
476
+ self.context["control_list"] = control_list
477
+ self.context["display"] = display
478
+ self.context["filter_form"] = self.filter_form
479
+ self.context["htmx_template_name"] = template_name
480
+ self.context["page_description"] = page_description
481
+ self.context["query_string"] = query_string
482
+ self.context["root_url"] = root_url
483
+ self.context["subtitle"] = self.subtitle
484
+ self.context["url"] = url
485
+
486
+ response = render(request, template_name, self.context)
487
+ if self.is_htmx():
488
+ response["X-Initialize-Tables"] = "initialize-tables"
489
+ return response
490
+
491
+ def post(self, request, *args, **kwargs):
492
+ """build filter string from form fields and call get method to update queryset"""
493
+ form = self.filter_form(request.POST)
494
+ if form.is_valid():
495
+ post_data = {
496
+ key: value for key, value in request.POST.dict().items() if value
497
+ }
498
+ return self.get(request, post_data, *args, **kwargs)
499
+
500
+
501
+ class HtmxItemizedView(HtmxViewMixin, HandyHelperIndexView):
502
+ template_name = "handyhelpers/generic/bs5/generic_index.html"
503
+ htmx_template_name = "handyhelpers/htmx/bs5/index.htm"
504
+
505
+ def get(self, request, *args, **kwargs):
506
+ if self.is_htmx() and self.htmx_template_name:
507
+ self.template_name = self.htmx_template_name
508
+ return super().get(request, *args, **kwargs)
509
+
510
+
511
+ class HtmxFilterModalView(BuildBootstrapModalView):
512
+ """Render a modal containing a filter form"""
513
+
514
+ form = None
515
+ form_display = "bs5"
516
+ modal_button_submit = "Filter"
517
+ modal_title = "Filter"
518
+ template_name = (
519
+ "handyhelpers/htmx/bs5/htmx_option_multi_filter_view/filter_form_modal_swap.htm"
520
+ )
521
+
522
+ def get(self, request, *args, **kwargs):
523
+ if not self.is_htmx():
524
+ return HttpResponse("Invalid request", status=400)
525
+ if not self.form:
526
+ return HttpResponse("Invalid request", status=400)
527
+
528
+ list_display = request.GET.get("display", None)
529
+
530
+ context = {
531
+ "data": self.data,
532
+ "display": list_display,
533
+ "extra_data": self.extra_data,
534
+ "form": self.form,
535
+ "form_display": self.form_display,
536
+ "modal_body": self.modal_body,
537
+ "modal_button_close": self.modal_button_close,
538
+ "modal_button_submit": self.modal_button_submit,
539
+ "modal_size": self.modal_size,
540
+ "modal_subtitle": self.modal_subtitle,
541
+ "modal_title": self.modal_title,
542
+ }
543
+ return render(request, self.template_name, context)
@@ -5,6 +5,7 @@ from django.conf import settings
5
5
  import datetime
6
6
  import calendar
7
7
  from dateutil.rrule import rrule, MONTHLY
8
+ from handyhelpers.mixins.view_mixins import HtmxViewMixin
8
9
 
9
10
 
10
11
  def get_color_list():
@@ -44,7 +45,7 @@ def get_annual_timestamps(start=None, end=None, reverse=False):
44
45
  if not end:
45
46
  end = timezone.now()
46
47
  if not start:
47
- start = end - datetime.timedelta(365)
48
+ start = end - datetime.timedelta(366)
48
49
  if reverse:
49
50
  data = [d.replace(day=1) for d in rrule(MONTHLY, dtstart=start, until=end)]
50
51
  else:
@@ -234,7 +235,7 @@ def build_day_week_month_year_charts(dataset_list):
234
235
  return return_dataset_list
235
236
 
236
237
 
237
- class AnnualStatView(View):
238
+ class AnnualStatView(HtmxViewMixin, View):
238
239
  """
239
240
  Description:
240
241
  Tallies the number of entries added over the past year. Included are counts of entries sectioned by
@@ -258,10 +259,12 @@ class AnnualStatView(View):
258
259
  base_template = getattr(settings, 'BASE_TEMPLATE', 'handyhelpers/handyhelpers_base.htm')
259
260
  title = 'Annual Statistics Report'
260
261
  sub_title = None
261
- template_name = 'handyhelpers/report/chartjs/annual_stats.html'
262
+ template_name = 'handyhelpers/report/annual_stats.html'
262
263
  dataset_list = list()
263
264
 
264
265
  def get(self, request):
266
+ if self.is_htmx():
267
+ self.template_name = 'handyhelpers/report/annual_stats_content.htm'
265
268
  context = dict()
266
269
  context['base_template'] = self.base_template
267
270
  context['title'] = self.title
@@ -293,7 +296,7 @@ class AnnualStatView(View):
293
296
  return render(request, self.template_name, context)
294
297
 
295
298
 
296
- class AnnualTrendView(View):
299
+ class AnnualTrendView(HtmxViewMixin, View):
297
300
  """
298
301
  Description:
299
302
  Tallies the number of elements processed over the past year. Included are counts of elements processed in the
@@ -320,6 +323,8 @@ class AnnualTrendView(View):
320
323
  dataset_list = list()
321
324
 
322
325
  def get(self, request):
326
+ if self.is_htmx():
327
+ self.template_name = 'handyhelpers/report/chartjs/annual_trends_content.htm'
323
328
  context = dict()
324
329
  context['base_template'] = self.base_template
325
330
  context['title'] = self.title
@@ -334,7 +339,7 @@ class AnnualTrendView(View):
334
339
  return render(request, self.template_name, context)
335
340
 
336
341
 
337
- class AnnualProgressView(View):
342
+ class AnnualProgressView(HtmxViewMixin, View):
338
343
  """
339
344
  Description:
340
345
  Show the current number of elements per dataset and chart showing counts of data added per month over the
@@ -359,6 +364,8 @@ class AnnualProgressView(View):
359
364
  dataset_list = list()
360
365
 
361
366
  def get(self, request):
367
+ if self.is_htmx():
368
+ self.template_name = 'handyhelpers/report/chartjs/annual_progress_content.htm'
362
369
  context = dict()
363
370
  context['base_template'] = self.base_template
364
371
  context['title'] = self.title
@@ -1,110 +0,0 @@
1
- from django.core.management.base import BaseCommand, CommandError
2
- from django.apps import apps
3
- from django.conf import settings
4
- from jinja2 import Template
5
- import os
6
-
7
- __version__ = '0.0.2'
8
-
9
-
10
- class Command(BaseCommand):
11
- help = "Generate admin.py file, based on a jinja2 template, for a given app"
12
-
13
- def __init__(self):
14
- self.opts = None
15
- self.app = None
16
- self.model_list = None
17
- super(Command, self).__init__()
18
-
19
- def add_arguments(self, parser):
20
- """ define command arguments """
21
- parser.add_argument('app', type=str, help='name of the django app')
22
- parser.add_argument('--template', type=str, help='path to Jinja template used to create admin.py file')
23
- parser.add_argument('--output_file', type=str, help='path of output file to create')
24
-
25
- def handle(self, *args, **options):
26
- """ command entry point """
27
- if options['app'] not in settings.INSTALLED_APPS:
28
- raise CommandError(f"'{options['app']}' is not an available application in this project")
29
-
30
- self.opts = options
31
- self.app = options['app']
32
- self.get_model_list()
33
- self.get_admin_template()
34
- self.get_output_file()
35
- self.build_admin()
36
- self.stdout.write(self.style.SUCCESS(f"{self.opts['output_file']} generated!"))
37
-
38
- def get_output_file(self):
39
- """ return the full path of the generated file """
40
- if not self.opts['output_file']:
41
- self.opts['output_file'] = f'{os.getcwd()}/{self.app}/admin.py'
42
-
43
- def get_admin_template(self):
44
- """ return the full path of the jinja template to use in creating the admin.py file """
45
- if not self.opts['template']:
46
- self.opts['template'] = os.path.join(os.path.dirname(os.path.realpath(__file__)),
47
- 'admin_templates', 'admin.jinja')
48
-
49
- def get_model_list(self):
50
- """ return a list of all models in application """
51
- app = apps.get_app_config(self.app)
52
- self.model_list = list(app.get_models())
53
-
54
- @staticmethod
55
- def get_model_field_names(model, exclude_list=()):
56
- """ return a list of field names for a given model """
57
- return [i.name for i in model._meta.fields if type(i).__name__ not in exclude_list]
58
-
59
- def build_admin(self):
60
- """ build the admin.py file """
61
- model_fields = {}
62
- for model in self.model_list:
63
- model_fields[model.__name__] = self.get_model_field_names(model)
64
-
65
- data = {'model_list': self.model_list,
66
- 'app_name': self.app,
67
- 'models_file': 'models',
68
- 'model_data': self.get_models_and_fields(),
69
- }
70
-
71
- with open(self.opts['template']) as f:
72
- template = Template(f.read())
73
- file_text = template.render(data)
74
-
75
- with open(self.opts['output_file'], 'w') as f:
76
- f.write(file_text)
77
-
78
- @staticmethod
79
- def get_display_fields(model, exclude_field_list=()):
80
- """ build and return a list of 'list_display' to be used in admin.py for a given model """
81
- return [i.name for i in model._meta.fields if i.get_internal_type() not in exclude_field_list]
82
-
83
- @staticmethod
84
- def get_search_fields(model, exclude_field_list=('AutoField', 'BooleanField', 'DateTimeField', 'ForeignKey')):
85
- """ build and return a list of 'search_fields' to be used in admin.py for a given model """
86
- return [i.name for i in model._meta.fields if i.get_internal_type() not in exclude_field_list]
87
-
88
- @staticmethod
89
- def get_filter_fields(model, include_field_list=('BooleanField', 'ForeignKey', 'CharField')):
90
- """ build and return a list of 'filter_fields' to be used in admin.py for a given model """
91
- return_list = []
92
- for i in model._meta.fields:
93
- field_type = i.get_internal_type()
94
- if field_type in include_field_list:
95
- if field_type == 'CharField' and not i.choices:
96
- continue
97
- elif field_type == 'CharField' and i.choices:
98
- return_list.append(i.name)
99
- else:
100
- return_list.append(i.name)
101
- return return_list
102
-
103
- def get_models_and_fields(self):
104
- return_data = {}
105
- for model in self.model_list:
106
- return_data[model.__name__] = {'display_fields': self.get_display_fields(model),
107
- 'search_fields': self.get_search_fields(model),
108
- 'filter_fields': self.get_filter_fields(model),
109
- }
110
- return return_data
@@ -1,9 +0,0 @@
1
- export default function format(str) {
2
- for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
3
- args[_key - 1] = arguments[_key];
4
- }
5
-
6
- return [].concat(args).reduce(function (p, c) {
7
- return p.replace(/%s/, c);
8
- }, str);
9
- }