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