95 |
95 |
remove_style(child, child)
|
96 |
96 |
return etree.tostring(tree)
|
97 |
97 |
|
|
98 |
def get_label_of_item(item):
|
|
99 |
if getattr(item, 'label', None):
|
|
100 |
label = item.label
|
|
101 |
if getattr(item, 'by', None):
|
|
102 |
roles = render_list_of_roles(item.by)
|
|
103 |
label += ' %s %s' % (_('by'), roles)
|
|
104 |
else:
|
|
105 |
label = item.render_as_line()
|
|
106 |
label = textwrap.fill(label.replace('"', '\\"'), 20)
|
|
107 |
label = label.replace('\n', '\\n')
|
|
108 |
return label
|
|
109 |
|
|
110 |
def get_label_of_item_for_html(item):
|
|
111 |
if getattr(item, 'label', None):
|
|
112 |
label = item.label
|
|
113 |
if getattr(item, 'by', None):
|
|
114 |
roles = render_list_of_roles(item.by)
|
|
115 |
label += ' %s %s' % (_('by'), roles)
|
|
116 |
else:
|
|
117 |
label = item.render_as_line()
|
|
118 |
label = textwrap.fill(label.replace('"', '\\"'), 20)
|
|
119 |
label = label.replace('\n', '<BR/>')
|
|
120 |
return label
|
|
121 |
|
98 |
122 |
def graphviz(workflow, url_prefix='', select=None, svg=True,
|
99 |
123 |
include=False):
|
100 |
124 |
out = StringIO()
|
... | ... | |
105 |
129 |
for status in workflow.possible_status:
|
106 |
130 |
i = status.id
|
107 |
131 |
print >>out, 'status%s' % i,
|
108 |
|
print >>out, '[label="%s"' % status.name,
|
|
132 |
url = 'status/%s/' % i
|
|
133 |
local_actions = ['<TR BORDER="0"><TD BORDER="0" HREF="%s" ALIGN="LEFT">%s</TD></TR>' % (url, status.name)]
|
|
134 |
for item in status.items:
|
|
135 |
if getattr(item, 'status', None):
|
|
136 |
continue
|
|
137 |
label = get_label_of_item_for_html(item)
|
|
138 |
url = 'status/%s/items/%s/' % (i, item.id)
|
|
139 |
label = '<TR><TD HREF="%s" BORDER="1" ALIGN="RIGHT">%s</TD></TR>' % (url, label)
|
|
140 |
local_actions.append(label)
|
|
141 |
print >>out, '[label=<<TABLE BORDER="0">%s</TABLE>>' % (''.join(local_actions)),
|
109 |
142 |
if select == str(i):
|
110 |
143 |
print >>out, ',color=salmon'
|
111 |
|
print >>out, ' URL="%sstatus/%s/"];' % (url_prefix, i)
|
|
144 |
print >>out, '];'
|
112 |
145 |
|
113 |
146 |
for status in workflow.possible_status:
|
114 |
147 |
i = status.id
|
115 |
148 |
for item in status.items:
|
116 |
|
if getattr(item, 'status', None):
|
117 |
|
next_id = item.status
|
118 |
|
else:
|
119 |
|
next_id = status.id
|
|
149 |
if getattr(item, 'status', None) is None:
|
|
150 |
continue
|
|
151 |
next_id = item.status
|
120 |
152 |
print >>out, 'status%s -> status%s' % (i, next_id)
|
121 |
153 |
url = 'status/%s/items/%s/' % (i, item.id)
|
122 |
|
if getattr(item, 'label', None):
|
123 |
|
label = item.label
|
124 |
|
if getattr(item, 'by', None):
|
125 |
|
roles = render_list_of_roles(item.by)
|
126 |
|
label += ' %s %s' % (_('by'), roles)
|
127 |
|
else:
|
128 |
|
label = item.render_as_line()
|
129 |
|
label = textwrap.fill(label.replace('"', '\\"'), 20)
|
130 |
|
label = label.replace('\n', '\\n')
|
|
154 |
label = get_label_of_item(item)
|
131 |
155 |
print >>out, '[label="%s"' % label,
|
132 |
156 |
if select == '%s-%s' % (i, item.id):
|
133 |
157 |
print >>out, ',color=salmon'
|