dynamicforms 0.76.14__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. dynamicforms/__init__.py +8 -0
  2. dynamicforms/action.py +521 -0
  3. dynamicforms/apps.py +5 -0
  4. dynamicforms/fields.py +1570 -0
  5. dynamicforms/filters.py +44 -0
  6. dynamicforms/locale/en/LC_MESSAGES/django.po +67 -0
  7. dynamicforms/locale/en/LC_MESSAGES/djangojs.po +31 -0
  8. dynamicforms/locale/sl/LC_MESSAGES/django.po +71 -0
  9. dynamicforms/locale/sl/LC_MESSAGES/djangojs.po +36 -0
  10. dynamicforms/management/__init__.py +0 -0
  11. dynamicforms/management/commands/__init__.py +0 -0
  12. dynamicforms/management/commands/clean_dfpreuploaded_files.py +26 -0
  13. dynamicforms/migrations/__init__.py +0 -0
  14. dynamicforms/mixins/__init__.py +27 -0
  15. dynamicforms/mixins/action.py +14 -0
  16. dynamicforms/mixins/choice/__init__.py +94 -0
  17. dynamicforms/mixins/choice/allow_tags.py +79 -0
  18. dynamicforms/mixins/choice/null_choice.py +26 -0
  19. dynamicforms/mixins/choice/single_choice.py +21 -0
  20. dynamicforms/mixins/color_field.py +4 -0
  21. dynamicforms/mixins/conditional_visibility.py +193 -0
  22. dynamicforms/mixins/enable_copy.py +4 -0
  23. dynamicforms/mixins/field_render.py +209 -0
  24. dynamicforms/mixins/file_field.py +5 -0
  25. dynamicforms/mixins/help_text.py +46 -0
  26. dynamicforms/mixins/implicit_hidden.py +7 -0
  27. dynamicforms/mixins/implicit_natural_date.py +88 -0
  28. dynamicforms/mixins/null_value.py +15 -0
  29. dynamicforms/mixins/password_field.py +23 -0
  30. dynamicforms/mixins/related_field_ajax.py +142 -0
  31. dynamicforms/mixins/rtf_field.py +58 -0
  32. dynamicforms/models.py +5 -0
  33. dynamicforms/models_utils.py +33 -0
  34. dynamicforms/pagination.py +175 -0
  35. dynamicforms/preupload_files.py +42 -0
  36. dynamicforms/progress.py +71 -0
  37. dynamicforms/renderers.py +1 -0
  38. dynamicforms/routers.py +36 -0
  39. dynamicforms/serializers.py +486 -0
  40. dynamicforms/struct.py +40 -0
  41. dynamicforms/template_render/__init__.py +10 -0
  42. dynamicforms/template_render/layout.py +178 -0
  43. dynamicforms/template_render/mixins/__init__.py +0 -0
  44. dynamicforms/template_render/mixins/base.py +39 -0
  45. dynamicforms/template_render/mixins/field.py +74 -0
  46. dynamicforms/template_render/mixins/listserializer.py +100 -0
  47. dynamicforms/template_render/mixins/render_mode_enum.py +8 -0
  48. dynamicforms/template_render/mixins/serializer.py +301 -0
  49. dynamicforms/template_render/mixins/serializer_filter.py +19 -0
  50. dynamicforms/template_render/mixins/serializer_render_actions.py +21 -0
  51. dynamicforms/template_render/mixins/serializer_render_fields.py +57 -0
  52. dynamicforms/template_render/mixins/util.py +9 -0
  53. dynamicforms/template_render/renderer.py +38 -0
  54. dynamicforms/template_render/responsive_table_layout.py +64 -0
  55. dynamicforms/urls.py +9 -0
  56. dynamicforms/utils.py +32 -0
  57. dynamicforms/views.py +1 -0
  58. dynamicforms/viewsets.py +421 -0
  59. dynamicforms-0.76.14.dist-info/METADATA +129 -0
  60. dynamicforms-0.76.14.dist-info/RECORD +287 -0
  61. dynamicforms-0.76.14.dist-info/WHEEL +4 -0
  62. dynamicforms-0.76.14.dist-info/licenses/LICENSE +21 -0
  63. dynamicforms_legacy/__init__.py +8 -0
  64. dynamicforms_legacy/action.py +561 -0
  65. dynamicforms_legacy/apps.py +5 -0
  66. dynamicforms_legacy/context_processors.py +27 -0
  67. dynamicforms_legacy/dynamicforms_migration_mixin.py +42 -0
  68. dynamicforms_legacy/fields.py +1108 -0
  69. dynamicforms_legacy/filters.py +44 -0
  70. dynamicforms_legacy/migrations/__init__.py +0 -0
  71. dynamicforms_legacy/mixins/__init__.py +16 -0
  72. dynamicforms_legacy/mixins/action.py +14 -0
  73. dynamicforms_legacy/mixins/allow_tags.py +85 -0
  74. dynamicforms_legacy/mixins/enable_copy.py +4 -0
  75. dynamicforms_legacy/mixins/file_field.py +5 -0
  76. dynamicforms_legacy/mixins/help_text.py +38 -0
  77. dynamicforms_legacy/mixins/implicit_hidden.py +7 -0
  78. dynamicforms_legacy/mixins/implicit_natural_date.py +86 -0
  79. dynamicforms_legacy/mixins/null_choice.py +26 -0
  80. dynamicforms_legacy/mixins/null_value.py +15 -0
  81. dynamicforms_legacy/mixins/password_field.py +19 -0
  82. dynamicforms_legacy/mixins/related_field_ajax.py +58 -0
  83. dynamicforms_legacy/mixins/render.py +203 -0
  84. dynamicforms_legacy/mixins/rtf_field.py +52 -0
  85. dynamicforms_legacy/mixins/single_choice.py +21 -0
  86. dynamicforms_legacy/models.py +5 -0
  87. dynamicforms_legacy/pagination.py +168 -0
  88. dynamicforms_legacy/progress.py +71 -0
  89. dynamicforms_legacy/renderers.py +183 -0
  90. dynamicforms_legacy/serializers.py +335 -0
  91. dynamicforms_legacy/settings.py +196 -0
  92. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +587 -0
  93. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +1 -0
  94. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +6 -0
  95. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +1 -0
  96. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.css +6834 -0
  97. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.css.map +1 -0
  98. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.min.css +6 -0
  99. dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +1 -0
  100. dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.eot +0 -0
  101. dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.svg +288 -0
  102. dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  103. dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff +0 -0
  104. dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  105. dynamicforms_legacy/static/bootstrap-3.4.1-dist/js/bootstrap.js +2580 -0
  106. dynamicforms_legacy/static/bootstrap-3.4.1-dist/js/bootstrap.min.js +6 -0
  107. dynamicforms_legacy/static/bootstrap-3.4.1-dist/js/npm.js +13 -0
  108. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.css +3719 -0
  109. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.css.map +1 -0
  110. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css +7 -0
  111. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css.map +1 -0
  112. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.css +331 -0
  113. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.css.map +1 -0
  114. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css +8 -0
  115. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css.map +1 -0
  116. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.css +10038 -0
  117. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.css.map +1 -0
  118. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.min.css +7 -0
  119. dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.min.css.map +1 -0
  120. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.js +7013 -0
  121. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.js.map +1 -0
  122. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js +7 -0
  123. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js.map +1 -0
  124. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.js +4435 -0
  125. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.js.map +1 -0
  126. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.min.js +7 -0
  127. dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.min.js.map +1 -0
  128. dynamicforms_legacy/static/ckeditor-df/ckEditorCustomBuildReadMe.txt +255 -0
  129. dynamicforms_legacy/static/ckeditor-df/ckeditor.js +6 -0
  130. dynamicforms_legacy/static/dynamicforms/dynamicforms.js +1883 -0
  131. dynamicforms_legacy/static/dynamicforms/icons/copy.svg +7 -0
  132. dynamicforms_legacy/static/dynamicforms/icons/eye-off-outline.svg +10 -0
  133. dynamicforms_legacy/static/dynamicforms/icons/eye-outline.svg +7 -0
  134. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  135. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  136. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  137. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  138. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  139. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  140. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  141. dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  142. dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_222222_256x240.png +0 -0
  143. dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_228ef1_256x240.png +0 -0
  144. dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_ef8c08_256x240.png +0 -0
  145. dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_ffd27a_256x240.png +0 -0
  146. dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_ffffff_256x240.png +0 -0
  147. dynamicforms_legacy/static/jquery_ui/css/jquery-ui.min.css +7 -0
  148. dynamicforms_legacy/static/jquery_ui/css/jquery-ui.structure.min.css +5 -0
  149. dynamicforms_legacy/static/jquery_ui/css/jquery-ui.theme.min.css +5 -0
  150. dynamicforms_legacy/static/jquery_ui/js/jquery-3.3.1.min.js +2 -0
  151. dynamicforms_legacy/static/jquery_ui/js/jquery-ui.min.js +13 -0
  152. dynamicforms_legacy/static/select2/css/select2-bootstrap3.min.css +7 -0
  153. dynamicforms_legacy/static/select2/css/select2-bootstrap4.min.css +578 -0
  154. dynamicforms_legacy/static/select2/select2-4.0.5/css/select2.min.css +1 -0
  155. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/af.js +3 -0
  156. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ar.js +3 -0
  157. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/az.js +3 -0
  158. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/bg.js +3 -0
  159. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/bs.js +3 -0
  160. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ca.js +3 -0
  161. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/cs.js +3 -0
  162. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/da.js +3 -0
  163. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/de.js +3 -0
  164. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/dsb.js +3 -0
  165. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/el.js +3 -0
  166. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/en.js +3 -0
  167. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/es.js +3 -0
  168. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/et.js +3 -0
  169. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/eu.js +3 -0
  170. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/fa.js +3 -0
  171. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/fi.js +3 -0
  172. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/fr.js +3 -0
  173. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/gl.js +3 -0
  174. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/he.js +3 -0
  175. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hi.js +3 -0
  176. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hr.js +3 -0
  177. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hsb.js +3 -0
  178. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hu.js +3 -0
  179. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hy.js +3 -0
  180. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/id.js +3 -0
  181. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/is.js +3 -0
  182. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/it.js +3 -0
  183. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ja.js +3 -0
  184. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/km.js +3 -0
  185. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ko.js +3 -0
  186. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/lt.js +3 -0
  187. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/lv.js +3 -0
  188. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/mk.js +3 -0
  189. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ms.js +3 -0
  190. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/nb.js +3 -0
  191. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/nl.js +3 -0
  192. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/pl.js +3 -0
  193. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ps.js +3 -0
  194. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/pt-BR.js +3 -0
  195. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/pt.js +3 -0
  196. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ro.js +3 -0
  197. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ru.js +3 -0
  198. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sk.js +3 -0
  199. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sl.js +3 -0
  200. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sr-Cyrl.js +3 -0
  201. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sr.js +3 -0
  202. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sv.js +3 -0
  203. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/th.js +3 -0
  204. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/tr.js +3 -0
  205. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/uk.js +3 -0
  206. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/vi.js +3 -0
  207. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/zh-CN.js +3 -0
  208. dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/zh-TW.js +3 -0
  209. dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.full.js +6457 -0
  210. dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.full.min.js +1 -0
  211. dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.js +5746 -0
  212. dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.min.js +1 -0
  213. dynamicforms_legacy/struct.py +40 -0
  214. dynamicforms_legacy/templates/dynamicforms/base.html +12 -0
  215. dynamicforms_legacy/templates/dynamicforms/base_form.html +44 -0
  216. dynamicforms_legacy/templates/dynamicforms/base_includes.html +51 -0
  217. dynamicforms_legacy/templates/dynamicforms/base_includes_select2.html +6 -0
  218. dynamicforms_legacy/templates/dynamicforms/base_list.html +47 -0
  219. dynamicforms_legacy/templates/dynamicforms/base_table_body.html +46 -0
  220. dynamicforms_legacy/templates/dynamicforms/base_table_filter.html +44 -0
  221. dynamicforms_legacy/templates/dynamicforms/bootstrap/base_form.html +10 -0
  222. dynamicforms_legacy/templates/dynamicforms/bootstrap/base_includes.html +46 -0
  223. dynamicforms_legacy/templates/dynamicforms/bootstrap/base_includes_v3.html +90 -0
  224. dynamicforms_legacy/templates/dynamicforms/bootstrap/base_includes_v4.html +77 -0
  225. dynamicforms_legacy/templates/dynamicforms/bootstrap/base_list.html +9 -0
  226. dynamicforms_legacy/templates/dynamicforms/bootstrap/base_table_body.html +4 -0
  227. dynamicforms_legacy/templates/dynamicforms/bootstrap/base_table_filter.html +5 -0
  228. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/base_field.html +41 -0
  229. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/base_field_v3.html +11 -0
  230. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/base_field_v4.html +11 -0
  231. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/checkbox.html +7 -0
  232. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/checkbox_multiple.html +7 -0
  233. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/fieldset.html +21 -0
  234. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/form.html +4 -0
  235. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/input.html +31 -0
  236. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/list_fieldset.html +18 -0
  237. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/radio.html +8 -0
  238. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/rtf_field.html +4 -0
  239. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/select.html +46 -0
  240. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/select_multiple.html +17 -0
  241. dynamicforms_legacy/templates/dynamicforms/bootstrap/field/textarea.html +4 -0
  242. dynamicforms_legacy/templates/dynamicforms/bootstrap/modal_dialog.html +13 -0
  243. dynamicforms_legacy/templates/dynamicforms/bootstrap/modal_dialog_rest.html +23 -0
  244. dynamicforms_legacy/templates/dynamicforms/bootstrap/page.html +11 -0
  245. dynamicforms_legacy/templates/dynamicforms/field/base_field.html +55 -0
  246. dynamicforms_legacy/templates/dynamicforms/field/checkbox.html +28 -0
  247. dynamicforms_legacy/templates/dynamicforms/field/checkbox_multiple.html +16 -0
  248. dynamicforms_legacy/templates/dynamicforms/field/dict_field.html +4 -0
  249. dynamicforms_legacy/templates/dynamicforms/field/fieldset.html +4 -0
  250. dynamicforms_legacy/templates/dynamicforms/field/form.html +18 -0
  251. dynamicforms_legacy/templates/dynamicforms/field/input.html +31 -0
  252. dynamicforms_legacy/templates/dynamicforms/field/list_field.html +4 -0
  253. dynamicforms_legacy/templates/dynamicforms/field/list_fieldset.html +4 -0
  254. dynamicforms_legacy/templates/dynamicforms/field/radio.html +24 -0
  255. dynamicforms_legacy/templates/dynamicforms/field/rtf_field.html +14 -0
  256. dynamicforms_legacy/templates/dynamicforms/field/select.html +97 -0
  257. dynamicforms_legacy/templates/dynamicforms/field/select_multiple.html +67 -0
  258. dynamicforms_legacy/templates/dynamicforms/field/textarea.html +13 -0
  259. dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_form.html +13 -0
  260. dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_includes.html +225 -0
  261. dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_list.html +9 -0
  262. dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_table_body.html +4 -0
  263. dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_table_filter.html +5 -0
  264. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/base_field.html +16 -0
  265. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/checkbox.html +7 -0
  266. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/checkbox_multiple.html +9 -0
  267. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/fieldset.html +11 -0
  268. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/form.html +4 -0
  269. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/input.html +17 -0
  270. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/list_fieldset.html +6 -0
  271. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/radio.html +8 -0
  272. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/rtf_field.html +4 -0
  273. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/select.html +37 -0
  274. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/select_multiple.html +18 -0
  275. dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/textarea.html +4 -0
  276. dynamicforms_legacy/templates/dynamicforms/jquery_ui/modal_dialog.html +2 -0
  277. dynamicforms_legacy/templates/dynamicforms/jquery_ui/modal_dialog_rest.html +27 -0
  278. dynamicforms_legacy/templates/dynamicforms/jquery_ui/page.html +20 -0
  279. dynamicforms_legacy/templates/dynamicforms/modal_dialog.html +4 -0
  280. dynamicforms_legacy/templates/dynamicforms/modal_dialog_rest.html +18 -0
  281. dynamicforms_legacy/templates/dynamicforms/page.html +25 -0
  282. dynamicforms_legacy/templates/dynamicforms/rtf_field_style.html +41 -0
  283. dynamicforms_legacy/templatetags/__init__.py +0 -0
  284. dynamicforms_legacy/templatetags/dynamicforms.py +475 -0
  285. dynamicforms_legacy/urls.py +8 -0
  286. dynamicforms_legacy/views.py +1 -0
  287. dynamicforms_legacy/viewsets.py +366 -0
@@ -0,0 +1,178 @@
1
+ import uuid
2
+
3
+ from typing import Dict, List, Optional, Tuple, TYPE_CHECKING, Union
4
+
5
+ from rest_framework.serializers import Serializer as DRFSerializer
6
+
7
+ from dynamicforms.fields import DFField, DisplayMode
8
+
9
+ if TYPE_CHECKING:
10
+ from dynamicforms.serializers import Serializer
11
+
12
+
13
+ class Field(object):
14
+ def __init__(self, field_name: str, render_format: Optional[str] = None):
15
+ self.field_name = field_name
16
+ self.render_format = render_format
17
+
18
+ def field_def(self, serializer: "Serializer") -> Union[DFField, DRFSerializer]:
19
+ return serializer.fields[self.field_name]
20
+
21
+ def as_component_def(self, serializer: "Serializer", fields: Dict):
22
+ field = self.field_def(serializer).as_component_def()
23
+
24
+ field["name"] = self.field_name
25
+ if self.render_format:
26
+ field["render_format"] = self.render_format
27
+ fields[self.field_name] = field
28
+ return field["name"]
29
+
30
+
31
+ class Column(object):
32
+ def __init__(self, field: Union[Tuple[str, DFField], Field, str, None], width_classes: Optional[str] = None):
33
+ if isinstance(field, str):
34
+ self.field = Field(field)
35
+ elif isinstance(field, Field):
36
+ self.field = field
37
+ elif field is None and isinstance(self, Group):
38
+ # a Group might not have a field attached to it
39
+ self.field = field
40
+ else:
41
+ raise NotImplementedError(f"Unknown field type {field.__class__.__name__}")
42
+ self.width_classes = width_classes or ""
43
+ # TODO: It was a lot more useful when bootstrap was the front-end framework and this basically allowed to
44
+ # specify how big a column was to be used. Needs to change to support the Vue / Vuetify components and
45
+ # their props now. task: https://app.clickup.com/t/86bzw1k8f
46
+
47
+ def _get_laid_fields(self):
48
+ return {self.field.field_name} if self.field is not None else set()
49
+
50
+ def as_component_def(self, serializer: "Serializer", fields: Dict) -> Dict:
51
+ fld_def = self.field.as_component_def(serializer, fields) if self.field is not None else dict()
52
+ res = dict(type="column", field=fld_def)
53
+ if self.width_classes:
54
+ res["width_classes"] = self.width_classes
55
+ return res
56
+
57
+
58
+ class Row(object):
59
+ def __init__(self, *columns: Union[Column, Field, str], component: str = None):
60
+ self.component = component or "FormRow"
61
+ self.columns: List[Column] = []
62
+ for column in columns:
63
+ if isinstance(column, str):
64
+ self.columns.append(Column(Field(column)))
65
+ elif isinstance(column, Field):
66
+ self.columns.append(Column(column))
67
+ elif isinstance(column, Column):
68
+ self.columns.append(column)
69
+ else:
70
+ raise NotImplementedError(f"Unknown column type {column.__class__.__name__}")
71
+
72
+ def _get_laid_fields(self):
73
+ return set().union(*(col._get_laid_fields() for col in self.columns))
74
+
75
+ def as_component_def(self, serializer: "Serializer", fields: Dict) -> dict:
76
+ return dict(
77
+ component=self.component, columns=[col.as_component_def(serializer, fields) for col in self.columns]
78
+ )
79
+
80
+
81
+ class Layout(object):
82
+ def __init__(
83
+ self,
84
+ *rows: Row,
85
+ component_name: str = "df-form-layout",
86
+ columns: int = 1,
87
+ size: str = "",
88
+ header_classes: str = "",
89
+ auto_add_fields: bool = True,
90
+ ):
91
+ """
92
+ Creates layout definition
93
+ :param rows: layout rows containing columns & fields
94
+ :param columns: for all fields not added in layout manually, add them in n-column layout
95
+ :param size: 'small', 'large' or ''
96
+ :param header_classes: 'bg-info', ..., or ''
97
+ """
98
+ self.rows: List[Row] = list(rows) or []
99
+ self.columns = columns
100
+ self.size = size
101
+ self.header_classes = header_classes
102
+ self.component_name = component_name
103
+ self.auto_add_fields = auto_add_fields
104
+
105
+ def _get_laid_fields(self):
106
+ return set().union(*(row._get_laid_fields() for row in self.rows))
107
+
108
+ def as_component_def(self, serializer: "Serializer", fields: Dict = None, used_fields: set = None) -> Dict:
109
+ assert serializer is not None
110
+ fields = fields if fields is not None else dict()
111
+ res = dict(rows=[row.as_component_def(serializer, fields) for row in self.rows])
112
+ res["fields"] = fields
113
+ used_fields = (used_fields or set()).union(self._get_laid_fields())
114
+ if self.size:
115
+ res["size"] = self.size
116
+ if self.header_classes:
117
+ res["header_classes"] = self.header_classes
118
+
119
+ if self.auto_add_fields:
120
+ # add any non-declared fields and append them to the end of the layout
121
+ # if no layout is specified in serializer Meta, this will generate default single-column layout
122
+ default_layout = Layout()
123
+ row = []
124
+ row_num = 0
125
+ for field_name, field in serializer.fields.items():
126
+ if field_name not in used_fields and field.display_form != DisplayMode.SUPPRESS:
127
+ used_fields.add(field_name)
128
+ row.append(
129
+ Group(field_name) # nested Serializer or ListSerializer
130
+ if isinstance(field, DRFSerializer)
131
+ else field_name # "just" a standard field
132
+ )
133
+ if field.display_form == DisplayMode.FULL:
134
+ row_num += 1
135
+ if row_num >= self.columns:
136
+ default_layout.rows.append(Row(*row))
137
+ row, row_num = [], 0
138
+ if row:
139
+ default_layout.rows.append(Row(*row))
140
+ if default_layout.rows:
141
+ res["rows"] += default_layout.as_component_def(serializer, fields, used_fields)["rows"]
142
+
143
+ res["component_name"] = self.component_name
144
+ return res
145
+
146
+
147
+ class Group(Column):
148
+ def __init__(
149
+ self,
150
+ field: Union[str, Field, None],
151
+ title: str = None,
152
+ sub_layout: Layout = None,
153
+ width_classes: Optional[str] = None,
154
+ footer: Optional[str] = None,
155
+ ):
156
+ super().__init__(field, width_classes)
157
+ self.title = title
158
+ self.layout = sub_layout
159
+ self.footer = footer
160
+
161
+ def _get_laid_fields(self):
162
+ if self.field is None:
163
+ return self.layout._get_laid_fields()
164
+ return super()._get_laid_fields()
165
+
166
+ def as_component_def(self, serializer: "Serializer", fields: Dict) -> Dict:
167
+ res = super().as_component_def(serializer, fields)
168
+ assert self.field or self.layout
169
+ sub_serializer = self.field.field_def(serializer) if self.field else None # type: Serializer
170
+ layout = self.layout or sub_serializer.layout
171
+ res.update(
172
+ type="group",
173
+ footer=self.footer,
174
+ title=self.title or sub_serializer.label,
175
+ uuid=sub_serializer.uuid if sub_serializer else uuid.uuid4(),
176
+ layout=layout.as_component_def(sub_serializer if sub_serializer else serializer),
177
+ )
178
+ return res
File without changes
@@ -0,0 +1,39 @@
1
+ from dynamicforms.fields import DFField
2
+
3
+ from .render_mode_enum import ViewModeEnum
4
+
5
+
6
+ class ViewModeBase(object):
7
+ view_mode = None
8
+
9
+ def set_view_mode(self, view_mode: "ViewModeEnum"):
10
+ self.view_mode = view_mode
11
+
12
+ def set_bound_value(self, *args):
13
+ """
14
+ Used to set the bound value. However, implementation is class-specific, so we only declare this so that
15
+ implementations are checked to contain the method
16
+ """
17
+ raise NotImplementedError()
18
+
19
+ def render(self: "_ViewModeBoundField"):
20
+ view_mode_name = f"render_{self.view_mode.name.lower()}"
21
+ render_func = getattr(self, view_mode_name, None)
22
+ if render_func is None:
23
+ raise NotImplementedError(
24
+ f'ViewMode object {self.__class__.__name__}{(" " + self.label) if self.label else ""} has view_mode '
25
+ f"set to {self.view_mode.name}, but doesn't handle rendering for it"
26
+ )
27
+ return render_func()
28
+
29
+ def __str__(self):
30
+ return self.render()
31
+
32
+
33
+ # noinspection PyAbstractClass
34
+ class _ViewModeBoundField(ViewModeBase, DFField):
35
+ """
36
+ Dummy class just for type hinting
37
+ """
38
+
39
+ pass
@@ -0,0 +1,74 @@
1
+ from enum import auto
2
+ from typing import Any, Dict, Optional
3
+
4
+ from rest_framework.fields import Field
5
+
6
+ from dynamicforms.mixins.field_render import FieldRenderMixin
7
+
8
+ from .base import ViewModeBase
9
+ from .render_mode_enum import ViewModeEnum
10
+
11
+
12
+ class ViewModeField(ViewModeBase):
13
+ """
14
+ Binds the field definition from serializer to data for rendering
15
+ """
16
+
17
+ bound_value = None
18
+ bound_value_row = None
19
+
20
+ class ViewMode(ViewModeEnum):
21
+ FORM = auto() # Render to form field
22
+ TABLE_DATA = auto() # Render to table td
23
+ TABLE_HEADER = auto() # Render field label to table th
24
+
25
+ def __init__(
26
+ self,
27
+ view_mode: "ViewModeField.ViewMode",
28
+ field: FieldRenderMixin,
29
+ value: Optional[Any] = None,
30
+ value_row: Optional[Dict[Any, Any]] = None,
31
+ ):
32
+ """
33
+ Will patch the field instance such that it will get this mixin mixed in.
34
+ Optionally row and field values can also be provided for a one-off rendering
35
+
36
+ :param field: serializer field instance
37
+ :param value: field value in current data row
38
+ :param value_row: current data row value
39
+ """
40
+ field.__class__ = type("ViewModeBoundField", (ViewModeField, field.__class__), {})
41
+ self.set_bound_value(value, value_row)
42
+ super().__init__(view_mode)
43
+
44
+ def set_bound_value(self, value: Any, value_row: Dict[Any, Any]):
45
+ self.bound_value = value
46
+ self.bound_value_row = value_row
47
+
48
+ def render_form(self: "_ViewModeBoundField"):
49
+ """
50
+ renders field's serialized value to HTML. Currently code only for performance reasons, we might support
51
+ templating in the future
52
+
53
+ :return: rendered value for form view
54
+ """
55
+ return self.bound_value
56
+
57
+ def render_table(self: "_ViewModeBoundField"):
58
+ """
59
+ renders field's serialized value to HTML. Currently code only for performance reasons, we might support
60
+ templating in the future
61
+
62
+ :return: rendered value for table view
63
+ """
64
+ # TODO: Actually, the DRFTT.format_value() should be here and not in RenderMixin. Let's see if we can move it
65
+ return self.bound_value
66
+
67
+
68
+ # noinspection PyAbstractClass
69
+ class _ViewModeBoundField(ViewModeField, Field):
70
+ """
71
+ Dummy class just for type hinting
72
+ """
73
+
74
+ pass
@@ -0,0 +1,100 @@
1
+ from enum import auto
2
+ from typing import Dict, List
3
+
4
+ from django.template import loader
5
+ from rest_framework.reverse import reverse
6
+ from rest_framework.serializers import ListSerializer
7
+
8
+ from dynamicforms.mixins import FieldRenderMixin
9
+
10
+ from .base import ViewModeBase
11
+ from .render_mode_enum import ViewModeEnum
12
+ from .util import convert_to_json_if
13
+
14
+
15
+ class ViewModeListSerializer(ViewModeBase, FieldRenderMixin, ListSerializer):
16
+ bound_value = None
17
+
18
+ class ViewMode(ViewModeEnum):
19
+ TABLE = auto() # Render to full table with header, filter, rows
20
+
21
+ def __init__(self, *args, **kwargs):
22
+ self.child = None
23
+ kwargs.setdefault("display_table", kwargs["child"].display_table)
24
+ kwargs.setdefault("display_form", kwargs["child"].display_form)
25
+ super().__init__(*args, **kwargs)
26
+
27
+ def set_bound_value(self, value: List[Dict]):
28
+ self.bound_value = value
29
+
30
+ def render_table(self: "_ViewModeBoundListSerializer"):
31
+ template = loader.get_template("template_render/full_table.html")
32
+ context = dict(serializer=self, columns=self.render_fields)
33
+ return template.render(context)
34
+
35
+ @property
36
+ def render_fields(self: "_ViewModeBoundListSerializer"):
37
+ return self.child.render_fields
38
+
39
+ @property
40
+ def render_actions(self: "_ViewModeBoundListSerializer"):
41
+ return self.child.render_actions
42
+
43
+ def component_params(self: "_ViewModeBoundListSerializer", output_json: bool = True, data=None):
44
+ res = self.child.component_params(output_json=False)
45
+
46
+ if self.paginator:
47
+ res["rows"] = data or self.paginator.get_paginated_response(self.data).data
48
+ else:
49
+ res["rows"] = dict(prev=None, next=None, results=data or self.data)
50
+
51
+ res["list_url"] = self.reverse_url
52
+ return convert_to_json_if(res, output_json)
53
+
54
+ # propagate original serializer's uuid to list serializer
55
+ uuid = property(lambda self: self.child.uuid, lambda self, value: setattr(self.child, "uuid", value))
56
+
57
+ @classmethod
58
+ def get_reverse_url(cls, view_name, request):
59
+ return reverse(view_name + "-list", format="json", request=request)
60
+
61
+ def apply_component_context(self, request=None, paginator=None):
62
+ # Different to ViewModeSerializer.get_component_context - which is a class method creating the instances
63
+ # this one will decorate existing instance with the appropriate values needed for rendering
64
+ # in all other respects, they are the same
65
+ request = request or self.request
66
+ paginator = paginator or self.context.get("view", type("NoView", (object,), dict(paginator=None))).paginator
67
+
68
+ self.child.apply_component_context(request, paginator)
69
+ self.view_mode = ViewModeListSerializer.ViewMode.TABLE
70
+ self.reverse_url = self.get_reverse_url(self.child.template_context["url_reverse"], request)
71
+ self.paginator = paginator
72
+ if paginator:
73
+ base_url = paginator.base_url.split("?", 1)
74
+ paginator.base_url = self.reverse_url + (("?" + base_url[1]) if len(base_url) == 2 else "")
75
+
76
+ @property
77
+ def request(self: "_ViewModeBoundListSerializer"):
78
+ if self.context and "view" in self.context and self.context["view"].request:
79
+ return self.context["view"].request
80
+ elif self.child:
81
+ return self.child.request
82
+ return None
83
+
84
+ def as_component_def(self: "DFField") -> dict: # noqa
85
+ if hasattr(self.child, "as_component_def_table"):
86
+ return self.child.as_component_def_table
87
+ res = super().as_component_def()
88
+ res["render_params"]["form_component_name"] = "DList"
89
+ self.child.apply_component_context()
90
+ res["render_params"]["form_component_def"] = self.child.component_params(output_json=False)
91
+ return res
92
+
93
+
94
+ # noinspection PyAbstractClass
95
+ class _ViewModeBoundListSerializer(ViewModeListSerializer, ListSerializer):
96
+ """
97
+ Dummy class just for type hinting
98
+ """
99
+
100
+ pass
@@ -0,0 +1,8 @@
1
+ from enum import Enum
2
+
3
+
4
+ class ViewModeEnum(Enum):
5
+ # noinspection PyMethodParameters
6
+ def _generate_next_value_(name, start, count, last_values):
7
+ # We use this construct to obtain value same as name
8
+ return name