[FIX] web: various bugs in calendar and move _rpc call into model

This commit is contained in:
Christophe Matthieu
2017-04-11 19:44:38 +02:00
committed by Aaron Bohy
parent e7dfa4af77
commit 3dfa2caa3d
6 changed files with 93 additions and 97 deletions
@@ -102,14 +102,7 @@ var CalendarController = AbstractController.extend({
* @param {integer} record.id
*/
_updateRecord: function (record) {
// Cannot modify actual name yet
var data = _.omit(this.model.calendarEventToRecord(record), 'name');
this._rpc({
model: this.model.modelName,
method: 'write',
args: [record.id, data],
})
.then(this.reload.bind(this));
this.model.updateRecord(record).reload.bind(this);
},
//--------------------------------------------------------------------------
@@ -155,23 +148,16 @@ var CalendarController = AbstractController.extend({
*/
_onQuickCreate: function (event) {
var self = this;
var data = this.model.calendarEventToRecord(event.data.data);
var options = event.data.options;
return this._rpc({
model: this.model.modelName,
method: 'create',
args: [$.extend({}, this.quick.data_template, data)],
context: _.pick(options, 'context'),
})
this.model.createRecord(event)
.then(function (id) {
self.quick.destroy();
self.quick = null;
self.reload(id);
}, function () {
// This will occurs if there are some more fields required
data.disable_quick_create = true;
data.on_save = this.destroy.bind(this);
self._onOpenCreate({data: data});
event.data.options.disable_quick_create = true;
event.data.options.on_save = this.destroy.bind(this);
self._onOpenCreate(event.data);
});
},
/**
@@ -194,7 +180,13 @@ var CalendarController = AbstractController.extend({
context['default_' + this.mapping.date_delay] = data.duration;
}
if (this.mapping.all_day) {
context['default_' + this.mapping.all_day] = true;
context['default_' + this.mapping.all_day] = data[this.mapping.all_day];
}
for (var k in context) {
if (context[k] && context[k]._isAMomentObject) {
context[k] = context[k].clone().utc().format('YYYY-MM-DD HH:mm:ss');
}
}
var options = _.extend({}, this.options, {context: context});
@@ -203,7 +195,6 @@ var CalendarController = AbstractController.extend({
if (this.quick != null) {
this.quick.destroy();
this.quick = null;
return;
}
this.quick = new QuickCreate(this, true, options, data, event.data);
this.quick.on('added', this, this.reload.bind(this));
@@ -262,11 +253,7 @@ var CalendarController = AbstractController.extend({
click: function () {
Dialog.confirm(this, _t("Are you sure you want to delete this record ?"), {
confirm_callback: function () {
self._rpc({
model: self.modelName,
method: 'unlink',
args: [id],
})
self.model.deleteRecords([id], self.modelName)
.then(function () {
self.dialog.destroy();
self.reload();
@@ -2,11 +2,10 @@ odoo.define('web.CalendarModel', function (require) {
"use strict";
var AbstractModel = require('web.AbstractModel');
var core = require('web.core');
var field_utils = require('web.field_utils');
var session = require('web.session');
var time = require('web.time');
var core = require('web.core');
var data = require('web.data');
var _t = core._t;
@@ -16,6 +15,10 @@ var scales = [
'month'
];
function dateToServer (date) {
return date.clone().utc().format('YYYY-MM-DD HH:mm:ss');
}
return AbstractModel.extend({
init: function () {
this._super.apply(this, arguments);
@@ -32,8 +35,8 @@ return AbstractModel.extend({
calendarEventToRecord: function (event) {
// Normalize event_end without changing fullcalendars event.
var data = {'name': event.title};
var start = moment(new Date(event.start));
var end = moment(new Date(event.end));
var start = event.start;
var end = event.end;
//Bug when we move an all_day event from week or day view, we don't have
// a date.end or duration...
@@ -64,10 +67,6 @@ return AbstractModel.extend({
start.utc().hours(7);
end.utc().hours(19);
}
} else {
var offset = start.utcOffset();
start.utc().add(-offset, 'minutes');
end.utc().add(-offset, 'minutes');
}
if (this.mapping.all_day) {
@@ -82,13 +81,13 @@ return AbstractModel.extend({
}
}
data[this.mapping.date_start] = time.datetime_to_str(start.toDate());
if (this.mapping.date_delay) {
data[this.mapping.date_delay] = (end.diff(start) <= 0 ? end.endOf('day').diff(start) : end.diff(start)) / 1000 / 3600;
data[this.mapping.date_start] = start;
if (this.mapping.date_stop) {
data[this.mapping.date_stop] = end;
}
if (this.mapping.date_stop) {
data[this.mapping.date_stop] = time.datetime_to_str(end.toDate());
if (this.mapping.date_delay) {
data[this.mapping.date_delay] = (end.diff(start) <= 0 ? end.endOf('day').diff(start) : end.diff(start)) / 1000 / 3600;
}
return data;
@@ -119,6 +118,23 @@ return AbstractModel.extend({
}
return true;
},
/**
* @param {OdooEvent} event
*/
createRecord: function (event) {
var data = this.calendarEventToRecord(event.data.data);
for (var k in data) {
if (data[k] && data[k]._isAMomentObject) {
data[k] = dateToServer(data[k]);
}
}
return this._rpc({
model: this.modelName,
method: 'create',
args: [data],
context: _.pick(event.data.options, 'context'),
});
},
/**
* @todo I think this is dead code
*
@@ -201,10 +217,10 @@ return AbstractModel.extend({
return this.preload_def.then(this._loadCalendar.bind(this));
},
next: function () {
this.setDate(moment(this.data.target_date).add(1, this.data.scale));
this.setDate(this.data.target_date.clone().add(1, this.data.scale));
},
prev: function () {
this.setDate(moment(this.data.target_date).add(-1, this.data.scale));
this.setDate(this.data.target_date.clone().add(-1, this.data.scale));
},
/**
* @todo: this should not work. it ignores the domain/context
@@ -218,37 +234,23 @@ return AbstractModel.extend({
return this._loadCalendar();
},
/**
* @param {any} start
* @param {any} highlight
* @param {Moment} start
* @param {boolean} highlight
*/
setDate: function (start, highlight) {
this.data.start_date = this.data.end_date = this.data.target_date = this.data.highlight_date = new Date(start);
this.data.start_date = this.data.end_date = this.data.target_date = this.data.highlight_date = start;
switch (this.data.scale) {
case 'month':
this.data.start_date = moment(this.data.start_date)
.startOf('month')
.startOf('week')
.toDate();
this.data.end_date = moment(this.data.start_date)
.add(5, 'week')
.endOf('week')
.toDate();
this.data.start_date = this.data.start_date.clone().startOf('month').startOf('week');
this.data.end_date = this.data.start_date.clone().add(5, 'week').endOf('week');
break;
case 'week':
this.data.start_date = moment(this.data.start_date)
.startOf('week')
.toDate();
this.data.end_date = moment(this.data.end_date)
.endOf('week')
.toDate();
this.data.start_date = this.data.start_date.clone().startOf('week');
this.data.end_date = this.data.end_date.clone().endOf('week');
break;
default:
this.data.start_date = moment(this.data.start_date)
.startOf('day')
.toDate();
this.data.end_date = moment(this.data.end_date)
.endOf('day')
.toDate();
this.data.start_date = this.data.start_date.clone().startOf('day');
this.data.end_date = this.data.end_date.clone().endOf('day');
}
if (highlight) {
this.data.highlight_date = this.data.target_date;
@@ -262,12 +264,31 @@ return AbstractModel.extend({
this.setDate(this.data.target_date);
},
today: function () {
this.setDate(new Date());
this.setDate(moment(new Date()));
},
toggleFullWidth: function () {
var fullWidth = this.call('local_storage', 'getItem', 'calendar_fullWidth') !== 'true';
this.call('local_storage', 'setItem', 'calendar_fullWidth', fullWidth);
},
/**
* @param {Object} record
* @param {integer} record.id
*/
updateRecord: function (record) {
// Cannot modify actual name yet
var data = _.omit(this.calendarEventToRecord(record), 'name');
for (var k in data) {
if (data[k] && data[k]._isAMomentObject) {
data[k] = dateToServer(data[k]);
}
}
return this._rpc({
model: this.modelName,
method: 'write',
args: [record.id, data],
context: _.pick(event.data.options, 'context'),
});
},
//--------------------------------------------------------------------------
// Private
@@ -347,12 +368,11 @@ return AbstractModel.extend({
_getRangeDomain: function () {
// Build OpenERP Domain to filter object by this.mapping.date_start field
// between given start, end dates.
var format = time.datetime_to_str;
var domain = [[this.mapping.date_start, '<=', format(this.data.end_date)]];
var domain = [[this.mapping.date_start, '<=', dateToServer(this.data.end_date)]];
if (this.mapping.date_stop) {
domain.push([this.mapping.date_stop, '>=', format(this.data.start_date)]);
domain.push([this.mapping.date_stop, '>=', dateToServer(this.data.start_date)]);
} else if (!this.mapping.date_delay) {
domain.push([this.mapping.date_start, '>=', format(this.data.start_date)]);
domain.push([this.mapping.date_start, '>=', dateToServer(this.data.start_date)]);
}
return domain;
},
@@ -552,25 +572,21 @@ return AbstractModel.extend({
attendees = [];
if (!all_day) {
date_start = time.auto_str_to_date(evt[this.mapping.date_start]);
date_stop = this.mapping.date_stop ? time.auto_str_to_date(evt[this.mapping.date_stop]) : null;
date_start = field_utils.parse.datetime(evt[this.mapping.date_start]);
date_stop = this.mapping.date_stop ? field_utils.parse.datetime(evt[this.mapping.date_stop]) : null;
} else {
date_start = time.auto_str_to_date(evt[this.mapping.date_start].split(' ')[0],'start');
date_stop = this.mapping.date_stop ? time.auto_str_to_date(evt[this.mapping.date_stop].split(' ')[0],'start') : null;
date_start = field_utils.parse.datetime(evt[this.mapping.date_start].split(' ')[0],'start');
date_stop = this.mapping.date_stop ? field_utils.parse.datetime(evt[this.mapping.date_stop].split(' ')[0],'start') : null;
}
if (!date_stop && date_delay) {
var m_start = moment(date_start).add(date_delay,'hours');
date_stop = m_start.toDate();
date_stop = date_start.clone().add(date_delay,'hours');
}
date_start = moment(date_start);
date_stop = moment(date_stop);
var r = {
'record': evt,
'start': date_start.format('YYYY-MM-DD HH:mm:ss'),
'end': date_stop.format('YYYY-MM-DD HH:mm:ss'),
'start': dateToServer(date_start),
'end': dateToServer(date_stop),
'r_start':date_start.clone(),
'r_end':date_stop.clone(),
'title': the_title,
@@ -22,15 +22,15 @@ var QuickCreate = Dialog.extend({
* @param {Widget} parent
* @param {Object} buttons
* @param {Object} options
* @param {Object} data_template
* @param {Object} dataTemplate
* @param {Object} dataCalendar
*/
init: function (parent, buttons, options, data_template, dataCalendar) {
init: function (parent, buttons, options, dataTemplate, dataCalendar) {
this._buttons = buttons || false;
this.options = options;
// Can hold data pre-set from where you clicked on agenda
this.data_template = data_template || {};
this.dataTemplate = dataTemplate || {};
this.$input = $();
var self = this;
@@ -108,6 +108,7 @@ var QuickCreate = Dialog.extend({
* Gathers data from the quick create dialog a launch quick_create(data) method
*/
_quickAdd: function (dataCalendar) {
dataCalendar = $.extend({}, this.dataTemplate, dataCalendar);
var val = this.$input.val().trim();
dataCalendar.title = val;
return (val)? this.trigger_up('quickCreate', {data: dataCalendar, options: this.options}) : false;
@@ -370,7 +370,7 @@ return AbstractRenderer.extend({
$calendar.find('.fc-bg .fc-day[data-date="'+highlightDate+'"]')
.addClass('o_target_date');
this.$small_calendar.datepicker("setDate", this.state.highlight_date)
this.$small_calendar.datepicker("setDate", this.state.highlight_date.toDate())
.find('.o_selected_range')
.removeClass('o_color o_selected_range');
var $a;
@@ -132,7 +132,7 @@ var CalendarView = AbstractView.extend({
this.loadParams.filters = filters;
this.loadParams.mode = attrs.mode;
this.loadParams.scale_zoom = attrs.scale_zoom;
this.loadParams.initialDate = params.initialDate || new Date();
this.loadParams.initialDate = moment(params.initialDate || new Date());
},
});
+4 -12
View File
@@ -10,14 +10,6 @@ var createView = testUtils.createView;
var initialDate = new Date("2016-12-12T08:00:00Z");
function mock_check_access_rights(route, args) {
if (args.method === "check_access_rights") {
if (!args.model) throw new Error('"model" is undefined to call "check_access_rights"');
return $.when(true);
}
return this._super(route, args);
}
QUnit.module('Views', {
beforeEach: function () {
session.uid = -1; // TO CHECK
@@ -41,7 +33,10 @@ QUnit.module('Views', {
{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}
]
],
check_access_rights: function () {
return $.when(true);
}
},
user: {
fields: {
@@ -166,7 +161,6 @@ QUnit.module('Views', {
'<field name="partner_ids" write_model="filter_partner" write_field="partner_id"/>'+
'</calendar>',
archs: archs,
mockRPC: mock_check_access_rights,
viewOptions: {
initialDate: initialDate,
},
@@ -237,7 +231,6 @@ QUnit.module('Views', {
'<field name="name"/>'+
'</calendar>',
archs: archs,
mockRPC: mock_check_access_rights,
viewOptions: {
initialDate: initialDate,
},
@@ -332,7 +325,6 @@ QUnit.module('Views', {
'<field name="partner_ids" avatar_field="image" write_model="filter_partner" write_field="partner_id"/>'+
'</calendar>',
archs: archs,
mockRPC: mock_check_access_rights,
viewOptions: {
initialDate: initialDate,
},