django-viewflow 2.3.0__tar.gz → 2.3.2__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.
- {django_viewflow-2.3.0/django_viewflow.egg-info → django_viewflow-2.3.2}/PKG-INFO +48 -25
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/README.md +47 -24
- {django_viewflow-2.3.0 → django_viewflow-2.3.2/django_viewflow.egg-info}/PKG-INFO +48 -25
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/django_viewflow.egg-info/SOURCES.txt +3 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/setup.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/__init__.py +5 -11
- django_viewflow-2.3.2/viewflow/apps.py +39 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/conf.py +10 -3
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/admin/__init__.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/auth.py +21 -4
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/plotly/views.py +26 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/fields.py +42 -8
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/forms/renderers.py +11 -4
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/fsm/admin.py +3 -2
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/fsm/base.py +16 -7
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/fsm/chart.py +2 -1
- django_viewflow-2.3.2/viewflow/fsm/views.py +64 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/fsm/viewset.py +33 -2
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/jsonstore.py +18 -2
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/management/__init__.py +1 -2
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/management/commands/flowexport.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/middleware.py +2 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/viewflow.min.js +9 -9
- django_viewflow-2.3.2/viewflow/static/viewflow/js/viewflow.min.js.map +1 -0
- django_viewflow-2.3.2/viewflow/templates/viewflow/contrib/import_export/import_action.html +41 -0
- django_viewflow-2.3.2/viewflow/templates/viewflow/fsm/detail.html +22 -0
- django_viewflow-2.3.2/viewflow/templates/viewflow/views/detail.html +24 -0
- django_viewflow-2.3.2/viewflow/templates/viewflow/views/fsm_chart.html +21 -0
- django_viewflow-2.3.2/viewflow/templatetags/fsm.py +20 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/utils.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/actions.py +18 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/detail.py +7 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/list.py +4 -5
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/search.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/activation.py +10 -2
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/admin.py +20 -7
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/apps.py +3 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/base.py +5 -2
- django_viewflow-2.3.2/viewflow/workflow/checks.py +57 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/mixins.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/utils.py +10 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/actions.py +28 -5
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/chart.py +6 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/dashboard.py +8 -5
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/detail.py +3 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/list.py +2 -2
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/lock.py +59 -3
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/end.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/func.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/if_gate.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/job.py +14 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/join.py +58 -24
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/split.py +1 -1
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/start.py +11 -9
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/switch.py +1 -1
- django_viewflow-2.3.0/viewflow/apps.py +0 -15
- django_viewflow-2.3.0/viewflow/fsm/views.py +0 -52
- django_viewflow-2.3.0/viewflow/static/viewflow/js/viewflow.min.js.map +0 -1
- django_viewflow-2.3.0/viewflow/templates/viewflow/contrib/import_export/import_action.html +0 -0
- django_viewflow-2.3.0/viewflow/templates/viewflow/views/detail.html +0 -12
- django_viewflow-2.3.0/viewflow/templatetags/fsm.py +0 -15
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/LICENSE +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/LICENSE_EXCEPTION +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/MANIFEST.in +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/django_viewflow.egg-info/dependency_links.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/django_viewflow.egg-info/not-zip-safe +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/django_viewflow.egg-info/requires.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/django_viewflow.egg-info/top_level.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/setup.cfg +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/tests/test_middleware.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/tests/test_templates.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/tests/test_templatetags__viewflow.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/tests/test_this_object.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/tests/test_urls__base.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/tests/test_utils__package.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/admin/apps.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/plotly/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/plotly/material.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/contrib/plotly/viewset.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/forms/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/fsm/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/fsm/typing.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/de/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/de/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/es/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/es/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/it/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/it/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/ja/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/ja/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/kk/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/kk/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/ko/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/ko/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/pt/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/pt/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/ru/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/ru/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/sr/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/sr/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/management/commands/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/css/node_modules/perfect-scrollbar/css/perfect-scrollbar.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/css/node_modules/trix/dist/trix.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/css/node_modules/vis-network/dist/dist/vis-network.min.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/css/perfect-scrollbar.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/css/trix.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/css/viewflow.min.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/css/vis-network.min.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-outlined.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-outlined.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-round.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-round.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-sharp.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-sharp.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-two-tone.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons-two-tone.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/material-icons/node_modules/material-icons/iconfont/material-icons.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/css/roboto/roboto-fontface.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Black.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Black.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-BlackItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Bold.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Bold.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-BoldItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Light.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Light.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-LightItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Medium.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Medium.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-MediumItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Regular.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Regular.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-RegularItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Thin.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-Thin.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-ThinItalic.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/node_modules/roboto-fontface/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/roboto/roboto-fontface.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.eot +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.otf +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.ttf +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/node_modules/simple-icons-font/font/SimpleIcons.eot +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/node_modules/simple-icons-font/font/SimpleIcons.otf +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/node_modules/simple-icons-font/font/SimpleIcons.ttf +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/node_modules/simple-icons-font/font/SimpleIcons.woff +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/node_modules/simple-icons-font/font/SimpleIcons.woff2 +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/node_modules/simple-icons-font/font/simple-icons.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/node_modules/simple-icons-font/font/simple-icons.min.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.min.css +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/img/favicon.png +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/img/user.png +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash-renderer/build/dash_renderer.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.LICENSE.txt +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/dcc/plotly.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/deps/polyfill@7.12.1.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.7.2.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.8.1.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/deps/react-dom@16.14.0.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/deps/react@16.14.0.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/node_modules/@hotwired/turbo/dist/turbo.es2017-umd.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/node_modules/perfect-scrollbar/dist/perfect-scrollbar.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/node_modules/perfect-scrollbar/dist/perfect-scrollbar.min.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/node_modules/smartcrop/smartcrop.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/node_modules/vis-network/dist/vis-network.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/node_modules/vis-network/dist/vis-network.min.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/perfect-scrollbar.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/perfect-scrollbar.min.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/smartcrop.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/trix.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/turbo.es2017-umd.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/vis-network.min.js +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/static/viewflow/js/vis-network.min.js.map +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/400.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/403.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/404.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/500.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/admin/fsm_change_form.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/admin/fsm_change_form_object_tools.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/admin/fsm_change_list.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/admin/fsm_transition_form.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/formtools/wizard/wizard_form.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/logged_out.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/login.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/password_change_done.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/password_change_form.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/password_reset_complete.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/password_reset_confirm.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/password_reset_done.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/password_reset_form.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/profile.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/registration/provider_list.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/base.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/base_lockscreen.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/base_page.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/contrib/import_export/export_action.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/contrib/plotly.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/contrib/swagger.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/app_menu.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/list_bulk_actions.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/list_filter.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/list_pagination.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/object_detail_card.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/site_menu.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/snackbar.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/view_action_menu.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/viewflow_css.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/includes/viewflow_js.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/material/circular_progress.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/views/confirm_delete.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/views/delete_action.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/views/form.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/views/list.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/views/transition.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/assign.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/base_page.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/celery_task_detail.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/flow_menu.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/graph.bpmn +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/graph.svg +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/process_cancel.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/process_dashboard.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/process_data.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/process_detail.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/process_list.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/process_tasks_list.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/start.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_assign.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_base.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_cancel.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_data.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_detail.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_list.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_revive.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_unassign.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/task_undo.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/tasks_assign.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/tasks_unassign.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/workflow_menu.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templates/viewflow/workflow/workflow_tasks_list.html +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templatetags/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templatetags/viewflow.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/templatetags/workflow.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/this_object.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/urls/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/urls/base.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/urls/model.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/urls/sites.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/base.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/create.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/delete.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/filters.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/views/update.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/chart.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/context.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/exceptions.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/fields.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/nodes.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/create.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/filters.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/mixins.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/views/update.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/flow/viewset.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/managers.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0001_initial.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0002_fsmchange.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0003_task_owner_permission_change.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0004_extend_fields_length.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0004_subprocess.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0005_merge.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0005_rename_flowcls.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0006_i18n.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0006_merge.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0007_owner_permission_obj.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0007_task_assigned.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0008_jsonfield_and_artifact.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0008_merge.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0009_merge.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0010_viewflow20.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0011_alter_task_created_and_more.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0013_process_seed_content_type_process_seed_object_id_and_more.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/0014_alter_process_parent_task.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/migrations/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/models.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/__init__.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/handle.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/mixins.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/obsolete.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/nodes/view.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/signals.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/status.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/token.py +0 -0
- {django_viewflow-2.3.0 → django_viewflow-2.3.2}/viewflow/workflow/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-viewflow
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.2
|
|
4
4
|
Summary: Reusable library to build business applications fast
|
|
5
5
|
Author: Mikhail Podgurskiy
|
|
6
6
|
Author-email: kmmbvnr@gmail.com
|
|
@@ -75,7 +75,7 @@ Viewflow comes in two versions:
|
|
|
75
75
|
|
|
76
76
|
## Installation
|
|
77
77
|
|
|
78
|
-
Viewflow works with Python 3.
|
|
78
|
+
Viewflow works with Python 3.10+ and Django 4.2+
|
|
79
79
|
|
|
80
80
|
Viewflow:
|
|
81
81
|
|
|
@@ -225,6 +225,52 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
225
225
|
|
|
226
226
|
## Changelog
|
|
227
227
|
|
|
228
|
+
For older releases, see [CHANGELOG.rst](./CHANGELOG.rst).
|
|
229
|
+
|
|
230
|
+
## 2.3.2 2026-07-06
|
|
231
|
+
|
|
232
|
+
Security and data-integrity release. Highlights:
|
|
233
|
+
|
|
234
|
+
- Fix cross-flow privilege escalation and information disclosure: a user with
|
|
235
|
+
only flow A's permission could cancel, or read the full task list of, flow B's
|
|
236
|
+
process by posting/opening flow B's id on flow A's URL. `CancelProcessView` and
|
|
237
|
+
`DetailProcessView` now scope their querysets to the view's own flow
|
|
238
|
+
- Fix the bulk-delete endpoint (`action/delete/`) deleting rows without checking
|
|
239
|
+
login or the `delete` permission; add the missing authentication checks to the
|
|
240
|
+
standalone `FlowChartView` and the `contrib.plotly` Dash endpoints
|
|
241
|
+
- Fix a transaction-ordering bug that committed partial writes next to a task's
|
|
242
|
+
`ERROR` status in async mode; `Function`, `End`, `If`, `Split`, `Switch`,
|
|
243
|
+
`Subprocess`, and `Join` activation now roll back cleanly on failure
|
|
244
|
+
- Fix a celery `Job` node treating `self.retry()`/`Reject` as a task failure and
|
|
245
|
+
crashing on redelivery of a `STARTED` retry
|
|
246
|
+
- Fix task actions releasing their lock before the transaction commits, which let
|
|
247
|
+
a concurrent request double-execute an action under `CacheLock`
|
|
248
|
+
- Fix `jsonstore` fields with a falsy `default` (`False`, `0`) returning `None`,
|
|
249
|
+
discarding a falsy assigned value, and mis-sorting on `order_by()`
|
|
250
|
+
- Fix unbounded memory leaks in form rendering (widget-renderer cache keyed on the
|
|
251
|
+
widget instance) and in `ListModelView` (`lru_cache` keyed on the view instance)
|
|
252
|
+
- Fix the "Administration" menu showing to every logged-in user instead of staff
|
|
253
|
+
- Fix several `viewflow.fsm` bugs: chart crashes on self-transitions, `State` with
|
|
254
|
+
a custom getter replacing falsy-but-valid states, REST `transition` committing
|
|
255
|
+
field writes on a failed transition or allowing arbitrary field writes; add a
|
|
256
|
+
`chart/` state-chart view and action to `FlowViewsMixin`
|
|
257
|
+
- Fix a crash on the admin change page of any FSM-backed model under Django 5.2+
|
|
258
|
+
(incl. 6.1) from the `change_form_fsm_tools` template tag
|
|
259
|
+
- Fix grouped `<select>` options under an `<optgroup>` being dropped, a formset
|
|
260
|
+
validation bypass via a tampered ManagementForm, and `vf-field-select-multiple`
|
|
261
|
+
dropping or failing to toggle selected values
|
|
262
|
+
- Fix a system check now warning when a flow has `Join` nodes but no real lock,
|
|
263
|
+
and `manage.py check`/`runserver` crashing for a Join-node flow defined outside
|
|
264
|
+
any installed app
|
|
265
|
+
|
|
266
|
+
## 2.3.1 2026-06-30
|
|
267
|
+
|
|
268
|
+
- Add Django 6.1 support
|
|
269
|
+
- Fix the bulk task assign/unassign actions not enforcing the per-task
|
|
270
|
+
`can_assign`/`can_unassign` permission
|
|
271
|
+
- Fix task views accepting a task pk from another flow; tasks are now scoped to
|
|
272
|
+
the flow in the URL
|
|
273
|
+
|
|
228
274
|
## 2.3.0 2026-06-30
|
|
229
275
|
|
|
230
276
|
- Fix `viewflow.fsm` chart generation crashing for `Enum` states and `State.ANY`
|
|
@@ -249,29 +295,6 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
249
295
|
- Upgrade `vanilla-jsoneditor` 0.23 → 3 (bundles svelte 5); the JSON field
|
|
250
296
|
editor API is unchanged
|
|
251
297
|
|
|
252
|
-
## 2.2.15 2025-12-24
|
|
253
|
-
|
|
254
|
-
- Fix form button name/value lost on resubmission after validation error with Turbo
|
|
255
|
-
- Fix subprocess double execution when completing synchronously
|
|
256
|
-
|
|
257
|
-
## 2.2.14 2025-11-24
|
|
258
|
-
|
|
259
|
-
- Add Django 6.0 compatibility (requires Python 3.12+)
|
|
260
|
-
- Improve error handling for permission creation in multiple database configurations
|
|
261
|
-
- Fix BPMN export to include name attribute for gateway nodes (flow.If)
|
|
262
|
-
|
|
263
|
-
## 2.2.13 2025-09-24
|
|
264
|
-
|
|
265
|
-
- Fix checkbox field error message styling to display in red color
|
|
266
|
-
|
|
267
|
-
## 2.2.12 2025-07-25
|
|
268
|
-
|
|
269
|
-
- Allow to extend and override process_data template
|
|
270
|
-
|
|
271
|
-
## 2.2.11 2025-05-14
|
|
272
|
-
|
|
273
|
-
- Return .Avaialble(..) for the start node
|
|
274
|
-
|
|
275
298
|
|
|
276
299
|
|
|
277
300
|
[build]: https://img.shields.io/github/actions/workflow/status/viewflow/viewflow/django.yml?branch=main
|
|
@@ -32,7 +32,7 @@ Viewflow comes in two versions:
|
|
|
32
32
|
|
|
33
33
|
## Installation
|
|
34
34
|
|
|
35
|
-
Viewflow works with Python 3.
|
|
35
|
+
Viewflow works with Python 3.10+ and Django 4.2+
|
|
36
36
|
|
|
37
37
|
Viewflow:
|
|
38
38
|
|
|
@@ -182,6 +182,52 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
182
182
|
|
|
183
183
|
## Changelog
|
|
184
184
|
|
|
185
|
+
For older releases, see [CHANGELOG.rst](./CHANGELOG.rst).
|
|
186
|
+
|
|
187
|
+
## 2.3.2 2026-07-06
|
|
188
|
+
|
|
189
|
+
Security and data-integrity release. Highlights:
|
|
190
|
+
|
|
191
|
+
- Fix cross-flow privilege escalation and information disclosure: a user with
|
|
192
|
+
only flow A's permission could cancel, or read the full task list of, flow B's
|
|
193
|
+
process by posting/opening flow B's id on flow A's URL. `CancelProcessView` and
|
|
194
|
+
`DetailProcessView` now scope their querysets to the view's own flow
|
|
195
|
+
- Fix the bulk-delete endpoint (`action/delete/`) deleting rows without checking
|
|
196
|
+
login or the `delete` permission; add the missing authentication checks to the
|
|
197
|
+
standalone `FlowChartView` and the `contrib.plotly` Dash endpoints
|
|
198
|
+
- Fix a transaction-ordering bug that committed partial writes next to a task's
|
|
199
|
+
`ERROR` status in async mode; `Function`, `End`, `If`, `Split`, `Switch`,
|
|
200
|
+
`Subprocess`, and `Join` activation now roll back cleanly on failure
|
|
201
|
+
- Fix a celery `Job` node treating `self.retry()`/`Reject` as a task failure and
|
|
202
|
+
crashing on redelivery of a `STARTED` retry
|
|
203
|
+
- Fix task actions releasing their lock before the transaction commits, which let
|
|
204
|
+
a concurrent request double-execute an action under `CacheLock`
|
|
205
|
+
- Fix `jsonstore` fields with a falsy `default` (`False`, `0`) returning `None`,
|
|
206
|
+
discarding a falsy assigned value, and mis-sorting on `order_by()`
|
|
207
|
+
- Fix unbounded memory leaks in form rendering (widget-renderer cache keyed on the
|
|
208
|
+
widget instance) and in `ListModelView` (`lru_cache` keyed on the view instance)
|
|
209
|
+
- Fix the "Administration" menu showing to every logged-in user instead of staff
|
|
210
|
+
- Fix several `viewflow.fsm` bugs: chart crashes on self-transitions, `State` with
|
|
211
|
+
a custom getter replacing falsy-but-valid states, REST `transition` committing
|
|
212
|
+
field writes on a failed transition or allowing arbitrary field writes; add a
|
|
213
|
+
`chart/` state-chart view and action to `FlowViewsMixin`
|
|
214
|
+
- Fix a crash on the admin change page of any FSM-backed model under Django 5.2+
|
|
215
|
+
(incl. 6.1) from the `change_form_fsm_tools` template tag
|
|
216
|
+
- Fix grouped `<select>` options under an `<optgroup>` being dropped, a formset
|
|
217
|
+
validation bypass via a tampered ManagementForm, and `vf-field-select-multiple`
|
|
218
|
+
dropping or failing to toggle selected values
|
|
219
|
+
- Fix a system check now warning when a flow has `Join` nodes but no real lock,
|
|
220
|
+
and `manage.py check`/`runserver` crashing for a Join-node flow defined outside
|
|
221
|
+
any installed app
|
|
222
|
+
|
|
223
|
+
## 2.3.1 2026-06-30
|
|
224
|
+
|
|
225
|
+
- Add Django 6.1 support
|
|
226
|
+
- Fix the bulk task assign/unassign actions not enforcing the per-task
|
|
227
|
+
`can_assign`/`can_unassign` permission
|
|
228
|
+
- Fix task views accepting a task pk from another flow; tasks are now scoped to
|
|
229
|
+
the flow in the URL
|
|
230
|
+
|
|
185
231
|
## 2.3.0 2026-06-30
|
|
186
232
|
|
|
187
233
|
- Fix `viewflow.fsm` chart generation crashing for `Enum` states and `State.ANY`
|
|
@@ -206,29 +252,6 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
206
252
|
- Upgrade `vanilla-jsoneditor` 0.23 → 3 (bundles svelte 5); the JSON field
|
|
207
253
|
editor API is unchanged
|
|
208
254
|
|
|
209
|
-
## 2.2.15 2025-12-24
|
|
210
|
-
|
|
211
|
-
- Fix form button name/value lost on resubmission after validation error with Turbo
|
|
212
|
-
- Fix subprocess double execution when completing synchronously
|
|
213
|
-
|
|
214
|
-
## 2.2.14 2025-11-24
|
|
215
|
-
|
|
216
|
-
- Add Django 6.0 compatibility (requires Python 3.12+)
|
|
217
|
-
- Improve error handling for permission creation in multiple database configurations
|
|
218
|
-
- Fix BPMN export to include name attribute for gateway nodes (flow.If)
|
|
219
|
-
|
|
220
|
-
## 2.2.13 2025-09-24
|
|
221
|
-
|
|
222
|
-
- Fix checkbox field error message styling to display in red color
|
|
223
|
-
|
|
224
|
-
## 2.2.12 2025-07-25
|
|
225
|
-
|
|
226
|
-
- Allow to extend and override process_data template
|
|
227
|
-
|
|
228
|
-
## 2.2.11 2025-05-14
|
|
229
|
-
|
|
230
|
-
- Return .Avaialble(..) for the start node
|
|
231
|
-
|
|
232
255
|
|
|
233
256
|
|
|
234
257
|
[build]: https://img.shields.io/github/actions/workflow/status/viewflow/viewflow/django.yml?branch=main
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: django-viewflow
|
|
3
|
-
Version: 2.3.
|
|
3
|
+
Version: 2.3.2
|
|
4
4
|
Summary: Reusable library to build business applications fast
|
|
5
5
|
Author: Mikhail Podgurskiy
|
|
6
6
|
Author-email: kmmbvnr@gmail.com
|
|
@@ -75,7 +75,7 @@ Viewflow comes in two versions:
|
|
|
75
75
|
|
|
76
76
|
## Installation
|
|
77
77
|
|
|
78
|
-
Viewflow works with Python 3.
|
|
78
|
+
Viewflow works with Python 3.10+ and Django 4.2+
|
|
79
79
|
|
|
80
80
|
Viewflow:
|
|
81
81
|
|
|
@@ -225,6 +225,52 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
225
225
|
|
|
226
226
|
## Changelog
|
|
227
227
|
|
|
228
|
+
For older releases, see [CHANGELOG.rst](./CHANGELOG.rst).
|
|
229
|
+
|
|
230
|
+
## 2.3.2 2026-07-06
|
|
231
|
+
|
|
232
|
+
Security and data-integrity release. Highlights:
|
|
233
|
+
|
|
234
|
+
- Fix cross-flow privilege escalation and information disclosure: a user with
|
|
235
|
+
only flow A's permission could cancel, or read the full task list of, flow B's
|
|
236
|
+
process by posting/opening flow B's id on flow A's URL. `CancelProcessView` and
|
|
237
|
+
`DetailProcessView` now scope their querysets to the view's own flow
|
|
238
|
+
- Fix the bulk-delete endpoint (`action/delete/`) deleting rows without checking
|
|
239
|
+
login or the `delete` permission; add the missing authentication checks to the
|
|
240
|
+
standalone `FlowChartView` and the `contrib.plotly` Dash endpoints
|
|
241
|
+
- Fix a transaction-ordering bug that committed partial writes next to a task's
|
|
242
|
+
`ERROR` status in async mode; `Function`, `End`, `If`, `Split`, `Switch`,
|
|
243
|
+
`Subprocess`, and `Join` activation now roll back cleanly on failure
|
|
244
|
+
- Fix a celery `Job` node treating `self.retry()`/`Reject` as a task failure and
|
|
245
|
+
crashing on redelivery of a `STARTED` retry
|
|
246
|
+
- Fix task actions releasing their lock before the transaction commits, which let
|
|
247
|
+
a concurrent request double-execute an action under `CacheLock`
|
|
248
|
+
- Fix `jsonstore` fields with a falsy `default` (`False`, `0`) returning `None`,
|
|
249
|
+
discarding a falsy assigned value, and mis-sorting on `order_by()`
|
|
250
|
+
- Fix unbounded memory leaks in form rendering (widget-renderer cache keyed on the
|
|
251
|
+
widget instance) and in `ListModelView` (`lru_cache` keyed on the view instance)
|
|
252
|
+
- Fix the "Administration" menu showing to every logged-in user instead of staff
|
|
253
|
+
- Fix several `viewflow.fsm` bugs: chart crashes on self-transitions, `State` with
|
|
254
|
+
a custom getter replacing falsy-but-valid states, REST `transition` committing
|
|
255
|
+
field writes on a failed transition or allowing arbitrary field writes; add a
|
|
256
|
+
`chart/` state-chart view and action to `FlowViewsMixin`
|
|
257
|
+
- Fix a crash on the admin change page of any FSM-backed model under Django 5.2+
|
|
258
|
+
(incl. 6.1) from the `change_form_fsm_tools` template tag
|
|
259
|
+
- Fix grouped `<select>` options under an `<optgroup>` being dropped, a formset
|
|
260
|
+
validation bypass via a tampered ManagementForm, and `vf-field-select-multiple`
|
|
261
|
+
dropping or failing to toggle selected values
|
|
262
|
+
- Fix a system check now warning when a flow has `Join` nodes but no real lock,
|
|
263
|
+
and `manage.py check`/`runserver` crashing for a Join-node flow defined outside
|
|
264
|
+
any installed app
|
|
265
|
+
|
|
266
|
+
## 2.3.1 2026-06-30
|
|
267
|
+
|
|
268
|
+
- Add Django 6.1 support
|
|
269
|
+
- Fix the bulk task assign/unassign actions not enforcing the per-task
|
|
270
|
+
`can_assign`/`can_unassign` permission
|
|
271
|
+
- Fix task views accepting a task pk from another flow; tasks are now scoped to
|
|
272
|
+
the flow in the URL
|
|
273
|
+
|
|
228
274
|
## 2.3.0 2026-06-30
|
|
229
275
|
|
|
230
276
|
- Fix `viewflow.fsm` chart generation crashing for `Enum` states and `State.ANY`
|
|
@@ -249,29 +295,6 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
249
295
|
- Upgrade `vanilla-jsoneditor` 0.23 → 3 (bundles svelte 5); the JSON field
|
|
250
296
|
editor API is unchanged
|
|
251
297
|
|
|
252
|
-
## 2.2.15 2025-12-24
|
|
253
|
-
|
|
254
|
-
- Fix form button name/value lost on resubmission after validation error with Turbo
|
|
255
|
-
- Fix subprocess double execution when completing synchronously
|
|
256
|
-
|
|
257
|
-
## 2.2.14 2025-11-24
|
|
258
|
-
|
|
259
|
-
- Add Django 6.0 compatibility (requires Python 3.12+)
|
|
260
|
-
- Improve error handling for permission creation in multiple database configurations
|
|
261
|
-
- Fix BPMN export to include name attribute for gateway nodes (flow.If)
|
|
262
|
-
|
|
263
|
-
## 2.2.13 2025-09-24
|
|
264
|
-
|
|
265
|
-
- Fix checkbox field error message styling to display in red color
|
|
266
|
-
|
|
267
|
-
## 2.2.12 2025-07-25
|
|
268
|
-
|
|
269
|
-
- Allow to extend and override process_data template
|
|
270
|
-
|
|
271
|
-
## 2.2.11 2025-05-14
|
|
272
|
-
|
|
273
|
-
- Return .Avaialble(..) for the start node
|
|
274
|
-
|
|
275
298
|
|
|
276
299
|
|
|
277
300
|
[build]: https://img.shields.io/github/actions/workflow/status/viewflow/viewflow/django.yml?branch=main
|
|
@@ -247,6 +247,7 @@ viewflow/templates/viewflow/contrib/plotly.html
|
|
|
247
247
|
viewflow/templates/viewflow/contrib/swagger.html
|
|
248
248
|
viewflow/templates/viewflow/contrib/import_export/export_action.html
|
|
249
249
|
viewflow/templates/viewflow/contrib/import_export/import_action.html
|
|
250
|
+
viewflow/templates/viewflow/fsm/detail.html
|
|
250
251
|
viewflow/templates/viewflow/includes/app_menu.html
|
|
251
252
|
viewflow/templates/viewflow/includes/list_bulk_actions.html
|
|
252
253
|
viewflow/templates/viewflow/includes/list_filter.html
|
|
@@ -262,6 +263,7 @@ viewflow/templates/viewflow/views/confirm_delete.html
|
|
|
262
263
|
viewflow/templates/viewflow/views/delete_action.html
|
|
263
264
|
viewflow/templates/viewflow/views/detail.html
|
|
264
265
|
viewflow/templates/viewflow/views/form.html
|
|
266
|
+
viewflow/templates/viewflow/views/fsm_chart.html
|
|
265
267
|
viewflow/templates/viewflow/views/list.html
|
|
266
268
|
viewflow/templates/viewflow/views/transition.html
|
|
267
269
|
viewflow/templates/viewflow/workflow/assign.html
|
|
@@ -315,6 +317,7 @@ viewflow/workflow/admin.py
|
|
|
315
317
|
viewflow/workflow/apps.py
|
|
316
318
|
viewflow/workflow/base.py
|
|
317
319
|
viewflow/workflow/chart.py
|
|
320
|
+
viewflow/workflow/checks.py
|
|
318
321
|
viewflow/workflow/context.py
|
|
319
322
|
viewflow/workflow/exceptions.py
|
|
320
323
|
viewflow/workflow/fields.py
|
|
@@ -4,7 +4,7 @@ README = open("README.md", "r", encoding="utf-8").read()
|
|
|
4
4
|
|
|
5
5
|
setuptools.setup(
|
|
6
6
|
name="django-viewflow",
|
|
7
|
-
version="2.3.
|
|
7
|
+
version="2.3.2",
|
|
8
8
|
author_email="kmmbvnr@gmail.com",
|
|
9
9
|
author="Mikhail Podgurskiy",
|
|
10
10
|
description="Reusable library to build business applications fast",
|
|
@@ -7,13 +7,11 @@
|
|
|
7
7
|
# LICENSE_EXCEPTION and the Commercial license defined in file 'COMM_LICENSE',
|
|
8
8
|
# which is part of this source code package.
|
|
9
9
|
|
|
10
|
-
from django.conf import settings as django_settings
|
|
11
|
-
from .conf import settings
|
|
12
10
|
from .this_object import this
|
|
13
11
|
from .utils import viewprop, Icon, DEFAULT
|
|
14
12
|
|
|
15
13
|
__title__ = "Django-Viewflow"
|
|
16
|
-
__version__ = "2.3.
|
|
14
|
+
__version__ = "2.3.2"
|
|
17
15
|
__author__ = "Mikhail Podgurskiy"
|
|
18
16
|
__license__ = "AGPL"
|
|
19
17
|
__copyright__ = "Copyright 2018-2021 Mikhail Podgurskiy"
|
|
@@ -22,11 +20,7 @@ __all__ = ("this", "viewprop", "Icon", "DEFAULT")
|
|
|
22
20
|
|
|
23
21
|
default_app_config = "viewflow.apps.ViewflowConfig"
|
|
24
22
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
django_settings.MIDDLEWARE += (site_middleware,)
|
|
30
|
-
turbo_middleware = "viewflow.middleware.HotwireTurboMiddleware"
|
|
31
|
-
if turbo_middleware not in django_settings.MIDDLEWARE:
|
|
32
|
-
django_settings.MIDDLEWARE += (turbo_middleware,)
|
|
23
|
+
# Middleware auto-registration lives in ViewflowConfig.ready() -- the app
|
|
24
|
+
# registry isn't populated yet at this point, so apps.is_installed() (needed
|
|
25
|
+
# to recognize viewflow regardless of how it's spelled in INSTALLED_APPS)
|
|
26
|
+
# isn't safe to call here.
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
from django.apps import AppConfig, apps
|
|
2
|
+
from django.conf import settings as django_settings
|
|
3
|
+
|
|
4
|
+
# Copyright (c) 2017-2020, Mikhail Podgurskiy
|
|
5
|
+
# All Rights Reserved.
|
|
6
|
+
|
|
7
|
+
# This work is dual-licensed under AGPL defined in file 'LICENSE' with
|
|
8
|
+
# LICENSE_EXCEPTION and the Commercial licence defined in file 'COMM_LICENSE',
|
|
9
|
+
# which is part of this source code package.
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ViewflowConfig(AppConfig):
|
|
13
|
+
"""Default application config."""
|
|
14
|
+
|
|
15
|
+
name = "viewflow"
|
|
16
|
+
label = "viewflow_base" # allow to user 'viewflow' label for 'viewflow.workflow'
|
|
17
|
+
|
|
18
|
+
def ready(self):
|
|
19
|
+
from .conf import settings
|
|
20
|
+
|
|
21
|
+
# The registry isn't populated yet when viewflow.conf.DEFAULTS is
|
|
22
|
+
# first computed, so its AUTOREGISTER default is a best-effort
|
|
23
|
+
# string check that only recognizes the bare "viewflow" app-label
|
|
24
|
+
# form. apps.is_installed() is only safe to call here, once every
|
|
25
|
+
# app is loaded, and correctly recognizes viewflow regardless of
|
|
26
|
+
# how it's spelled in INSTALLED_APPS (including the
|
|
27
|
+
# "viewflow.apps.ViewflowConfig" AppConfig-path form). Only
|
|
28
|
+
# correct the default -- an explicit user setting always wins.
|
|
29
|
+
custom = getattr(django_settings, "VIEWFLOW", {})
|
|
30
|
+
if "AUTOREGISTER" not in custom:
|
|
31
|
+
settings.settings["AUTOREGISTER"] = apps.is_installed("viewflow")
|
|
32
|
+
|
|
33
|
+
if settings.AUTOREGISTER:
|
|
34
|
+
site_middleware = "viewflow.middleware.SiteMiddleware"
|
|
35
|
+
if site_middleware not in django_settings.MIDDLEWARE:
|
|
36
|
+
django_settings.MIDDLEWARE += (site_middleware,)
|
|
37
|
+
turbo_middleware = "viewflow.middleware.HotwireTurboMiddleware"
|
|
38
|
+
if turbo_middleware not in django_settings.MIDDLEWARE:
|
|
39
|
+
django_settings.MIDDLEWARE += (turbo_middleware,)
|
|
@@ -38,9 +38,16 @@ class Settings(object):
|
|
|
38
38
|
custom = getattr(django_settings, "VIEWFLOW", {})
|
|
39
39
|
self.settings = deepcopy(DEFAULTS)
|
|
40
40
|
|
|
41
|
-
for key, value in custom.
|
|
42
|
-
|
|
43
|
-
|
|
41
|
+
for key, value in custom.items():
|
|
42
|
+
if key == "WIDGET_RENDERERS":
|
|
43
|
+
for widget_key, renderer_value in value.items():
|
|
44
|
+
widget_class, renderer_class = (
|
|
45
|
+
import_string(widget_key),
|
|
46
|
+
import_string(renderer_value),
|
|
47
|
+
)
|
|
48
|
+
self.settings["WIDGET_RENDERERS"][widget_class] = renderer_class
|
|
49
|
+
elif key in self.settings:
|
|
50
|
+
self.settings[key] = value
|
|
44
51
|
|
|
45
52
|
def __getattr__(self, attr):
|
|
46
53
|
if attr not in self.settings:
|
|
@@ -19,6 +19,7 @@ from django.core.cache import cache
|
|
|
19
19
|
from django.core.cache.utils import make_template_fragment_key
|
|
20
20
|
from django.core.files.storage import default_storage
|
|
21
21
|
from django.db import models
|
|
22
|
+
from django.template.defaultfilters import filesizeformat
|
|
22
23
|
from django.urls import path
|
|
23
24
|
from django.utils.decorators import method_decorator
|
|
24
25
|
from django.views import generic
|
|
@@ -29,6 +30,9 @@ from viewflow.urls import Viewset
|
|
|
29
30
|
from viewflow.utils import viewprop
|
|
30
31
|
|
|
31
32
|
|
|
33
|
+
MAX_AVATAR_SIZE = 5 * 1024 * 1024 # 5 MB
|
|
34
|
+
|
|
35
|
+
|
|
32
36
|
class AuthenticationForm(auth_forms.AuthenticationForm):
|
|
33
37
|
def __init__(self, *args, **kwargs):
|
|
34
38
|
super().__init__(*args, **kwargs)
|
|
@@ -68,16 +72,29 @@ class ProfileView(generic.DetailView):
|
|
|
68
72
|
|
|
69
73
|
def post(self, request, *args, **kwargs):
|
|
70
74
|
class AvatarForm(forms.Form):
|
|
71
|
-
avatar = forms.
|
|
75
|
+
avatar = forms.ImageField(required=True)
|
|
76
|
+
|
|
77
|
+
def clean_avatar(self):
|
|
78
|
+
avatar = self.cleaned_data["avatar"]
|
|
79
|
+
if avatar.size > MAX_AVATAR_SIZE:
|
|
80
|
+
raise forms.ValidationError(
|
|
81
|
+
_(
|
|
82
|
+
"Avatar file is too large (%(size)s). "
|
|
83
|
+
"Max size is %(max_size)s."
|
|
84
|
+
)
|
|
85
|
+
% {
|
|
86
|
+
"size": filesizeformat(avatar.size),
|
|
87
|
+
"max_size": filesizeformat(MAX_AVATAR_SIZE),
|
|
88
|
+
}
|
|
89
|
+
)
|
|
90
|
+
return avatar
|
|
72
91
|
|
|
73
92
|
form = AvatarForm(request.POST, request.FILES)
|
|
74
93
|
if form.is_valid():
|
|
75
94
|
file_name = "avatars/{}.png".format(request.user.pk)
|
|
76
95
|
if default_storage.exists(file_name):
|
|
77
96
|
default_storage.delete(file_name)
|
|
78
|
-
default_storage.save(
|
|
79
|
-
file_name, form.cleaned_data["avatar"], max_length=512 * 1024
|
|
80
|
-
)
|
|
97
|
+
default_storage.save(file_name, form.cleaned_data["avatar"])
|
|
81
98
|
key = make_template_fragment_key(
|
|
82
99
|
"django-viewflow-avatar", [request.user.pk]
|
|
83
100
|
)
|
|
@@ -1,11 +1,34 @@
|
|
|
1
|
+
import functools
|
|
1
2
|
import json
|
|
2
3
|
import re
|
|
4
|
+
from django.core.exceptions import PermissionDenied
|
|
3
5
|
from django.http import HttpResponse, JsonResponse
|
|
4
6
|
from django.views.decorators.csrf import csrf_exempt
|
|
5
7
|
from django.views.decorators.http import require_POST
|
|
6
8
|
from django.views.generic import TemplateView
|
|
7
9
|
|
|
8
10
|
|
|
11
|
+
def dash_view_permission_required(view_func):
|
|
12
|
+
"""Require an authenticated user with view permission on the Dashboard.
|
|
13
|
+
|
|
14
|
+
Dash endpoints have no built-in auth of their own, and Dashboard's
|
|
15
|
+
default `has_view_permission` (inherited from AppMenuMixin, since
|
|
16
|
+
Dashboard isn't an Application) is always True -- so without this,
|
|
17
|
+
an anonymous user could read the dashboard layout/data and invoke
|
|
18
|
+
registered callbacks.
|
|
19
|
+
"""
|
|
20
|
+
|
|
21
|
+
@functools.wraps(view_func)
|
|
22
|
+
def wrapper(request, viewset, *args, **kwargs):
|
|
23
|
+
if not request.user.is_authenticated:
|
|
24
|
+
raise PermissionDenied
|
|
25
|
+
if not viewset.has_view_permission(request.user):
|
|
26
|
+
raise PermissionDenied
|
|
27
|
+
return view_func(request, viewset, *args, **kwargs)
|
|
28
|
+
|
|
29
|
+
return wrapper
|
|
30
|
+
|
|
31
|
+
|
|
9
32
|
def _extract_urls(data):
|
|
10
33
|
"""
|
|
11
34
|
Given html string of <script src=""> tags, extracts list of static files stripping version info
|
|
@@ -35,15 +58,18 @@ class DashboardView(TemplateView):
|
|
|
35
58
|
)
|
|
36
59
|
|
|
37
60
|
|
|
61
|
+
@dash_view_permission_required
|
|
38
62
|
def layout_endpoint(request, viewset):
|
|
39
63
|
dash_response = viewset.dash_app.serve_layout()
|
|
40
64
|
return HttpResponse(dash_response.data, content_type="application/json")
|
|
41
65
|
|
|
42
66
|
|
|
67
|
+
@dash_view_permission_required
|
|
43
68
|
def dependencies_endpoint(request, viewset):
|
|
44
69
|
return JsonResponse(viewset.dash_app._callback_list, safe=False)
|
|
45
70
|
|
|
46
71
|
|
|
72
|
+
@dash_view_permission_required
|
|
47
73
|
@csrf_exempt
|
|
48
74
|
@require_POST
|
|
49
75
|
def update_component_endpoint(request, viewset):
|
|
@@ -11,8 +11,8 @@ import json
|
|
|
11
11
|
import uuid
|
|
12
12
|
from typing import List
|
|
13
13
|
from django.db import DEFAULT_DB_ALIAS, models, router
|
|
14
|
-
from django.db.models import
|
|
15
|
-
from django.db.models.sql.where import WhereNode, AND
|
|
14
|
+
from django.db.models.deletion import Collector
|
|
15
|
+
from django.db.models.sql.where import WhereNode, AND, OR
|
|
16
16
|
from django.utils.duration import duration_iso_string
|
|
17
17
|
from django.utils.functional import Promise
|
|
18
18
|
from django.utils.timezone import is_aware
|
|
@@ -47,17 +47,17 @@ class CompositeKey(models.AutoField):
|
|
|
47
47
|
def delete(inst, using=None, keep_parents=False):
|
|
48
48
|
using = using or router.db_for_write(self.model, instance=inst)
|
|
49
49
|
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
query._raw_delete(using)
|
|
50
|
+
collector = Collector(using=using, origin=inst)
|
|
51
|
+
collector.collect([inst], keep_parents=keep_parents)
|
|
52
|
+
result = collector.delete()
|
|
54
53
|
|
|
55
54
|
for column in self.columns:
|
|
56
55
|
setattr(inst, column, None)
|
|
57
56
|
|
|
58
|
-
|
|
57
|
+
return result
|
|
59
58
|
|
|
60
|
-
cls.delete
|
|
59
|
+
if cls.delete is models.Model.delete:
|
|
60
|
+
cls.delete = delete
|
|
61
61
|
|
|
62
62
|
def get_prep_value(self, value):
|
|
63
63
|
return self.to_python(value)
|
|
@@ -138,3 +138,37 @@ class Exact(models.Lookup):
|
|
|
138
138
|
for lookup in lookups:
|
|
139
139
|
value_constraint.add(lookup, AND)
|
|
140
140
|
return value_constraint.as_sql(compiler, connection)
|
|
141
|
+
|
|
142
|
+
|
|
143
|
+
@CompositeKey.register_lookup
|
|
144
|
+
class In(models.Lookup):
|
|
145
|
+
"""Supports ``pk__in=[...]``, notably the deletion `Collector`'s own
|
|
146
|
+
batch-delete query, which filters by ``<pk_attname>__in`` directly."""
|
|
147
|
+
|
|
148
|
+
lookup_name = "in"
|
|
149
|
+
|
|
150
|
+
def get_prep_lookup(self):
|
|
151
|
+
# The base Lookup.get_prep_lookup() would call
|
|
152
|
+
# output_field.get_prep_value() on the whole rhs list at once --
|
|
153
|
+
# CompositeKey.get_prep_value() expects a single key. Each key is
|
|
154
|
+
# prepared individually, per-field, in as_sql() instead.
|
|
155
|
+
return self.rhs
|
|
156
|
+
|
|
157
|
+
def as_sql(self, compiler, connection):
|
|
158
|
+
fields = [
|
|
159
|
+
self.lhs.field.model._meta.get_field(column)
|
|
160
|
+
for column in self.lhs.field.columns
|
|
161
|
+
]
|
|
162
|
+
lookup_classes = [field.get_lookup("exact") for field in fields]
|
|
163
|
+
|
|
164
|
+
keys_constraint = WhereNode(connector=OR)
|
|
165
|
+
for key in self.rhs:
|
|
166
|
+
key_constraint = WhereNode()
|
|
167
|
+
for lookup_class, field, column in zip(
|
|
168
|
+
lookup_classes, fields, self.lhs.field.columns
|
|
169
|
+
):
|
|
170
|
+
key_constraint.add(
|
|
171
|
+
lookup_class(field.get_col(self.lhs.alias), key[column]), AND
|
|
172
|
+
)
|
|
173
|
+
keys_constraint.add(key_constraint, OR)
|
|
174
|
+
return keys_constraint.as_sql(compiler, connection)
|
|
@@ -68,13 +68,19 @@ class WidgetRenderer(object):
|
|
|
68
68
|
return self.create_root(context)
|
|
69
69
|
|
|
70
70
|
@staticmethod
|
|
71
|
-
@lru_cache(maxsize=None)
|
|
72
71
|
def get_renderer(widget: forms.Widget) -> "Type[WidgetRenderer]":
|
|
72
|
+
return WidgetRenderer._get_renderer_for_class(type(widget))
|
|
73
|
+
|
|
74
|
+
@staticmethod
|
|
75
|
+
@lru_cache(maxsize=None)
|
|
76
|
+
def _get_renderer_for_class(
|
|
77
|
+
widget_class: "Type[forms.Widget]",
|
|
78
|
+
) -> "Type[WidgetRenderer]":
|
|
73
79
|
from viewflow.conf import settings
|
|
74
80
|
|
|
75
|
-
for
|
|
81
|
+
for klass in widget_class.mro()[:-2]:
|
|
76
82
|
try:
|
|
77
|
-
return settings.WIDGET_RENDERERS[
|
|
83
|
+
return settings.WIDGET_RENDERERS[klass]
|
|
78
84
|
except KeyError:
|
|
79
85
|
continue
|
|
80
86
|
|
|
@@ -254,11 +260,12 @@ class SelectRenderer(WidgetRenderer):
|
|
|
254
260
|
"name": name or "",
|
|
255
261
|
"options": {
|
|
256
262
|
key: value
|
|
257
|
-
for key, value in
|
|
263
|
+
for key, value in option.items()
|
|
258
264
|
if key not in ["template_name", "type", "wrap_label"]
|
|
259
265
|
},
|
|
260
266
|
}
|
|
261
267
|
for name, options, _ in context["widget"]["optgroups"]
|
|
268
|
+
for option in options
|
|
262
269
|
],
|
|
263
270
|
cls=FormDataEncoder,
|
|
264
271
|
)
|
|
@@ -48,11 +48,12 @@ class FlowAdminMixin(object):
|
|
|
48
48
|
object. Override this function if your flow class does not have a
|
|
49
49
|
constructor that accepts the model object as the only argument.
|
|
50
50
|
"""
|
|
51
|
+
owner = self.get_flow_state(request)._owner
|
|
51
52
|
try:
|
|
52
|
-
return
|
|
53
|
+
return owner(obj)
|
|
53
54
|
except TypeError:
|
|
54
55
|
raise ValueError(
|
|
55
|
-
f"{
|
|
56
|
+
f"{owner} does not have a constructor that accepts"
|
|
56
57
|
" a single argument. Please redefine 'get_object_flow' on the model"
|
|
57
58
|
" admin."
|
|
58
59
|
)
|