diff --git a/addons/account/views/account_invoice_view.xml b/addons/account/views/account_invoice_view.xml
index fb0b2c9fa75..3dc37f3b735 100644
--- a/addons/account/views/account_invoice_view.xml
+++ b/addons/account/views/account_invoice_view.xml
@@ -7,10 +7,9 @@
account.invoice.calendar
account.invoice
-
+
-
diff --git a/addons/calendar/models/calendar.py b/addons/calendar/models/calendar.py
index 7469ba029f8..b178b18f1b2 100644
--- a/addons/calendar/models/calendar.py
+++ b/addons/calendar/models/calendar.py
@@ -742,10 +742,8 @@ class Meeting(models.Model):
('-1', 'Last')
], string='By day')
final_date = fields.Date('Repeat Until')
-
user_id = fields.Many2one('res.users', 'Responsible', states={'done': [('readonly', True)]}, default=lambda self: self.env.user)
- color_partner_id = fields.Integer("Color index of creator", compute='_compute_color_partner', store=False)
-
+ partner_id = fields.Many2one('res.partner', string='Responsible', related='user_id.partner_id', readonly=True)
active = fields.Boolean('Active', default=True, help="If the active field is set to false, it will allow you to hide the event alarm information without removing it.")
categ_ids = fields.Many2many('calendar.event.type', 'meeting_category_rel', 'event_id', 'type_id', 'Tags')
attendee_ids = fields.One2many('calendar.attendee', 'event_id', 'Participant', ondelete='cascade')
@@ -834,11 +832,6 @@ class Meeting(models.Model):
data.update(self._rrule_parse(meeting.rrule, data, meeting.start))
meeting.update(data)
- @api.multi
- def _compute_color_partner(self):
- for meeting in self:
- meeting.color_partner_id = meeting.user_id.partner_id.id
-
@api.constrains('start_datetime', 'stop_datetime', 'start_date', 'stop_date')
def _check_closing_date(self):
for meeting in self:
diff --git a/addons/calendar/views/calendar_views.xml b/addons/calendar/views/calendar_views.xml
index 92d3a35c29b..731e7f1e387 100644
--- a/addons/calendar/views/calendar_views.xml
+++ b/addons/calendar/views/calendar_views.xml
@@ -265,11 +265,10 @@
+ color="partner_id">
-
+
-
diff --git a/addons/crm/views/crm_lead_views.xml b/addons/crm/views/crm_lead_views.xml
index 295d20f27e5..6104de36b49 100644
--- a/addons/crm/views/crm_lead_views.xml
+++ b/addons/crm/views/crm_lead_views.xml
@@ -186,10 +186,9 @@
crm.lead
-
+
-
diff --git a/addons/event/views/event_views.xml b/addons/event/views/event_views.xml
index efdca855f2b..28ba24ada70 100644
--- a/addons/event/views/event_views.xml
+++ b/addons/event/views/event_views.xml
@@ -360,10 +360,9 @@
event.event
-
+
-
@@ -503,10 +502,9 @@
event.registration
-
+
-
diff --git a/addons/hr_holidays/views/hr_holidays_views.xml b/addons/hr_holidays/views/hr_holidays_views.xml
index 1b31c3af01b..42fbdfc4ba9 100644
--- a/addons/hr_holidays/views/hr_holidays_views.xml
+++ b/addons/hr_holidays/views/hr_holidays_views.xml
@@ -65,9 +65,8 @@
Leave Request
hr.holidays
-
+
-
diff --git a/addons/hr_recruitment/views/hr_recruitment_views.xml b/addons/hr_recruitment/views/hr_recruitment_views.xml
index 137302f2cdf..20748105c5c 100644
--- a/addons/hr_recruitment/views/hr_recruitment_views.xml
+++ b/addons/hr_recruitment/views/hr_recruitment_views.xml
@@ -232,11 +232,10 @@
hr.applicant
-
+
-
diff --git a/addons/maintenance/views/maintenance_views.xml b/addons/maintenance/views/maintenance_views.xml
index 0323595cad3..a2636caf408 100644
--- a/addons/maintenance/views/maintenance_views.xml
+++ b/addons/maintenance/views/maintenance_views.xml
@@ -217,10 +217,9 @@
equipment.request.calendar
maintenance.request
-
+
-
diff --git a/addons/mrp/views/mrp_production_views.xml b/addons/mrp/views/mrp_production_views.xml
index a92feb0254b..398e1f8847c 100644
--- a/addons/mrp/views/mrp_production_views.xml
+++ b/addons/mrp/views/mrp_production_views.xml
@@ -212,11 +212,10 @@
mrp.production
-
+
-
diff --git a/addons/mrp/views/mrp_workorder_views.xml b/addons/mrp/views/mrp_workorder_views.xml
index e1ece57ce1e..aa1b4c701f7 100644
--- a/addons/mrp/views/mrp_workorder_views.xml
+++ b/addons/mrp/views/mrp_workorder_views.xml
@@ -272,10 +272,9 @@
mrp.production.work.order.calendar
mrp.workorder
-
+
-
diff --git a/addons/project/views/project_views.xml b/addons/project/views/project_views.xml
index 3668e2a1dc5..3e066b137ee 100644
--- a/addons/project/views/project_views.xml
+++ b/addons/project/views/project_views.xml
@@ -532,8 +532,6 @@ action = model.activate_sample_project()
-
-
diff --git a/addons/project_issue/views/project_issue_views.xml b/addons/project_issue/views/project_issue_views.xml
index 759c20498af..b217f68c7b4 100644
--- a/addons/project_issue/views/project_issue_views.xml
+++ b/addons/project_issue/views/project_issue_views.xml
@@ -153,10 +153,9 @@
project.issue
-
+
-
diff --git a/addons/purchase/views/purchase_views.xml b/addons/purchase/views/purchase_views.xml
index 8333f4d554d..d70ed23aee5 100644
--- a/addons/purchase/views/purchase_views.xml
+++ b/addons/purchase/views/purchase_views.xml
@@ -113,11 +113,10 @@
purchase.order
-
+
-
diff --git a/addons/resource/views/resource_views.xml b/addons/resource/views/resource_views.xml
index 4c44f4baf45..b2241dd6970 100644
--- a/addons/resource/views/resource_views.xml
+++ b/addons/resource/views/resource_views.xml
@@ -103,9 +103,8 @@
resource.calendar.leaves.calendar
resource.calendar.leaves
-
+
-
diff --git a/addons/sale/views/sale_views.xml b/addons/sale/views/sale_views.xml
index a7c7d8f1624..f44941e6ee1 100644
--- a/addons/sale/views/sale_views.xml
+++ b/addons/sale/views/sale_views.xml
@@ -35,10 +35,9 @@
sale.order.calendar
sale.order
-
+
-
diff --git a/addons/stock/views/stock_picking_views.xml b/addons/stock/views/stock_picking_views.xml
index 17782d32c85..445c0b6ae24 100644
--- a/addons/stock/views/stock_picking_views.xml
+++ b/addons/stock/views/stock_picking_views.xml
@@ -127,11 +127,10 @@
stock.picking
-
+
-
diff --git a/addons/web/static/src/js/views/calendar/calendar_model.js b/addons/web/static/src/js/views/calendar/calendar_model.js
index 9e4a7df3a20..1d25fbb839f 100644
--- a/addons/web/static/src/js/views/calendar/calendar_model.js
+++ b/addons/web/static/src/js/views/calendar/calendar_model.js
@@ -164,26 +164,8 @@ return AbstractModel.extend({
// fields to display color, e.g.: user_id.partner_id
this.field_color = params.field_color;
if (!this.preload_def) {
- var def;
- if (this.field_color) {
- var fields = this.field_color.split('.');
- if (fields.length > 1) {
- def = new $.Deferred();
- if (!this.model_color) {
- var dataset = new data.DataSetSearch(this, this.fields[fields[0]].relation, params.context, []);
- this.loadFieldView(dataset, false, 'form').then(function (fieldView) {
- self.model_color = fieldView.fields[fields[1]].relation;
- def.resolve();
- });
- } else {
- def.resolve();
- }
- }
- }
-
this.preload_def = $.Deferred();
$.when(
- def,
this.performModelRPC(this.modelName, 'check_access_rights', ["write", false]),
this.performModelRPC(this.modelName, 'check_access_rights', ["create", false]))
.then(function (write, create) {
@@ -401,32 +383,12 @@ return AbstractModel.extend({
*/
_loadColors: function (element, events) {
if (this.field_color) {
- var fields = this.field_color.split('.');
- var first = fields[0];
- var self = this;
-
- if (fields.length === 1) {
- _.each(events, function (event) {
- var value = event.record[first];
- event.color_index = _.isArray(value) ? value[0] : value;
- });
- this.model_color = this.fields[first].relation || element.model;
- } else {
- var model = this.fields[first].relation;
- var ids = [];
- _.each(events, function (event) {
- ids.push(event.record[first][0]);
- });
- ids = _.uniq(ids);
-
- return self.performModelRPC(model, 'read', [ids, [fields[1]]]).then(function (res) {
- res = _.object(_.pluck(res, ['id']), _.pluck(res, [fields[1]]));
- _.each(events, function (event) {
- var value = res[event.record[first][0]];
- event.color_index = _.isArray(value) ? value[0] : value;
- });
- });
- }
+ var fieldName = this.field_color;
+ _.each(events, function (event) {
+ var value = event.record[fieldName];
+ event.color_index = _.isArray(value) ? value[0] : value;
+ });
+ this.model_color = this.fields[fieldName].relation || element.model;
}
return $.Deferred().resolve();
},
@@ -498,6 +460,7 @@ return AbstractModel.extend({
var self = this;
var new_filters = {};
var to_read = {};
+
_.each(this.data.filters, function (filter, fieldName) {
var field = self.fields[fieldName];
@@ -526,7 +489,7 @@ return AbstractModel.extend({
_.each(data, function (_value) {
var value = _.isArray(_value) ? _value[0] : _value;
fs.push({
- 'color': self.model_color === (field.relation || element.model) ? value : false,
+ 'color_index': self.model_color === (field.relation || element.model) ? value : false,
'value': value,
'label': field_utils.format[field.type](_value, field),
'avatar_model': field.relation || element.model,
diff --git a/addons/web/static/src/js/views/calendar/calendar_renderer.js b/addons/web/static/src/js/views/calendar/calendar_renderer.js
index 1807f900882..adea44e8f96 100644
--- a/addons/web/static/src/js/views/calendar/calendar_renderer.js
+++ b/addons/web/static/src/js/views/calendar/calendar_renderer.js
@@ -151,11 +151,6 @@ return AbstractRenderer.extend({
if (params.eventTemplate) {
this.qweb = new QWeb(session.debug, {_s: session.origin});
- params.eventTemplate.children = [{
- 'tag': "t",
- 'attrs': {'t-name': "calendar-box"},
- 'children': params.eventTemplate.children
- }];
this.qweb.add_template(utils.json_node_to_xml(params.eventTemplate));
}
},
diff --git a/addons/web/static/src/js/views/calendar/calendar_view.js b/addons/web/static/src/js/views/calendar/calendar_view.js
index 288e908797c..f72dc8e640e 100644
--- a/addons/web/static/src/js/views/calendar/calendar_view.js
+++ b/addons/web/static/src/js/views/calendar/calendar_view.js
@@ -31,7 +31,7 @@ var CalendarView = AbstractView.extend({
var attrs = arch.attrs;
if (!attrs.date_start) {
- throw new Error(_t("Calendar view has not defined 'date_start' attribute."));
+ throw new Error(_lt("Calendar view has not defined 'date_start' attribute."));
}
var mapping = {};
@@ -46,42 +46,59 @@ var CalendarView = AbstractView.extend({
}
});
- if (attrs.color) {
- fieldNames.push(attrs.color.split('.')[0]);
- }
+ var filters = {};
var eventLimit = attrs.event_limit !== null && (isNaN(+attrs.event_limit) ? _.str.toBool(attrs.event_limit) : +attrs.event_limit);
- var filters = {};
-
+ var modelFilters = [];
_.each(arch.children, function (child) {
- switch (child.tag) {
- case "filter":
- if (params.sidebar === false) break; // if we have not sidebar, (eg: Dashboard), we don't use the filter "coworkers"
- var fieldName = child.attrs.name;
- filters[fieldName] = {
+ if (child.tag !== 'field') return;
+ var fieldName = child.attrs.name;
+ fieldNames.push(fieldName);
+ if (!child.attrs.invisible) {
+ displayFields[fieldName] = child.attrs;
+
+ if (params.sidebar === false) return; // if we have not sidebar, (eg: Dashboard), we don't use the filter "coworkers"
+
+ if (child.attrs.avatar_field) {
+ filters[fieldName] = filters[fieldName] || {
'title': fields[fieldName].string,
'fieldName': fieldName,
'filters': [],
};
- if (child.attrs.avatar_field) {
- filters[fieldName].avatar_field = child.attrs.avatar_field;
- filters[fieldName].avatar_model = fields[fieldName].relation;
- }
- if (child.attrs.write_model) {
- filters[fieldName].write_model = child.attrs.write_model;
- filters[fieldName].write_field = child.attrs.write_field; // can't use a x2many fields
- }
- fieldNames.push(child.attrs.name);
- break;
- case "field":
- fieldNames.push(child.attrs.name);
- if (!child.attrs.invisible) {
- displayFields[child.attrs.name] = child.attrs;
- }
+ filters[fieldName].avatar_field = child.attrs.avatar_field;
+ filters[fieldName].avatar_model = fields[fieldName].relation;
+ }
+ if (child.attrs.write_model) {
+ filters[fieldName] = filters[fieldName] || {
+ 'title': fields[fieldName].string,
+ 'fieldName': fieldName,
+ 'filters': [],
+ };
+ filters[fieldName].write_model = child.attrs.write_model;
+ filters[fieldName].write_field = child.attrs.write_field; // can't use a x2many fields
+
+ modelFilters.push(fields[fieldName].relation);
+ }
}
});
+ if (attrs.color) {
+ var fieldName = attrs.color;
+ fieldNames.push(fieldName);
+ filters[fieldName] = {
+ 'title': fields[fieldName].string,
+ 'fieldName': fieldName,
+ 'filters': [],
+ };
+ if (fields[fieldName].relation) {
+ if (['res.users', 'res.partner'].indexOf(fields[fieldName].relation) !== -1) {
+ filters[fieldName].avatar_field = 'image_small';
+ }
+ filters[fieldName].avatar_model = fields[fieldName].relation;
+ }
+ }
+
if (_.isEmpty(displayFields)) {
displayFields = fields.display_name ? {'display_name': {}} : [];
}
diff --git a/addons/web/static/test/views/calendar_tests.js b/addons/web/static/test/views/calendar_tests.js
index d17f588d814..b5abb4d2b5f 100644
--- a/addons/web/static/test/views/calendar_tests.js
+++ b/addons/web/static/test/views/calendar_tests.js
@@ -26,6 +26,7 @@ QUnit.module('Views', {
fields: {
id: {string: "ID", type: "integer"},
user_id: {string: "user", type: "many2one", relation: 'user'},
+ parnter_id: {string: "user", type: "many2one", relation: 'partner', related: 'user_id.parnter_id'},
name: {string: "name", type: "char"},
start: {string: "start", type: "datetime"},
stop: {string: "stop", type: "datetime"},
@@ -34,12 +35,12 @@ QUnit.module('Views', {
type: {string: "type", type: "integer"},
},
records: [
- {id: 1, user_id: session.uid, name: "event 1", start: "2016-12-11 00:00:00", stop: "2016-12-11 00:00:00", allday: false, partner_ids: [1,2,3], type: 1},
- {id: 2, user_id: session.uid, name: "event 2", start: "2016-12-12 10:55:05", stop: "2016-12-12 14:55:05", allday: false, partner_ids: [1,2], type: 3},
- {id: 3, user_id: 4, name: "event 3", start: "2016-12-12 15:55:05", stop: "2016-12-12 16:55:05", allday: false, partner_ids: [1], type: 2},
- {id: 4, user_id: session.uid, name: "event 4", start: "2016-12-14 15:55:05", stop: "2016-12-14 18:55:05", allday: true, partner_ids: [1], type: 2},
- {id: 5, user_id: 4, name: "event 5", start: "2016-12-13 15:55:05", stop: "2016-12-20 18:55:05", allday: false, partner_ids: [2,3], type: 2},
- {id: 6, user_id: session.uid, name: "event 6", start: "2016-12-18 08:00:00", stop: "2016-12-18 09:00:00", allday: false, partner_ids: [3], type: 3}
+ {id: 1, user_id: session.uid, partner_id: 1, name: "event 1", start: "2016-12-11 00:00:00", stop: "2016-12-11 00:00:00", allday: false, partner_ids: [1,2,3], type: 1},
+ {id: 2, user_id: session.uid, partner_id: 1, name: "event 2", start: "2016-12-12 10:55:05", stop: "2016-12-12 14:55:05", allday: false, partner_ids: [1,2], type: 3},
+ {id: 3, user_id: 4, partner_id: 4, name: "event 3", start: "2016-12-12 15:55:05", stop: "2016-12-12 16:55:05", allday: false, partner_ids: [1], type: 2},
+ {id: 4, user_id: session.uid, partner_id: 1, name: "event 4", start: "2016-12-14 15:55:05", stop: "2016-12-14 18:55:05", allday: true, partner_ids: [1], type: 2},
+ {id: 5, user_id: 4, partner_id: 4, name: "event 5", start: "2016-12-13 15:55:05", stop: "2016-12-20 18:55:05", allday: false, partner_ids: [2,3], type: 2},
+ {id: 6, user_id: session.uid, partner_id: 1, name: "event 6", start: "2016-12-18 08:00:00", stop: "2016-12-18 09:00:00", allday: false, partner_ids: [3], type: 3}
]
},
user: {
@@ -47,6 +48,7 @@ QUnit.module('Views', {
id: {string: "ID", type: "integer"},
display_name: {string: "Displayed name", type: "char"},
parnter_id: {string: "partner", type: "many2one", relation: 'partner'},
+ image: {string: "image", type: "integer"},
},
records: [
{id: session.uid, display_name: "user 1", partner_id: 1},
@@ -158,10 +160,10 @@ QUnit.module('Views', {
'all_day="allday" '+
'mode="week" '+
'attendee="partner_ids" '+
- 'color="user_id.parnter_id">'+
+ 'color="parnter_id">'+
''+
- ''+
- ''+ // todo test image: avatar_field="image"
+ ''+
+ ''+
'',
archs: archs,
mockRPC: mock_check_access_rights,
@@ -191,11 +193,11 @@ QUnit.module('Views', {
// test filters
- assert.strictEqual($sidebar.find('.o_calendar_filter').length, 2, "should display 2 filters");
+ assert.strictEqual($sidebar.find('.o_calendar_filter').length, 2, "should display 3 filters");
- var $typeFilter = $sidebar.find('.o_calendar_filter:has(h3:contains(type))');
- assert.ok($typeFilter.length, "should display 'type' filter");
- assert.strictEqual($typeFilter.find('.o_calendar_filter_item').length, 3, "should display 3 filter items for 'type'");
+ var $typeFilter = $sidebar.find('.o_calendar_filter:has(h3:contains(user))');
+ assert.ok($typeFilter.length, "should display 'user' filter");
+ assert.strictEqual($typeFilter.find('.o_calendar_filter_item').length, 1, "should display 1 filter items for 'user'");
var $attendeesFilter = $sidebar.find('.o_calendar_filter:has(h3:contains(attendees))');
assert.ok($attendeesFilter.length, "should display 'attendees' filter");
diff --git a/addons/website_event_track/views/event_track_views.xml b/addons/website_event_track/views/event_track_views.xml
index eb5c9cb1451..19912ab98ea 100644
--- a/addons/website_event_track/views/event_track_views.xml
+++ b/addons/website_event_track/views/event_track_views.xml
@@ -60,10 +60,9 @@
event.track
-
+
-
diff --git a/doc/howtos/backend/exercise-calendar b/doc/howtos/backend/exercise-calendar
index a605016ae3b..0c62fa8ce98 100644
--- a/doc/howtos/backend/exercise-calendar
+++ b/doc/howtos/backend/exercise-calendar
@@ -64,9 +64,8 @@ diff --git a/openacademy/views/openacademy.xml b/openacademy/views/openacademy.x
+ session.calendar
+ openacademy.session
+
-+
++
+
-+
+
+
+
diff --git a/odoo/addons/base/ir/ir_cron_view.xml b/odoo/addons/base/ir/ir_cron_view.xml
index 15fa8284a75..75bb568e62d 100644
--- a/odoo/addons/base/ir/ir_cron_view.xml
+++ b/odoo/addons/base/ir/ir_cron_view.xml
@@ -54,10 +54,8 @@
ir.cron
-
+
-
-
diff --git a/odoo/addons/base/rng/view.rng b/odoo/addons/base/rng/view.rng
index 78cadd36de6..90c5be1ad6e 100644
--- a/odoo/addons/base/rng/view.rng
+++ b/odoo/addons/base/rng/view.rng
@@ -649,10 +649,7 @@
-
-
-
-
+