django-viewflow 2.1.2__tar.gz → 2.2.4__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.4}/PKG-INFO +3 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/README.md +55 -18
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/PKG-INFO +3 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/SOURCES.txt +2 -2
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/setup.py +1 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/forms/renderers.py +2 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/graph.svg +7 -7
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_cancel.html +3 -3
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_data.html +22 -2
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task.html +4 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_data.html +22 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_detail.html +10 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/workflow.py +2 -0
- django_viewflow-2.2.4/viewflow/this_object.py +119 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/base.py +68 -18
- django_viewflow-2.2.4/viewflow/workflow/activation.py +293 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/base.py +111 -55
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/chart.py +22 -5
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/__init__.py +0 -6
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/nodes.py +92 -34
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/actions.py +14 -3
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/create.py +4 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/dashboard.py +4 -2
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/update.py +4 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/viewset.py +4 -0
- django_viewflow-2.2.4/viewflow/workflow/migrations/0013_process_seed_content_type_process_seed_object_id_and_more.py +47 -0
- django_viewflow-2.2.4/viewflow/workflow/migrations/0014_alter_process_parent_task.py +25 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/models.py +25 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/__init__.py +0 -4
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/end.py +5 -2
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/if_gate.py +32 -6
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/job.py +9 -4
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/join.py +7 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/mixins.py +21 -2
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/split.py +2 -5
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/start.py +12 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/view.py +2 -1
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/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/activation.py +0 -194
- django-viewflow-2.1.2/viewflow/workflow/nodes/subprocess.py +0 -149
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/LICENSE +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/LICENSE_EXCEPTION +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/MANIFEST.in +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/dependency_links.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/not-zip-safe +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/requires.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/top_level.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/setup.cfg +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_middleware.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_templates.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_templatetags__viewflow.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_this_object.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_urls__base.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_utils__package.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/apps.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/conf.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/admin/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/admin/apps.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/auth.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/material.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/views.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/viewset.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fields.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/forms/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/admin.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/base.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/chart.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/typing.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/views.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/viewset.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/jsonstore.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/de/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/de/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/es/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/es/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/fr/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/fr/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/it/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/it/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ja/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ja/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/kk/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/kk/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ko/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ko/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/pt/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/pt/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ru/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ru/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/sr/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/sr/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/management/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/management/commands/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/management/commands/flowexport.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/middleware.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/perfect-scrollbar.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/trix.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/viewflow.min.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/vis-network.min.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/roboto-fontface.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.eot +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.otf +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.ttf +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff2 +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.min.css +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/img/favicon.png +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/img/user.png +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash-renderer/build/dash_renderer.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/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.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.LICENSE.txt +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/plotly.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/deps/polyfill@7.12.1.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/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.4}/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.4}/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.4}/viewflow/static/viewflow/js/contrib/dash/deps/react@16.14.0.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/perfect-scrollbar.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/perfect-scrollbar.min.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/smartcrop.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/trix.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/turbo.es2017-umd.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/viewflow.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/viewflow.min.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/vis-network.min.js +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/vis-network.min.js.map +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/400.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/403.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/404.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/500.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_change_form.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_change_form_object_tools.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_change_list.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_transition_form.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/formtools/wizard/wizard_form.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/logged_out.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/login.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_change_done.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_change_form.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_complete.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_confirm.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_done.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_form.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/profile.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/provider_list.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/base.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/base_lockscreen.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/base_page.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/import_export/export_action.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/import_export/import_action.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/plotly.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/swagger.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/app_menu.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/list_bulk_actions.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/list_filter.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/list_pagination.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/object_detail_card.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/site_menu.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/snackbar.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/view_action_menu.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/viewflow_css.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/viewflow_js.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/material/circular_progress.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/confirm_delete.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/delete_action.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/detail.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/form.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/list.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/transition.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/assign.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/base_page.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/celery_task_detail.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/flow_menu.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/graph.bpmn +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_dashboard.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_detail.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_list.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_tasks_list.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/start.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_assign.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_base.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_cancel.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_list.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_revive.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_unassign.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_undo.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/tasks_assign.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/tasks_unassign.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/workflow_menu.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/workflow_tasks_list.html +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/fsm.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/viewflow.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/model.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/sites.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/utils.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/actions.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/base.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/create.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/delete.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/detail.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/filters.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/list.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/search.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/update.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/admin.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/apps.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/context.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/exceptions.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/fields.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/mixins.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/utils.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/chart.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/detail.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/filters.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/list.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/mixins.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/lock.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/managers.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0001_initial.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0002_fsmchange.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0003_task_owner_permission_change.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0004_extend_fields_length.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0004_subprocess.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0005_merge.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0005_rename_flowcls.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0006_i18n.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0006_merge.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0007_owner_permission_obj.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0007_task_assigned.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0008_jsonfield_and_artifact.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0008_merge.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0009_merge.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0010_viewflow20.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0011_alter_task_created_and_more.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/__init__.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/func.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/handle.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/obsolete.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/switch.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/signals.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/status.py +0 -0
- {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/utils.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: django-viewflow
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.4
|
|
4
4
|
Summary: Reusable library to build business applications fast
|
|
5
5
|
Author: Mikhail Podgurskiy
|
|
6
6
|
Author-email: kmmbvnr@gmail.com
|
|
@@ -25,3 +25,5 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
25
25
|
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
|
26
26
|
Requires-Python: >=3.8
|
|
27
27
|
License-File: LICENSE
|
|
28
|
+
Requires-Dist: Django>=4.2
|
|
29
|
+
Requires-Dist: django-filter>=2.3.0
|
|
@@ -185,24 +185,61 @@ modifications of Viewflow. You can find the commercial license terms in
|
|
|
185
185
|
|
|
186
186
|
## Changelog
|
|
187
187
|
|
|
188
|
-
### 2.
|
|
189
|
-
|
|
190
|
-
-
|
|
191
|
-
-
|
|
192
|
-
-
|
|
193
|
-
-
|
|
194
|
-
|
|
195
|
-
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
-
|
|
205
|
-
-
|
|
188
|
+
### 2.2.4 2024-07-12
|
|
189
|
+
|
|
190
|
+
- Clone data, seed, and artifacts from canceled tasks to revived tasks.
|
|
191
|
+
- Enhance error handling for celery.Job.
|
|
192
|
+
- Improve the process cancellation template.
|
|
193
|
+
- Redirect to the task detail page after canceling or undoing actions, instead
|
|
194
|
+
of redirecting to the process detail page.
|
|
195
|
+
- Added links to parent subprocess and parent task on the subprocess process and
|
|
196
|
+
task details pages.
|
|
197
|
+
- Updated the Process.parent_task field to use related_name='subprocess',
|
|
198
|
+
allowing access to subprocesses via task.subprocess
|
|
199
|
+
- Enhanced CreateProcessView and UpdateProcessView to set process_seed and
|
|
200
|
+
artifact_generic_foreign_key fields based on form.cleaned_data, as Django
|
|
201
|
+
model forms do not handle this automatically.
|
|
202
|
+
- Added tasks with an ERROR status to the process dashboard for better visibility and tracking.
|
|
203
|
+
- Added tooltip hover titles to nodes without text labels in the SVG workflow graph.
|
|
204
|
+
- Marked StartHandler nodes as BPMN Start Message events on the SVG graph.
|
|
205
|
+
- Fixed rendering of hidden field errors in forms.
|
|
206
|
+
|
|
207
|
+
|
|
208
|
+
### 2.2.3 2024-07-09
|
|
209
|
+
|
|
210
|
+
- Fixed issue with Split/Join operations when an immediate split to join
|
|
211
|
+
connection occurs.
|
|
212
|
+
- Improved redirect functionality for "Execute and Continue." Now redirects to
|
|
213
|
+
the process details if the process has finished.
|
|
214
|
+
- Enabled the Undo action for End() nodes.
|
|
215
|
+
|
|
216
|
+
|
|
217
|
+
### 2.2.2 2024-07-05
|
|
218
|
+
|
|
219
|
+
- Introduced new parameters for .If().Then(.., task_data=, task_seed) and
|
|
220
|
+
.Else(...)
|
|
221
|
+
- Include {{ form.media }} into default workflow/task.html template
|
|
222
|
+
|
|
223
|
+
|
|
224
|
+
### 2.2.1 2024-07-03
|
|
225
|
+
|
|
226
|
+
- Introduced a new parameter for .Next(..., task_seed=) that allows the
|
|
227
|
+
instantiation of new tasks with additional initialized .seed generic foreign key
|
|
228
|
+
- Introduced a new parameter for .Split(..., task_seed_source=) same as task_data_source,
|
|
229
|
+
prodices outgoing tasks with initializaed .seed value
|
|
230
|
+
- Introduced a new parameter for flow.Subprocess(process_data=, process_seed=,
|
|
231
|
+
task_data=, task_seed=) allows to provide data nad seed for newly created
|
|
232
|
+
process and/or start task
|
|
233
|
+
|
|
234
|
+
### 2.2.0 2024-06-28
|
|
235
|
+
|
|
236
|
+
- Introduced a new parameter for .Next(..., task_data=) that allows the
|
|
237
|
+
instantiation of new tasks with additional initialized .data, enabling data to
|
|
238
|
+
be passed from task to task.
|
|
239
|
+
- Added process.seed and task.seed generic foreign keys to the default workflow
|
|
240
|
+
models. Along with process.artifact and task.artifact, these additions enable
|
|
241
|
+
tracking of business process results from start to finish.
|
|
242
|
+
- Renamed Split.Next(data_source=) to task_data_source=.
|
|
206
243
|
|
|
207
244
|
|
|
208
245
|
[build]: https://img.shields.io/github/actions/workflow/status/viewflow/viewflow/django.yml?branch=main
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.1
|
|
2
2
|
Name: django-viewflow
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.2.4
|
|
4
4
|
Summary: Reusable library to build business applications fast
|
|
5
5
|
Author: Mikhail Podgurskiy
|
|
6
6
|
Author-email: kmmbvnr@gmail.com
|
|
@@ -25,3 +25,5 @@ Classifier: Topic :: Software Development :: Libraries :: Python Modules
|
|
|
25
25
|
Classifier: License :: OSI Approved :: GNU Affero General Public License v3 or later (AGPLv3+)
|
|
26
26
|
Requires-Python: >=3.8
|
|
27
27
|
License-File: LICENSE
|
|
28
|
+
Requires-Dist: Django>=4.2
|
|
29
|
+
Requires-Dist: django-filter>=2.3.0
|
|
@@ -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,8 @@ 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
|
+
viewflow/workflow/migrations/0014_alter_process_parent_task.py
|
|
309
310
|
viewflow/workflow/migrations/__init__.py
|
|
310
311
|
viewflow/workflow/nodes/__init__.py
|
|
311
312
|
viewflow/workflow/nodes/end.py
|
|
@@ -318,6 +319,5 @@ viewflow/workflow/nodes/mixins.py
|
|
|
318
319
|
viewflow/workflow/nodes/obsolete.py
|
|
319
320
|
viewflow/workflow/nodes/split.py
|
|
320
321
|
viewflow/workflow/nodes/start.py
|
|
321
|
-
viewflow/workflow/nodes/subprocess.py
|
|
322
322
|
viewflow/workflow/nodes/switch.py
|
|
323
323
|
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.4",
|
|
8
8
|
author_email="kmmbvnr@gmail.com",
|
|
9
9
|
author="Mikhail Podgurskiy",
|
|
10
10
|
description="Reusable library to build business applications fast",
|
|
@@ -510,9 +510,10 @@ class FormLayout:
|
|
|
510
510
|
def append_non_field_errors(self, form: forms.Form, root: ElementTree.Element):
|
|
511
511
|
errors = form.non_field_errors()
|
|
512
512
|
errors.extend(
|
|
513
|
-
|
|
513
|
+
error
|
|
514
514
|
for bound_field in form.hidden_fields()
|
|
515
515
|
if bound_field.errors
|
|
516
|
+
for error in bound_field.errors
|
|
516
517
|
)
|
|
517
518
|
|
|
518
519
|
if errors:
|
{django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/graph.svg
RENAMED
|
@@ -81,7 +81,7 @@
|
|
|
81
81
|
|
|
82
82
|
circle.event,
|
|
83
83
|
path.event {
|
|
84
|
-
fill:
|
|
84
|
+
fill: transparent;
|
|
85
85
|
stroke: #000;
|
|
86
86
|
}
|
|
87
87
|
|
|
@@ -90,12 +90,12 @@
|
|
|
90
90
|
}
|
|
91
91
|
|
|
92
92
|
path.event-marker {
|
|
93
|
-
fill:
|
|
93
|
+
fill: transparent;
|
|
94
94
|
stroke: #000;
|
|
95
95
|
}
|
|
96
96
|
|
|
97
97
|
path.gateway {
|
|
98
|
-
fill:
|
|
98
|
+
fill: transparent;
|
|
99
99
|
stroke: #000;
|
|
100
100
|
stroke-width: 1.1;
|
|
101
101
|
}
|
|
@@ -108,7 +108,7 @@
|
|
|
108
108
|
}
|
|
109
109
|
|
|
110
110
|
rect.task {
|
|
111
|
-
fill:
|
|
111
|
+
fill: transparent;
|
|
112
112
|
stroke: #000;
|
|
113
113
|
stroke-width: 1.1;
|
|
114
114
|
}
|
|
@@ -120,7 +120,7 @@
|
|
|
120
120
|
}
|
|
121
121
|
|
|
122
122
|
path.task-marker {
|
|
123
|
-
fill:
|
|
123
|
+
fill: transparent;
|
|
124
124
|
stroke: #000;
|
|
125
125
|
stroke-width: 1.1;
|
|
126
126
|
}
|
|
@@ -128,14 +128,14 @@
|
|
|
128
128
|
</style>
|
|
129
129
|
{% for cell in cells %}
|
|
130
130
|
<g id="{{ cell.node.name }}" transform="translate({{ cell.shape.x }}, {{ cell.shape.y }})"{% if cell.status %} class="{{ cell.status|lower }}"{% endif %}>
|
|
131
|
-
{% if cell.
|
|
131
|
+
{% if cell.title %}<title>{{ cell.title }}</title>{% endif %}
|
|
132
132
|
{{ cell.shape.svg|safe }}
|
|
133
133
|
{% for text, class, font_size, x, y in cell.shape.text %}
|
|
134
134
|
<text class="{{ class }}" font-size="{{ font_size }}px" x="{{ x }}" y="{{ y }}">{% if forloop.first %}{{ text|title }}{% else %}{{ text }}{% endif %}</text>
|
|
135
135
|
{% endfor %}
|
|
136
136
|
</g>
|
|
137
137
|
{% endfor %}{% for edge in edges %}
|
|
138
|
-
<path fill="
|
|
138
|
+
<path fill="transparent" stroke="#000000" stroke-width="2" id="{{ edge.src.name}}__{{ edge.dst.name }}" marker-end="url(#end-marker)"
|
|
139
139
|
d="{% for x,y in edge.segments %}{% if forloop.first %}M{% else %} L{% endif %}{{ x }}, {{ y }}{% endfor %}"/>
|
|
140
140
|
|
|
141
141
|
{% endfor %}
|
|
@@ -3,8 +3,8 @@
|
|
|
3
3
|
|
|
4
4
|
{% block content %}
|
|
5
5
|
<div class="mdc-layout-grid vf-page__grid">
|
|
6
|
-
<div class="mdc-layout-grid__inner">
|
|
7
|
-
<div class="mdc-layout-grid__cell mdc-layout-grid__cell--span-
|
|
6
|
+
<div class="mdc-layout-grid__inner vf-page__grid-inner">
|
|
7
|
+
<div class="mdc-layout-grid__cell mdc-layout-grid__cell--span-8-desktop mdc-layout-grid__cell--span-8-tablet mdc-layout-grid__cell--span-4-phone">
|
|
8
8
|
<div class="mdc-card vf-card">
|
|
9
9
|
<section class="vf-card__header">
|
|
10
10
|
<h1 class="vf-card__title">
|
|
@@ -90,7 +90,7 @@
|
|
|
90
90
|
</div>
|
|
91
91
|
</div>
|
|
92
92
|
{% block panel-cell %}
|
|
93
|
-
<div class="mdc-layout-grid__cell {% block panel-cell-span %}mdc-layout-grid__cell--span-
|
|
93
|
+
<div class="mdc-layout-grid__cell {% block panel-cell-span %}mdc-layout-grid__cell--span-4-desktop mdc-layout-grid__cell--span-8-tablet mdc-layout-grid__cell--span-4-phone{% endblock %}">
|
|
94
94
|
{% include_process_data process %}
|
|
95
95
|
</div>
|
|
96
96
|
{% endblock panel-cell %}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
{% load viewflow %}
|
|
1
|
+
{% load viewflow i18n %}
|
|
2
2
|
<div class="mdc-card vf-card">
|
|
3
3
|
<section class="vf-card__header">
|
|
4
4
|
<h1 class="vf-card__title">{{ process }}</h1>
|
|
@@ -20,13 +20,33 @@
|
|
|
20
20
|
</td>
|
|
21
21
|
</tr>
|
|
22
22
|
{% for field, field_name, value in process_data %}
|
|
23
|
-
{% if field.name != 'data' and field.name != 'flow_class' and field.name != 'artifact_object_id' and field.name != 'artifact_content_type'%}
|
|
23
|
+
{% if field.name != 'parent_task' and field.name != 'data' and field.name != 'flow_class' and field.name != 'artifact_object_id' and field.name != 'artifact_content_type' and field.name != 'seed_object_id' and field.name != 'seed_content_type'%}
|
|
24
24
|
<tr>
|
|
25
25
|
<th class="vf-list__table-header vf-list__table-header-text">{{ field_name }}</th>
|
|
26
26
|
<td>{{ value }}</td>
|
|
27
27
|
</tr>
|
|
28
28
|
{% endif %}
|
|
29
29
|
{% endfor %}
|
|
30
|
+
{% if process.parent_task %}
|
|
31
|
+
<tr>
|
|
32
|
+
<th class="vf-list__table-header vf-list__table-header-text">{% translate 'Parent Task' %}</th>
|
|
33
|
+
<td>
|
|
34
|
+
<a href="{% reverse process.parent_task.flow_task 'index' process.parent_task.process_id process.parent_task.pk %}">{{ process.parent_task.flow_task }}</a>
|
|
35
|
+
</td>
|
|
36
|
+
</tr>
|
|
37
|
+
{% endif %}
|
|
38
|
+
{% if process.seed %}
|
|
39
|
+
<tr>
|
|
40
|
+
<th class="vf-list__table-header vf-list__table-header-text">{% translate 'Seed' %}</th>
|
|
41
|
+
<td>{{ process.seed }}</td>
|
|
42
|
+
</tr>
|
|
43
|
+
{% endif %}
|
|
44
|
+
{% if process.artifact %}
|
|
45
|
+
<tr>
|
|
46
|
+
<th class="vf-list__table-header vf-list__table-header-text">{% translate 'Artifact' %}</th>
|
|
47
|
+
<td>{{ process.artifact }}</td>
|
|
48
|
+
</tr>
|
|
49
|
+
{% endif %}
|
|
30
50
|
</tbody>
|
|
31
51
|
</table>
|
|
32
52
|
</section>
|
{django-viewflow-2.1.2 → django_viewflow-2.2.4}/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">
|
{django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_data.html
RENAMED
|
@@ -20,6 +20,28 @@
|
|
|
20
20
|
</div>
|
|
21
21
|
{% endif %}
|
|
22
22
|
|
|
23
|
+
{% if seed_data %}
|
|
24
|
+
<div class="mdc-card vf-card">
|
|
25
|
+
<section class="vf-card__header">
|
|
26
|
+
<h1 class="vf-card__title">{{ task.seed }}</h1>
|
|
27
|
+
</section>
|
|
28
|
+
<section class="vf-card__body">
|
|
29
|
+
<table class="vf-list__table">
|
|
30
|
+
<tbody>
|
|
31
|
+
{% for field, field_name, value in seed_data %}
|
|
32
|
+
{% if field.name != 'process' and field.name != 'task' %}
|
|
33
|
+
<tr>
|
|
34
|
+
<th class="vf-list__table-header vf-list__table-header-text">{{ field_name }}</th>
|
|
35
|
+
<td>{{ value }}</td>
|
|
36
|
+
</tr>
|
|
37
|
+
{% endif %}
|
|
38
|
+
{% endfor %}
|
|
39
|
+
</tbody>
|
|
40
|
+
</table>
|
|
41
|
+
</section>
|
|
42
|
+
</div>
|
|
43
|
+
{% endif %}
|
|
44
|
+
|
|
23
45
|
|
|
24
46
|
{% if data %}
|
|
25
47
|
{{ data }}
|
|
@@ -37,6 +37,16 @@
|
|
|
37
37
|
{% endfor %}
|
|
38
38
|
</div>
|
|
39
39
|
</div>
|
|
40
|
+
{% with subprocesses=task.subprocesses.all %}{% if subprocesses %}
|
|
41
|
+
<div class="mdc-layout-grid__cell mdc-layout-grid__cell--span-12">
|
|
42
|
+
<h4 class="mdc-typography mdc-typography--headline5" style="margin-bottom:10px">{% trans "Subprocess" %}</h4>
|
|
43
|
+
<div>
|
|
44
|
+
{% for subprocess in subprocesses %}
|
|
45
|
+
<a class="mdc-typography mdc-typography--subtitle1" href="{% reverse subprocess.flow_class 'process_detail' subprocess.pk %}">{{ subprocess }}</a>{% if not forloop.last %}, {% endif %}
|
|
46
|
+
{% endfor %}
|
|
47
|
+
</div>
|
|
48
|
+
</div>
|
|
49
|
+
{% endif %}{% endwith %}
|
|
40
50
|
{% endblock %}
|
|
41
51
|
|
|
42
52
|
{% block task_actions %}
|
|
@@ -51,6 +51,8 @@ def include_task_data(context, task):
|
|
|
51
51
|
try:
|
|
52
52
|
if task.artifact_object_id:
|
|
53
53
|
context["artifact_data"] = get_object_data(task.artifact)
|
|
54
|
+
if task.seed_object_id:
|
|
55
|
+
context["seed_data"] = get_object_data(task.seed)
|
|
54
56
|
context["data"] = task.data
|
|
55
57
|
context["task"] = task
|
|
56
58
|
return template.render(
|
|
@@ -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
|
|