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.
Files changed (328) hide show
  1. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/PKG-INFO +3 -1
  2. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/README.md +55 -18
  3. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/PKG-INFO +3 -1
  4. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/SOURCES.txt +2 -2
  5. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/setup.py +1 -1
  6. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/forms/renderers.py +2 -1
  7. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/graph.svg +7 -7
  8. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_cancel.html +3 -3
  9. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_data.html +22 -2
  10. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task.html +4 -0
  11. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_data.html +22 -0
  12. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_detail.html +10 -0
  13. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/workflow.py +2 -0
  14. django_viewflow-2.2.4/viewflow/this_object.py +119 -0
  15. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/base.py +68 -18
  16. django_viewflow-2.2.4/viewflow/workflow/activation.py +293 -0
  17. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/base.py +111 -55
  18. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/chart.py +22 -5
  19. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/__init__.py +0 -6
  20. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/nodes.py +92 -34
  21. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/actions.py +14 -3
  22. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/create.py +4 -0
  23. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/dashboard.py +4 -2
  24. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/update.py +4 -0
  25. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/viewset.py +4 -0
  26. django_viewflow-2.2.4/viewflow/workflow/migrations/0013_process_seed_content_type_process_seed_object_id_and_more.py +47 -0
  27. django_viewflow-2.2.4/viewflow/workflow/migrations/0014_alter_process_parent_task.py +25 -0
  28. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/models.py +25 -1
  29. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/__init__.py +0 -4
  30. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/end.py +5 -2
  31. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/if_gate.py +32 -6
  32. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/job.py +9 -4
  33. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/join.py +7 -1
  34. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/mixins.py +21 -2
  35. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/split.py +2 -5
  36. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/start.py +12 -1
  37. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/view.py +2 -1
  38. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/token.py +11 -10
  39. django-viewflow-2.1.2/LICENSE.django +0 -37
  40. django-viewflow-2.1.2/viewflow/this_object.py +0 -67
  41. django-viewflow-2.1.2/viewflow/workflow/activation.py +0 -194
  42. django-viewflow-2.1.2/viewflow/workflow/nodes/subprocess.py +0 -149
  43. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/LICENSE +0 -0
  44. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/LICENSE_EXCEPTION +0 -0
  45. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/MANIFEST.in +0 -0
  46. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/dependency_links.txt +0 -0
  47. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/not-zip-safe +0 -0
  48. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/requires.txt +0 -0
  49. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/django_viewflow.egg-info/top_level.txt +0 -0
  50. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/setup.cfg +0 -0
  51. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_middleware.py +0 -0
  52. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_templates.py +0 -0
  53. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_templatetags__viewflow.py +0 -0
  54. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_this_object.py +0 -0
  55. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_urls__base.py +0 -0
  56. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/tests/test_utils__package.py +0 -0
  57. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/__init__.py +0 -0
  58. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/apps.py +0 -0
  59. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/conf.py +0 -0
  60. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/__init__.py +0 -0
  61. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/admin/__init__.py +0 -0
  62. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/admin/apps.py +0 -0
  63. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/auth.py +0 -0
  64. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/__init__.py +0 -0
  65. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/material.py +0 -0
  66. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/views.py +0 -0
  67. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/contrib/plotly/viewset.py +0 -0
  68. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fields.py +0 -0
  69. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/forms/__init__.py +0 -0
  70. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/__init__.py +0 -0
  71. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/admin.py +0 -0
  72. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/base.py +0 -0
  73. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/chart.py +0 -0
  74. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/typing.py +0 -0
  75. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/views.py +0 -0
  76. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/fsm/viewset.py +0 -0
  77. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/jsonstore.py +0 -0
  78. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/de/LC_MESSAGES/django.mo +0 -0
  79. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/de/LC_MESSAGES/django.po +0 -0
  80. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/es/LC_MESSAGES/django.mo +0 -0
  81. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/es/LC_MESSAGES/django.po +0 -0
  82. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/fr/LC_MESSAGES/django.mo +0 -0
  83. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/fr/LC_MESSAGES/django.po +0 -0
  84. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/it/LC_MESSAGES/django.mo +0 -0
  85. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/it/LC_MESSAGES/django.po +0 -0
  86. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ja/LC_MESSAGES/django.mo +0 -0
  87. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ja/LC_MESSAGES/django.po +0 -0
  88. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/kk/LC_MESSAGES/django.mo +0 -0
  89. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/kk/LC_MESSAGES/django.po +0 -0
  90. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ko/LC_MESSAGES/django.mo +0 -0
  91. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ko/LC_MESSAGES/django.po +0 -0
  92. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/pt/LC_MESSAGES/django.mo +0 -0
  93. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/pt/LC_MESSAGES/django.po +0 -0
  94. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ru/LC_MESSAGES/django.mo +0 -0
  95. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/ru/LC_MESSAGES/django.po +0 -0
  96. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/sr/LC_MESSAGES/django.mo +0 -0
  97. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/sr/LC_MESSAGES/django.po +0 -0
  98. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  99. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
  100. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/management/__init__.py +0 -0
  101. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/management/commands/__init__.py +0 -0
  102. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/management/commands/flowexport.py +0 -0
  103. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/middleware.py +0 -0
  104. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/perfect-scrollbar.css +0 -0
  105. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/trix.css +0 -0
  106. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/viewflow.min.css +0 -0
  107. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/css/vis-network.min.css +0 -0
  108. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff +0 -0
  109. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff2 +0 -0
  110. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff +0 -0
  111. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff2 +0 -0
  112. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff +0 -0
  113. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff2 +0 -0
  114. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff +0 -0
  115. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff2 +0 -0
  116. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons.css +0 -0
  117. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff +0 -0
  118. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff2 +0 -0
  119. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff +0 -0
  120. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff2 +0 -0
  121. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff +0 -0
  122. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
  123. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff +0 -0
  124. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff2 +0 -0
  125. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff +0 -0
  126. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
  127. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff +0 -0
  128. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff2 +0 -0
  129. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff +0 -0
  130. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
  131. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff +0 -0
  132. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff2 +0 -0
  133. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff +0 -0
  134. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
  135. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff +0 -0
  136. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff2 +0 -0
  137. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff +0 -0
  138. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
  139. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff +0 -0
  140. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff2 +0 -0
  141. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff +0 -0
  142. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
  143. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/roboto/roboto-fontface.css +0 -0
  144. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.eot +0 -0
  145. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.otf +0 -0
  146. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.ttf +0 -0
  147. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff +0 -0
  148. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff2 +0 -0
  149. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.css +0 -0
  150. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.min.css +0 -0
  151. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/img/favicon.png +0 -0
  152. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/img/user.png +0 -0
  153. {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
  154. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js +0 -0
  155. {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
  156. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.map +0 -0
  157. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js +0 -0
  158. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js.map +0 -0
  159. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js +0 -0
  160. {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
  161. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.map +0 -0
  162. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js +0 -0
  163. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js.map +0 -0
  164. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js +0 -0
  165. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js.map +0 -0
  166. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js +0 -0
  167. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.LICENSE.txt +0 -0
  168. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.map +0 -0
  169. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js +0 -0
  170. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.LICENSE.txt +0 -0
  171. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.map +0 -0
  172. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js +0 -0
  173. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js.map +0 -0
  174. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js +0 -0
  175. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.LICENSE.txt +0 -0
  176. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.map +0 -0
  177. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js +0 -0
  178. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js.LICENSE.txt +0 -0
  179. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js +0 -0
  180. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.LICENSE.txt +0 -0
  181. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.map +0 -0
  182. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js +0 -0
  183. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js.map +0 -0
  184. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js +0 -0
  185. {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
  186. {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
  187. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js +0 -0
  188. {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
  189. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.map +0 -0
  190. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/dcc/plotly.min.js +0 -0
  191. {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
  192. {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
  193. {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
  194. {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
  195. {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
  196. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js +0 -0
  197. {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
  198. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/perfect-scrollbar.min.js +0 -0
  199. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/perfect-scrollbar.min.js.map +0 -0
  200. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/smartcrop.js +0 -0
  201. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/trix.js +0 -0
  202. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/turbo.es2017-umd.js +0 -0
  203. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/viewflow.min.js +0 -0
  204. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/viewflow.min.js.map +0 -0
  205. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/vis-network.min.js +0 -0
  206. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/static/viewflow/js/vis-network.min.js.map +0 -0
  207. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/400.html +0 -0
  208. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/403.html +0 -0
  209. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/404.html +0 -0
  210. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/500.html +0 -0
  211. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_change_form.html +0 -0
  212. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_change_form_object_tools.html +0 -0
  213. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_change_list.html +0 -0
  214. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/admin/fsm_transition_form.html +0 -0
  215. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/formtools/wizard/wizard_form.html +0 -0
  216. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/logged_out.html +0 -0
  217. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/login.html +0 -0
  218. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_change_done.html +0 -0
  219. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_change_form.html +0 -0
  220. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_complete.html +0 -0
  221. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_confirm.html +0 -0
  222. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_done.html +0 -0
  223. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/password_reset_form.html +0 -0
  224. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/profile.html +0 -0
  225. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/registration/provider_list.html +0 -0
  226. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/base.html +0 -0
  227. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/base_lockscreen.html +0 -0
  228. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/base_page.html +0 -0
  229. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/import_export/export_action.html +0 -0
  230. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/import_export/import_action.html +0 -0
  231. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/plotly.html +0 -0
  232. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/contrib/swagger.html +0 -0
  233. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/app_menu.html +0 -0
  234. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/list_bulk_actions.html +0 -0
  235. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/list_filter.html +0 -0
  236. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/list_pagination.html +0 -0
  237. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/object_detail_card.html +0 -0
  238. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/site_menu.html +0 -0
  239. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/snackbar.html +0 -0
  240. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/view_action_menu.html +0 -0
  241. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/viewflow_css.html +0 -0
  242. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/includes/viewflow_js.html +0 -0
  243. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/material/circular_progress.html +0 -0
  244. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/confirm_delete.html +0 -0
  245. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/delete_action.html +0 -0
  246. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/detail.html +0 -0
  247. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/form.html +0 -0
  248. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/list.html +0 -0
  249. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/views/transition.html +0 -0
  250. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/assign.html +0 -0
  251. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/base_page.html +0 -0
  252. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/celery_task_detail.html +0 -0
  253. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/flow_menu.html +0 -0
  254. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/graph.bpmn +0 -0
  255. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_dashboard.html +0 -0
  256. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_detail.html +0 -0
  257. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_list.html +0 -0
  258. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/process_tasks_list.html +0 -0
  259. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/start.html +0 -0
  260. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_assign.html +0 -0
  261. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_base.html +0 -0
  262. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_cancel.html +0 -0
  263. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_list.html +0 -0
  264. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_revive.html +0 -0
  265. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_unassign.html +0 -0
  266. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/task_undo.html +0 -0
  267. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/tasks_assign.html +0 -0
  268. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/tasks_unassign.html +0 -0
  269. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/workflow_menu.html +0 -0
  270. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templates/viewflow/workflow/workflow_tasks_list.html +0 -0
  271. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/__init__.py +0 -0
  272. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/fsm.py +0 -0
  273. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/templatetags/viewflow.py +0 -0
  274. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/__init__.py +0 -0
  275. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/model.py +0 -0
  276. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/urls/sites.py +0 -0
  277. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/utils.py +0 -0
  278. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/__init__.py +0 -0
  279. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/actions.py +0 -0
  280. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/base.py +0 -0
  281. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/create.py +0 -0
  282. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/delete.py +0 -0
  283. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/detail.py +0 -0
  284. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/filters.py +0 -0
  285. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/list.py +0 -0
  286. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/search.py +0 -0
  287. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/views/update.py +0 -0
  288. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/__init__.py +0 -0
  289. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/admin.py +0 -0
  290. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/apps.py +0 -0
  291. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/context.py +0 -0
  292. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/exceptions.py +0 -0
  293. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/fields.py +0 -0
  294. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/mixins.py +0 -0
  295. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/utils.py +0 -0
  296. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/__init__.py +0 -0
  297. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/chart.py +0 -0
  298. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/detail.py +0 -0
  299. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/filters.py +0 -0
  300. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/list.py +0 -0
  301. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/flow/views/mixins.py +0 -0
  302. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/lock.py +0 -0
  303. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/managers.py +0 -0
  304. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0001_initial.py +0 -0
  305. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0002_fsmchange.py +0 -0
  306. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0003_task_owner_permission_change.py +0 -0
  307. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0004_extend_fields_length.py +0 -0
  308. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0004_subprocess.py +0 -0
  309. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0005_merge.py +0 -0
  310. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0005_rename_flowcls.py +0 -0
  311. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0006_i18n.py +0 -0
  312. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0006_merge.py +0 -0
  313. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0007_owner_permission_obj.py +0 -0
  314. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0007_task_assigned.py +0 -0
  315. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0008_jsonfield_and_artifact.py +0 -0
  316. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0008_merge.py +0 -0
  317. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0009_merge.py +0 -0
  318. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0010_viewflow20.py +0 -0
  319. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0011_alter_task_created_and_more.py +0 -0
  320. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py +0 -0
  321. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/migrations/__init__.py +0 -0
  322. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/func.py +0 -0
  323. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/handle.py +0 -0
  324. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/obsolete.py +0 -0
  325. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/nodes/switch.py +0 -0
  326. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/signals.py +0 -0
  327. {django-viewflow-2.1.2 → django_viewflow-2.2.4}/viewflow/workflow/status.py +0 -0
  328. {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.1.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.1.2 2024-06-24
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.
196
-
197
- ### 2.1.1 2024-06-06
198
-
199
- - Hotfix broken task creation
200
-
201
-
202
- ### 2.1.0 2024-06-16
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.
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.1.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.1.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
- form.error_class(bound_field.errors)
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:
@@ -81,7 +81,7 @@
81
81
 
82
82
  circle.event,
83
83
  path.event {
84
- fill: none;
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: none;
93
+ fill: transparent;
94
94
  stroke: #000;
95
95
  }
96
96
 
97
97
  path.gateway {
98
- fill: none;
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: none;
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: none;
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.status %}<title>{{ cell.status }}</title>{% endif %}
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="none" stroke="#000000" stroke-width="2" id="{{ edge.src.name}}__{{ edge.dst.name }}" marker-end="url(#end-marker)"
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-9-desktop mdc-layout-grid__cell--span-8-tablet mdc-layout-grid__cell--span-4-phone">
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-3-desktop mdc-layout-grid__cell--span-8-tablet mdc-layout-grid__cell--span-4-phone{% endblock %}">
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>
@@ -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">
@@ -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(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