django-viewflow - получение URL задачи без запроса - PullRequest
0 голосов
/ 31 мая 2018

Зная task экземпляр, есть ли способ получить url этого?Например в кулинарной книге: https://github.com/viewflow/cookbook/blob/master/helloworld/demo/helloworld/flows.py - как мне получить URL-адрес assign задачи approve flow_task?

Я знаю, что есть flow_task.get_task_url(task, url_type='guess', namespace='', **kwargs), но дело в том, что из того, что я вижу, namespace обычно берется из self.request.resolver_match.namespace.Это не идеально - что если мы находимся в другой части приложения и просто хотим предоставить ссылки на задачи напрямую?

Ответы [ 2 ]

0 голосов
/ 24 января 2019

Чтобы получить URL-адрес задачи, вам нужно всего лишь app_name(app_namespace), flow_namespace and flow_label.Наиболее сложным элементом здесь является пространство имен_потока (если вы не использовали URL-адреса веб-интерфейса).Чтобы решить эту проблему, вы можете использовать карту, заимствованную из ns_map от FlowListMixin.Определение пространства имен потока для каждого потока в вашем проекте.Затем вы определяете пространство имен потоков и 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)

Then you can reverse your task 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, но это не должно бытьслишком сложно.

0 голосов
/ 07 июня 2018

Как и в случае с реверсом django, вам нужно передать пространство имен, чтобы получить URL.В случае встроенного внешнего интерфейса viewflow пространство имен равно viewflow:[app_label]:[flow_label] ex: "viewflow: helloworld: helloworld"

...