django-viewflow 2.2.5__tar.gz → 2.2.6__tar.gz

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