Skip to content

Commit 38c2da5

Browse files
MaartincmCarlosRoca13
authored andcommitted
[MIG] web_timeline module from v10 to v11
* Update Version in Manifest * Remove enconding in .py files * Rewrite the view definition according to version 11
1 parent a55ef08 commit 38c2da5

File tree

11 files changed

+781
-553
lines changed

11 files changed

+781
-553
lines changed

web_timeline/README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ new record with the group and start date linked to the area you clicked in.
102102

103103
.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas
104104
:alt: Try me on Runbot
105-
:target: https://runbot.odoo-community.org/runbot/162/10.0
105+
:target: https://runbot.odoo-community.org/runbot/162/11.0
106106

107107
Known issues / Roadmap
108108
======================

web_timeline/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
# Copyright 2016 ACSONE SA/NV (<http://acsone.eu>)
32
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
43

web_timeline/__manifest__.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
# -*- coding: utf-8 -*-
21
# Copyright 2016 ACSONE SA/NV (<http://acsone.eu>)
32
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
43

54
{
65
'name': "Web timeline",
76
'summary': "Interactive visualization chart to show events in time",
8-
"version": "10.0.1.2.1",
7+
"version": "11.0.1.0.0",
98
'author': 'ACSONE SA/NV, '
109
'Tecnativa, '
1110
'Monk Software, '

web_timeline/models/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
# © 2016 ACSONE SA/NV (<http://acsone.eu>)
32
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
43

web_timeline/models/ir_view.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
# -*- coding: utf-8 -*-
21
# Copyright 2016 ACSONE SA/NV (<http://acsone.eu>)
32
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
43

Lines changed: 228 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,228 @@
1+
odoo.define('web_timeline.TimelineController', function (require) {
2+
"use strict";
3+
4+
var AbstractController = require('web.AbstractController');
5+
var dialogs = require('web.view_dialogs');
6+
var core = require('web.core');
7+
var time = require('web.time');
8+
9+
var _t = core._t;
10+
11+
var CalendarController = AbstractController.extend({
12+
custom_events: _.extend({}, AbstractController.prototype.custom_events, {
13+
onUpdate: '_onUpdate',
14+
onRemove: '_onRemove',
15+
onMove: '_onMove',
16+
onAdd: '_onAdd',
17+
}),
18+
19+
init: function (parent, model, renderer, params) {
20+
this._super.apply(this, arguments);
21+
this.open_popup_action = params.open_popup_action;
22+
this.date_start = params.date_start;
23+
this.date_stop = params.date_stop;
24+
this.date_delay = params.date_delay;
25+
this.context = params.actionContext;
26+
},
27+
28+
update: function(params, options) {
29+
this._super.apply(this, arguments);
30+
if (_.isEmpty(params)){
31+
return;
32+
}
33+
var self = this;
34+
var domains = params.domain;
35+
var contexts = params.context;
36+
var group_bys = params.groupBy;
37+
this.last_domains = domains;
38+
this.last_contexts = contexts;
39+
// select the group by
40+
var n_group_bys = [];
41+
if (this.renderer.arch.attrs.default_group_by) {
42+
n_group_bys = this.renderer.arch.attrs.default_group_by.split(',');
43+
}
44+
if (group_bys.length) {
45+
n_group_bys = group_bys;
46+
}
47+
this.renderer.last_group_bys = n_group_bys;
48+
this.renderer.last_domains = domains;
49+
50+
var fields = this.renderer.fieldNames;
51+
fields = _.uniq(fields.concat(n_group_bys));
52+
self._rpc({
53+
model: self.model.modelName,
54+
method: 'search_read',
55+
kwargs: {
56+
fields: fields,
57+
domain: domains,
58+
},
59+
context: self.getSession().user_context,
60+
}).then(function(data) {
61+
return self.renderer.on_data_loaded(data, n_group_bys);
62+
});
63+
},
64+
65+
_onUpdate: function(event) {
66+
var self = this;
67+
this.renderer = event.data.renderer;
68+
var rights = event.data.rights;
69+
var item = event.data.item;
70+
var id = item.evt.id;
71+
var title = item.evt.__name;
72+
if (this.open_popup_action) {
73+
var dialog = new dialogs.FormViewDialog(this, {
74+
res_model: this.model.modelName,
75+
res_id: parseInt(id).toString() == id ? parseInt(id) : id,
76+
context: this.getSession().user_context,
77+
title: title,
78+
view_id: +this.open_popup_action,
79+
on_saved: function (record) {
80+
self.write_completed();
81+
},
82+
}).open();
83+
} else {
84+
var mode = 'readonly';
85+
if (rights.write) {
86+
mode = 'edit';
87+
}
88+
this.trigger_up('switch_view', {
89+
view_type: 'form',
90+
res_id: parseInt(id).toString() == id ? parseInt(id) : id,
91+
mode: mode,
92+
model: this.model.modelName,
93+
});
94+
}
95+
},
96+
97+
_onMove: function(event) {
98+
var self = this;
99+
var item = event.data.item;
100+
var view = this.renderer.view;
101+
var fields = view.fields;
102+
var event_start = item.start;
103+
var event_end = item.end;
104+
var group = false;
105+
if (item.group != -1) {
106+
group = item.group;
107+
}
108+
var data = {};
109+
// In case of a move event, the date_delay stay the same, only date_start and stop must be updated
110+
data[this.date_start] = time.auto_date_to_str(event_start, fields[this.date_start].type);
111+
if (this.date_stop) {
112+
// In case of instantaneous event, item.end is not defined
113+
if (event_end) {
114+
data[this.date_stop] = time.auto_date_to_str(event_end, fields[this.date_stop].type);
115+
} else {
116+
data[this.date_stop] = data[this.date_start];
117+
}
118+
}
119+
if (this.date_delay && event_end) {
120+
var diff_seconds = Math.round((event_end.getTime() - event_start.getTime()) / 1000);
121+
data[this.date_delay] = diff_seconds / 3600;
122+
}
123+
if (this.renderer.last_group_bys && this.renderer.last_group_bys instanceof Array) {
124+
data[this.renderer.last_group_bys[0]] = group;
125+
}
126+
self._rpc({
127+
model: self.model.modelName,
128+
method: 'write',
129+
args: [
130+
[event.data.item.id],
131+
data,
132+
],
133+
context: self.getSession().user_context,
134+
}).then(function() {
135+
event.data.callback(event.data.item);
136+
});
137+
},
138+
139+
_onRemove: function(event) {
140+
var self = this;
141+
142+
function do_it(event) {
143+
return self._rpc({
144+
model: self.model.modelName,
145+
method: 'unlink',
146+
args: [
147+
[event.data.item.id],
148+
],
149+
context: self.getSession().user_context,
150+
}).then(function() {
151+
var unlink_index = false;
152+
for (var i=0; i<self.model.data.data.length; i++) {
153+
if (self.model.data.data[i].id == event.data.item.id)
154+
unlink_index = i;
155+
}
156+
if (!isNaN(unlink_index)) {
157+
self.model.data.data.splice(unlink_index, 1);
158+
}
159+
160+
event.data.callback(event.data.item);
161+
});
162+
}
163+
164+
if (confirm(_t("Are you sure you want to delete this record ?"))) {
165+
return do_it(event);
166+
}
167+
},
168+
169+
_onAdd: function(event) {
170+
var self = this;
171+
var item = event.data.item;
172+
// Initialize default values for creation
173+
var default_context = {};
174+
default_context['default_'.concat(this.date_start)] = item.start;
175+
if (this.date_delay) {
176+
default_context['default_'.concat(this.date_delay)] = 1;
177+
}
178+
if (this.date_stop) {
179+
default_context['default_'.concat(this.date_stop)] = moment(item.start).add(1, 'hours').toDate();
180+
}
181+
if (item.group > 0) {
182+
default_context['default_'.concat(this.renderer.last_group_bys[0])] = item.group;
183+
}
184+
// Show popup
185+
var dialog = new dialogs.FormViewDialog(this, {
186+
res_model: this.model.modelName,
187+
res_id: null,
188+
context: _.extend(default_context, this.context),
189+
view_id: +this.open_popup_action,
190+
on_saved: function (record) {
191+
self.create_completed([record.res_id]);
192+
},
193+
}).open();
194+
return false;
195+
},
196+
197+
create_completed: function (id) {
198+
var self = this;
199+
return this._rpc({
200+
model: this.model.modelName,
201+
method: 'read',
202+
args: [
203+
id,
204+
this.model.fieldNames,
205+
],
206+
context: this.context,
207+
})
208+
.then(function (records) {
209+
var new_event = self.renderer.event_data_transform(records[0]);
210+
var items = self.renderer.timeline.itemsData;
211+
items.add(new_event);
212+
self.renderer.timeline.setItems(items);
213+
self.reload();
214+
});
215+
},
216+
217+
write_completed: function () {
218+
var params = {
219+
domain: this.renderer.last_domains,
220+
context: this.context,
221+
groupBy: this.renderer.last_group_bys,
222+
};
223+
this.update(params, null);
224+
},
225+
});
226+
227+
return CalendarController;
228+
});
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
odoo.define('web_timeline.TimelineModel', function (require) {
2+
"use strict";
3+
4+
var AbstractModel = require('web.AbstractModel');
5+
6+
var TimelineModel = AbstractModel.extend({
7+
init: function () {
8+
this._super.apply(this, arguments);
9+
},
10+
11+
load: function (params) {
12+
var self = this;
13+
this.modelName = params.modelName;
14+
this.fieldNames = params.fieldNames;
15+
if (!this.preload_def) {
16+
this.preload_def = $.Deferred();
17+
$.when(
18+
this._rpc({model: this.modelName, method: 'check_access_rights', args: ["write", false]}),
19+
this._rpc({model: this.modelName, method: 'check_access_rights', args: ["unlink", false]}),
20+
this._rpc({model: this.modelName, method: 'check_access_rights', args: ["create", false]}))
21+
.then(function (write, unlink, create) {
22+
self.write_right = write;
23+
self.unlink_right = unlink;
24+
self.create_right = create;
25+
self.preload_def.resolve();
26+
});
27+
}
28+
29+
this.data = {
30+
domain: params.domain,
31+
context: params.context,
32+
};
33+
34+
return this.preload_def.then(this._loadTimeline.bind(this));
35+
},
36+
37+
_loadTimeline: function () {
38+
var self = this;
39+
return self._rpc({
40+
model: self.modelName,
41+
method: 'search_read',
42+
context: self.data.context,
43+
fields: self.fieldNames,
44+
domain: self.data.domain,
45+
})
46+
.then(function (events) {
47+
self.data.data = events;
48+
self.data.rights = {
49+
'unlink': self.unlink_right,
50+
'create': self.create_right,
51+
'write': self.write_right,
52+
};
53+
});
54+
},
55+
});
56+
57+
return TimelineModel;
58+
});

0 commit comments

Comments
 (0)