dynamicforms 0.77.4__tar.gz → 0.77.8__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (416) hide show
  1. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/PKG-INFO +4 -3
  2. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/__init__.py +1 -1
  3. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/fields.py +18 -1
  4. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/choice/allow_tags.py +1 -1
  5. dynamicforms-0.77.8/dynamicforms/mixins/file_field.py +52 -0
  6. dynamicforms-0.77.8/dynamicforms/preupload_files.py +117 -0
  7. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/serializers.py +7 -4
  8. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/urls.py +1 -1
  9. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/advanced_fields.py +2 -3
  10. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/document.py +2 -3
  11. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/pyproject.toml +1 -1
  12. dynamicforms-0.77.4/dynamicforms/preupload_files.py +0 -42
  13. dynamicforms-0.77.4/dynamicforms_legacy/mixins/file_field.py +0 -5
  14. dynamicforms-0.77.4/examples/rest/fields/df_file_field.py +0 -76
  15. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.actrc +0 -0
  16. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.coveragerc +0 -0
  17. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.github/workflows/Python tests.yml +0 -0
  18. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.github/workflows/check_code.yml +0 -0
  19. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.github/workflows/check_doc.yml +0 -0
  20. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.github/workflows/incremental-cover-check.yml +0 -0
  21. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.github/workflows/vitest_tests.yml +0 -0
  22. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/.gitignore +0 -0
  23. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/LICENSE +0 -0
  24. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/MANIFEST.in +0 -0
  25. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/README.md +0 -0
  26. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/Makefile +0 -0
  27. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/conf.py +0 -0
  28. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/action_controls.rst +0 -0
  29. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/context_processors.rst +0 -0
  30. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/dialogs.rst +0 -0
  31. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/fields.rst +0 -0
  32. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/index.rst +0 -0
  33. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/renderers.rst +0 -0
  34. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/serializers.rst +0 -0
  35. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/templatetags.rst +0 -0
  36. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/api/viewsets.rst +0 -0
  37. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/contribute.rst +0 -0
  38. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/guides/index.rst +0 -0
  39. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/guides/quick_start.rst +0 -0
  40. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/guides/templates.rst +0 -0
  41. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/intro.rst +0 -0
  42. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/documents/settings.rst +0 -0
  43. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/index.rst +0 -0
  44. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.docs_archive/make.bat +0 -0
  45. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.vitepress/config.mts +0 -0
  46. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.vitepress/theme/index.ts +0 -0
  47. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/.vitepress/theme/style.css +0 -0
  48. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/examples/api-examples.md +0 -0
  49. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/examples/markdown-examples.md +0 -0
  50. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/getting-started.md +0 -0
  51. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/index.md +0 -0
  52. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/reference/dialog-size.md +0 -0
  53. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/reference/hiding_titlebar_and_navbar.md +0 -0
  54. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/reference/index.md +0 -0
  55. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/reference/layout.md +0 -0
  56. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/docs/settings.md +0 -0
  57. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/action.py +0 -0
  58. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/apps.py +0 -0
  59. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/filters.py +0 -0
  60. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/locale/en/LC_MESSAGES/django.po +0 -0
  61. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/locale/en/LC_MESSAGES/djangojs.po +0 -0
  62. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/locale/sl/LC_MESSAGES/django.po +0 -0
  63. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/locale/sl/LC_MESSAGES/djangojs.po +0 -0
  64. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/management/__init__.py +0 -0
  65. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/management/commands/__init__.py +0 -0
  66. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/management/commands/clean_dfpreuploaded_files.py +0 -0
  67. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/migrations/__init__.py +0 -0
  68. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/__init__.py +0 -0
  69. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/action.py +0 -0
  70. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/choice/__init__.py +0 -0
  71. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/choice/null_choice.py +0 -0
  72. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/choice/single_choice.py +0 -0
  73. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/color_field.py +0 -0
  74. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/conditional_visibility.py +0 -0
  75. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/enable_copy.py +0 -0
  76. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/field_render.py +0 -0
  77. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/help_text.py +0 -0
  78. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/implicit_hidden.py +0 -0
  79. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/implicit_natural_date.py +0 -0
  80. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/null_value.py +0 -0
  81. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/password_field.py +0 -0
  82. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/related_field_ajax.py +0 -0
  83. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/mixins/rtf_field.py +0 -0
  84. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/models.py +0 -0
  85. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/models_utils.py +0 -0
  86. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/pagination.py +0 -0
  87. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/progress.py +0 -0
  88. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/renderers.py +0 -0
  89. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/routers.py +0 -0
  90. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/struct.py +0 -0
  91. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/__init__.py +0 -0
  92. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/layout.py +0 -0
  93. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/__init__.py +0 -0
  94. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/base.py +0 -0
  95. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/field.py +0 -0
  96. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/listserializer.py +0 -0
  97. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/render_mode_enum.py +0 -0
  98. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/serializer.py +0 -0
  99. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/serializer_filter.py +0 -0
  100. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/serializer_render_actions.py +0 -0
  101. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/serializer_render_fields.py +0 -0
  102. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/mixins/util.py +0 -0
  103. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/renderer.py +0 -0
  104. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/template_render/responsive_table_layout.py +0 -0
  105. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/utils.py +0 -0
  106. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/views.py +0 -0
  107. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms/viewsets.py +0 -0
  108. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_dev/__init__.py +0 -0
  109. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_dev/management/__init__.py +0 -0
  110. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_dev/management/commands/__init__.py +0 -0
  111. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_dev/management/commands/generate_fields.py +0 -0
  112. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_dev/management/commands/npm_run.py +0 -0
  113. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/__init__.py +0 -0
  114. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/action.py +0 -0
  115. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/apps.py +0 -0
  116. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/context_processors.py +0 -0
  117. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/dynamicforms_migration_mixin.py +0 -0
  118. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/fields.py +0 -0
  119. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/filters.py +0 -0
  120. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/migrations/__init__.py +0 -0
  121. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/__init__.py +0 -0
  122. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/action.py +0 -0
  123. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/allow_tags.py +0 -0
  124. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/enable_copy.py +0 -0
  125. {dynamicforms-0.77.4/dynamicforms → dynamicforms-0.77.8/dynamicforms_legacy}/mixins/file_field.py +0 -0
  126. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/help_text.py +0 -0
  127. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/implicit_hidden.py +0 -0
  128. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/implicit_natural_date.py +0 -0
  129. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/null_choice.py +0 -0
  130. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/null_value.py +0 -0
  131. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/password_field.py +0 -0
  132. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/related_field_ajax.py +0 -0
  133. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/render.py +0 -0
  134. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/rtf_field.py +0 -0
  135. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/mixins/single_choice.py +0 -0
  136. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/models.py +0 -0
  137. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/pagination.py +0 -0
  138. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/progress.py +0 -0
  139. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/renderers.py +0 -0
  140. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/serializers.py +0 -0
  141. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/settings.py +0 -0
  142. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.css +0 -0
  143. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.css.map +0 -0
  144. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css +0 -0
  145. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap-theme.min.css.map +0 -0
  146. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.css +0 -0
  147. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.css.map +0 -0
  148. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.min.css +0 -0
  149. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/css/bootstrap.min.css.map +0 -0
  150. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.eot +0 -0
  151. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.svg +0 -0
  152. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.ttf +0 -0
  153. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff +0 -0
  154. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/fonts/glyphicons-halflings-regular.woff2 +0 -0
  155. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/js/bootstrap.js +0 -0
  156. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/js/bootstrap.min.js +0 -0
  157. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-3.4.1-dist/js/npm.js +0 -0
  158. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.css +0 -0
  159. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.css.map +0 -0
  160. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css +0 -0
  161. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-grid.min.css.map +0 -0
  162. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.css +0 -0
  163. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.css.map +0 -0
  164. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css +0 -0
  165. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap-reboot.min.css.map +0 -0
  166. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.css +0 -0
  167. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.css.map +0 -0
  168. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.min.css +0 -0
  169. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/css/bootstrap.min.css.map +0 -0
  170. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.js +0 -0
  171. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.js.map +0 -0
  172. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js +0 -0
  173. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.bundle.min.js.map +0 -0
  174. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.js +0 -0
  175. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.js.map +0 -0
  176. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.min.js +0 -0
  177. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/bootstrap-4.3.1-dist/js/bootstrap.min.js.map +0 -0
  178. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/ckeditor-df/ckEditorCustomBuildReadMe.txt +0 -0
  179. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/ckeditor-df/ckeditor.js +0 -0
  180. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/dynamicforms/dynamicforms.js +0 -0
  181. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/dynamicforms/icons/copy.svg +0 -0
  182. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/dynamicforms/icons/eye-off-outline.svg +0 -0
  183. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/dynamicforms/icons/eye-outline.svg +0 -0
  184. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  185. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  186. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  187. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  188. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  189. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  190. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  191. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  192. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_222222_256x240.png +0 -0
  193. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_228ef1_256x240.png +0 -0
  194. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_ef8c08_256x240.png +0 -0
  195. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_ffd27a_256x240.png +0 -0
  196. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/images/ui-icons_ffffff_256x240.png +0 -0
  197. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/jquery-ui.min.css +0 -0
  198. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/jquery-ui.structure.min.css +0 -0
  199. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/css/jquery-ui.theme.min.css +0 -0
  200. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/js/jquery-3.3.1.min.js +0 -0
  201. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/jquery_ui/js/jquery-ui.min.js +0 -0
  202. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/css/select2-bootstrap3.min.css +0 -0
  203. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/css/select2-bootstrap4.min.css +0 -0
  204. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/css/select2.min.css +0 -0
  205. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/af.js +0 -0
  206. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ar.js +0 -0
  207. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/az.js +0 -0
  208. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/bg.js +0 -0
  209. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/bs.js +0 -0
  210. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ca.js +0 -0
  211. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/cs.js +0 -0
  212. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/da.js +0 -0
  213. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/de.js +0 -0
  214. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/dsb.js +0 -0
  215. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/el.js +0 -0
  216. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/en.js +0 -0
  217. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/es.js +0 -0
  218. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/et.js +0 -0
  219. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/eu.js +0 -0
  220. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/fa.js +0 -0
  221. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/fi.js +0 -0
  222. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/fr.js +0 -0
  223. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/gl.js +0 -0
  224. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/he.js +0 -0
  225. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hi.js +0 -0
  226. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hr.js +0 -0
  227. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hsb.js +0 -0
  228. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hu.js +0 -0
  229. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/hy.js +0 -0
  230. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/id.js +0 -0
  231. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/is.js +0 -0
  232. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/it.js +0 -0
  233. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ja.js +0 -0
  234. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/km.js +0 -0
  235. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ko.js +0 -0
  236. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/lt.js +0 -0
  237. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/lv.js +0 -0
  238. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/mk.js +0 -0
  239. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ms.js +0 -0
  240. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/nb.js +0 -0
  241. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/nl.js +0 -0
  242. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/pl.js +0 -0
  243. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ps.js +0 -0
  244. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/pt-BR.js +0 -0
  245. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/pt.js +0 -0
  246. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ro.js +0 -0
  247. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/ru.js +0 -0
  248. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sk.js +0 -0
  249. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sl.js +0 -0
  250. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sr-Cyrl.js +0 -0
  251. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sr.js +0 -0
  252. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/sv.js +0 -0
  253. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/th.js +0 -0
  254. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/tr.js +0 -0
  255. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/uk.js +0 -0
  256. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/vi.js +0 -0
  257. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/zh-CN.js +0 -0
  258. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/i18n/zh-TW.js +0 -0
  259. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.full.js +0 -0
  260. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.full.min.js +0 -0
  261. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.js +0 -0
  262. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/static/select2/select2-4.0.5/js/select2.min.js +0 -0
  263. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/struct.py +0 -0
  264. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/base.html +0 -0
  265. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/base_form.html +0 -0
  266. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/base_includes.html +0 -0
  267. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/base_includes_select2.html +0 -0
  268. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/base_list.html +0 -0
  269. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/base_table_body.html +0 -0
  270. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/base_table_filter.html +0 -0
  271. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/base_form.html +0 -0
  272. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/base_includes.html +0 -0
  273. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/base_includes_v3.html +0 -0
  274. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/base_includes_v4.html +0 -0
  275. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/base_list.html +0 -0
  276. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/base_table_body.html +0 -0
  277. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/base_table_filter.html +0 -0
  278. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/base_field.html +0 -0
  279. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/base_field_v3.html +0 -0
  280. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/base_field_v4.html +0 -0
  281. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/checkbox.html +0 -0
  282. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/checkbox_multiple.html +0 -0
  283. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/fieldset.html +0 -0
  284. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/form.html +0 -0
  285. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/input.html +0 -0
  286. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/list_fieldset.html +0 -0
  287. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/radio.html +0 -0
  288. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/rtf_field.html +0 -0
  289. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/select.html +0 -0
  290. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/select_multiple.html +0 -0
  291. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/field/textarea.html +0 -0
  292. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/modal_dialog.html +0 -0
  293. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/modal_dialog_rest.html +0 -0
  294. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/bootstrap/page.html +0 -0
  295. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/base_field.html +0 -0
  296. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/checkbox.html +0 -0
  297. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/checkbox_multiple.html +0 -0
  298. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/dict_field.html +0 -0
  299. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/fieldset.html +0 -0
  300. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/form.html +0 -0
  301. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/input.html +0 -0
  302. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/list_field.html +0 -0
  303. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/list_fieldset.html +0 -0
  304. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/radio.html +0 -0
  305. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/rtf_field.html +0 -0
  306. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/select.html +0 -0
  307. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/select_multiple.html +0 -0
  308. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/field/textarea.html +0 -0
  309. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_form.html +0 -0
  310. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_includes.html +0 -0
  311. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_list.html +0 -0
  312. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_table_body.html +0 -0
  313. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/base_table_filter.html +0 -0
  314. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/base_field.html +0 -0
  315. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/checkbox.html +0 -0
  316. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/checkbox_multiple.html +0 -0
  317. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/fieldset.html +0 -0
  318. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/form.html +0 -0
  319. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/input.html +0 -0
  320. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/list_fieldset.html +0 -0
  321. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/radio.html +0 -0
  322. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/rtf_field.html +0 -0
  323. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/select.html +0 -0
  324. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/select_multiple.html +0 -0
  325. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/field/textarea.html +0 -0
  326. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/modal_dialog.html +0 -0
  327. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/modal_dialog_rest.html +0 -0
  328. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/jquery_ui/page.html +0 -0
  329. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/modal_dialog.html +0 -0
  330. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/modal_dialog_rest.html +0 -0
  331. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/page.html +0 -0
  332. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templates/dynamicforms/rtf_field_style.html +0 -0
  333. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templatetags/__init__.py +0 -0
  334. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/templatetags/dynamicforms.py +0 -0
  335. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/urls.py +0 -0
  336. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/views.py +0 -0
  337. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/dynamicforms_legacy/viewsets.py +0 -0
  338. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/__init__.py +0 -0
  339. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/admin.py +0 -0
  340. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/apps.py +0 -0
  341. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/enum_field.py +0 -0
  342. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0001_initial.py +0 -0
  343. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0002_auto_20190320_0823.py +0 -0
  344. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0003_filter_name.py +0 -0
  345. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0004_basicfields_password_field.py +0 -0
  346. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0005_advancedfields_file_field_two.py +0 -0
  347. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0005_refreshtype_rich_text_field.py +0 -0
  348. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0006_merge_20200921_1152.py +0 -0
  349. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0007_basicfields_nullint_field.py +0 -0
  350. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0008_auto_20210303_0904.py +0 -0
  351. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0008_auto_20210312_1146.py +0 -0
  352. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0009_auto_20210929_1136.py +0 -0
  353. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0010_filter_rtf_field.py +0 -0
  354. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/0011_auto_20211120_0523.py +0 -0
  355. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/migrations/__init__.py +0 -0
  356. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/models.py +0 -0
  357. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/recurrence_utils.py +0 -0
  358. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/__init__.py +0 -0
  359. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/actions_overview.py +0 -0
  360. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/basic_fields.py +0 -0
  361. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/calculated_css_class_for_table_row.py +0 -0
  362. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/calendar.py +0 -0
  363. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/calendar_dependencies.py +0 -0
  364. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/calendar_recurrence.py +0 -0
  365. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/calendar_reminders.py +0 -0
  366. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/choice_allow_tags_fields.py +0 -0
  367. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/fields/__init__.py +0 -0
  368. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/fields/name_field.py +0 -0
  369. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/filter.py +0 -0
  370. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/hidden_fields.py +0 -0
  371. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/page_load.py +0 -0
  372. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/relation.py +0 -0
  373. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/single_dialog.py +0 -0
  374. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/validated.py +0 -0
  375. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/rest/write_only_fields.py +0 -0
  376. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/tests.py +0 -0
  377. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/examples/urls.py +0 -0
  378. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/manage.py +0 -0
  379. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/package-lock.json +0 -0
  380. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/package.json +0 -0
  381. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/publish.py +0 -0
  382. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/readthedocs.yml +0 -0
  383. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/requirements.txt +0 -0
  384. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/requirements_test_functional.txt +0 -0
  385. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/setup/__init__.py +0 -0
  386. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/setup/settings.py +0 -0
  387. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/setup/urls.py +0 -0
  388. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/setup/wsgi.py +0 -0
  389. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/__init__.py +0 -0
  390. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/__init__.py +0 -0
  391. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_test_advanced_fields.py +0 -0
  392. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_test_basic_fields.py +0 -0
  393. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_test_filter.py +0 -0
  394. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_test_hidden_fields.py +0 -0
  395. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_test_page_load.py +0 -0
  396. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_test_single_dialog.py +0 -0
  397. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_test_validated.py +0 -0
  398. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/_tests.py +0 -0
  399. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/select.py +0 -0
  400. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/functional/selenium_test_case.py +0 -0
  401. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/request_sync.py +0 -0
  402. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/static_files/0_3142.prj +0 -0
  403. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/__init__.py +0 -0
  404. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_calendar.py +0 -0
  405. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_conditional_visibility.py +0 -0
  406. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_cursor_pagination.py +0 -0
  407. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_df_serializer.py +0 -0
  408. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_filter.py +0 -0
  409. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_page_load.py +0 -0
  410. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_struct.py +0 -0
  411. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/test_validate_allow_null_for_field_with_source_equal_to_star.py +0 -0
  412. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tests/unit/tests.py +0 -0
  413. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tox.ini +0 -0
  414. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tsconfig.build.json +0 -0
  415. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tsconfig.eslint.json +0 -0
  416. {dynamicforms-0.77.4 → dynamicforms-0.77.8}/tsconfig.json +0 -0
@@ -1,12 +1,13 @@
1
- Metadata-Version: 2.3
1
+ Metadata-Version: 2.4
2
2
  Name: dynamicforms
3
- Version: 0.77.4
3
+ Version: 0.77.8
4
4
  Summary: DynamicForms performs all the visualisation & data entry of your DRF Serializers & ViewSets and adds some candy of its own
5
5
  Project-URL: Homepage, https://github.com/velis74/DynamicForms
6
6
  Project-URL: Repository, https://github.com/velis74/DynamicForms
7
7
  Project-URL: Bug Tracker, https://github.com/velis74/DynamicForms/issues
8
8
  Author-email: Jure Erznožnik <jure@velis.si>
9
- License: MIT
9
+ License-Expression: MIT
10
+ License-File: LICENSE
10
11
  Classifier: Development Status :: 3 - Alpha
11
12
  Classifier: Framework :: Django
12
13
  Classifier: License :: OSI Approved :: BSD License
@@ -1,5 +1,5 @@
1
1
  __title__ = "DynamicForms"
2
- __version__ = '0.77.4'
2
+ __version__ = '0.77.8'
3
3
  __author__ = "Jure Erznožnik"
4
4
  __email__ = "jure.erznoznik@gmail.com"
5
5
  __license__ = "BSD 3-Clause"
@@ -35,7 +35,24 @@ assert DFField # So that the linter does not complain
35
35
 
36
36
 
37
37
  class AutoGeneratedField(dict):
38
- pass
38
+ def get_serializer_field(self, name, serializer, extra_params=None):
39
+ from rest_framework.utils import model_meta
40
+
41
+ if not hasattr(serializer, "_df_model"):
42
+ serializer._df_model = getattr(serializer.Meta, "model")
43
+ if not hasattr(serializer, "_df_info"):
44
+ serializer._df_info = model_meta.get_field_info(serializer._df_model)
45
+ if not hasattr(serializer, "_df_depth"):
46
+ serializer._df_depth = getattr(serializer.Meta, "depth", 0)
47
+
48
+ if extra_params is None:
49
+ extra_params = self
50
+ field_class, field_kwargs = serializer.build_field(
51
+ name, serializer._df_info, serializer._df_model, serializer._df_depth
52
+ )
53
+ field_kwargs.update(extra_params)
54
+
55
+ return field_class(**field_kwargs)
39
56
 
40
57
 
41
58
  class BooleanField(FieldRenderMixin, ActionMixin, FieldHelpTextMixin, ConditionalVisibilityMixin, fields.BooleanField):
@@ -13,7 +13,7 @@ class DenormalisedArray(list):
13
13
  for itm in ast.literal_eval(lst):
14
14
  self.append(itm)
15
15
 
16
- elif lst is not None and isinstance(lst, list):
16
+ elif lst is not None and isinstance(lst, (list, set)):
17
17
  for itm in lst:
18
18
  self.append(itm)
19
19
 
@@ -0,0 +1,52 @@
1
+ from typing import TYPE_CHECKING
2
+
3
+ from django.utils.translation import gettext_lazy as _
4
+
5
+ if TYPE_CHECKING:
6
+ from rest_framework.fields import FileField
7
+
8
+
9
+ class FileFieldMixin(object):
10
+ def __init__(self, **kwargs) -> None:
11
+ super().__init__(**kwargs)
12
+ # noinspection PyUnresolvedReferences
13
+ self.style.setdefault("no_filter", True)
14
+
15
+ def to_representation(self: "FileField", value, row_data=None):
16
+ if value:
17
+ return getattr(value, "url", None)
18
+ return None
19
+
20
+ def to_internal_value(self: "FileField", data):
21
+ from django.core.files.base import ContentFile
22
+ from rest_framework.exceptions import ValidationError
23
+
24
+ from dynamicforms.preupload_files import get_cached_file
25
+
26
+ if isinstance(data, str): # dobimo guid
27
+ cached_file = get_cached_file(data, self.context["request"].user.id or -1, True)
28
+ if cached_file:
29
+ # Naredimo django file iz cache podatkov
30
+ return ContentFile(cached_file.content, name=cached_file.name)
31
+
32
+ # Če datoteke ni v cache-u in imamo obstoječo vrednost na instanci, vrnemo obstoječo vrednost
33
+ if self.parent.instance and getattr(self.parent.instance, self.field_name, None):
34
+ return str(getattr(self.parent.instance, self.field_name))
35
+ raise ValidationError(_("File not found in cache"))
36
+
37
+ if not self.allow_empty_file and not data:
38
+ self.fail("empty")
39
+
40
+ return super().to_internal_value(data)
41
+
42
+ def validate_empty_values(self: "FileField", data):
43
+ """Override za boljše rokovanje z empty vrednostmi"""
44
+ if data is None:
45
+ if self.required:
46
+ self.fail("required")
47
+ return True, None
48
+
49
+ if data == "" and self.allow_empty_file:
50
+ return True, None
51
+
52
+ return False, data
@@ -0,0 +1,117 @@
1
+ import time
2
+
3
+ from dataclasses import asdict, dataclass
4
+ from typing import Optional
5
+ from uuid import uuid4
6
+
7
+ from django.core.cache import cache
8
+ from django.utils.translation import gettext as __
9
+ from rest_framework import status
10
+ from rest_framework.exceptions import NotFound, PermissionDenied, ValidationError
11
+ from rest_framework.response import Response
12
+ from rest_framework.views import APIView
13
+
14
+ # Cache constants
15
+ CACHE_EXPIRATION = 60 * 60 # 60 minutes
16
+ CACHE_KEY_PREFIX = "file_upload_"
17
+
18
+
19
+ @dataclass
20
+ class CachedFile:
21
+ content: bytes
22
+ name: str
23
+ content_type: str
24
+ size: int
25
+ user_id: int
26
+ timestamp: int
27
+
28
+ @property
29
+ def age_in_seconds(self) -> int:
30
+ return int(time.time()) - self.timestamp
31
+
32
+
33
+ def count_user_cached_files(user_id: int) -> int:
34
+ """Vrne število vseh cached datotek za uporabnika"""
35
+ count = 0
36
+
37
+ if hasattr(cache, 'keys'): # we expect redis in production
38
+ for key in cache.keys(f"{CACHE_KEY_PREFIX}*"):
39
+ file_data = cache.get(key)
40
+ if file_data and file_data.get("user_id") == user_id:
41
+ count += 1
42
+
43
+ return count
44
+
45
+ class FileUploadView(APIView):
46
+ def post(self, request):
47
+ """Upload file to cache storage"""
48
+ MAX_FILE_SIZE = 1 * 1024 * 1024 # 1MB
49
+ MAX_FILES_PER_USER = 10
50
+
51
+ uploaded_file = request.FILES.get("file")
52
+ if not uploaded_file:
53
+ raise ValidationError({"file": ["required"]})
54
+
55
+ if uploaded_file.size > MAX_FILE_SIZE:
56
+ msg = __("File size exceeds allowed maximum size of {size_mb}MB")
57
+ raise ValidationError({"file": [msg.format(size_mb=MAX_FILE_SIZE // (1024 * 1024))]})
58
+
59
+ user_id = request.user.id or -1
60
+
61
+ if count_user_cached_files(user_id) >= MAX_FILES_PER_USER:
62
+ raise ValidationError({"file": [__("Too many files uploaded. Please submit a form or try again later.")]})
63
+
64
+ try:
65
+ file_identifier = str(uuid4())
66
+ file_content = uploaded_file.read()
67
+
68
+ cached_file = CachedFile(
69
+ content=file_content,
70
+ name=uploaded_file.name,
71
+ content_type=uploaded_file.content_type,
72
+ size=uploaded_file.size,
73
+ user_id=user_id,
74
+ timestamp=int(time.time()),
75
+ )
76
+
77
+ cache_key = f"{CACHE_KEY_PREFIX}{file_identifier}"
78
+ cache.set(cache_key, asdict(cached_file), CACHE_EXPIRATION)
79
+
80
+ return Response({"identifier": file_identifier})
81
+
82
+ except Exception as e:
83
+ # V produkciji uporabi proper logging
84
+ print(f"Error during file upload: {str(e)}")
85
+ return Response({"error": __("File upload failed")}, status=status.HTTP_500_INTERNAL_SERVER_ERROR)
86
+
87
+ def delete(self, request, file_identifier=None):
88
+ """Delete file from cache storage"""
89
+ if not file_identifier:
90
+ raise ValidationError({"file_identifier": ["required"]})
91
+
92
+ file_identifier = file_identifier.rstrip("/") # remove the trailing slash
93
+ cached_file = get_cached_file(file_identifier, request.user.id)
94
+ if not cached_file:
95
+ raise NotFound(__("File not found"))
96
+
97
+ cache_key = f"{CACHE_KEY_PREFIX}{file_identifier}"
98
+ cache.delete(cache_key)
99
+
100
+ return Response(status=status.HTTP_204_NO_CONTENT)
101
+
102
+
103
+ def get_cached_file(file_identifier: str, user_id: int, delete_from_cache: bool = False) -> Optional[CachedFile]:
104
+ """Helper function to retrieve file from cache"""
105
+ cache_key = f"{CACHE_KEY_PREFIX}{file_identifier}"
106
+ file_data = cache.get(cache_key)
107
+
108
+ if not file_data:
109
+ return None
110
+
111
+ if file_data.get("user_id") != user_id:
112
+ raise PermissionDenied(__("You don't have permission to access this file"))
113
+
114
+ if delete_from_cache:
115
+ cache.delete(cache_key)
116
+
117
+ return CachedFile(**file_data)
@@ -303,10 +303,14 @@ class ModelSerializer(DynamicFormsSerializer, serializers.ModelSerializer):
303
303
  resolved display value in table
304
304
  """
305
305
  for field_name in field_names[:]:
306
- # serializer field: either what is declared as a Field instance in Serializer or AutogeneratedField
307
- s_field = declared_fields.get(field_name, getattr(self, field_name, None))
308
306
  # existing extra as provided by get_extra_kwargs
309
307
  extra = extra_kwargs.get(field_name, dict())
308
+
309
+ # serializer field: either what is declared as a Field instance in Serializer or AutogeneratedField
310
+ s_field = declared_fields.get(field_name, getattr(self, field_name, None))
311
+ if isinstance(s_field, fields.AutoGeneratedField):
312
+ s_field = s_field.get_serializer_field(field_name, self, extra)
313
+
310
314
  # model field, if it exists
311
315
  try:
312
316
  d_field = self.Meta.model._meta.get_field(field_name)
@@ -350,7 +354,7 @@ class ModelSerializer(DynamicFormsSerializer, serializers.ModelSerializer):
350
354
  source="*",
351
355
  display_form=DisplayMode.HIDDEN,
352
356
  display_table=DisplayMode.FULL,
353
- render_params=s_field.render_params if s_field else None,
357
+ render_params=getattr(s_field, "render_params", None) if s_field else None,
354
358
  )
355
359
 
356
360
  def get_resolve_method(fld_nm, res_fld):
@@ -528,4 +532,3 @@ class DynamicModelSerializerMixin(DynamicModelMixin):
528
532
  except ImportError:
529
533
  pass
530
534
  return self.Meta.layout
531
-
@@ -5,5 +5,5 @@ from dynamicforms import preupload_files, progress
5
5
  urlpatterns = [
6
6
  # Progress is used for checking on progress of operation on server
7
7
  re_path(r"^progress/$", progress.get_progress_value, name="progress"),
8
- re_path(r"^preupload-file/$", preupload_files.preupload_file, name="preupload-file"),
8
+ re_path(r"^preupload-file/(?P<file_identifier>[\w-]+/)?$", preupload_files.FileUploadView.as_view(), name="preupload-file"),
9
9
  ]
@@ -5,7 +5,6 @@ from dynamicforms.template_render.layout import Layout
5
5
  from dynamicforms.viewsets import ModelViewSet
6
6
 
7
7
  from ..models import AdvancedFields, Relation
8
- from .fields.df_file_field import DfFileField, DfPreloadedFileField
9
8
 
10
9
 
11
10
  class AdvancedFieldsSerializer(serializers.ModelSerializer):
@@ -95,8 +94,8 @@ class AdvancedFieldsSerializer(serializers.ModelSerializer):
95
94
  queryset=Relation.objects.all(), url_reverse="relation-list", value_field="id", text_field="name"
96
95
  )
97
96
  slug_related_field = fields.SlugRelatedField(slug_field="name", queryset=Relation.objects.all())
98
- file_field = DfFileField(max_length=None, allow_empty_file=False, use_url=False, allow_null=True, required=False)
99
- file_field_two = DfPreloadedFileField(allow_empty_file=False, use_url=False, allow_null=True, required=False)
97
+ file_field = fields.FileField(max_length=None, allow_empty_file=False, use_url=False, allow_null=True, required=False)
98
+ file_field_two = fields.FileField(allow_empty_file=False, use_url=False, allow_null=True, required=False)
100
99
 
101
100
  # hyperlinked_identity_field = serializers.HyperlinkedIdentityField(view_name='relation-detail', read_only=True)
102
101
 
@@ -1,8 +1,7 @@
1
- from dynamicforms import serializers
1
+ from dynamicforms import fields, serializers
2
2
  from dynamicforms.viewsets import ModelViewSet
3
3
 
4
4
  from ..models import Document
5
- from .fields.df_file_field import DfPreloadedFileField
6
5
 
7
6
 
8
7
  class DocumentsSerializer(serializers.ModelSerializer):
@@ -13,7 +12,7 @@ class DocumentsSerializer(serializers.ModelSerializer):
13
12
  "edit": "Editing document object",
14
13
  }
15
14
 
16
- file = DfPreloadedFileField(allow_empty_file=False, use_url=False, allow_null=True)
15
+ file = fields.FileField(allow_empty_file=False, use_url=False, allow_null=True)
17
16
 
18
17
  class Meta:
19
18
  model = Document
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "dynamicforms"
7
- version = "0.77.4"
7
+ version = "0.77.8"
8
8
  description = "DynamicForms performs all the visualisation & data entry of your DRF Serializers & ViewSets and adds some candy of its own"
9
9
  readme = "README.md"
10
10
  requires-python = ">=3.8"
@@ -1,42 +0,0 @@
1
- import pathlib
2
- import time
3
-
4
- from typing import Optional
5
- from uuid import uuid4
6
-
7
- from django.conf import settings
8
- from django.core.files.storage import FileSystemStorage
9
- from django.core.files.uploadedfile import InMemoryUploadedFile
10
- from django.http import HttpResponse, JsonResponse
11
- from django.utils.translation import gettext as __
12
- from rest_framework import status
13
- from rest_framework.exceptions import ValidationError
14
-
15
- UPLOADED_FILE_NAME_TIMESTAMP_SEPARATOR = "_timestamp_"
16
- UPLOADED_FILE_NAME_UUID_SEPARATOR = "_uuid_"
17
- UPLOADED_FILE_TMP_LOCATION = "df_tmp_files"
18
-
19
- preuploaded_fs = FileSystemStorage(location=f"{settings.MEDIA_ROOT}/{UPLOADED_FILE_TMP_LOCATION}")
20
-
21
-
22
- def preupload_file(request):
23
- # if not DYNAMICFORMS.allow_anonymous_user_to_preupload_files and not request.user.is_authenticated:
24
- # return HttpResponse(status=status.HTTP_401_UNAUTHORIZED)
25
- if request.method == "POST":
26
- uploaded_file: Optional[InMemoryUploadedFile] = request.FILES.get("file", None)
27
- if not uploaded_file:
28
- raise ValidationError(dict(file=["required"]))
29
- file_identifier: str = str(uuid4())
30
- try:
31
- file_extension: str = pathlib.Path(uploaded_file.name).suffix
32
- file_name: str = uploaded_file.name.replace(file_extension, "")
33
- preuploaded_fs.save(
34
- f"{file_name}{UPLOADED_FILE_NAME_UUID_SEPARATOR}{file_identifier}"
35
- f"{UPLOADED_FILE_NAME_TIMESTAMP_SEPARATOR}{int(time.time())}"
36
- f"{file_extension}",
37
- uploaded_file,
38
- )
39
- return JsonResponse(dict(identifier=file_identifier))
40
- except Exception:
41
- return HttpResponse(status=status.HTTP_500_INTERNAL_SERVER_ERROR, content=__("File upload failed").encode())
42
- return HttpResponse(status=status.HTTP_501_NOT_IMPLEMENTED)
@@ -1,5 +0,0 @@
1
- class FileFieldMixin(object):
2
- def __init__(self, **kwargs) -> None:
3
- super().__init__(**kwargs)
4
- # noinspection PyUnresolvedReferences
5
- self.style.setdefault("no_filter", True)
@@ -1,76 +0,0 @@
1
- import glob
2
- import os
3
- import pathlib
4
-
5
- from typing import Optional
6
-
7
- from django.core.files.uploadedfile import InMemoryUploadedFile
8
- from django.utils.safestring import mark_safe
9
- from django.utils.translation import gettext_lazy as _
10
- from rest_framework.exceptions import ValidationError
11
-
12
- from dynamicforms.fields import FileField
13
- from dynamicforms.preupload_files import (
14
- preuploaded_fs,
15
- UPLOADED_FILE_NAME_TIMESTAMP_SEPARATOR,
16
- UPLOADED_FILE_NAME_UUID_SEPARATOR,
17
- )
18
-
19
-
20
- class DfFileField(FileField):
21
- def to_representation(self, value, row_data=None):
22
- empty_value: Optional[str] = ""
23
- render_to_component_def_format: bool = self.context.get("format", "") == "componentdef"
24
- if render_to_component_def_format:
25
- empty_value = None
26
- if not value:
27
- return empty_value
28
- link = mark_safe(
29
- '<a href="#" onclick=\'dynamicforms.stopEventPropagation(event); window.open("%s", "_blank")\'>%s</a>'
30
- % (value.url, os.path.basename(value.url))
31
- )
32
- self.help_text = "Existing file: %s " % link
33
- return super().to_representation(empty_value, row_data)
34
-
35
- def render_to_table(self, value, row_data):
36
- render_to_component_def_format: bool = self.context.get("format", "") == "componentdef"
37
- link = mark_safe(
38
- '<a href="#" onclick=\'dynamicforms.stopEventPropagation(event); window.open("%s", "_blank")\'>%s</a>'
39
- % (value.url, os.path.basename(value.url))
40
- )
41
- return link if not render_to_component_def_format else value.url
42
-
43
-
44
- class DfPreloadedFileField(FileField):
45
- def to_representation(self, value, row_data=None):
46
- if value:
47
- return getattr(value, "url", None)
48
- return None
49
-
50
- def to_internal_value(self, data):
51
- if not isinstance(data, str):
52
- raise ValidationError(_("File identifier should be string"))
53
- file_size = len(data)
54
- if not self.allow_empty_file and not file_size:
55
- self.fail("empty")
56
- file: Optional[str] = next(
57
- iter(
58
- glob.glob(
59
- f"{preuploaded_fs.location}/*{UPLOADED_FILE_NAME_UUID_SEPARATOR}*{data}*{UPLOADED_FILE_NAME_TIMESTAMP_SEPARATOR}*"
60
- )
61
- ),
62
- None,
63
- )
64
- if not file and self.parent.instance and getattr(self.parent.instance, self.field_name, None):
65
- return str(getattr(self.parent.instance, self.field_name))
66
- file_object = pathlib.Path(file)
67
- file_pointer = open(file, "rb")
68
- return InMemoryUploadedFile(
69
- file=file_pointer,
70
- field_name=self.field_name,
71
- name=f"{file_object.stem.split(UPLOADED_FILE_NAME_UUID_SEPARATOR)[0]}{file_object.suffix}",
72
- content_type=None,
73
- size=len(file_pointer.read()),
74
- charset=None,
75
- content_type_extra=None,
76
- )
File without changes
File without changes
File without changes
File without changes
File without changes
File without changes