[FIX] web: various bugs in calendar and move _rpc call into model
This commit is contained in:
committed by
Aaron Bohy
parent
e7dfa4af77
commit
3dfa2caa3d
@@ -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());
|
||||
},
|
||||
});
|
||||
|
||||
|
||||
@@ -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,
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user