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,8 @@
1
+ __title__ = "DynamicForms"
2
+ __version__ = '0.76.14'
3
+ __author__ = "Jure Erznožnik"
4
+ __email__ = "jure.erznoznik@gmail.com"
5
+ __license__ = "BSD 3-Clause"
6
+ __copyright__ = "Copyright 2017-present Jure Erznožnik"
7
+
8
+ VERSION = __version__
dynamicforms/action.py ADDED
@@ -0,0 +1,521 @@
1
+ import uuid as uuid_module
2
+
3
+ from enum import IntEnum
4
+ from typing import Iterable, List, Union
5
+
6
+ from django.utils.translation import gettext_lazy as _
7
+ from rest_framework.serializers import Serializer
8
+
9
+
10
+ class ActionBase(object):
11
+ def __init__(self, name: str, serializer: Serializer = None, action=None):
12
+ """
13
+ :param name: name by which to recognise this action in further processing, e.g. Serializer.suppress_action
14
+ :param serializer: bind to this serializer instance
15
+ :param action: this is a dict specifying how the vue renderer should render the action. several modes are
16
+ supported:
17
+ dict(func_name, params): calls window.func_name(params) (func_name can contain dots which will be resolved)
18
+ dict(href): action is actually a href - the browser will redirect to the given href
19
+ dict(href, router_name=True): action is a href to a Vue router named path. href will be resolved from name
20
+ """
21
+ assert name is not None, "Action name must not be None"
22
+ self.name = name
23
+ self.action = action
24
+ # serializer will be set when obtaining a resolved copy
25
+ self.serializer = serializer
26
+
27
+ @property
28
+ def action_id(self):
29
+ return id(self)
30
+
31
+ def copy_and_resolve_reference(self, serializer):
32
+ raise NotImplementedError()
33
+
34
+ @staticmethod
35
+ def prepare_string(string, encode=True):
36
+ """
37
+ Replaces curly brackets with some special string so there is no problem when string.format() is called
38
+
39
+ :param string: String in which program searches for curly brackets
40
+ :param encode: True: replaces brackets with special string, False: the other way around
41
+ :return:
42
+ """
43
+ if not string:
44
+ return ""
45
+ replaces = {"{": "´|curl_brack_start|`", "}": "´|curl_brack_end|`"}
46
+ if not encode:
47
+ replaces = dict([(value, key) for key, value in replaces.items()])
48
+
49
+ for key, val in replaces.items():
50
+ string = string.replace(key, val)
51
+ return string
52
+
53
+ def as_component_def(self):
54
+ return {k: getattr(self, k) for k in ("name", "action")}
55
+
56
+
57
+ class TablePosition(IntEnum):
58
+ HEADER = 0 # Table header of list view
59
+ FILTER_ROW_START = 7 # Alternative to HEADER: command is placed in filter row, actions column at start of line
60
+ FILTER_ROW_END = 8 # Alternative to HEADER: command is placed in filter row, actions column at end of line
61
+ # On left click on table row (currently this renders only once per table.
62
+ # We might need to add one that renders for each row
63
+ ROW_CLICK = 1
64
+ ROW_RIGHTCLICK = 2 # On right click on table row
65
+ ROW_START = 3 # Additional control column on left side of table
66
+ ROW_END = 4 # Additional control column on right side of table
67
+ FIELD_START = 5 # On left side of field value
68
+ FIELD_END = 6 # On right side of field value
69
+
70
+
71
+ class FormButtonTypes(IntEnum):
72
+ CANCEL = 1
73
+ SUBMIT = 2
74
+ CUSTOM = 3
75
+
76
+
77
+ class RenderableActionMixin(object):
78
+ """
79
+ Action that is rendered on screen
80
+ """
81
+
82
+ def __init__(
83
+ self,
84
+ label: str,
85
+ title: str,
86
+ icon: str = None,
87
+ btn_classes: Union[str, dict, None] = None,
88
+ display_style: Union[dict, None] = None,
89
+ ):
90
+ """
91
+ :param label: Label for rendering to on screen control
92
+ :param title: Hint text for on-screen control
93
+ :param icon: optional icon to add to render
94
+ :param btn_classes: optional class(es) of button. if variable is dict and key 'replace' have value True,
95
+ then default class will be replaced with class(es) that are under key 'classes'. In other case class(es) will
96
+ be just added to default class
97
+ :param display_style: How is action rendered - Button or non button, only icon, only label, bot icon and label
98
+ """
99
+ self.label = label
100
+ self.title = title
101
+ self.icon = icon
102
+ self.btn_classes = btn_classes
103
+ self.display_style = display_style
104
+
105
+ def as_component_def(self):
106
+ return dict(
107
+ label=self.label,
108
+ title=self.title,
109
+ icon=self.icon,
110
+ classes=self.btn_classes,
111
+ displayStyle=self.display_style,
112
+ )
113
+
114
+ @staticmethod
115
+ def def_display_style(
116
+ table_position: Union[TablePosition, None] = None, form_button: Union[FormButtonTypes, None] = None
117
+ ):
118
+ if table_position == TablePosition.HEADER:
119
+ return dict(
120
+ md=dict(asButton=True, showLabel=True, showIcon=True),
121
+ xs=dict(asButton=True, showLabel=False, showIcon=True),
122
+ )
123
+ elif table_position in (
124
+ TablePosition.FILTER_ROW_START,
125
+ TablePosition.FILTER_ROW_END,
126
+ TablePosition.ROW_START,
127
+ TablePosition.ROW_END,
128
+ ):
129
+ return dict(xs=dict(asButton=True, showLabel=False, showIcon=True))
130
+ elif table_position in (TablePosition.FIELD_START, TablePosition.FIELD_END):
131
+ return dict(xs=dict(asButton=False, showLabel=False, showIcon=True))
132
+ elif form_button in (FormButtonTypes.SUBMIT, FormButtonTypes.CANCEL, FormButtonTypes.CUSTOM):
133
+ return dict(xs=dict(asButton=True, showLabel=True, showIcon=False))
134
+ return None
135
+
136
+
137
+ class TableAction(ActionBase, RenderableActionMixin):
138
+ def __init__(
139
+ self,
140
+ position: TablePosition,
141
+ label: str,
142
+ title: Union[str, None] = None,
143
+ icon: Union[str, None] = None,
144
+ field_name: Union[str, None] = None,
145
+ name: Union[str, None] = None,
146
+ serializer: Serializer = None,
147
+ btn_classes: Union[str, dict, None] = None,
148
+ action=None,
149
+ display_style=None,
150
+ ):
151
+ ActionBase.__init__(self, name, serializer, action=action)
152
+ RenderableActionMixin.__init__(
153
+ self, label, title, icon, btn_classes, display_style or self.def_display_style(table_position=position)
154
+ )
155
+ self.position = position
156
+ self.field_name = field_name
157
+
158
+ def copy_and_resolve_reference(self, serializer: Serializer):
159
+ return TableAction(
160
+ self.position,
161
+ self.label,
162
+ self.title,
163
+ self.icon,
164
+ self.field_name,
165
+ self.name,
166
+ serializer,
167
+ self.btn_classes,
168
+ action=self.action,
169
+ display_style=self.display_style,
170
+ )
171
+
172
+ def to_component_params(self, row_data, serializer):
173
+ """
174
+ generates a dict with parameters for component that is going to represent this action.
175
+ none means don't render / activate this action on this row
176
+
177
+ :param row_data:
178
+ :param serializer:
179
+ :return:
180
+ """
181
+ if self.position in (TablePosition.HEADER, TablePosition.FILTER_ROW_START, TablePosition.FILTER_ROW_END):
182
+ return self.name, None
183
+ return self.name, {}
184
+
185
+ def as_component_def(self):
186
+ res = dict(position=self.position.name, field_name=self.field_name)
187
+ res.update(ActionBase.as_component_def(self))
188
+ res.update(RenderableActionMixin.as_component_def(self))
189
+ return res
190
+
191
+
192
+ class FieldChangeAction(ActionBase):
193
+ def __init__(
194
+ self, tracked_fields: Iterable[str], name: Union[str, None] = None, serializer: Serializer = None, action=None
195
+ ):
196
+ super().__init__(name, serializer, action=action)
197
+ self.tracked_fields = tracked_fields or []
198
+ # assert self.tracked_fields, 'When declaring an action, it must track at least one form field'
199
+ if serializer:
200
+ self.tracked_fields = [self._resolve_reference(f) for f in self.tracked_fields]
201
+
202
+ def to_component_params(self, row_data, serializer):
203
+ """
204
+ generates a dict with parameters for component that is going to represent this action.
205
+ none means don't render / activate this action on this row
206
+
207
+ :param row_data:
208
+ :param serializer:
209
+ :return:
210
+ """
211
+ # perhaps this function is misnamed: it should be row_render_params, because only the row-level properties are
212
+ # processed
213
+ return self.name, None
214
+
215
+ def as_component_def(self):
216
+ res = dict(position="VALUE_CHANGED", tracked_fields=list(self.tracked_fields))
217
+ res.update(ActionBase.as_component_def(self))
218
+ return res
219
+
220
+ def _resolve_reference(self, ref):
221
+ from .mixins import FieldRenderMixin
222
+
223
+ if isinstance(ref, uuid_module.UUID):
224
+ return str(ref)
225
+ elif isinstance(ref, FieldRenderMixin):
226
+ # TODO unit tests!!!
227
+ # TODO test what happens if the Field instance given is from another serializer
228
+ # TODO test what happens when Field instance is actually a Serializer (when should onchange trigger for it?)
229
+ return ref.uuid
230
+ elif isinstance(ref, str) and ref in self.serializer.fields:
231
+ return self.serializer.fields[ref].uuid
232
+ elif isinstance(ref, str) and "." in ref:
233
+ # This supports nested serializers and fields with . notation, e.g. master_serializer_field.child_field
234
+ f = self.serializer
235
+ for r in ref.split("."):
236
+ f = f.fields[r]
237
+ return f.uuid
238
+ raise Exception("Unknown reference type for Action tracked field (%r)" % ref)
239
+
240
+ def copy_and_resolve_reference(self, serializer: Serializer):
241
+ return FieldChangeAction(self.tracked_fields, self.name, serializer)
242
+
243
+
244
+ class FormInitAction(ActionBase):
245
+ def copy_and_resolve_reference(self, serializer: Serializer):
246
+ return FormInitAction(self.name, serializer, action=self.action)
247
+
248
+ def to_component_params(self, row_data, serializer):
249
+ """
250
+ generates a dict with parameters for component that is going to represent this action.
251
+ none means don't render / activate this action on this row
252
+
253
+ :param row_data:
254
+ :param serializer:
255
+ :return:
256
+ """
257
+ # perhaps this function is misnamed: it should be row_render_params, because only the row-level properties are
258
+ # processed
259
+ return self.name, None
260
+
261
+
262
+ class FieldInitAction(FieldChangeAction):
263
+ def to_component_params(self, row_data, serializer):
264
+ """
265
+ generates a dict with parameters for component that is going to represent this action.
266
+ none means don't render / activate this action on this row
267
+
268
+ :param row_data:
269
+ :param serializer:
270
+ :return:
271
+ """
272
+ # perhaps this function is misnamed: it should be row_render_params, because only the row-level properties are
273
+ # processed
274
+ return self.name, None
275
+
276
+ def copy_and_resolve_reference(self, serializer: Serializer):
277
+ return FieldInitAction(self.tracked_fields, self.name, serializer)
278
+
279
+
280
+ class FormPosition(IntEnum):
281
+ FORM_HEADER = 1
282
+ FORM_FOOTER = 2
283
+
284
+
285
+ class FormButtonAction(ActionBase, RenderableActionMixin):
286
+ DEFAULT_LABELS = {
287
+ FormButtonTypes.CANCEL: _("Cancel"),
288
+ FormButtonTypes.SUBMIT: _("Save changes"),
289
+ FormButtonTypes.CUSTOM: "Custom", # intended to be translated by using code
290
+ }
291
+
292
+ def __init__(
293
+ self,
294
+ btn_type: FormButtonTypes,
295
+ label: str = None,
296
+ button_is_primary: bool = None,
297
+ position: FormPosition = FormPosition.FORM_FOOTER,
298
+ name: Union[str, None] = None,
299
+ serializer: Serializer = None,
300
+ icon: Union[str, None] = None,
301
+ action=None,
302
+ display_style=None,
303
+ ):
304
+ ActionBase.__init__(self, name, serializer, action=action)
305
+ title = label
306
+ label = label or FormButtonAction.DEFAULT_LABELS[btn_type or FormButtonTypes.CUSTOM]
307
+ RenderableActionMixin.__init__(
308
+ self, label, title, icon, None, display_style or self.def_display_style(form_button=btn_type)
309
+ )
310
+ self.uuid = uuid_module.uuid1()
311
+ self.btn_type = btn_type
312
+ self.position = position or FormPosition.FORM_FOOTER
313
+
314
+ if button_is_primary is None:
315
+ button_is_primary = btn_type == FormButtonTypes.SUBMIT
316
+ self.button_is_primary = button_is_primary
317
+
318
+ def to_component_params(self, row_data, serializer):
319
+ """
320
+ generates a dict with parameters for component that is going to represent this action.
321
+ none means don't render / activate this action on this row
322
+
323
+ :param row_data:
324
+ :param serializer:
325
+ :return:
326
+ """
327
+ # perhaps this function is misnamed: it should be row_render_params, because only the row-level properties are
328
+ # processed
329
+ return self.name, None
330
+
331
+ def as_component_def(self):
332
+ res = dict(
333
+ uuid=str(self.uuid),
334
+ element_id=f"{self.name}-{self.serializer.uuid}",
335
+ type=self.btn_type.name,
336
+ position=self.position.name,
337
+ )
338
+ res.update(ActionBase.as_component_def(self))
339
+ res.update(RenderableActionMixin.as_component_def(self))
340
+ return res
341
+
342
+ def copy_and_resolve_reference(self, serializer):
343
+ return FormButtonAction(self.btn_type, self.label, self.button_is_primary, self.position, self.name, serializer)
344
+
345
+
346
+ class Actions(object):
347
+ def __init__(
348
+ self, *args, add_default_crud: bool = False, add_default_filter: bool = False, add_form_buttons: bool = True
349
+ ) -> None:
350
+ super().__init__()
351
+ if len(args) == 1 and args[0] is None:
352
+ self.actions = []
353
+ return
354
+
355
+ self.actions: List[ActionBase] = list(args)
356
+ if add_default_crud:
357
+ self.actions.append(
358
+ TableAction(
359
+ TablePosition.HEADER, _("Add"), title=_("Add new record"), name="add", icon="add-circle-outline"
360
+ )
361
+ )
362
+ self.actions.append(
363
+ TableAction(
364
+ TablePosition.ROW_CLICK, _("Edit"), title=_("Edit record"), name="edit", icon="pencil-outline"
365
+ )
366
+ )
367
+ self.actions.append(
368
+ TableAction(
369
+ TablePosition.ROW_END,
370
+ label=_("Delete"),
371
+ title=_("Delete record"),
372
+ name="delete",
373
+ icon="trash-outline",
374
+ )
375
+ )
376
+ self.actions.append(TableAction(TablePosition.ROW_CLICK, _("Sort"), title=_("Sort by column"), name="sort"))
377
+ if add_default_filter:
378
+ self.actions.append(
379
+ TableAction(
380
+ TablePosition.HEADER, label=_("Filter"), title=_("Filter"), name="filter", icon="search-outline"
381
+ )
382
+ )
383
+
384
+ if add_form_buttons:
385
+ self.actions.append(FormButtonAction(btn_type=FormButtonTypes.CANCEL, name="cancel"))
386
+ self.actions.append(FormButtonAction(btn_type=FormButtonTypes.SUBMIT, name="submit"))
387
+
388
+ self.actions.append(FieldChangeAction(None, "value_changed"))
389
+
390
+ def get_resolved_copy(self, serializer) -> "Actions":
391
+ """
392
+ Returns a copy of declared actions bound to the serializer
393
+ :param serializer: serializer the copy will be bound to
394
+ :return:
395
+ """
396
+ if not isinstance(serializer, Serializer):
397
+ return Actions(None)
398
+
399
+ actions = [a.copy_and_resolve_reference(serializer) for a in self.actions]
400
+
401
+ # move actions from Field to Serializer
402
+ actions.extend(
403
+ [
404
+ a.copy_and_resolve_reference(serializer)
405
+ for field in serializer.fields.values()
406
+ for a in getattr(field, "actions", Actions(None)).actions_not_suppressed(serializer)
407
+ if isinstance(a, FieldChangeAction)
408
+ ]
409
+ )
410
+
411
+ return Actions(*actions, add_form_buttons=False)
412
+
413
+ def render_field_onchange(self, serializer):
414
+ """
415
+ renders all field onchange actions needed for dynamicforms.registerFieldAction() function
416
+
417
+ :return: the actions rendered as template string
418
+ """
419
+ res = ""
420
+ for action in self.actions:
421
+ if isinstance(action, FieldChangeAction) and not isinstance(action, FieldInitAction):
422
+ res += action.render(serializer)
423
+ return res
424
+
425
+ def render_form_init(self, serializer):
426
+ """
427
+ renders the function which will analyse initial form data and hide appropriate fields
428
+
429
+ :return: the actions rendered as template string
430
+ """
431
+ res = ""
432
+ for action in self.actions:
433
+ if isinstance(action, FormInitAction):
434
+ res += action.render(serializer)
435
+ return res
436
+
437
+ def render_field_init(self, serializer, field_name: str):
438
+ """
439
+ renders function that will initialise the field being rendered
440
+
441
+ :return: the actions rendered as template string
442
+ """
443
+ res = ""
444
+ for action in self.actions:
445
+ if isinstance(action, FieldInitAction) and field_name in action.tracked_fields:
446
+ res += action.render(serializer)
447
+ return res
448
+
449
+ def renderable_actions(self, serializer: Serializer):
450
+ request = serializer.context.get("request", None)
451
+ viewset = serializer.context.get("view", None)
452
+ return (
453
+ a
454
+ for a in self.actions
455
+ if not serializer.suppress_action(a, request, viewset)
456
+ )
457
+
458
+ def actions_not_suppressed(self, serializer: Serializer):
459
+ request = serializer.context.get("request", None)
460
+ viewset = serializer.context.get("view", None)
461
+
462
+ return (a for a in self.actions if not serializer.suppress_action(a, request, viewset))
463
+
464
+ def render_form_buttons(self, serializer: Serializer, position: str):
465
+ """
466
+ Renders form buttons
467
+ :return: List[Action]
468
+ """
469
+ request = serializer.context.get("request", None)
470
+ viewset = serializer.context.get("view", None)
471
+
472
+ res = ""
473
+
474
+ for button in self.actions:
475
+ if (
476
+ isinstance(button, FormButtonAction)
477
+ and position == button.position
478
+ and not serializer.suppress_action(button, request, viewset)
479
+ ):
480
+ res += button.render(serializer, position=position)
481
+ return res
482
+
483
+ def __iter__(self):
484
+ return iter(self.actions)
485
+
486
+
487
+ """
488
+ tipi akcij
489
+ crud (new, edit, delete, view detail)
490
+ on field change
491
+ on form display (initial fields hiding)
492
+ dialog / form manipulation (cancel entry, submit entry)
493
+ custom actions
494
+
495
+ kako se akcije renderajo
496
+ gumb / link -> html control
497
+ onclick / onrightclick / onkey -> JS event
498
+ on field change -> JS event (depends on field / position)
499
+
500
+
501
+ akcije na formi / dialogu
502
+ control column (start, end of row, any position?) -> HTML control
503
+ table header / footer -> html control
504
+ table field left / right -> html control
505
+ form field left / right -> html control
506
+ form top, form bottom -> html control
507
+ custom pozicija (programer pokliče render funkcijo z nekim custom tekstom, namesto z enum vrednostjo)
508
+
509
+
510
+
511
+ ali morajo vedeti, na čem so?
512
+ pri formi imamo submit, pri dialogu pa dynamicforms.SubmitForm, se pravi, da je render drugačen
513
+ pri tabeli row id, morda row data?
514
+
515
+
516
+ podatki, ki so lahko na voljo:
517
+ parent serializer
518
+ serializer
519
+ row data
520
+ form data --> serializer
521
+ """
dynamicforms/apps.py ADDED
@@ -0,0 +1,5 @@
1
+ from django.apps import AppConfig
2
+
3
+
4
+ class DynamicformsConfig(AppConfig):
5
+ name = "dynamicforms"