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 @@ - - - - +