django-viewflow 2.1.2__tar.gz → 2.2.3__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.1.2 → django-viewflow-2.2.3}/PKG-INFO +1 -1
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/README.md +29 -12
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/PKG-INFO +1 -1
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/SOURCES.txt +1 -2
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/setup.py +1 -1
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task.html +4 -0
- django-viewflow-2.2.3/viewflow/this_object.py +119 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/base.py +68 -18
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/activation.py +130 -36
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/base.py +111 -55
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/__init__.py +0 -6
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/nodes.py +92 -34
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/viewset.py +4 -0
- django-viewflow-2.2.3/viewflow/workflow/migrations/0013_process_seed_content_type_process_seed_object_id_and_more.py +47 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/models.py +24 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/__init__.py +0 -4
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/end.py +5 -2
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/if_gate.py +32 -6
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/job.py +2 -1
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/join.py +7 -1
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/mixins.py +21 -2
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/split.py +2 -5
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/start.py +10 -1
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/view.py +2 -1
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/token.py +11 -10
- django-viewflow-2.1.2/LICENSE.django +0 -37
- django-viewflow-2.1.2/viewflow/this_object.py +0 -67
- django-viewflow-2.1.2/viewflow/workflow/nodes/subprocess.py +0 -149
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/LICENSE +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/LICENSE_EXCEPTION +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/MANIFEST.in +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/dependency_links.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/not-zip-safe +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/requires.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/top_level.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/setup.cfg +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_middleware.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_templates.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_templatetags__viewflow.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_this_object.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_urls__base.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_utils__package.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/apps.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/conf.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/admin/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/admin/apps.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/auth.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/material.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/views.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/viewset.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fields.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/forms/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/forms/renderers.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/admin.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/base.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/chart.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/typing.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/views.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/viewset.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/jsonstore.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/de/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/de/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/es/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/es/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/fr/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/it/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/it/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ja/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ja/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/kk/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/kk/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ko/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ko/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/pt/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/pt/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ru/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ru/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/sr/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/sr/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/management/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/management/commands/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/management/commands/flowexport.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/middleware.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/perfect-scrollbar.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/trix.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/viewflow.min.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/vis-network.min.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/roboto-fontface.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.eot +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.otf +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.ttf +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff2 +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.min.css +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/img/favicon.png +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/img/user.png +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash-renderer/build/dash_renderer.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/plotly.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/deps/polyfill@7.12.1.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.7.2.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.8.1.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/deps/react-dom@16.14.0.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/deps/react@16.14.0.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/perfect-scrollbar.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/perfect-scrollbar.min.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/smartcrop.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/trix.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/turbo.es2017-umd.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/viewflow.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/viewflow.min.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/vis-network.min.js +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/vis-network.min.js.map +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/400.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/403.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/404.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/500.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_change_form.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_change_form_object_tools.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_change_list.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_transition_form.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/formtools/wizard/wizard_form.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/logged_out.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/login.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_change_done.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_change_form.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_complete.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_confirm.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_done.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_form.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/profile.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/provider_list.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/base.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/base_lockscreen.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/base_page.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/import_export/export_action.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/import_export/import_action.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/plotly.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/swagger.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/app_menu.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/list_bulk_actions.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/list_filter.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/list_pagination.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/object_detail_card.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/site_menu.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/snackbar.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/view_action_menu.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/viewflow_css.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/viewflow_js.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/material/circular_progress.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/confirm_delete.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/delete_action.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/detail.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/form.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/list.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/transition.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/assign.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/base_page.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/celery_task_detail.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/flow_menu.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/graph.bpmn +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/graph.svg +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_cancel.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_dashboard.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_data.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_detail.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_list.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_tasks_list.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/start.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_assign.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_base.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_cancel.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_data.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_detail.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_list.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_revive.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_unassign.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_undo.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/tasks_assign.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/tasks_unassign.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/workflow_menu.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/workflow_tasks_list.html +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/fsm.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/viewflow.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/workflow.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/model.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/sites.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/utils.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/actions.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/base.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/create.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/delete.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/detail.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/filters.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/list.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/search.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/update.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/admin.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/apps.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/chart.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/context.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/exceptions.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/fields.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/mixins.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/utils.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/actions.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/chart.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/create.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/dashboard.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/detail.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/filters.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/list.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/mixins.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/update.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/lock.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/managers.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0001_initial.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0002_fsmchange.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0003_task_owner_permission_change.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0004_extend_fields_length.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0004_subprocess.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0005_merge.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0005_rename_flowcls.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0006_i18n.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0006_merge.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0007_owner_permission_obj.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0007_task_assigned.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0008_jsonfield_and_artifact.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0008_merge.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0009_merge.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0010_viewflow20.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0011_alter_task_created_and_more.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/__init__.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/func.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/handle.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/obsolete.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/switch.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/signals.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/status.py +0 -0
- {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/utils.py +0 -0
|
@@ -185,24 +185,41 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
185
185
|
|
|
186
186
|
## Changelog
|
|
187
187
|
|
|
188
|
-
### 2.
|
|
188
|
+
### 2.2.3 2024-07-09
|
|
189
189
|
|
|
190
|
-
-
|
|
191
|
-
|
|
192
|
-
-
|
|
193
|
-
|
|
194
|
-
-
|
|
195
|
-
- Allow Admin() viewset to be used as a sub-item in an Application viewset.
|
|
190
|
+
- Fixed issue with Split/Join operations when an immediate split to join
|
|
191
|
+
connection occurs.
|
|
192
|
+
- Improved redirect functionality for "Execute and Continue." Now redirects to
|
|
193
|
+
the process details if the process has finished.
|
|
194
|
+
- Enabled the Undo action for End() nodes.
|
|
196
195
|
|
|
197
|
-
### 2.1.1 2024-06-06
|
|
198
196
|
|
|
199
|
-
|
|
197
|
+
### 2.2.2 2024-07-05
|
|
200
198
|
|
|
199
|
+
- Introduced new parameters for .If().Then(.., task_data=, task_seed) and
|
|
200
|
+
.Else(...)
|
|
201
|
+
- Include {{ form.media }} into default workflow/task.html template
|
|
201
202
|
|
|
202
|
-
### 2.1.0 2024-06-16
|
|
203
203
|
|
|
204
|
-
|
|
205
|
-
|
|
204
|
+
### 2.2.1 2024-07-03
|
|
205
|
+
|
|
206
|
+
- Introduced a new parameter for .Next(..., task_seed=) that allows the
|
|
207
|
+
instantiation of new tasks with additional initialized .seed generic foreign key
|
|
208
|
+
- Introduced a new parameter for .Split(..., task_seed_source=) same as task_data_source,
|
|
209
|
+
prodices outgoing tasks with initializaed .seed value
|
|
210
|
+
- Introduced a new parameter for flow.Subprocess(process_data=, process_seed=,
|
|
211
|
+
task_data=, task_seed=) allows to provide data nad seed for newly created
|
|
212
|
+
process and/or start task
|
|
213
|
+
|
|
214
|
+
### 2.2.0 2024-06-28
|
|
215
|
+
|
|
216
|
+
- Introduced a new parameter for .Next(..., task_data=) that allows the
|
|
217
|
+
instantiation of new tasks with additional initialized .data, enabling data to
|
|
218
|
+
be passed from task to task.
|
|
219
|
+
- Added process.seed and task.seed generic foreign keys to the default workflow
|
|
220
|
+
models. Along with process.artifact and task.artifact, these additions enable
|
|
221
|
+
tracking of business process results from start to finish.
|
|
222
|
+
- Renamed Split.Next(data_source=) to task_data_source=.
|
|
206
223
|
|
|
207
224
|
|
|
208
225
|
[build]: https://img.shields.io/github/actions/workflow/status/viewflow/viewflow/django.yml?branch=main
|
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
LICENSE
|
|
2
|
-
LICENSE.django
|
|
3
2
|
LICENSE_EXCEPTION
|
|
4
3
|
MANIFEST.in
|
|
5
4
|
README.md
|
|
@@ -306,6 +305,7 @@ viewflow/workflow/migrations/0009_merge.py
|
|
|
306
305
|
viewflow/workflow/migrations/0010_viewflow20.py
|
|
307
306
|
viewflow/workflow/migrations/0011_alter_task_created_and_more.py
|
|
308
307
|
viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py
|
|
308
|
+
viewflow/workflow/migrations/0013_process_seed_content_type_process_seed_object_id_and_more.py
|
|
309
309
|
viewflow/workflow/migrations/__init__.py
|
|
310
310
|
viewflow/workflow/nodes/__init__.py
|
|
311
311
|
viewflow/workflow/nodes/end.py
|
|
@@ -318,6 +318,5 @@ viewflow/workflow/nodes/mixins.py
|
|
|
318
318
|
viewflow/workflow/nodes/obsolete.py
|
|
319
319
|
viewflow/workflow/nodes/split.py
|
|
320
320
|
viewflow/workflow/nodes/start.py
|
|
321
|
-
viewflow/workflow/nodes/subprocess.py
|
|
322
321
|
viewflow/workflow/nodes/switch.py
|
|
323
322
|
viewflow/workflow/nodes/view.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.
|
|
7
|
+
version="2.2.3",
|
|
8
8
|
author_email="kmmbvnr@gmail.com",
|
|
9
9
|
author="Mikhail Podgurskiy",
|
|
10
10
|
description="Reusable library to build business applications fast",
|
{django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task.html
RENAMED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
{% extends request.resolver_match.app.base_template_name|default:'viewflow/workflow/base_page.html' %}
|
|
2
2
|
{% load i18n viewflow workflow %}
|
|
3
3
|
|
|
4
|
+
{% block extrahead %}
|
|
5
|
+
{{ block.super }}
|
|
6
|
+
{{ form.media }}
|
|
7
|
+
{% endblock %}
|
|
4
8
|
|
|
5
9
|
{% block content %}{% with process=request.activation.process task=request.activation.task %}
|
|
6
10
|
<div class="mdc-layout-grid vf-page__grid">
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
"""Forward-reference for class-body declarations"""
|
|
2
|
+
|
|
3
|
+
# Copyright (c) 2017-2020, Mikhail Podgurskiy
|
|
4
|
+
# All Rights Reserved.
|
|
5
|
+
|
|
6
|
+
# This work is dual-licensed under AGPL defined in file 'LICENSE' with
|
|
7
|
+
# LICENSE_EXCEPTION and the Commercial license defined in file 'COMM_LICENSE',
|
|
8
|
+
# which is part of this source code package.
|
|
9
|
+
from typing import Any, Optional, Union
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class ThisMethod:
|
|
13
|
+
"""
|
|
14
|
+
Reference to a method for forward references in class bodies.
|
|
15
|
+
|
|
16
|
+
This class is used to defer the resolution of a method reference until the
|
|
17
|
+
class is fully constructed. This is particularly useful in workflow or state
|
|
18
|
+
machine implementations where the flow references are declared before the
|
|
19
|
+
methods are defined.
|
|
20
|
+
"""
|
|
21
|
+
|
|
22
|
+
def __init__(self, propname: str, methodname: str):
|
|
23
|
+
self._propname = propname
|
|
24
|
+
self._methodname = methodname
|
|
25
|
+
|
|
26
|
+
def resolve(self, instance) -> Any:
|
|
27
|
+
"""
|
|
28
|
+
Resolve the method reference on the given instance.
|
|
29
|
+
|
|
30
|
+
Args:
|
|
31
|
+
instance (object): The instance on which to resolve the method.
|
|
32
|
+
|
|
33
|
+
Returns:
|
|
34
|
+
Any: The result of the resolved method call.
|
|
35
|
+
|
|
36
|
+
Raises:
|
|
37
|
+
AttributeError: If the property or method does not exist on the instance.
|
|
38
|
+
"""
|
|
39
|
+
prop = getattr(instance, self._propname)
|
|
40
|
+
method = getattr(instance, f"_this_{self._methodname}")
|
|
41
|
+
return method(prop)
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
class ThisObject(object):
|
|
45
|
+
"""
|
|
46
|
+
Helper for forward references to class attributes.
|
|
47
|
+
|
|
48
|
+
This class is used to defer the resolution of an attribute reference until
|
|
49
|
+
the class is fully constructed. This allows for the use of class attributes
|
|
50
|
+
before they are defined.
|
|
51
|
+
|
|
52
|
+
Attributes:
|
|
53
|
+
name (str): The name of the attribute to resolve.
|
|
54
|
+
"""
|
|
55
|
+
|
|
56
|
+
def __init__(self, name: str) -> None: # noqa D102
|
|
57
|
+
self.name = name
|
|
58
|
+
|
|
59
|
+
def resolve(self, instance: object) -> Any:
|
|
60
|
+
"""
|
|
61
|
+
Resolve the attribute reference on the given instance.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
instance (object): The instance on which to resolve the attribute.
|
|
65
|
+
|
|
66
|
+
Returns:
|
|
67
|
+
Any: The resolved attribute.
|
|
68
|
+
|
|
69
|
+
Raises:
|
|
70
|
+
AttributeError: If the attribute does not exist on the instance.
|
|
71
|
+
"""
|
|
72
|
+
return getattr(instance, self.name)
|
|
73
|
+
|
|
74
|
+
# def __copy__(self):
|
|
75
|
+
# return super().__copy__()
|
|
76
|
+
|
|
77
|
+
# def __deepcopy__(self, memo):
|
|
78
|
+
# return super().__deepcopy__(memo)
|
|
79
|
+
|
|
80
|
+
def __getattr__(self, name):
|
|
81
|
+
if name.startswith("__"):
|
|
82
|
+
super().__getattr__(name)
|
|
83
|
+
return ThisMethod(self.name, name)
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
class This:
|
|
87
|
+
"""
|
|
88
|
+
Helper for building forward references to class attributes and methods.
|
|
89
|
+
|
|
90
|
+
The rationale is the ability to specify references to the class attributes and
|
|
91
|
+
methods before they are declared. `this` acts similarly to `self`, but for
|
|
92
|
+
class-level forward references.
|
|
93
|
+
"""
|
|
94
|
+
|
|
95
|
+
def resolve(self, instance: object, this_ref: Union[ThisObject, ThisMethod, Any]):
|
|
96
|
+
"""
|
|
97
|
+
Resolve a forward reference on the given instance.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
instance (object): The instance on which to resolve the reference.
|
|
101
|
+
this_ref (Union[ThisObject, ThisMethod, Any]): The reference to resolve.
|
|
102
|
+
|
|
103
|
+
Returns:
|
|
104
|
+
Any: The resolved reference.
|
|
105
|
+
|
|
106
|
+
Raises:
|
|
107
|
+
AttributeError: If the reference cannot be resolved.
|
|
108
|
+
"""
|
|
109
|
+
if isinstance(this_ref, (ThisObject, ThisMethod)):
|
|
110
|
+
return this_ref.resolve(instance)
|
|
111
|
+
else:
|
|
112
|
+
return this_ref
|
|
113
|
+
|
|
114
|
+
def __getattr__(self, name):
|
|
115
|
+
return ThisObject(name)
|
|
116
|
+
|
|
117
|
+
|
|
118
|
+
# Instantiate a global `this` object for use in class definitions.
|
|
119
|
+
this = This()
|
|
@@ -8,6 +8,7 @@ import copy
|
|
|
8
8
|
import types
|
|
9
9
|
import warnings
|
|
10
10
|
from collections import namedtuple, OrderedDict
|
|
11
|
+
from typing import Optional, Dict, Any, List, Union
|
|
11
12
|
|
|
12
13
|
from django.views.generic import RedirectView
|
|
13
14
|
from django.urls import URLPattern, URLResolver, include, path, reverse
|
|
@@ -29,17 +30,17 @@ class _UrlName(str):
|
|
|
29
30
|
hierarchy.
|
|
30
31
|
"""
|
|
31
32
|
|
|
32
|
-
def __init__(self, value):
|
|
33
|
+
def __init__(self, value) -> None:
|
|
33
34
|
str.__init__(value)
|
|
34
35
|
self.extra = {}
|
|
35
36
|
|
|
36
37
|
|
|
37
38
|
class _URLResolver(URLResolver):
|
|
38
|
-
def __init__(self, *args, **kwargs):
|
|
39
|
+
def __init__(self, *args, **kwargs) -> None:
|
|
39
40
|
self.extra = kwargs.pop("extra", {})
|
|
40
41
|
super(_URLResolver, self).__init__(*args, **kwargs)
|
|
41
42
|
|
|
42
|
-
def resolve(self, *args, **kwargs):
|
|
43
|
+
def resolve(self, *args, **kwargs) -> str:
|
|
43
44
|
result = super(_URLResolver, self).resolve(*args, **kwargs)
|
|
44
45
|
if not isinstance(result.url_name, _UrlName):
|
|
45
46
|
result.url_name = _UrlName(result.url_name)
|
|
@@ -54,7 +55,7 @@ class _URLResolver(URLResolver):
|
|
|
54
55
|
Route = namedtuple("Route", ["prefix", "viewset"])
|
|
55
56
|
|
|
56
57
|
|
|
57
|
-
def route(prefix, viewset):
|
|
58
|
+
def route(prefix, viewset: "BaseViewset") -> Route:
|
|
58
59
|
"""A viewset url"""
|
|
59
60
|
if not isinstance(viewset, BaseViewset):
|
|
60
61
|
raise ValueError(
|
|
@@ -65,26 +66,48 @@ def route(prefix, viewset):
|
|
|
65
66
|
return Route(prefix, viewset)
|
|
66
67
|
|
|
67
68
|
|
|
68
|
-
class BaseViewset
|
|
69
|
+
class BaseViewset:
|
|
69
70
|
"""
|
|
70
|
-
|
|
71
|
+
Base class for defining a class-based Django routing configuration.
|
|
72
|
+
|
|
73
|
+
Attributes:
|
|
74
|
+
app_name (Optional[str]): The name of the application associated with this viewset.
|
|
75
|
+
namespace (Optional[str]): The namespace for the URLs of this viewset.
|
|
76
|
+
parent_namespace (Optional[str]): The namespace of the parent viewset.
|
|
77
|
+
extra_kwargs (Optional[Dict[str, Any]]): Additional keyword arguments for URL configuration.
|
|
71
78
|
"""
|
|
72
79
|
|
|
73
|
-
app_name = None
|
|
74
|
-
namespace = None
|
|
75
|
-
parent_namespace = None
|
|
76
|
-
extra_kwargs = None
|
|
80
|
+
app_name: Optional[str] = None
|
|
81
|
+
namespace: Optional[str] = None
|
|
82
|
+
parent_namespace: Optional[str] = None
|
|
83
|
+
extra_kwargs: Optional[Dict[str, Any]] = None
|
|
77
84
|
|
|
78
|
-
def __init__(self):
|
|
85
|
+
def __init__(self) -> None:
|
|
79
86
|
super().__init__()
|
|
80
|
-
self._parent = None
|
|
87
|
+
self._parent: Optional[BaseViewset] = None
|
|
81
88
|
|
|
82
89
|
@property
|
|
83
|
-
def parent(self):
|
|
90
|
+
def parent(self) -> Optional["BaseViewset"]:
|
|
91
|
+
"""
|
|
92
|
+
Get the parent viewset.
|
|
93
|
+
|
|
94
|
+
Returns:
|
|
95
|
+
Optional[BaseViewset]: The parent viewset, if any.
|
|
96
|
+
"""
|
|
84
97
|
return self._parent
|
|
85
98
|
|
|
86
99
|
@parent.setter
|
|
87
|
-
def parent(self, value):
|
|
100
|
+
def parent(self, value: "BaseViewset") -> None:
|
|
101
|
+
"""
|
|
102
|
+
Set the parent viewset. This can only be set once.
|
|
103
|
+
|
|
104
|
+
Args:
|
|
105
|
+
value (BaseViewset): The viewset to set as the parent.
|
|
106
|
+
|
|
107
|
+
Raises:
|
|
108
|
+
Warning: If the parent is being set more than once or if the viewset
|
|
109
|
+
already has an explicit parent namespace.
|
|
110
|
+
"""
|
|
88
111
|
if self._parent is not None:
|
|
89
112
|
warnings.warn(
|
|
90
113
|
f"Viewset {self.__class__.__name__} parent could be set only once",
|
|
@@ -98,11 +121,28 @@ class BaseViewset(object):
|
|
|
98
121
|
self._parent = value
|
|
99
122
|
|
|
100
123
|
@property
|
|
101
|
-
def urls(self):
|
|
124
|
+
def urls(self) -> List[Any]:
|
|
102
125
|
raise NotImplementedError("Subclass should override this")
|
|
103
126
|
|
|
104
|
-
def reverse(
|
|
105
|
-
|
|
127
|
+
def reverse(
|
|
128
|
+
self,
|
|
129
|
+
viewname: str,
|
|
130
|
+
args: Optional[list[Any]] = None,
|
|
131
|
+
kwargs: Optional[dict[str, Any]] = None,
|
|
132
|
+
current_app: Optional[str] = None,
|
|
133
|
+
) -> str:
|
|
134
|
+
"""
|
|
135
|
+
Get the URL for a given viewname, including the namespace.
|
|
136
|
+
|
|
137
|
+
Args:
|
|
138
|
+
viewname (str): The name of the view.
|
|
139
|
+
args (Optional[list[Any]], optional): Positional arguments for the view.
|
|
140
|
+
kwargs (Optional[dict[str, Any]], optional): Keyword arguments for the view.
|
|
141
|
+
current_app (Optional[str], optional): The current application namespace.
|
|
142
|
+
|
|
143
|
+
Returns:
|
|
144
|
+
str: The URL for the view with the appropriate namespace
|
|
145
|
+
"""
|
|
106
146
|
view_namespace = ""
|
|
107
147
|
|
|
108
148
|
current_viewset = self
|
|
@@ -121,7 +161,17 @@ class BaseViewset(object):
|
|
|
121
161
|
|
|
122
162
|
return reverse(viewname, args=args, kwargs=kwargs, current_app=current_app)
|
|
123
163
|
|
|
124
|
-
def has_view_permission(self, user, obj=None):
|
|
164
|
+
def has_view_permission(self, user: Any, obj: Optional[Any] = None):
|
|
165
|
+
"""
|
|
166
|
+
Determine if the user has permission to view the viewset.
|
|
167
|
+
|
|
168
|
+
Args:
|
|
169
|
+
user (User): The user to check permissions for.
|
|
170
|
+
obj (Optional[Any], optional): The object being viewed.
|
|
171
|
+
|
|
172
|
+
Returns:
|
|
173
|
+
bool: True if the user has view permission, False otherwise.
|
|
174
|
+
"""
|
|
125
175
|
return True
|
|
126
176
|
|
|
127
177
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
from contextlib import contextmanager
|
|
2
|
-
from typing import List
|
|
2
|
+
from typing import Any, List, Optional, Set
|
|
3
3
|
|
|
4
4
|
from django.db import connection, transaction
|
|
5
5
|
from django.utils.timezone import now
|
|
@@ -10,70 +10,116 @@ from .signals import task_finished, task_failed
|
|
|
10
10
|
from .status import STATUS, PROCESS
|
|
11
11
|
|
|
12
12
|
|
|
13
|
-
def parent_tasks_completed(activation):
|
|
14
|
-
"""
|
|
13
|
+
def parent_tasks_completed(activation: "Activation") -> bool:
|
|
14
|
+
"""
|
|
15
|
+
Check if all parent tasks are completed.
|
|
16
|
+
|
|
17
|
+
Canceled task could be recreated iff all parent task was not cancelled.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
activation (Activation): The current activation instance.
|
|
21
|
+
|
|
22
|
+
Returns:
|
|
23
|
+
bool: True if all parent tasks are completed, False otherwise.
|
|
24
|
+
"""
|
|
15
25
|
previous = activation.task.previous.values("status")
|
|
16
26
|
completed = (STATUS.DONE, STATUS.REVIVED)
|
|
17
27
|
return all(lambda task: task.status in completed, previous)
|
|
18
28
|
|
|
19
29
|
|
|
20
|
-
def leading_tasks_canceled(activation):
|
|
21
|
-
"""
|
|
30
|
+
def leading_tasks_canceled(activation: "Activation") -> bool:
|
|
31
|
+
"""
|
|
32
|
+
Check if all leading tasks are canceled.
|
|
33
|
+
|
|
34
|
+
Task could be undone iff no outgoing uncancelled tasks are exists.
|
|
35
|
+
|
|
36
|
+
Args:
|
|
37
|
+
activation (Activation): The current activation instance.
|
|
38
|
+
|
|
39
|
+
Returns:
|
|
40
|
+
bool: True if all leading tasks are canceled, False otherwise.
|
|
41
|
+
"""
|
|
22
42
|
non_canceled_count = activation.task.leading.exclude(status=STATUS.CANCELED).count()
|
|
23
43
|
return non_canceled_count == 0
|
|
24
44
|
|
|
25
45
|
|
|
26
|
-
def process_not_cancelled(activation):
|
|
46
|
+
def process_not_cancelled(activation: "Activation") -> bool:
|
|
47
|
+
"""
|
|
48
|
+
Check if the process is not canceled.
|
|
49
|
+
|
|
50
|
+
Args:
|
|
51
|
+
activation (Activation): The current activation instance.
|
|
52
|
+
|
|
53
|
+
Returns:
|
|
54
|
+
bool: True if the process is not canceled, False otherwise.
|
|
55
|
+
"""
|
|
27
56
|
return activation.process.status != PROCESS.CANCELED
|
|
28
57
|
|
|
29
58
|
|
|
30
|
-
def has_manage_permission(activation, user):
|
|
59
|
+
def has_manage_permission(activation: "Activation", user: Any) -> bool:
|
|
60
|
+
"""
|
|
61
|
+
Check if the user has manage permission.
|
|
62
|
+
|
|
63
|
+
Args:
|
|
64
|
+
activation (Activation): The current activation instance.
|
|
65
|
+
user (Any): The user instance.
|
|
66
|
+
|
|
67
|
+
Returns:
|
|
68
|
+
bool: True if the user has manage permission, False otherwise.
|
|
69
|
+
"""
|
|
31
70
|
return activation.flow_class.instance.has_manage_permission(user)
|
|
32
71
|
|
|
33
72
|
|
|
34
|
-
class Activation
|
|
73
|
+
class Activation:
|
|
35
74
|
"""
|
|
36
75
|
Base class for flow task activations.
|
|
37
76
|
|
|
38
|
-
Activation is responsible for flow task state management and
|
|
39
|
-
Each activation status
|
|
40
|
-
automata.
|
|
77
|
+
Activation is responsible for flow task state management and persistence.
|
|
78
|
+
Each activation status change is restricted by a simple finite state automaton.
|
|
41
79
|
"""
|
|
42
80
|
|
|
43
81
|
status: fsm.State = fsm.State(STATUS, default=STATUS.NEW)
|
|
82
|
+
type: str = "node"
|
|
83
|
+
|
|
84
|
+
def __init__(self, task: Any) -> None:
|
|
85
|
+
"""
|
|
86
|
+
Instantiate an activation.
|
|
44
87
|
|
|
45
|
-
|
|
46
|
-
|
|
88
|
+
Args:
|
|
89
|
+
task (Any): The task instance associated with the activation.
|
|
90
|
+
"""
|
|
47
91
|
self.task = task
|
|
48
92
|
self.process = task.process.coerced
|
|
49
93
|
|
|
50
|
-
def __eq__(self, other):
|
|
94
|
+
def __eq__(self, other: Any) -> bool:
|
|
51
95
|
if not isinstance(other, Activation):
|
|
52
96
|
return False
|
|
53
97
|
return self.task == other.task
|
|
54
98
|
|
|
55
|
-
def __hash__(self):
|
|
99
|
+
def __hash__(self) -> int:
|
|
56
100
|
return hash(self.task)
|
|
57
101
|
|
|
58
102
|
@status.setter()
|
|
59
|
-
def _set_status(self, value):
|
|
103
|
+
def _set_status(self, value: Any) -> None:
|
|
60
104
|
"""Set the status to the underline task."""
|
|
61
105
|
self.task.status = value
|
|
62
106
|
|
|
63
107
|
@status.getter()
|
|
64
|
-
def _get_status(self):
|
|
108
|
+
def _get_status(self) -> Any:
|
|
65
109
|
"""Get the status of the activated task."""
|
|
66
110
|
return self.task.status
|
|
67
111
|
|
|
68
112
|
@property
|
|
69
|
-
def flow_task(self):
|
|
113
|
+
def flow_task(self) -> Any:
|
|
114
|
+
"""Get the flow task associated with the activation."""
|
|
70
115
|
return self.task.flow_task
|
|
71
116
|
|
|
72
117
|
@property
|
|
73
|
-
def flow_class(self):
|
|
118
|
+
def flow_class(self) -> Any:
|
|
119
|
+
"""Get the flow class associated with the activation."""
|
|
74
120
|
return self.flow_task.flow_class
|
|
75
121
|
|
|
76
|
-
def exception_guard(self):
|
|
122
|
+
def exception_guard(self) -> contextmanager:
|
|
77
123
|
"""
|
|
78
124
|
Perform activation action inside a transaction.
|
|
79
125
|
|
|
@@ -100,56 +146,101 @@ class Activation(object):
|
|
|
100
146
|
return guard()
|
|
101
147
|
|
|
102
148
|
@classmethod
|
|
103
|
-
def create(
|
|
104
|
-
|
|
149
|
+
def create(
|
|
150
|
+
cls,
|
|
151
|
+
flow_task: Any,
|
|
152
|
+
prev_activation: "Activation",
|
|
153
|
+
token: Any,
|
|
154
|
+
data: Optional[Any] = None,
|
|
155
|
+
seed: Optional[Any] = None,
|
|
156
|
+
) -> "Activation":
|
|
157
|
+
"""
|
|
158
|
+
Instantiate and persist a new flow task.
|
|
159
|
+
|
|
160
|
+
Args:
|
|
161
|
+
flow_task (Any): The flow task instance.
|
|
162
|
+
prev_activation (Activation): The previous activation instance.
|
|
163
|
+
token (Any): The token for the new task.
|
|
164
|
+
data (Optional[Any]): Additional data for the new task.
|
|
165
|
+
|
|
166
|
+
Returns:
|
|
167
|
+
Activation: The newly created activation instance.
|
|
168
|
+
"""
|
|
105
169
|
flow_class = flow_task.flow_class
|
|
106
170
|
task = flow_class.task_class(
|
|
107
171
|
process=prev_activation.process,
|
|
108
172
|
flow_task=flow_task,
|
|
109
173
|
token=token,
|
|
110
174
|
data=data if data is not None else {},
|
|
175
|
+
seed=seed,
|
|
111
176
|
)
|
|
112
177
|
task.save()
|
|
113
178
|
task.previous.add(prev_activation.task)
|
|
114
179
|
return cls(task)
|
|
115
180
|
|
|
116
181
|
@status.transition(source=STATUS.NEW)
|
|
117
|
-
def activate(self):
|
|
182
|
+
def activate(self) -> None:
|
|
183
|
+
"""Activate the task."""
|
|
118
184
|
raise NotImplementedError(
|
|
119
185
|
f"{self.__class__.__name__} class should override act() method"
|
|
120
186
|
)
|
|
121
187
|
|
|
122
188
|
@status.transition(source=STATUS.DONE)
|
|
123
|
-
def create_next(self):
|
|
189
|
+
def create_next(self) -> None:
|
|
190
|
+
"""Create the next task in the flow."""
|
|
124
191
|
raise NotImplementedError(
|
|
125
192
|
f"{self.__class__.__name__} class should override create_next() method"
|
|
126
193
|
)
|
|
127
194
|
|
|
128
195
|
@status.transition(source=STATUS.NEW, target=STATUS.DONE)
|
|
129
|
-
def complete(self):
|
|
196
|
+
def complete(self) -> None:
|
|
197
|
+
"""Complete the current task."""
|
|
130
198
|
assert connection.in_atomic_block
|
|
131
199
|
self.task.finished = now()
|
|
132
200
|
self.task.save()
|
|
133
201
|
task_finished.send(sender=self.flow_class, process=self.process, task=self.task)
|
|
134
202
|
|
|
135
|
-
def _activate_next(self, activations:
|
|
203
|
+
def _activate_next(self, activations: Set["Activation"]) -> None:
|
|
204
|
+
"""Activate the next set of tasks."""
|
|
136
205
|
while activations:
|
|
137
|
-
for
|
|
206
|
+
join_activations = {act for act in activations if act.type == "join"}
|
|
207
|
+
task_activations = activations - join_activations
|
|
208
|
+
|
|
209
|
+
if task_activations:
|
|
210
|
+
for current_activation in task_activations:
|
|
211
|
+
if current_activation.activate.can_proceed():
|
|
212
|
+
current_activation.activate()
|
|
213
|
+
|
|
214
|
+
if current_activation.complete.can_proceed():
|
|
215
|
+
current_activation.complete()
|
|
216
|
+
|
|
217
|
+
activations = {
|
|
218
|
+
next_activation
|
|
219
|
+
for current_activation in activations
|
|
220
|
+
if current_activation.create_next.can_proceed()
|
|
221
|
+
for next_activation in current_activation.create_next()
|
|
222
|
+
}
|
|
223
|
+
activations.update(join_activations)
|
|
224
|
+
elif join_activations:
|
|
225
|
+
# process first join activation
|
|
226
|
+
current_activation = join_activations.pop()
|
|
138
227
|
if current_activation.activate.can_proceed():
|
|
139
228
|
current_activation.activate()
|
|
140
229
|
|
|
141
230
|
if current_activation.complete.can_proceed():
|
|
142
231
|
current_activation.complete()
|
|
143
232
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
233
|
+
activations = set()
|
|
234
|
+
if current_activation.create_next.can_proceed():
|
|
235
|
+
activations = {
|
|
236
|
+
next_activation
|
|
237
|
+
for next_activation in current_activation.create_next()
|
|
238
|
+
}
|
|
239
|
+
activations.update(join_activations)
|
|
150
240
|
|
|
151
241
|
@status.transition(source=STATUS.DONE)
|
|
152
|
-
def activate_next(self):
|
|
242
|
+
def activate_next(self) -> None:
|
|
243
|
+
"""Activate the next task in the flow."""
|
|
153
244
|
assert connection.in_atomic_block
|
|
154
245
|
activations = set(self.create_next())
|
|
155
246
|
self._activate_next(activations)
|
|
@@ -160,7 +251,8 @@ class Activation(object):
|
|
|
160
251
|
conditions=[leading_tasks_canceled],
|
|
161
252
|
permission=has_manage_permission,
|
|
162
253
|
)
|
|
163
|
-
def undo(self):
|
|
254
|
+
def undo(self) -> None:
|
|
255
|
+
"""Undo the current task."""
|
|
164
256
|
self.task.finished = now()
|
|
165
257
|
self.task.save()
|
|
166
258
|
|
|
@@ -169,7 +261,7 @@ class Activation(object):
|
|
|
169
261
|
target=STATUS.REVIVED,
|
|
170
262
|
permission=has_manage_permission,
|
|
171
263
|
)
|
|
172
|
-
def revive(self):
|
|
264
|
+
def revive(self) -> Any:
|
|
173
265
|
"""
|
|
174
266
|
Recreate and activate cancelled task
|
|
175
267
|
"""
|
|
@@ -188,7 +280,9 @@ class Activation(object):
|
|
|
188
280
|
return task
|
|
189
281
|
|
|
190
282
|
def get_outgoing_transitions(self) -> List[fsm.Transition]:
|
|
283
|
+
"""Get the outgoing transitions for the current status."""
|
|
191
284
|
return self.__class__.status.get_outgoing_transitions(self.status)
|
|
192
285
|
|
|
193
286
|
def get_available_transitions(self, user) -> List[fsm.Transition]:
|
|
287
|
+
"""Get the available transitions for the current status and user."""
|
|
194
288
|
return self.__class__.status.get_available_transitions(self, self.status, user)
|