django-viewflow - 在没有请求的情况下获取任务 URL

django-viewflow - getting task URL without request

知道task实例有没有办法得到它的url?例如在食谱中:https://github.com/viewflow/cookbook/blob/master/helloworld/demo/helloworld/flows.py - 如何获得 approve flow_taskassign 任务的 url?

我知道有 flow_task.get_task_url(task, url_type='guess', namespace='', **kwargs),但关键是据我所知 namespace 通常是从 self.request.resolver_match.namespace 中获取的。这并不理想 - 如果我们在应用程序的其他部分并且我们只是想直接提供任务链接怎么办?

与 django reverse 相同,您需要传递命名空间才能获得 URL。在内置视图流前端的情况下,命名空间为 viewflow:[app_label]:[flow_label] 例如:"viewflow:helloworld:helloworld"

要获得任务的 url,您只需要 app_name(app_namespace), flow_namespace and flow_label。 这里最具挑战性的项目是 flow_namespace(如果您还没有使用过前端 url)。 要解决这个问题,您可以使用从 FlowListMixin 的 ns_map 借用的地图。为项目中的每个流程定义 flow_namespace。 然后根据上面的内容确定流程命名空间和 url_name。

ns_map = {'MyFlow':'flow_namespace', 'AnotherFlow':'flow_namespace2'}

# flow_namespace as defined in the urls.py
# e.g if you defined your flow urls as
# flow_urls = FlowViewSet(MyFlow).urls
# flow_urls2 = FLowViewSet(MyFlow2).urls
# urlpatterns = [url(r'flow_path/', include(flow_urls, name=flow_namespace)),
# url(r'flow_path2/', include(flow_urls2, name=flow_namespace2)),
# ]
# With this is included in the root_url as
# urlpatterns = [
#     url(r'app/' include(app_urls, namespace='app_namespace')
#]

你需要的是像这样逆流 反向('app_name:flow_namespace:flow_label', kwargs={'process_pk':ppk, 'task_pk':tpk})

flow_class_name = task.process.flow_class.__name__
flow_namespace = ns_map.get(flow_class_name)
app_name = task.process.flow_class.__module__.split('.')[0]
flow_label = task.flow_task.name
url_name = "{}:{}:{}".format(app_name, flow_label, url_name)

然后你可以反转你的任务url

url = reverse(url_name, kwargs={"task_pk", task.pk, "process_pk":task.flow_process.pk}

# If you know where you are you could use resolver match to determine
# the app namespace. Be Sure of this, see more of that [here][1]

注意:我假设您将应用程序命名为 app_name 如果它不同,您必须找到替代方法来找到 app_names 命名空间,但这应该不会太困难。

如果模板中有任务对象,可以按如下方式提取url:

<a href="/workflow/formworkflow/{{ task.process.flow_class.flow_name }}/{{ task.process.flow_class.process_name }}/{{ task.process.pk }}/{{task.flow_task.name}}/{{task.id}}">Task Link</a>

如果经常使用,可以添加为模板过滤器。

在我了解命名空间的工作原理之前,这是一个肮脏的 hack。