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