django-viewflow 2.2.5__tar.gz → 2.2.6__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.2.5/django_viewflow.egg-info → django_viewflow-2.2.6}/PKG-INFO +1 -1
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/README.md +3 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6/django_viewflow.egg-info}/PKG-INFO +1 -1
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/setup.py +1 -1
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templatetags/workflow.py +2 -2
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/utils.py +5 -1
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/activation.py +50 -25
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/base.py +1 -1
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/nodes.py +10 -1
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/end.py +1 -1
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/func.py +11 -6
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/if_gate.py +4 -5
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/job.py +5 -3
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/join.py +4 -4
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/start.py +2 -3
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/switch.py +13 -11
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/view.py +2 -2
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/utils.py +4 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/LICENSE +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/LICENSE_EXCEPTION +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/MANIFEST.in +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/django_viewflow.egg-info/SOURCES.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/django_viewflow.egg-info/dependency_links.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/django_viewflow.egg-info/not-zip-safe +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/django_viewflow.egg-info/requires.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/django_viewflow.egg-info/top_level.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/setup.cfg +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/tests/test_middleware.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/tests/test_templates.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/tests/test_templatetags__viewflow.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/tests/test_this_object.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/tests/test_urls__base.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/tests/test_utils__package.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/apps.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/conf.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/admin/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/admin/apps.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/auth.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/plotly/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/plotly/material.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/plotly/views.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/contrib/plotly/viewset.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fields.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/forms/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/forms/renderers.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fsm/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fsm/admin.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fsm/base.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fsm/chart.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fsm/typing.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fsm/views.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/fsm/viewset.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/jsonstore.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/de/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/de/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/es/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/es/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/fr/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/it/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/it/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/ja/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/ja/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/kk/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/kk/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/ko/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/ko/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/pt/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/pt/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/ru/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/ru/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/sr/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/sr/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/management/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/management/commands/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/management/commands/flowexport.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/middleware.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/css/perfect-scrollbar.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/css/trix.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/css/viewflow.min.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/css/vis-network.min.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/roboto/roboto-fontface.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.eot +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.otf +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.ttf +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff2 +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.min.css +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/img/favicon.png +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/img/user.png +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash-renderer/build/dash_renderer.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.LICENSE.txt +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/dcc/plotly.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/deps/polyfill@7.12.1.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.7.2.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.8.1.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/deps/react-dom@16.14.0.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/deps/react@16.14.0.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/perfect-scrollbar.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/perfect-scrollbar.min.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/smartcrop.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/trix.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/turbo.es2017-umd.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/viewflow.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/viewflow.min.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/vis-network.min.js +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/js/vis-network.min.js.map +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/400.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/403.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/404.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/500.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/admin/fsm_change_form.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/admin/fsm_change_form_object_tools.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/admin/fsm_change_list.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/admin/fsm_transition_form.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/formtools/wizard/wizard_form.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/logged_out.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/login.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/password_change_done.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/password_change_form.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/password_reset_complete.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/password_reset_confirm.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/password_reset_done.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/password_reset_form.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/profile.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/registration/provider_list.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/base.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/base_lockscreen.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/base_page.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/contrib/import_export/export_action.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/contrib/import_export/import_action.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/contrib/plotly.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/contrib/swagger.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/app_menu.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/list_bulk_actions.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/list_filter.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/list_pagination.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/object_detail_card.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/site_menu.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/snackbar.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/view_action_menu.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/viewflow_css.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/includes/viewflow_js.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/material/circular_progress.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/views/confirm_delete.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/views/delete_action.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/views/detail.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/views/form.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/views/list.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/views/transition.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/assign.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/base_page.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/celery_task_detail.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/flow_menu.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/graph.bpmn +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/graph.svg +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/process_cancel.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/process_dashboard.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/process_data.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/process_detail.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/process_list.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/process_tasks_list.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/start.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_assign.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_base.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_cancel.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_data.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_detail.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_list.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_revive.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_unassign.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/task_undo.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/tasks_assign.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/tasks_unassign.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/workflow_menu.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templates/viewflow/workflow/workflow_tasks_list.html +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templatetags/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templatetags/fsm.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/templatetags/viewflow.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/this_object.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/urls/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/urls/base.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/urls/model.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/urls/sites.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/actions.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/base.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/create.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/delete.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/detail.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/filters.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/list.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/search.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/views/update.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/admin.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/apps.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/chart.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/context.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/exceptions.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/fields.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/mixins.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/utils.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/actions.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/chart.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/create.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/dashboard.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/detail.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/filters.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/list.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/mixins.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/views/update.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/flow/viewset.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/lock.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/managers.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0001_initial.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0002_fsmchange.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0003_task_owner_permission_change.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0004_extend_fields_length.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0004_subprocess.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0005_merge.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0005_rename_flowcls.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0006_i18n.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0006_merge.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0007_owner_permission_obj.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0007_task_assigned.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0008_jsonfield_and_artifact.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0008_merge.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0009_merge.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0010_viewflow20.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0011_alter_task_created_and_more.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0013_process_seed_content_type_process_seed_object_id_and_more.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/0014_alter_process_parent_task.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/migrations/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/models.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/__init__.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/handle.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/mixins.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/obsolete.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/nodes/split.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/signals.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/status.py +0 -0
- {django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/workflow/token.py +0 -0
|
@@ -9,6 +9,8 @@ Viewflow is a low-code, reusable component library for creating comprehensive bu
|
|
|
9
9
|
|
|
10
10
|
With Viewflow, you can create full-featured business applications in just a few lines of code using its reusable component library. It's shipped as a single package with batteries included, and each part of Viewflow can be used independently of the others, but they all work well together.
|
|
11
11
|
|
|
12
|
+
GPT assisted with Viewflow documentation: [Viewflow Pair Programming Buddy][gpt]
|
|
13
|
+
|
|
12
14
|
|
|
13
15
|
Viewflow comes in two flavors:
|
|
14
16
|
- **Viewflow Core:** A lightweight, open-source library with only non-opinionated core classes that allows you to build your custom solution on top.
|
|
@@ -264,3 +266,4 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
264
266
|
[py-versions]: https://img.shields.io/pypi/pyversions/django-viewflow.svg
|
|
265
267
|
[requirements-svg]: https://requires.io/github/viewflow/viewflow/requirements.svg?branch=v2
|
|
266
268
|
[requirements]: https://requires.io/github/viewflow/viewflow/requirements/?branch=v2
|
|
269
|
+
[gpt]: https://chatgpt.com/g/g-8UHAnOpE3-viewflow-pair-programming
|
|
@@ -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.2.
|
|
7
|
+
version="2.2.6",
|
|
8
8
|
author_email="kmmbvnr@gmail.com",
|
|
9
9
|
author="Mikhail Podgurskiy",
|
|
10
10
|
description="Reusable library to build business applications fast",
|
|
@@ -49,9 +49,9 @@ def include_task_data(context, task):
|
|
|
49
49
|
template = select_template(template_names)
|
|
50
50
|
context.push()
|
|
51
51
|
try:
|
|
52
|
-
if task.artifact_object_id:
|
|
52
|
+
if task.artifact_object_id and task.artifact is not None:
|
|
53
53
|
context["artifact_data"] = get_object_data(task.artifact)
|
|
54
|
-
if task.seed_object_id:
|
|
54
|
+
if task.seed_object_id and task.seed is not None:
|
|
55
55
|
context["seed_data"] = get_object_data(task.seed)
|
|
56
56
|
context["data"] = task.data
|
|
57
57
|
context["task"] = task
|
|
@@ -228,7 +228,11 @@ def get_object_data(obj: models.Model) -> Iterator[Tuple[models.Field, str, Any]
|
|
|
228
228
|
if value is not None:
|
|
229
229
|
yield (field, field.verbose_name.capitalize(), value)
|
|
230
230
|
|
|
231
|
-
if
|
|
231
|
+
if (
|
|
232
|
+
hasattr(obj, "artifact_object_id")
|
|
233
|
+
and obj.artifact_object_id
|
|
234
|
+
and obj.artifact is not None
|
|
235
|
+
):
|
|
232
236
|
yield from get_object_data(obj.artifact)
|
|
233
237
|
|
|
234
238
|
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
|
|
1
|
+
import json
|
|
2
|
+
import traceback
|
|
3
|
+
from contextlib import ContextDecorator
|
|
2
4
|
from typing import Any, List, Optional, Set
|
|
3
5
|
|
|
4
6
|
from django.db import connection, transaction
|
|
@@ -119,31 +121,54 @@ class Activation:
|
|
|
119
121
|
"""Get the flow class associated with the activation."""
|
|
120
122
|
return self.flow_task.flow_class
|
|
121
123
|
|
|
122
|
-
def exception_guard(self) ->
|
|
124
|
+
def exception_guard(self) -> ContextDecorator:
|
|
123
125
|
"""
|
|
124
126
|
Perform activation action inside a transaction.
|
|
125
127
|
|
|
126
128
|
Handle and propagate exception depending on activation context state.
|
|
127
129
|
"""
|
|
128
130
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
131
|
+
class ExceptionGuard(ContextDecorator):
|
|
132
|
+
def __enter__(self):
|
|
133
|
+
return self
|
|
134
|
+
|
|
135
|
+
def __exit__(self_eg, exc_type, exc_val, exc_tb):
|
|
136
|
+
if exc_type is not None:
|
|
137
|
+
if not context.propagate_exception:
|
|
138
|
+
# Keep error state
|
|
139
|
+
tb = exc_val.__traceback__
|
|
140
|
+
while tb.tb_next:
|
|
141
|
+
tb = tb.tb_next
|
|
142
|
+
|
|
143
|
+
try:
|
|
144
|
+
serialized_locals = json.dumps(
|
|
145
|
+
tb.tb_frame.f_locals, default=lambda obj: str(obj)
|
|
146
|
+
)
|
|
147
|
+
except Exception as ex:
|
|
148
|
+
serialized_locals = json.dumps(
|
|
149
|
+
{"_serialization_exception": str(ex)}
|
|
150
|
+
)
|
|
151
|
+
|
|
152
|
+
self.task.data["_exception"] = {
|
|
153
|
+
"title": str(exc_val),
|
|
154
|
+
"traceback": traceback.format_exc(),
|
|
155
|
+
"locals": json.loads(serialized_locals),
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
# Set status
|
|
159
|
+
self.task.finished = now()
|
|
160
|
+
self._set_status(STATUS.ERROR)
|
|
161
|
+
self.task.save()
|
|
162
|
+
task_failed.send(
|
|
163
|
+
sender=self.flow_class, process=self.process, task=self.task
|
|
164
|
+
)
|
|
165
|
+
# self.transaction.__exit__(exc_type, exc_val, exc_tb)
|
|
166
|
+
return True # Suppress the exception
|
|
167
|
+
else:
|
|
168
|
+
# self.transaction.__exit__(exc_type, exc_val, exc_tb)
|
|
169
|
+
return False # Propagate the exception
|
|
170
|
+
|
|
171
|
+
return ExceptionGuard()
|
|
147
172
|
|
|
148
173
|
@classmethod
|
|
149
174
|
def create(
|
|
@@ -171,9 +196,9 @@ class Activation:
|
|
|
171
196
|
process=prev_activation.process,
|
|
172
197
|
flow_task=flow_task,
|
|
173
198
|
token=token,
|
|
174
|
-
data=data if data is not None else {},
|
|
175
|
-
seed=seed,
|
|
176
199
|
)
|
|
200
|
+
task.data = data if data is not None else {}
|
|
201
|
+
task.seed = seed
|
|
177
202
|
task.save()
|
|
178
203
|
task.previous.add(prev_activation.task)
|
|
179
204
|
return cls(task)
|
|
@@ -270,10 +295,10 @@ class Activation:
|
|
|
270
295
|
process=self.process,
|
|
271
296
|
flow_task=self.flow_task,
|
|
272
297
|
token=self.task.token,
|
|
273
|
-
seed=self.task.seed,
|
|
274
|
-
artifact=self.task.artifact,
|
|
275
|
-
data=self.task.data,
|
|
276
298
|
)
|
|
299
|
+
task.seed = self.task.seed
|
|
300
|
+
task.data = self.task.data
|
|
301
|
+
task.artifact = self.task.artifact
|
|
277
302
|
task.save()
|
|
278
303
|
|
|
279
304
|
for prev_task in self.task.previous.all():
|
|
@@ -479,7 +479,7 @@ class Flow(Viewset, metaclass=FlowMetaClass):
|
|
|
479
479
|
if not_cancellable:
|
|
480
480
|
raise FlowRuntimeError(
|
|
481
481
|
"Can't cancel {}".format(
|
|
482
|
-
",".join(activation.task for activation in not_cancellable)
|
|
482
|
+
",".join(str(activation.task) for activation in not_cancellable)
|
|
483
483
|
)
|
|
484
484
|
)
|
|
485
485
|
|
|
@@ -221,7 +221,12 @@ class If(
|
|
|
221
221
|
revive_view_class = views.ReviveTaskView
|
|
222
222
|
|
|
223
223
|
|
|
224
|
-
class Function(
|
|
224
|
+
class Function(
|
|
225
|
+
mixins.NodeDetailMixin,
|
|
226
|
+
mixins.NodeUndoMixin,
|
|
227
|
+
mixins.NodeReviveMixin,
|
|
228
|
+
nodes.Function,
|
|
229
|
+
):
|
|
225
230
|
"""
|
|
226
231
|
Represents a callback function executed synchronously as part of a workflow
|
|
227
232
|
node.
|
|
@@ -255,6 +260,7 @@ class Function(mixins.NodeDetailMixin, mixins.NodeUndoMixin, nodes.Function):
|
|
|
255
260
|
index_view_class = views.IndexTaskView
|
|
256
261
|
detail_view_class = views.DetailTaskView
|
|
257
262
|
undo_view_class = views.UndoTaskView
|
|
263
|
+
revive_view_class = views.ReviveTaskView
|
|
258
264
|
|
|
259
265
|
|
|
260
266
|
class Handle(
|
|
@@ -357,6 +363,7 @@ class Split(
|
|
|
357
363
|
|
|
358
364
|
class SplitFirst(
|
|
359
365
|
mixins.NodeDetailMixin,
|
|
366
|
+
mixins.NodeReviveMixin,
|
|
360
367
|
nodes.SplitFirst,
|
|
361
368
|
):
|
|
362
369
|
"""
|
|
@@ -385,6 +392,8 @@ class SplitFirst(
|
|
|
385
392
|
|
|
386
393
|
index_view_class = views.IndexTaskView
|
|
387
394
|
detail_view_class = views.DetailTaskView
|
|
395
|
+
undo_view_class = views.UndoTaskView
|
|
396
|
+
revive_view_class = views.ReviveTaskView
|
|
388
397
|
|
|
389
398
|
|
|
390
399
|
try:
|
|
@@ -27,7 +27,7 @@ class EndActivation(Activation):
|
|
|
27
27
|
"""
|
|
28
28
|
Finalize the flow. If there is no active task, process marked as finished.
|
|
29
29
|
"""
|
|
30
|
-
with transaction.atomic(savepoint=True):
|
|
30
|
+
with transaction.atomic(savepoint=True), self.exception_guard():
|
|
31
31
|
self.task.started = now()
|
|
32
32
|
task_started.send(
|
|
33
33
|
sender=self.flow_class, process=self.process, task=self.task
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
+
from django.db import transaction
|
|
1
2
|
from django.utils.timezone import now
|
|
2
3
|
|
|
3
4
|
from viewflow import this
|
|
4
|
-
from ..activation import Activation
|
|
5
|
+
from ..activation import Activation, has_manage_permission
|
|
5
6
|
from ..base import Node
|
|
6
7
|
from ..status import STATUS
|
|
7
8
|
from ..signals import task_started
|
|
@@ -18,17 +19,21 @@ class FunctionActivation(mixins.NextNodeActivationMixin, Activation):
|
|
|
18
19
|
@Activation.status.super()
|
|
19
20
|
def activate(self):
|
|
20
21
|
"""Perform the callback within current exception propagation strategy."""
|
|
21
|
-
with self.exception_guard():
|
|
22
|
+
with transaction.atomic(savepoint=True), self.exception_guard():
|
|
22
23
|
self.task.started = now()
|
|
23
24
|
task_started.send(
|
|
24
25
|
sender=self.flow_class, process=self.process, task=self.task
|
|
25
26
|
)
|
|
26
27
|
self.flow_task._func(self)
|
|
27
28
|
|
|
28
|
-
@Activation.status.transition(
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
29
|
+
@Activation.status.transition(
|
|
30
|
+
source=[STATUS.ERROR],
|
|
31
|
+
target=STATUS.CANCELED,
|
|
32
|
+
permission=has_manage_permission,
|
|
33
|
+
)
|
|
34
|
+
def cancel(self):
|
|
35
|
+
self.task.finished = now()
|
|
36
|
+
self.task.save()
|
|
32
37
|
|
|
33
38
|
|
|
34
39
|
class Function(mixins.NextNodeMixin, mixins.NodePermissionMixin, Node):
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from django.db import transaction
|
|
1
2
|
from viewflow import this
|
|
2
3
|
|
|
3
4
|
from ..base import Node, Edge
|
|
@@ -12,7 +13,8 @@ class IfActivation(Activation):
|
|
|
12
13
|
|
|
13
14
|
@Activation.status.super()
|
|
14
15
|
def activate(self):
|
|
15
|
-
|
|
16
|
+
with transaction.atomic(savepoint=True), self.exception_guard():
|
|
17
|
+
self._condition_result = self.flow_task._condition(self)
|
|
16
18
|
|
|
17
19
|
@Activation.status.super()
|
|
18
20
|
def create_next(self):
|
|
@@ -72,6 +74,7 @@ class If(Node):
|
|
|
72
74
|
def _resolve(self, instance):
|
|
73
75
|
super()._resolve(instance)
|
|
74
76
|
|
|
77
|
+
self._condition = this.resolve(self.flow_class.instance, self._condition)
|
|
75
78
|
self._on_true = this.resolve(instance, self._on_true)
|
|
76
79
|
self._on_true_data = this.resolve(instance, self._on_true_data)
|
|
77
80
|
self._on_true_seed = this.resolve(instance, self._on_true_seed)
|
|
@@ -80,10 +83,6 @@ class If(Node):
|
|
|
80
83
|
self._on_false_data = this.resolve(instance, self._on_false_data)
|
|
81
84
|
self._on_false_seed = this.resolve(instance, self._on_false_seed)
|
|
82
85
|
|
|
83
|
-
@property
|
|
84
|
-
def condition(self):
|
|
85
|
-
return this.resolve(self.flow_class.instance, self._condition)
|
|
86
|
-
|
|
87
86
|
def Then(self, node, task_data=None, task_seed=None):
|
|
88
87
|
"""Node activated if condition is True."""
|
|
89
88
|
self._on_true = node
|
|
@@ -6,6 +6,7 @@ from django.utils import timezone
|
|
|
6
6
|
|
|
7
7
|
from ..activation import Activation
|
|
8
8
|
from ..base import Node
|
|
9
|
+
from ..context import Context
|
|
9
10
|
from ..fields import get_flow_ref
|
|
10
11
|
from ..signals import task_failed
|
|
11
12
|
from ..status import STATUS
|
|
@@ -22,9 +23,9 @@ class AbstractJobActivation(mixins.NextNodeActivationMixin, Activation):
|
|
|
22
23
|
flow_task=flow_task,
|
|
23
24
|
token=token,
|
|
24
25
|
external_task_id=str(uuid.uuid4()),
|
|
25
|
-
data=data if data is not None else {},
|
|
26
|
-
seed=seed,
|
|
27
26
|
)
|
|
27
|
+
task.data = data if data is not None else {}
|
|
28
|
+
task.seed = seed
|
|
28
29
|
task.save()
|
|
29
30
|
task.previous.add(prev_activation.task)
|
|
30
31
|
return cls(task)
|
|
@@ -45,7 +46,8 @@ class AbstractJobActivation(mixins.NextNodeActivationMixin, Activation):
|
|
|
45
46
|
@Activation.status.transition(source=STATUS.STARTED)
|
|
46
47
|
def execute(self):
|
|
47
48
|
self.complete()
|
|
48
|
-
|
|
49
|
+
with Context(propagate_exception=False):
|
|
50
|
+
self.activate_next()
|
|
49
51
|
|
|
50
52
|
@Activation.status.transition(source=STATUS.STARTED, target=STATUS.ERROR)
|
|
51
53
|
def error(self, exception):
|
|
@@ -44,13 +44,14 @@ class JoinActivation(mixins.NextNodeActivationMixin, Activation):
|
|
|
44
44
|
if token.is_split_token():
|
|
45
45
|
token = token.get_base_split_token()
|
|
46
46
|
|
|
47
|
-
task = flow_class.task_class
|
|
47
|
+
task = flow_class.task_class(
|
|
48
48
|
process=prev_activation.process,
|
|
49
49
|
flow_task=flow_task,
|
|
50
50
|
token=token,
|
|
51
|
-
data=data if data is not None else {},
|
|
52
|
-
seed=seed,
|
|
53
51
|
)
|
|
52
|
+
task.data = data if data is not None else {}
|
|
53
|
+
task.seed = seed
|
|
54
|
+
task.save()
|
|
54
55
|
else:
|
|
55
56
|
# todo resolve task_data and seed
|
|
56
57
|
pass
|
|
@@ -63,7 +64,6 @@ class JoinActivation(mixins.NextNodeActivationMixin, Activation):
|
|
|
63
64
|
@Activation.status.transition(source=STATUS.NEW, target=STATUS.STARTED)
|
|
64
65
|
@Activation.status.transition(source=STATUS.STARTED)
|
|
65
66
|
def activate(self):
|
|
66
|
-
"""Do nothing on a sync call"""
|
|
67
67
|
if self.task.started is None:
|
|
68
68
|
self.task.started = now()
|
|
69
69
|
self.task.save()
|
|
@@ -21,10 +21,9 @@ class StartActivation(mixins.NextNodeActivationMixin, Activation):
|
|
|
21
21
|
flow_task=flow_task,
|
|
22
22
|
process=process,
|
|
23
23
|
started=now(),
|
|
24
|
-
data=data if data is not None else {},
|
|
25
|
-
seed=seed,
|
|
26
24
|
)
|
|
27
|
-
|
|
25
|
+
task.data = data if data is not None else {}
|
|
26
|
+
task.seed = seed
|
|
28
27
|
return cls(task)
|
|
29
28
|
|
|
30
29
|
@Activation.status.transition(source=STATUS.NEW)
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
from django.db import transaction
|
|
1
2
|
from django.utils.timezone import now
|
|
2
3
|
|
|
3
4
|
from viewflow import this
|
|
@@ -16,18 +17,19 @@ class SwitchActivation(Activation):
|
|
|
16
17
|
|
|
17
18
|
@Activation.status.super()
|
|
18
19
|
def activate(self):
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
if cond
|
|
20
|
+
with transaction.atomic(savepoint=True), self.exception_guard():
|
|
21
|
+
for node, cond in self.flow_task._branches:
|
|
22
|
+
if cond:
|
|
23
|
+
if cond(self):
|
|
24
|
+
self.next_task = node
|
|
25
|
+
break
|
|
26
|
+
else:
|
|
22
27
|
self.next_task = node
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
raise FlowRuntimeError(
|
|
29
|
-
"No next task available for {}".format(self.flow_task.name)
|
|
30
|
-
)
|
|
28
|
+
|
|
29
|
+
if not self.next_task:
|
|
30
|
+
raise FlowRuntimeError(
|
|
31
|
+
"No next task available for {}".format(self.flow_task.name)
|
|
32
|
+
)
|
|
31
33
|
|
|
32
34
|
@Activation.status.super()
|
|
33
35
|
def create_next(self):
|
|
@@ -20,9 +20,9 @@ class ViewActivation(mixins.NextNodeActivationMixin, Activation):
|
|
|
20
20
|
process=prev_activation.process,
|
|
21
21
|
flow_task=flow_task,
|
|
22
22
|
token=token,
|
|
23
|
-
data=data if data is not None else {},
|
|
24
|
-
seed=seed,
|
|
25
23
|
)
|
|
24
|
+
task.data = data if data is not None else {}
|
|
25
|
+
task.seed = seed
|
|
26
26
|
|
|
27
27
|
activation = cls(task)
|
|
28
28
|
|
|
@@ -45,4 +45,8 @@ def get_next_process_task(manager, process, user):
|
|
|
45
45
|
status__in=[STATUS.NEW, STATUS.SCHEDULED, STATUS.STARTED],
|
|
46
46
|
).first()
|
|
47
47
|
|
|
48
|
+
# a task in a ERROR state
|
|
49
|
+
if task is None:
|
|
50
|
+
task = manager.filter(process=process, status=STATUS.ERROR).first()
|
|
51
|
+
|
|
48
52
|
return task
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_viewflow-2.2.5 → django_viewflow-2.2.6}/django_viewflow.egg-info/dependency_links.txt
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo
RENAMED
|
File without changes
|
{django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/css/perfect-scrollbar.css
RENAMED
|
File without changes
|
|
File without changes
|
{django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/css/viewflow.min.css
RENAMED
|
File without changes
|
{django_viewflow-2.2.5 → django_viewflow-2.2.6}/viewflow/static/viewflow/css/vis-network.min.css
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|