[IMP] account_analytic_analysis : Add recurring field to product and add product...
[odoo/odoo.git] / addons / web_diagram / controllers / main.py
1 import openerp
2
3 class DiagramView(openerp.http.Controller):
4
5     @openerp.http.route('/web_diagram/diagram/get_diagram_info', type='json', auth='user')
6     def get_diagram_info(self, req, id, model, node, connector,
7                          src_node, des_node, label, **kw):
8
9         visible_node_fields = kw.get('visible_node_fields',[])
10         invisible_node_fields = kw.get('invisible_node_fields',[])
11         node_fields_string = kw.get('node_fields_string',[])
12         connector_fields = kw.get('connector_fields',[])
13         connector_fields_string = kw.get('connector_fields_string',[])
14
15         bgcolors = {}
16         shapes = {}
17         bgcolor = kw.get('bgcolor','')
18         shape = kw.get('shape','')
19
20         if bgcolor:
21             for color_spec in bgcolor.split(';'):
22                 if color_spec:
23                     colour, color_state = color_spec.split(':')
24                     bgcolors[colour] = color_state
25
26         if shape:
27             for shape_spec in shape.split(';'):
28                 if shape_spec:
29                     shape_colour, shape_color_state = shape_spec.split(':')
30                     shapes[shape_colour] = shape_color_state
31
32         ir_view = req.session.model('ir.ui.view')
33         graphs = ir_view.graph_get(
34             int(id), model, node, connector, src_node, des_node, label,
35             (140, 180), req.session.context)
36         nodes = graphs['nodes']
37         transitions = graphs['transitions']
38         isolate_nodes = {}
39         for blnk_node in graphs['blank_nodes']:
40             isolate_nodes[blnk_node['id']] = blnk_node
41         else:
42             y = map(lambda t: t['y'],filter(lambda x: x['y'] if x['x']==20 else None, nodes.values()))
43             y_max = (y and max(y)) or 120
44
45         connectors = {}
46         list_tr = []
47
48         for tr in transitions:
49             list_tr.append(tr)
50             connectors.setdefault(tr, {
51                 'id': tr,
52                 's_id': transitions[tr][0],
53                 'd_id': transitions[tr][1]
54             })
55         connector_tr = req.session.model(connector)
56         connector_ids = connector_tr.search([('id', 'in', list_tr)], 0, 0, 0, req.session.context)
57
58         data_connectors =connector_tr.read(connector_ids, connector_fields, req.session.context)
59
60         for tr in data_connectors:
61             transition_id = str(tr['id'])
62             _sourceid, label = graphs['label'][transition_id]
63             t = connectors[transition_id]
64             t.update(
65                 source=tr[src_node][1],
66                 destination=tr[des_node][1],
67                 options={},
68                 signal=label
69             )
70
71             for i, fld in enumerate(connector_fields):
72                 t['options'][connector_fields_string[i]] = tr[fld]
73
74         fields = req.session.model('ir.model.fields')
75         field_ids = fields.search([('model', '=', model), ('relation', '=', node)], 0, 0, 0, req.session.context)
76         field_data = fields.read(field_ids, ['relation_field'], req.session.context)
77         node_act = req.session.model(node)
78         search_acts = node_act.search([(field_data[0]['relation_field'], '=', id)], 0, 0, 0, req.session.context)
79         data_acts = node_act.read(search_acts, invisible_node_fields + visible_node_fields, req.session.context)
80
81         for act in data_acts:
82             n = nodes.get(str(act['id']))
83             if not n:
84                 n = isolate_nodes.get(act['id'], {})
85                 y_max += 140
86                 n.update(x=20, y=y_max)
87                 nodes[act['id']] = n
88
89             n.update(
90                 id=act['id'],
91                 color='white',
92                 options={}
93             )
94             for color, expr in bgcolors.items():
95                 if eval(expr, act):
96                     n['color'] = color
97
98             for shape, expr in shapes.items():
99                 if eval(expr, act):
100                     n['shape'] = shape
101
102             for i, fld in enumerate(visible_node_fields):
103                 n['options'][node_fields_string[i]] = act[fld]
104
105         _id, name = req.session.model(model).name_get([id], req.session.context)[0]
106         return dict(nodes=nodes,
107                     conn=connectors,
108                     name=name,
109                     parent_field=graphs['node_parent_field'])