django-viewflow 2.1.0__tar.gz → 2.1.2__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.1.0 → django-viewflow-2.1.2}/PKG-INFO +1 -3
  2. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/README.md +16 -0
  3. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/django_viewflow.egg-info/PKG-INFO +1 -3
  4. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/setup.py +1 -1
  5. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/admin/__init__.py +6 -4
  6. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/auth.py +162 -12
  7. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/urls/model.py +9 -6
  8. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/nodes.py +54 -1
  9. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/job.py +2 -1
  10. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/join.py +5 -2
  11. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/split.py +1 -1
  12. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/start.py +5 -2
  13. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/view.py +5 -2
  14. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/LICENSE +0 -0
  15. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/LICENSE.django +0 -0
  16. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/LICENSE_EXCEPTION +0 -0
  17. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/MANIFEST.in +0 -0
  18. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/django_viewflow.egg-info/SOURCES.txt +0 -0
  19. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/django_viewflow.egg-info/dependency_links.txt +0 -0
  20. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/django_viewflow.egg-info/not-zip-safe +0 -0
  21. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/django_viewflow.egg-info/requires.txt +0 -0
  22. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/django_viewflow.egg-info/top_level.txt +0 -0
  23. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/setup.cfg +0 -0
  24. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/tests/test_middleware.py +0 -0
  25. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/tests/test_templates.py +0 -0
  26. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/tests/test_templatetags__viewflow.py +0 -0
  27. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/tests/test_this_object.py +0 -0
  28. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/tests/test_urls__base.py +0 -0
  29. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/tests/test_utils__package.py +0 -0
  30. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/__init__.py +0 -0
  31. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/apps.py +0 -0
  32. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/conf.py +0 -0
  33. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/__init__.py +0 -0
  34. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/admin/apps.py +0 -0
  35. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/plotly/__init__.py +0 -0
  36. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/plotly/material.py +0 -0
  37. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/plotly/views.py +0 -0
  38. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/contrib/plotly/viewset.py +0 -0
  39. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fields.py +0 -0
  40. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/forms/__init__.py +0 -0
  41. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/forms/renderers.py +0 -0
  42. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fsm/__init__.py +0 -0
  43. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fsm/admin.py +0 -0
  44. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fsm/base.py +0 -0
  45. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fsm/chart.py +0 -0
  46. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fsm/typing.py +0 -0
  47. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fsm/views.py +0 -0
  48. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/fsm/viewset.py +0 -0
  49. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/jsonstore.py +0 -0
  50. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/de/LC_MESSAGES/django.mo +0 -0
  51. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/de/LC_MESSAGES/django.po +0 -0
  52. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/es/LC_MESSAGES/django.mo +0 -0
  53. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/es/LC_MESSAGES/django.po +0 -0
  54. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/fr/LC_MESSAGES/django.mo +0 -0
  55. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/fr/LC_MESSAGES/django.po +0 -0
  56. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/it/LC_MESSAGES/django.mo +0 -0
  57. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/it/LC_MESSAGES/django.po +0 -0
  58. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/ja/LC_MESSAGES/django.mo +0 -0
  59. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/ja/LC_MESSAGES/django.po +0 -0
  60. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/kk/LC_MESSAGES/django.mo +0 -0
  61. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/kk/LC_MESSAGES/django.po +0 -0
  62. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/ko/LC_MESSAGES/django.mo +0 -0
  63. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/ko/LC_MESSAGES/django.po +0 -0
  64. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/pt/LC_MESSAGES/django.mo +0 -0
  65. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/pt/LC_MESSAGES/django.po +0 -0
  66. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/ru/LC_MESSAGES/django.mo +0 -0
  67. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/ru/LC_MESSAGES/django.po +0 -0
  68. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/sr/LC_MESSAGES/django.mo +0 -0
  69. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/sr/LC_MESSAGES/django.po +0 -0
  70. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/zh_Hans/LC_MESSAGES/django.mo +0 -0
  71. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/locale/zh_Hans/LC_MESSAGES/django.po +0 -0
  72. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/management/__init__.py +0 -0
  73. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/management/commands/__init__.py +0 -0
  74. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/management/commands/flowexport.py +0 -0
  75. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/middleware.py +0 -0
  76. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/css/perfect-scrollbar.css +0 -0
  77. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/css/trix.css +0 -0
  78. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/css/viewflow.min.css +0 -0
  79. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/css/vis-network.min.css +0 -0
  80. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff +0 -0
  81. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-outlined.woff2 +0 -0
  82. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff +0 -0
  83. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-round.woff2 +0 -0
  84. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff +0 -0
  85. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-sharp.woff2 +0 -0
  86. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff +0 -0
  87. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons-two-tone.woff2 +0 -0
  88. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons.css +0 -0
  89. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff +0 -0
  90. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/material-icons/material-icons.woff2 +0 -0
  91. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff +0 -0
  92. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Black.woff2 +0 -0
  93. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff +0 -0
  94. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BlackItalic.woff2 +0 -0
  95. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff +0 -0
  96. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Bold.woff2 +0 -0
  97. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff +0 -0
  98. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-BoldItalic.woff2 +0 -0
  99. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff +0 -0
  100. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Light.woff2 +0 -0
  101. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff +0 -0
  102. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-LightItalic.woff2 +0 -0
  103. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff +0 -0
  104. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Medium.woff2 +0 -0
  105. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff +0 -0
  106. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-MediumItalic.woff2 +0 -0
  107. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff +0 -0
  108. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Regular.woff2 +0 -0
  109. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff +0 -0
  110. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-RegularItalic.woff2 +0 -0
  111. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff +0 -0
  112. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-Thin.woff2 +0 -0
  113. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff +0 -0
  114. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/Roboto-ThinItalic.woff2 +0 -0
  115. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/roboto/roboto-fontface.css +0 -0
  116. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.eot +0 -0
  117. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.otf +0 -0
  118. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.ttf +0 -0
  119. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff +0 -0
  120. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/simple-icons/SimpleIcons.woff2 +0 -0
  121. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.css +0 -0
  122. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/fonts/simple-icons/simple-icons.min.css +0 -0
  123. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/img/favicon.png +0 -0
  124. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/img/user.png +0 -0
  125. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash-renderer/build/dash_renderer.min.js +0 -0
  126. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js +0 -0
  127. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.LICENSE.txt +0 -0
  128. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-export.js.map +0 -0
  129. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js +0 -0
  130. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-highlight.js.map +0 -0
  131. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js +0 -0
  132. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.LICENSE.txt +0 -0
  133. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/async-table.js.map +0 -0
  134. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js +0 -0
  135. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dash_table/bundle.js.map +0 -0
  136. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js +0 -0
  137. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-datepicker.js.map +0 -0
  138. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js +0 -0
  139. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.LICENSE.txt +0 -0
  140. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-dropdown.js.map +0 -0
  141. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js +0 -0
  142. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.LICENSE.txt +0 -0
  143. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-graph.js.map +0 -0
  144. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js +0 -0
  145. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-highlight.js.map +0 -0
  146. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js +0 -0
  147. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.LICENSE.txt +0 -0
  148. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-markdown.js.map +0 -0
  149. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js +0 -0
  150. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-plotlyjs.js.LICENSE.txt +0 -0
  151. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js +0 -0
  152. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.LICENSE.txt +0 -0
  153. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-slider.js.map +0 -0
  154. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js +0 -0
  155. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/async-upload.js.map +0 -0
  156. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js +0 -0
  157. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.LICENSE.txt +0 -0
  158. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components-shared.js.map +0 -0
  159. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js +0 -0
  160. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.LICENSE.txt +0 -0
  161. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/dash_core_components.js.map +0 -0
  162. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/dcc/plotly.min.js +0 -0
  163. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/deps/polyfill@7.12.1.min.js +0 -0
  164. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.7.2.min.js +0 -0
  165. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/deps/prop-types@15.8.1.min.js +0 -0
  166. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/deps/react-dom@16.14.0.min.js +0 -0
  167. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/deps/react@16.14.0.min.js +0 -0
  168. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js +0 -0
  169. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/contrib/dash/html/dash_html_components.min.js.map +0 -0
  170. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/perfect-scrollbar.min.js +0 -0
  171. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/perfect-scrollbar.min.js.map +0 -0
  172. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/smartcrop.js +0 -0
  173. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/trix.js +0 -0
  174. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/turbo.es2017-umd.js +0 -0
  175. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/viewflow.min.js +0 -0
  176. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/viewflow.min.js.map +0 -0
  177. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/vis-network.min.js +0 -0
  178. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/static/viewflow/js/vis-network.min.js.map +0 -0
  179. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/400.html +0 -0
  180. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/403.html +0 -0
  181. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/404.html +0 -0
  182. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/500.html +0 -0
  183. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/admin/fsm_change_form.html +0 -0
  184. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/admin/fsm_change_form_object_tools.html +0 -0
  185. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/admin/fsm_change_list.html +0 -0
  186. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/admin/fsm_transition_form.html +0 -0
  187. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/formtools/wizard/wizard_form.html +0 -0
  188. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/logged_out.html +0 -0
  189. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/login.html +0 -0
  190. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/password_change_done.html +0 -0
  191. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/password_change_form.html +0 -0
  192. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/password_reset_complete.html +0 -0
  193. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/password_reset_confirm.html +0 -0
  194. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/password_reset_done.html +0 -0
  195. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/password_reset_form.html +0 -0
  196. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/profile.html +0 -0
  197. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/registration/provider_list.html +0 -0
  198. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/base.html +0 -0
  199. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/base_lockscreen.html +0 -0
  200. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/base_page.html +0 -0
  201. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/contrib/import_export/export_action.html +0 -0
  202. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/contrib/import_export/import_action.html +0 -0
  203. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/contrib/plotly.html +0 -0
  204. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/contrib/swagger.html +0 -0
  205. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/app_menu.html +0 -0
  206. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/list_bulk_actions.html +0 -0
  207. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/list_filter.html +0 -0
  208. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/list_pagination.html +0 -0
  209. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/object_detail_card.html +0 -0
  210. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/site_menu.html +0 -0
  211. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/snackbar.html +0 -0
  212. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/view_action_menu.html +0 -0
  213. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/viewflow_css.html +0 -0
  214. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/includes/viewflow_js.html +0 -0
  215. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/material/circular_progress.html +0 -0
  216. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/views/confirm_delete.html +0 -0
  217. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/views/delete_action.html +0 -0
  218. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/views/detail.html +0 -0
  219. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/views/form.html +0 -0
  220. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/views/list.html +0 -0
  221. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/views/transition.html +0 -0
  222. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/assign.html +0 -0
  223. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/base_page.html +0 -0
  224. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/celery_task_detail.html +0 -0
  225. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/flow_menu.html +0 -0
  226. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/graph.bpmn +0 -0
  227. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/graph.svg +0 -0
  228. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/process_cancel.html +0 -0
  229. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/process_dashboard.html +0 -0
  230. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/process_data.html +0 -0
  231. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/process_detail.html +0 -0
  232. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/process_list.html +0 -0
  233. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/process_tasks_list.html +0 -0
  234. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/start.html +0 -0
  235. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task.html +0 -0
  236. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_assign.html +0 -0
  237. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_base.html +0 -0
  238. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_cancel.html +0 -0
  239. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_data.html +0 -0
  240. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_detail.html +0 -0
  241. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_list.html +0 -0
  242. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_revive.html +0 -0
  243. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_unassign.html +0 -0
  244. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/task_undo.html +0 -0
  245. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/tasks_assign.html +0 -0
  246. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/tasks_unassign.html +0 -0
  247. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/workflow_menu.html +0 -0
  248. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templates/viewflow/workflow/workflow_tasks_list.html +0 -0
  249. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templatetags/__init__.py +0 -0
  250. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templatetags/fsm.py +0 -0
  251. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templatetags/viewflow.py +0 -0
  252. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/templatetags/workflow.py +0 -0
  253. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/this_object.py +0 -0
  254. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/urls/__init__.py +0 -0
  255. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/urls/base.py +0 -0
  256. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/urls/sites.py +0 -0
  257. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/utils.py +0 -0
  258. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/__init__.py +0 -0
  259. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/actions.py +0 -0
  260. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/base.py +0 -0
  261. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/create.py +0 -0
  262. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/delete.py +0 -0
  263. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/detail.py +0 -0
  264. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/filters.py +0 -0
  265. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/list.py +0 -0
  266. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/search.py +0 -0
  267. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/views/update.py +0 -0
  268. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/__init__.py +0 -0
  269. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/activation.py +0 -0
  270. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/admin.py +0 -0
  271. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/apps.py +0 -0
  272. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/base.py +0 -0
  273. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/chart.py +0 -0
  274. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/context.py +0 -0
  275. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/exceptions.py +0 -0
  276. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/fields.py +0 -0
  277. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/__init__.py +0 -0
  278. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/mixins.py +0 -0
  279. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/utils.py +0 -0
  280. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/__init__.py +0 -0
  281. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/actions.py +0 -0
  282. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/chart.py +0 -0
  283. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/create.py +0 -0
  284. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/dashboard.py +0 -0
  285. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/detail.py +0 -0
  286. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/filters.py +0 -0
  287. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/list.py +0 -0
  288. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/mixins.py +0 -0
  289. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/views/update.py +0 -0
  290. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/flow/viewset.py +0 -0
  291. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/lock.py +0 -0
  292. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/managers.py +0 -0
  293. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0001_initial.py +0 -0
  294. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0002_fsmchange.py +0 -0
  295. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0003_task_owner_permission_change.py +0 -0
  296. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0004_extend_fields_length.py +0 -0
  297. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0004_subprocess.py +0 -0
  298. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0005_merge.py +0 -0
  299. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0005_rename_flowcls.py +0 -0
  300. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0006_i18n.py +0 -0
  301. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0006_merge.py +0 -0
  302. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0007_owner_permission_obj.py +0 -0
  303. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0007_task_assigned.py +0 -0
  304. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0008_jsonfield_and_artifact.py +0 -0
  305. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0008_merge.py +0 -0
  306. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0009_merge.py +0 -0
  307. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0010_viewflow20.py +0 -0
  308. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0011_alter_task_created_and_more.py +0 -0
  309. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/0012_alter_process_data_alter_task_data.py +0 -0
  310. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/migrations/__init__.py +0 -0
  311. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/models.py +0 -0
  312. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/__init__.py +0 -0
  313. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/end.py +0 -0
  314. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/func.py +0 -0
  315. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/handle.py +0 -0
  316. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/if_gate.py +0 -0
  317. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/mixins.py +0 -0
  318. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/obsolete.py +0 -0
  319. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/subprocess.py +0 -0
  320. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/nodes/switch.py +0 -0
  321. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/signals.py +0 -0
  322. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/status.py +0 -0
  323. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/viewflow/workflow/token.py +0 -0
  324. {django-viewflow-2.1.0 → django-viewflow-2.1.2}/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.0
3
+ Version: 2.1.2
4
4
  Summary: Reusable library to build business applications fast
5
5
  Author: Mikhail Podgurskiy
6
6
  Author-email: kmmbvnr@gmail.com
@@ -25,5 +25,3 @@ 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
@@ -143,6 +143,8 @@ Make and run migrations to create the necessary database tables, then start your
143
143
  server and access the workflow through the pre-built frontend. You should be
144
144
  able to create and track pizza orders with the workflow.
145
145
 
146
+ Go to the https://docs.viewflow.io/workflow/writing.html for the next steps
147
+
146
148
  ## Documentation
147
149
 
148
150
  Viewflow's documentation for the latest version is available at
@@ -183,6 +185,20 @@ modifications of Viewflow. You can find the commercial license terms in
183
185
 
184
186
  ## Changelog
185
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
+
186
202
  ### 2.1.0 2024-06-16
187
203
 
188
204
  - Allow to assign additional custom data to viewflow.fsm transitions
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: django-viewflow
3
- Version: 2.1.0
3
+ Version: 2.1.2
4
4
  Summary: Reusable library to build business applications fast
5
5
  Author: Mikhail Podgurskiy
6
6
  Author-email: kmmbvnr@gmail.com
@@ -25,5 +25,3 @@ 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
@@ -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.0",
7
+ version="2.1.2",
8
8
  author_email="kmmbvnr@gmail.com",
9
9
  author="Mikhail Podgurskiy",
10
10
  description="Reusable library to build business applications fast",
@@ -9,20 +9,22 @@ from django.contrib import admin
9
9
  from django.utils.translation import gettext_lazy as _
10
10
 
11
11
  from viewflow import Icon
12
- from viewflow.urls import Application
12
+ from viewflow.urls import Application, AppMenuMixin
13
13
 
14
14
 
15
- class Admin(Application):
15
+ class Admin(AppMenuMixin, Application):
16
16
  """
17
17
  Django administration Viewset adapter::
18
18
 
19
- from material.contrib.admin import Admin
19
+ from django.contrib import admin
20
+ from viewflow.contrib.admin import Admin
20
21
 
21
- site = Site(apps=[
22
+ site = Site(viewsets=[
22
23
  Admin()
23
24
  ])
24
25
 
25
26
  urls = [
27
+ path("admin/", admin.site.urls),
26
28
  path('', site.urls)
27
29
  ]
28
30
 
@@ -132,23 +132,29 @@ def get_user_avatar_url(user):
132
132
 
133
133
  class AuthViewset(Viewset):
134
134
  """
135
- Class-based url configuration for the `django.contrib.auth`.
136
-
137
- urlpatterns = [
138
- path('accounts/', AuthViewset(
139
- allow_password_change=False,
140
- login_view=views.LoginView.as_view(
141
- authentication_form=MyAuthForm
142
- ),
143
- ).urls),
144
- ]
135
+ Class-based URL configuration for `django.contrib.auth`.
136
+
137
+ This viewset provides URL patterns for user authentication, including login,
138
+ logout, and password management views.
139
+
140
+ .. code-block:: python
141
+
142
+ urlpatterns = [
143
+ path('accounts/', AuthViewset(
144
+ allow_password_change=False,
145
+ login_view=views.LoginView.as_view(
146
+ authentication_form=MyAuthForm
147
+ ),
148
+ ).urls),
149
+ ]
145
150
  """
146
151
 
147
152
  def __init__(self, *, allow_password_change=True, with_profile_view=True, **kwargs):
148
153
  """
149
- Initialize the viewset.
154
+ Initialize the viewset with options for password change and profile view.
150
155
 
151
- :param allow_password_change=True: enable password change/reset views
156
+ :param allow_password_change: Enable or disable password change/reset views. Defaults to True.
157
+ :param with_profile_view: Enable or disable profile view. Defaults to True.
152
158
  """
153
159
  super().__init__(**kwargs)
154
160
  self.allow_password_change = allow_password_change
@@ -160,16 +166,32 @@ class AuthViewset(Viewset):
160
166
  login_view_class = views.LoginView
161
167
 
162
168
  def get_login_view_kwargs(self, **kwargs):
169
+ """
170
+ Get keyword arguments for the login view.
171
+
172
+ :param kwargs: Additional keyword arguments for the login view.
173
+ :return: Dictionary of keyword arguments.
174
+ """
163
175
  result = {"form_class": AuthenticationForm}
164
176
  result.update(kwargs)
165
177
  return result
166
178
 
167
179
  @viewprop
168
180
  def login_view(self):
181
+ """
182
+ Property to get the configured login view.
183
+
184
+ :return: Configured login view instance.
185
+ """
169
186
  return self.login_view_class.as_view(**self.get_login_view_kwargs())
170
187
 
171
188
  @property
172
189
  def login_path(self):
190
+ """
191
+ Property to get the URL pattern for the login view.
192
+
193
+ :return: URL pattern for the login view.
194
+ """
173
195
  return path("login/", self.login_view, name="login")
174
196
 
175
197
  """
@@ -178,14 +200,30 @@ class AuthViewset(Viewset):
178
200
  logout_view_class = views.LogoutView
179
201
 
180
202
  def get_logout_view_kwargs(self, **kwargs):
203
+ """
204
+ Get keyword arguments for the logout view.
205
+
206
+ :param kwargs: Additional keyword arguments for the logout view.
207
+ :return: Dictionary of keyword arguments.
208
+ """
181
209
  return kwargs
182
210
 
183
211
  @viewprop
184
212
  def logout_view(self):
213
+ """
214
+ Property to get the configured logout view.
215
+
216
+ :return: Configured logout view class.
217
+ """
185
218
  return self.logout_view_class.as_view(**self.get_logout_view_kwargs())
186
219
 
187
220
  @property
188
221
  def logout_path(self):
222
+ """
223
+ Property to get the URL pattern for the logout view.
224
+
225
+ :return: URL pattern for the logout view.
226
+ """
189
227
  return path("logout/", self.logout_view, name="logout")
190
228
 
191
229
  """
@@ -194,14 +232,30 @@ class AuthViewset(Viewset):
194
232
  pass_change_view_class = views.PasswordChangeView
195
233
 
196
234
  def get_pass_change_view_kwargs(self, **kwargs):
235
+ """
236
+ Get keyword arguments for the password change view.
237
+
238
+ :param kwargs: Additional keyword arguments for the password change view.
239
+ :return: Dictionary of keyword arguments.
240
+ """
197
241
  return kwargs
198
242
 
199
243
  @viewprop
200
244
  def pass_change_view(self):
245
+ """
246
+ Property to get the configured password change view.
247
+
248
+ :return: Configured password change view class.
249
+ """
201
250
  return self.pass_change_view_class.as_view(**self.get_pass_change_view_kwargs())
202
251
 
203
252
  @property
204
253
  def pass_change_path(self):
254
+ """
255
+ Property to get the URL pattern for the password change view.
256
+
257
+ :return: URL pattern for the password change view.
258
+ """
205
259
  if self.allow_password_change:
206
260
  return path(
207
261
  "password_change/", self.pass_change_view, name="password_change"
@@ -213,16 +267,32 @@ class AuthViewset(Viewset):
213
267
  pass_change_done_view_class = views.PasswordChangeDoneView
214
268
 
215
269
  def get_pass_change_done_view_kwargs(self, **kwargs):
270
+ """
271
+ Get keyword arguments for the password change done view.
272
+
273
+ :param kwargs: Additional keyword arguments for the password change done view.
274
+ :return: Dictionary of keyword arguments.
275
+ """
216
276
  return kwargs
217
277
 
218
278
  @viewprop
219
279
  def pass_change_done_view(self):
280
+ """
281
+ Property to get the configured password change done view.
282
+
283
+ :return: Configured password change done view class.
284
+ """
220
285
  return self.pass_change_done_view_class.as_view(
221
286
  **self.get_pass_change_done_view_kwargs()
222
287
  )
223
288
 
224
289
  @property
225
290
  def pass_change_done_path(self):
291
+ """
292
+ Property to get the URL pattern for the password change done view.
293
+
294
+ :return: URL pattern for the password change done view.
295
+ """
226
296
  if self.allow_password_change:
227
297
  return path(
228
298
  "password_change/done/",
@@ -236,14 +306,30 @@ class AuthViewset(Viewset):
236
306
  pass_reset_view_class = views.PasswordResetView
237
307
 
238
308
  def get_pass_reset_view_kwargs(self, **kwargs):
309
+ """
310
+ Get keyword arguments for the password reset request view.
311
+
312
+ :param kwargs: Additional keyword arguments for the password reset request view.
313
+ :return: Dictionary of keyword arguments.
314
+ """
239
315
  return kwargs
240
316
 
241
317
  @viewprop
242
318
  def pass_reset_view(self):
319
+ """
320
+ Property to get the configured password reset request view.
321
+
322
+ :return: Configured password reset request view class.
323
+ """
243
324
  return self.pass_reset_view_class.as_view(**self.get_pass_reset_view_kwargs())
244
325
 
245
326
  @property
246
327
  def pass_reset_path(self):
328
+ """
329
+ Property to get the URL pattern for the password reset request view.
330
+
331
+ :return: URL pattern for the password reset request view.
332
+ """
247
333
  if self.allow_password_change:
248
334
  return path("password_reset/", self.pass_reset_view, name="password_reset")
249
335
 
@@ -253,16 +339,32 @@ class AuthViewset(Viewset):
253
339
  pass_reset_done_view_class = views.PasswordResetDoneView
254
340
 
255
341
  def get_pass_reset_done_view_kwargs(self, **kwargs):
342
+ """
343
+ Get keyword arguments for the password reset request done view.
344
+
345
+ :param kwargs: Additional keyword arguments for the password reset request done view.
346
+ :return: Dictionary of keyword arguments.
347
+ """
256
348
  return kwargs
257
349
 
258
350
  @viewprop
259
351
  def pass_reset_done_view(self):
352
+ """
353
+ Property to get the configured password reset request done view.
354
+
355
+ :return: Configured password reset request done view class.
356
+ """
260
357
  return self.pass_reset_done_view_class.as_view(
261
358
  **self.get_pass_reset_done_view_kwargs()
262
359
  )
263
360
 
264
361
  @property
265
362
  def pass_reset_done_path(self):
363
+ """
364
+ Property to get the URL pattern for the password reset request done view.
365
+
366
+ :return: URL pattern for the password reset request done view.
367
+ """
266
368
  if self.allow_password_change:
267
369
  return path(
268
370
  "password_reset/done/",
@@ -276,16 +378,32 @@ class AuthViewset(Viewset):
276
378
  pass_reset_confirm_view_class = views.PasswordResetConfirmView
277
379
 
278
380
  def get_pass_reset_confirm_view_kwargs(self, **kwargs):
381
+ """
382
+ Get keyword arguments for the password reset confirm view.
383
+
384
+ :param kwargs: Additional keyword arguments for the password reset confirm view.
385
+ :return: Dictionary of keyword arguments.
386
+ """
279
387
  return kwargs
280
388
 
281
389
  @viewprop
282
390
  def pass_reset_confirm_view(self):
391
+ """
392
+ Property to get the configured password reset confirm view.
393
+
394
+ :return: Configured password reset confirm view class.
395
+ """
283
396
  return self.pass_reset_confirm_view_class.as_view(
284
397
  **self.get_pass_reset_confirm_view_kwargs()
285
398
  )
286
399
 
287
400
  @property
288
401
  def pass_reset_confirm_path(self):
402
+ """
403
+ Property to get the URL pattern for the password reset confirm view.
404
+
405
+ :return: URL pattern for the password reset confirm view.
406
+ """
289
407
  if self.allow_password_change:
290
408
  return path(
291
409
  "reset/<uidb64>/<token>/",
@@ -299,16 +417,32 @@ class AuthViewset(Viewset):
299
417
  pass_reset_complete_view_class = views.PasswordResetCompleteView
300
418
 
301
419
  def get_pass_reset_complete_view_kwargs(self, **kwargs):
420
+ """
421
+ Get keyword arguments for the password reset complete view.
422
+
423
+ :param kwargs: Additional keyword arguments for the password reset complete view.
424
+ :return: Dictionary of keyword arguments.
425
+ """
302
426
  return kwargs
303
427
 
304
428
  @viewprop
305
429
  def pass_reset_complete_view(self):
430
+ """
431
+ Property to get the configured password reset complete view.
432
+
433
+ :return: Configured password reset complete view class.
434
+ """
306
435
  return self.pass_reset_complete_view_class.as_view(
307
436
  **self.get_pass_reset_complete_view_kwargs()
308
437
  )
309
438
 
310
439
  @property
311
440
  def pass_reset_complete_path(self):
441
+ """
442
+ Property to get the URL pattern for the password reset complete view.
443
+
444
+ :return: URL pattern for the password reset complete view.
445
+ """
312
446
  if self.allow_password_change:
313
447
  return path(
314
448
  "reset/done/",
@@ -322,14 +456,30 @@ class AuthViewset(Viewset):
322
456
  profile_view_class = ProfileView
323
457
 
324
458
  def get_profile_view_kwargs(self, **kwargs):
459
+ """
460
+ Get keyword arguments for the profile view.
461
+
462
+ :param kwargs: Additional keyword arguments for the profile view.
463
+ :return: Dictionary of keyword arguments.
464
+ """
325
465
  return kwargs
326
466
 
327
467
  @viewprop
328
468
  def profile_view(self):
469
+ """
470
+ Property to get the configured profile view.
471
+
472
+ :return: Configured profile view class.
473
+ """
329
474
  return self.profile_view_class.as_view(**self.get_profile_view_kwargs())
330
475
 
331
476
  @property
332
477
  def profile_path(self):
478
+ """
479
+ Property to get the URL pattern for the profile view.
480
+
481
+ :return: URL pattern for the profile view.
482
+ """
333
483
  if self.with_profile_view:
334
484
  return path("profile/", self.profile_view, name="profile")
335
485
 
@@ -6,6 +6,7 @@
6
6
  # which is part of this source code package.
7
7
 
8
8
  from django.urls import path
9
+ from django.utils.translation import gettext_lazy as _
9
10
 
10
11
  from viewflow.urls import AppMenuMixin, Viewset, ViewsetMeta
11
12
  from viewflow.utils import DEFAULT, Icon, first_not_default, has_object_perm, viewprop
@@ -138,12 +139,14 @@ class CreateViewMixin(metaclass=ViewsetMeta):
138
139
  return self.filter_kwargs(self.create_view_class, **view_kwargs)
139
140
 
140
141
  def get_list_page_actions(self, request, *actions):
141
- add_action = Action(
142
- name="Add new",
143
- url=self.reverse("add"),
144
- icon=Icon("add_circle", class_="material-icons mdc-list-item__graphic"),
145
- )
146
- return super().get_list_page_actions(request, *(add_action, *actions))
142
+ if self.has_add_permission(request.user):
143
+ add_action = Action(
144
+ name=_("Add new"),
145
+ url=self.reverse("add"),
146
+ icon=Icon("add_circle", class_="material-icons mdc-list-item__graphic"),
147
+ )
148
+ actions = (add_action, *actions)
149
+ return super().get_list_page_actions(request, *actions)
147
150
 
148
151
  @viewprop
149
152
  def create_view_kwargs(self):
@@ -316,8 +316,37 @@ class Split(
316
316
  nodes.Split,
317
317
  ):
318
318
  """
319
- Parallel split gateway.
319
+ Represents a parallel split gateway in a workflow, allowing branching into multiple parallel paths.
320
320
 
321
+ Methods:
322
+ - `Next(node, case=None, data_source=None)`: Defines the subsequent node in the workflow.
323
+
324
+ * `node`: The next node to execute.
325
+ * `case` (optional): A callable that takes an activation and returns `True` if the node should be activated.
326
+ * `data_source` (optional): A callable that takes an activation and returns a list of data items, creating an instance of the node for each item, with `task.data` set to the item.
327
+
328
+ - `Always(node)`: A shortcut to define a subsequent node that is always executed.
329
+
330
+ Example:
331
+
332
+ .. code-block:: python
333
+
334
+ flow.Split()
335
+ .Next(
336
+ this.approve,
337
+ case=act.process.approved,
338
+ data_source=lambda activation: [{"sample": "test task 1"}, {"sample": "test task 2"}],
339
+ )
340
+ .Always(this.required)
341
+
342
+
343
+ In this example:
344
+ - The `approve` node is executed multiple times based on the `data_source` list.
345
+ - The `required` node is always executed unconditionally in parallel.
346
+
347
+ Notes:
348
+ - If `case` is not provided, the node is always activated.
349
+ - If `data_source` is not provided, the node is created only once.
321
350
  """
322
351
 
323
352
  index_view_class = views.IndexTaskView
@@ -330,6 +359,30 @@ class SplitFirst(
330
359
  mixins.NodeDetailMixin,
331
360
  nodes.SplitFirst,
332
361
  ):
362
+ """
363
+ Parallel split, as soon as the first task is completed, the remaining tasks
364
+ are cancelled.
365
+
366
+ The `SplitFirst` class is useful in workflows where you want to initiate
367
+ multiple parallel tasks but only require the first task to complete,
368
+ cancelling the rest once the first task finishes.
369
+
370
+ Example:
371
+
372
+ .. code-block:: python
373
+
374
+ class MyFlow(flow.Flow):
375
+ split_first = SplitFirst().Next(this.task_a).Next(this.task_b)
376
+
377
+ task_a = flow.View(views.UserView).Next(this.join)
378
+
379
+ task_b = celery.Timer(delay=timedelata(minutes=10)).Next(this.join)
380
+
381
+ join = flow.Join()
382
+
383
+
384
+ """
385
+
333
386
  index_view_class = views.IndexTaskView
334
387
  detail_view_class = views.DetailTaskView
335
388
 
@@ -14,7 +14,7 @@ from . import mixins
14
14
 
15
15
  class AbstractJobActivation(mixins.NextNodeActivationMixin, Activation):
16
16
  @classmethod
17
- def create(cls, flow_task, prev_activation, token):
17
+ def create(cls, flow_task, prev_activation, token, data=None):
18
18
  """Instantiate and persist new flow task."""
19
19
  flow_class = flow_task.flow_class
20
20
  task = flow_class.task_class(
@@ -22,6 +22,7 @@ class AbstractJobActivation(mixins.NextNodeActivationMixin, Activation):
22
22
  flow_task=flow_task,
23
23
  token=token,
24
24
  external_task_id=str(uuid.uuid4()),
25
+ data=data if data is not None else {},
25
26
  )
26
27
  task.save()
27
28
  task.previous.add(prev_activation.task)
@@ -15,7 +15,7 @@ class JoinActivation(mixins.NextNodeActivationMixin, Activation):
15
15
  super().__init__(*args, **kwargs)
16
16
 
17
17
  @classmethod
18
- def create(cls, flow_task, prev_activation, token):
18
+ def create(cls, flow_task, prev_activation, token, data=None):
19
19
  """
20
20
  Join and, if all incoming paths are completed, continue execution.
21
21
 
@@ -43,7 +43,10 @@ class JoinActivation(mixins.NextNodeActivationMixin, Activation):
43
43
  token = token.get_base_split_token()
44
44
 
45
45
  task = flow_class.task_class.objects.create(
46
- process=prev_activation.process, flow_task=flow_task, token=token
46
+ process=prev_activation.process,
47
+ flow_task=flow_task,
48
+ token=token,
49
+ data=data if data is not None else {},
47
50
  )
48
51
 
49
52
  task.previous.add(prev_activation.task)
@@ -47,7 +47,7 @@ class SplitActivation(Activation):
47
47
 
48
48
  next_tasks = [
49
49
  (task, data) for task, data in self.next_tasks if not isinstance(task, Join)
50
- ] + [(task, None) for task in self.next_tasks if isinstance(task, Join)]
50
+ ] + [(task, data) for task, data in self.next_tasks if isinstance(task, Join)]
51
51
 
52
52
  for n, (next_task, data) in enumerate(next_tasks, 1):
53
53
  yield next_task._create(
@@ -13,12 +13,15 @@ class StartActivation(mixins.NextNodeActivationMixin, Activation):
13
13
  """Task activation that creates new process instance."""
14
14
 
15
15
  @classmethod
16
- def create(cls, flow_task, prev_activation, token):
16
+ def create(cls, flow_task, prev_activation, token, data=None):
17
17
  flow_class = flow_task.flow_class
18
18
 
19
19
  process = flow_class.process_class(flow_class=flow_class)
20
20
  task = flow_class.task_class(
21
- flow_task=flow_task, process=process, started=now()
21
+ flow_task=flow_task,
22
+ process=process,
23
+ started=now(),
24
+ data=data if data is not None else {},
22
25
  )
23
26
 
24
27
  return cls(task)
@@ -13,11 +13,14 @@ class ViewActivation(mixins.NextNodeActivationMixin, Activation):
13
13
  """View node activation."""
14
14
 
15
15
  @classmethod
16
- def create(cls, flow_task, prev_activation, token):
16
+ def create(cls, flow_task, prev_activation, token, data=None):
17
17
  """Instantiate and persist new flow task."""
18
18
  flow_class = flow_task.flow_class
19
19
  task = flow_class.task_class(
20
- process=prev_activation.process, flow_task=flow_task, token=token
20
+ process=prev_activation.process,
21
+ flow_task=flow_task,
22
+ token=token,
23
+ data=data if data is not None else {},
21
24
  )
22
25
 
23
26
  activation = cls(task)
File without changes