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.
Files changed (326) hide show
  1. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/PKG-INFO +1 -1
  2. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/README.md +29 -12
  3. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/PKG-INFO +1 -1
  4. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/SOURCES.txt +1 -2
  5. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/setup.py +1 -1
  6. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task.html +4 -0
  7. django-viewflow-2.2.3/viewflow/this_object.py +119 -0
  8. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/base.py +68 -18
  9. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/activation.py +130 -36
  10. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/base.py +111 -55
  11. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/__init__.py +0 -6
  12. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/nodes.py +92 -34
  13. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/viewset.py +4 -0
  14. django-viewflow-2.2.3/viewflow/workflow/migrations/0013_process_seed_content_type_process_seed_object_id_and_more.py +47 -0
  15. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/models.py +24 -0
  16. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/__init__.py +0 -4
  17. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/end.py +5 -2
  18. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/if_gate.py +32 -6
  19. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/job.py +2 -1
  20. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/join.py +7 -1
  21. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/mixins.py +21 -2
  22. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/split.py +2 -5
  23. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/start.py +10 -1
  24. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/view.py +2 -1
  25. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/token.py +11 -10
  26. django-viewflow-2.1.2/LICENSE.django +0 -37
  27. django-viewflow-2.1.2/viewflow/this_object.py +0 -67
  28. django-viewflow-2.1.2/viewflow/workflow/nodes/subprocess.py +0 -149
  29. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/LICENSE +0 -0
  30. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/LICENSE_EXCEPTION +0 -0
  31. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/MANIFEST.in +0 -0
  32. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/dependency_links.txt +0 -0
  33. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/not-zip-safe +0 -0
  34. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/requires.txt +0 -0
  35. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/django_viewflow.egg-info/top_level.txt +0 -0
  36. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/setup.cfg +0 -0
  37. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_middleware.py +0 -0
  38. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_templates.py +0 -0
  39. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_templatetags__viewflow.py +0 -0
  40. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_this_object.py +0 -0
  41. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_urls__base.py +0 -0
  42. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/tests/test_utils__package.py +0 -0
  43. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/__init__.py +0 -0
  44. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/apps.py +0 -0
  45. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/conf.py +0 -0
  46. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/__init__.py +0 -0
  47. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/admin/__init__.py +0 -0
  48. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/admin/apps.py +0 -0
  49. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/auth.py +0 -0
  50. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/__init__.py +0 -0
  51. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/material.py +0 -0
  52. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/views.py +0 -0
  53. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/contrib/plotly/viewset.py +0 -0
  54. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fields.py +0 -0
  55. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/forms/__init__.py +0 -0
  56. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/forms/renderers.py +0 -0
  57. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/__init__.py +0 -0
  58. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/admin.py +0 -0
  59. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/base.py +0 -0
  60. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/chart.py +0 -0
  61. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/typing.py +0 -0
  62. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/views.py +0 -0
  63. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/fsm/viewset.py +0 -0
  64. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/jsonstore.py +0 -0
  65. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/de/LC_MESSAGES/django.mo +0 -0
  66. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/de/LC_MESSAGES/django.po +0 -0
  67. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/es/LC_MESSAGES/django.mo +0 -0
  68. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/es/LC_MESSAGES/django.po +0 -0
  69. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/fr/LC_MESSAGES/django.mo +0 -0
  70. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/fr/LC_MESSAGES/django.po +0 -0
  71. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/it/LC_MESSAGES/django.mo +0 -0
  72. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/it/LC_MESSAGES/django.po +0 -0
  73. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ja/LC_MESSAGES/django.mo +0 -0
  74. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ja/LC_MESSAGES/django.po +0 -0
  75. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/kk/LC_MESSAGES/django.mo +0 -0
  76. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/kk/LC_MESSAGES/django.po +0 -0
  77. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ko/LC_MESSAGES/django.mo +0 -0
  78. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ko/LC_MESSAGES/django.po +0 -0
  79. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/pt/LC_MESSAGES/django.mo +0 -0
  80. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/pt/LC_MESSAGES/django.po +0 -0
  81. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ru/LC_MESSAGES/django.mo +0 -0
  82. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/ru/LC_MESSAGES/django.po +0 -0
  83. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/sr/LC_MESSAGES/django.mo +0 -0
  84. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/sr/LC_MESSAGES/django.po +0 -0
  85. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  86. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
  87. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/management/__init__.py +0 -0
  88. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/management/commands/__init__.py +0 -0
  89. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/management/commands/flowexport.py +0 -0
  90. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/middleware.py +0 -0
  91. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/perfect-scrollbar.css +0 -0
  92. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/trix.css +0 -0
  93. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/viewflow.min.css +0 -0
  94. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/css/vis-network.min.css +0 -0
  95. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff +0 -0
  96. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff2 +0 -0
  97. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff +0 -0
  98. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff2 +0 -0
  99. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff +0 -0
  100. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff2 +0 -0
  101. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff +0 -0
  102. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff2 +0 -0
  103. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons.css +0 -0
  104. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff +0 -0
  105. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff2 +0 -0
  106. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff +0 -0
  107. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff2 +0 -0
  108. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff +0 -0
  109. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
  110. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff +0 -0
  111. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff2 +0 -0
  112. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff +0 -0
  113. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
  114. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff +0 -0
  115. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff2 +0 -0
  116. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff +0 -0
  117. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
  118. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff +0 -0
  119. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff2 +0 -0
  120. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff +0 -0
  121. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
  122. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff +0 -0
  123. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff2 +0 -0
  124. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff +0 -0
  125. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
  126. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff +0 -0
  127. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff2 +0 -0
  128. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff +0 -0
  129. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
  130. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/roboto/roboto-fontface.css +0 -0
  131. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.eot +0 -0
  132. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.otf +0 -0
  133. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.ttf +0 -0
  134. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff +0 -0
  135. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff2 +0 -0
  136. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.css +0 -0
  137. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.min.css +0 -0
  138. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/img/favicon.png +0 -0
  139. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/img/user.png +0 -0
  140. {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
  141. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js +0 -0
  142. {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
  143. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.map +0 -0
  144. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js +0 -0
  145. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js.map +0 -0
  146. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js +0 -0
  147. {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
  148. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.map +0 -0
  149. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js +0 -0
  150. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js.map +0 -0
  151. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js +0 -0
  152. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js.map +0 -0
  153. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js +0 -0
  154. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.LICENSE.txt +0 -0
  155. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.map +0 -0
  156. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js +0 -0
  157. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.LICENSE.txt +0 -0
  158. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.map +0 -0
  159. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js +0 -0
  160. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js.map +0 -0
  161. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js +0 -0
  162. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.LICENSE.txt +0 -0
  163. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.map +0 -0
  164. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js +0 -0
  165. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js.LICENSE.txt +0 -0
  166. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js +0 -0
  167. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.LICENSE.txt +0 -0
  168. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.map +0 -0
  169. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js +0 -0
  170. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js.map +0 -0
  171. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js +0 -0
  172. {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
  173. {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
  174. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js +0 -0
  175. {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
  176. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.map +0 -0
  177. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/dcc/plotly.min.js +0 -0
  178. {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
  179. {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
  180. {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
  181. {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
  182. {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
  183. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js +0 -0
  184. {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
  185. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/perfect-scrollbar.min.js +0 -0
  186. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/perfect-scrollbar.min.js.map +0 -0
  187. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/smartcrop.js +0 -0
  188. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/trix.js +0 -0
  189. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/turbo.es2017-umd.js +0 -0
  190. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/viewflow.min.js +0 -0
  191. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/viewflow.min.js.map +0 -0
  192. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/vis-network.min.js +0 -0
  193. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/static/viewflow/js/vis-network.min.js.map +0 -0
  194. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/400.html +0 -0
  195. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/403.html +0 -0
  196. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/404.html +0 -0
  197. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/500.html +0 -0
  198. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_change_form.html +0 -0
  199. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_change_form_object_tools.html +0 -0
  200. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_change_list.html +0 -0
  201. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/admin/fsm_transition_form.html +0 -0
  202. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/formtools/wizard/wizard_form.html +0 -0
  203. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/logged_out.html +0 -0
  204. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/login.html +0 -0
  205. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_change_done.html +0 -0
  206. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_change_form.html +0 -0
  207. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_complete.html +0 -0
  208. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_confirm.html +0 -0
  209. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_done.html +0 -0
  210. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/password_reset_form.html +0 -0
  211. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/profile.html +0 -0
  212. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/registration/provider_list.html +0 -0
  213. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/base.html +0 -0
  214. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/base_lockscreen.html +0 -0
  215. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/base_page.html +0 -0
  216. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/import_export/export_action.html +0 -0
  217. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/import_export/import_action.html +0 -0
  218. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/plotly.html +0 -0
  219. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/contrib/swagger.html +0 -0
  220. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/app_menu.html +0 -0
  221. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/list_bulk_actions.html +0 -0
  222. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/list_filter.html +0 -0
  223. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/list_pagination.html +0 -0
  224. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/object_detail_card.html +0 -0
  225. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/site_menu.html +0 -0
  226. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/snackbar.html +0 -0
  227. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/view_action_menu.html +0 -0
  228. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/viewflow_css.html +0 -0
  229. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/includes/viewflow_js.html +0 -0
  230. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/material/circular_progress.html +0 -0
  231. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/confirm_delete.html +0 -0
  232. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/delete_action.html +0 -0
  233. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/detail.html +0 -0
  234. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/form.html +0 -0
  235. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/list.html +0 -0
  236. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/views/transition.html +0 -0
  237. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/assign.html +0 -0
  238. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/base_page.html +0 -0
  239. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/celery_task_detail.html +0 -0
  240. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/flow_menu.html +0 -0
  241. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/graph.bpmn +0 -0
  242. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/graph.svg +0 -0
  243. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_cancel.html +0 -0
  244. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_dashboard.html +0 -0
  245. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_data.html +0 -0
  246. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_detail.html +0 -0
  247. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_list.html +0 -0
  248. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/process_tasks_list.html +0 -0
  249. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/start.html +0 -0
  250. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_assign.html +0 -0
  251. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_base.html +0 -0
  252. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_cancel.html +0 -0
  253. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_data.html +0 -0
  254. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_detail.html +0 -0
  255. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_list.html +0 -0
  256. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_revive.html +0 -0
  257. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_unassign.html +0 -0
  258. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/task_undo.html +0 -0
  259. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/tasks_assign.html +0 -0
  260. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/tasks_unassign.html +0 -0
  261. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/workflow_menu.html +0 -0
  262. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templates/viewflow/workflow/workflow_tasks_list.html +0 -0
  263. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/__init__.py +0 -0
  264. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/fsm.py +0 -0
  265. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/viewflow.py +0 -0
  266. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/templatetags/workflow.py +0 -0
  267. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/__init__.py +0 -0
  268. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/model.py +0 -0
  269. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/urls/sites.py +0 -0
  270. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/utils.py +0 -0
  271. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/__init__.py +0 -0
  272. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/actions.py +0 -0
  273. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/base.py +0 -0
  274. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/create.py +0 -0
  275. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/delete.py +0 -0
  276. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/detail.py +0 -0
  277. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/filters.py +0 -0
  278. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/list.py +0 -0
  279. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/search.py +0 -0
  280. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/views/update.py +0 -0
  281. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/__init__.py +0 -0
  282. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/admin.py +0 -0
  283. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/apps.py +0 -0
  284. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/chart.py +0 -0
  285. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/context.py +0 -0
  286. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/exceptions.py +0 -0
  287. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/fields.py +0 -0
  288. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/mixins.py +0 -0
  289. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/utils.py +0 -0
  290. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/__init__.py +0 -0
  291. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/actions.py +0 -0
  292. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/chart.py +0 -0
  293. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/create.py +0 -0
  294. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/dashboard.py +0 -0
  295. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/detail.py +0 -0
  296. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/filters.py +0 -0
  297. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/list.py +0 -0
  298. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/mixins.py +0 -0
  299. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/flow/views/update.py +0 -0
  300. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/lock.py +0 -0
  301. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/managers.py +0 -0
  302. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0001_initial.py +0 -0
  303. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0002_fsmchange.py +0 -0
  304. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0003_task_owner_permission_change.py +0 -0
  305. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0004_extend_fields_length.py +0 -0
  306. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0004_subprocess.py +0 -0
  307. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0005_merge.py +0 -0
  308. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0005_rename_flowcls.py +0 -0
  309. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0006_i18n.py +0 -0
  310. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0006_merge.py +0 -0
  311. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0007_owner_permission_obj.py +0 -0
  312. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0007_task_assigned.py +0 -0
  313. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0008_jsonfield_and_artifact.py +0 -0
  314. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0008_merge.py +0 -0
  315. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0009_merge.py +0 -0
  316. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0010_viewflow20.py +0 -0
  317. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0011_alter_task_created_and_more.py +0 -0
  318. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py +0 -0
  319. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/migrations/__init__.py +0 -0
  320. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/func.py +0 -0
  321. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/handle.py +0 -0
  322. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/obsolete.py +0 -0
  323. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/nodes/switch.py +0 -0
  324. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/signals.py +0 -0
  325. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/status.py +0 -0
  326. {django-viewflow-2.1.2 → django-viewflow-2.2.3}/viewflow/workflow/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-viewflow
3
- Version: 2.1.2
3
+ Version: 2.2.3
4
4
  Summary: Reusable library to build business applications fast
5
5
  Author: Mikhail Podgurskiy
6
6
  Author-email: kmmbvnr@gmail.com
@@ -185,24 +185,41 @@ modifications of Viewflow. You can find the commercial license terms in
185
185
 
186
186
  ## Changelog
187
187
 
188
- ### 2.1.2 2024-06-24
188
+ ### 2.2.3 2024-07-09
189
189
 
190
- - Allow cancelling Celery tasks from the ERROR state.
191
- - Hotfix: Fix broken Join when no other nodes are created by Split.
192
- - Allow using this references to flow static methods as Celery tasks.
193
- - Allow cancelling Celery jobs from the ERROR status.
194
- - Add missing permission check before adding a new item to the list.
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
- - Hotfix broken task creation
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
- - Allow to assign additional custom data to viewflow.fsm transitions
205
- - Added `data_source` parameter to `Split.Next()` method, allowing dynamic creation of multiple node instances based on a list of data items.
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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-viewflow
3
- Version: 2.1.2
3
+ Version: 2.2.3
4
4
  Summary: Reusable library to build business applications fast
5
5
  Author: Mikhail Podgurskiy
6
6
  Author-email: kmmbvnr@gmail.com
@@ -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.1.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",
@@ -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(object):
69
+ class BaseViewset:
69
70
  """
70
- Class-based django routing configuration
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(self, viewname, args=None, kwargs=None, current_app=None):
105
- """Get view url."""
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
- """Canceled task could be recreated iff all parent task was not cancelled."""
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
- """Task could be undone iff no outgoing uncancelled tasks are exists."""
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(object):
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 persistance.
39
- Each activation status changes are restricted by a simple finite state
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
- def __init__(self, task):
46
- """Instantiate an activation."""
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(cls, flow_task, prev_activation, token, data=None):
104
- """Instantiate and persist new flow task."""
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: set):
203
+ def _activate_next(self, activations: Set["Activation"]) -> None:
204
+ """Activate the next set of tasks."""
136
205
  while activations:
137
- for current_activation in activations:
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
- activations = {
145
- next_activation
146
- for current_activation in activations
147
- if current_activation.create_next.can_proceed()
148
- for next_activation in current_activation.create_next()
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)