Merge lp:~openerp-dev/openerp-web/7.0-calendar-day_length-fme into lp:openerp-web/7.0

Proposed by Fabien Meghazi (OpenERP)
Status: Rejected
Rejected by: Antony Lesuisse (OpenERP)
Proposed branch: lp:~openerp-dev/openerp-web/7.0-calendar-day_length-fme
Merge into: lp:openerp-web/7.0
Diff against target: 198 lines (+82/-47)
1 file modified
addons/web_calendar/static/src/js/calendar.js (+82/-47)
To merge this branch: bzr merge lp:~openerp-dev/openerp-web/7.0-calendar-day_length-fme
Reviewer Review Type Date Requested Status
Fabien Meghazi (OpenERP) (community) Needs Resubmitting
Olivier Dony (Odoo) Pending
Review via email: mp+158109@code.launchpad.net

Description of the change

Add support for `day_length` in calendar view.

To post a comment you must log in.
Revision history for this message
Fabien Meghazi (OpenERP) (fme) wrote :

Yick ! I just see a TODO comment. Back to Work in progress state.

Revision history for this message
Fabien Meghazi (OpenERP) (fme) wrote :

Ok, I added day_length="24" on the crm meeting's calendar. (addons branch ~openerp-dev/openobject-addons/7.0-calendar-day_length-fme)

Ready to be tested and reviewed

Revision history for this message
Fabien Meghazi (OpenERP) (fme) :
review: Approve
Revision history for this message
Fabien Meghazi (OpenERP) (fme) :
review: Needs Resubmitting
Revision history for this message
Antony Lesuisse (OpenERP) (al-openerp) wrote :

This feature is deprecated.

Unmerged revisions

3893. By Fabien Meghazi (OpenERP)

[ADD] Apply inverse of date_delay algorithm

3892. By Fabien Meghazi (OpenERP)

[IMP] Simplify day_length algorithm

3891. By Fabien Meghazi (OpenERP)

[ADD] Add day_length support

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'addons/web_calendar/static/src/js/calendar.js'
2--- addons/web_calendar/static/src/js/calendar.js 2013-04-03 13:23:46 +0000
3+++ addons/web_calendar/static/src/js/calendar.js 2013-04-11 16:16:19 +0000
4@@ -59,8 +59,8 @@
5 },
6 load_calendar: function(data) {
7 this.fields_view = data;
8+ this.fields = this.fields_view.fields;
9 this.$el.addClass(this.fields_view.arch.attrs['class']);
10- this.calendar_fields = {};
11 this.ids = this.dataset.ids;
12 this.color_values = [];
13 this.info_fields = [];
14@@ -73,10 +73,30 @@
15
16 // date_start is mandatory, date_delay and date_stop are optional
17 this.date_start = this.fields_view.arch.attrs.date_start;
18+ if (!this.date_start) {
19+ throw new Error(_t("Calendar view has not defined 'date_start' attribute."));
20+ }
21+ this.date_start_type = this.fields[this.date_start]['type'];
22+
23+ this.date_stop = this.fields_view.arch.attrs.date_stop;
24+ if (this.date_stop) {
25+ this.date_stop_type = this.fields[this.date_stop]['type'];
26+ }
27+
28 this.date_delay = this.fields_view.arch.attrs.date_delay;
29- this.date_stop = this.fields_view.arch.attrs.date_stop;
30+ if (this.date_delay && this.fields[this.date_delay].type != 'float') {
31+ throw new Error(_t("Calendar view has a 'date_delay' type != float"));
32+ }
33+ this.day_length = parseFloat(this.fields_view.arch.attrs.day_length, 10) || 8; // float
34+ if (this.day_length > 24) {
35+ throw new Error(_t("There's only 24 hours in a day, please check your `day_length` setting"));
36+ }
37+ this.day_start_hour = parseFloat(this.fields_view.arch.attrs.day_start_hour, 10) || 9; // float, default workday time start
38+ if ((this.day_start_hour + this.day_length) > 24) {
39+ this.day_start_hour = 24 - this.day_length;
40+ }
41+ this.day_stop_hour = this.day_start_hour + this.day_length;
42
43- this.day_length = this.fields_view.arch.attrs.day_length || 8;
44 this.color_field = this.fields_view.arch.attrs.color;
45 this.color_string = this.fields_view.fields[this.color_field] ?
46 this.fields_view.fields[this.color_field].string : _t("Filter");
47@@ -87,24 +107,6 @@
48 this.selected_filters.push(default_filter + '');
49 }
50 }
51- this.fields = this.fields_view.fields;
52-
53- if (!this.date_start) {
54- throw new Error(_t("Calendar view has not defined 'date_start' attribute."));
55- }
56-
57- //* Calendar Fields *
58- this.calendar_fields.date_start = {'name': this.date_start, 'kind': this.fields[this.date_start].type};
59-
60- if (this.date_delay) {
61- if (this.fields[this.date_delay].type != 'float') {
62- throw new Error(_t("Calendar view has a 'date_delay' type != float"));
63- }
64- this.calendar_fields.date_delay = {'name': this.date_delay, 'kind': this.fields[this.date_delay].type};
65- }
66- if (this.date_stop) {
67- this.calendar_fields.date_stop = {'name': this.date_stop, 'kind': this.fields[this.date_stop].type};
68- }
69
70 for (var fld = 0; fld < this.fields_view.arch.children.length; fld++) {
71 this.info_fields.push(this.fields_view.arch.children[fld].attrs.name);
72@@ -122,7 +124,7 @@
73 init_scheduler: function() {
74 var self = this;
75 scheduler.clearAll();
76- if (this.fields[this.date_start]['type'] == 'time') {
77+ if (this.date_start_type === 'time') {
78 scheduler.config.xml_date = "%H:%M:%S";
79 } else {
80 scheduler.config.xml_date = "%Y-%m-%d %H:%i";
81@@ -301,13 +303,6 @@
82 evt.textColor = '#000000';
83 }
84 }
85-
86- if (this.fields[this.date_start]['type'] == 'date') {
87- evt[this.date_start] = instance.web.auto_str_to_date(evt[this.date_start]).set({hour: 9}).toString('yyyy-MM-dd HH:mm:ss');
88- }
89- if (this.date_stop && evt[this.date_stop] && this.fields[this.date_stop]['type'] == 'date') {
90- evt[this.date_stop] = instance.web.auto_str_to_date(evt[this.date_stop]).set({hour: 17}).toString('yyyy-MM-dd HH:mm:ss');
91- }
92 res_events.push(this.convert_event(evt));
93 }
94 scheduler.parse(res_events, 'json');
95@@ -317,11 +312,19 @@
96 }
97 },
98 convert_event: function(evt) {
99- var date_start = instance.web.str_to_datetime(evt[this.date_start]),
100- date_stop = this.date_stop ? instance.web.str_to_datetime(evt[this.date_stop]) : null,
101- date_delay = evt[this.date_delay] || 1.0,
102- res_text = '';
103+ var event_date_start = instance.web.str_to_datetime(evt[this.date_start]);
104+ if (this.date_start_type === 'date') {
105+ event_date_start.clearTime().addHours(this.day_start_hour);
106+ }
107+ var event_date_stop;
108+ if (this.date_stop && evt[this.date_stop]) {
109+ event_date_stop = instance.web.str_to_datetime(evt[this.date_stop]);
110+ if (this.date_stop_type === 'date') {
111+ event_date_stop.clearTime().addHours(this.day_stop_hour);
112+ }
113+ }
114
115+ var res_text = '';
116 if (this.info_fields) {
117 res_text = _.map(this.info_fields, function(fld) {
118 if(evt[fld] instanceof Array)
119@@ -329,12 +332,29 @@
120 return evt[fld];
121 });
122 }
123- if (!date_stop && date_delay) {
124- date_stop = date_start.clone().addHours(date_delay);
125+
126+ // If a event_date_stop is defined, we don't even care about date_delays
127+ if (!event_date_stop) {
128+ var event_date_delay = evt[this.date_delay];
129+ var event_start_hour = (event_date_start - event_date_start.clone().clearTime()) / 3600000; // float
130+ var remaining_hours_in_day = 24 - event_start_hour;
131+ if (remaining_hours_in_day > this.day_length) {
132+ remaining_hours_in_day = this.day_length;
133+ }
134+ if (!event_date_delay) {
135+ event_date_stop = event_date_start.clone().addHours(1);
136+ } else if (this.day_length == 24 || remaining_hours_in_day >= event_date_delay) {
137+ event_date_stop = event_date_start.clone().addHours(event_date_delay);
138+ } else {
139+ event_date_delay -= remaining_hours_in_day;
140+ event_date_stop = event_date_start.clone().clearTime().addDays(1);
141+ event_date_stop.addDays(Math.floor(event_date_delay / this.day_length));
142+ event_date_stop.addHours(event_date_delay % this.day_length);
143+ }
144 }
145 var r = {
146- 'start_date': date_start.toString('yyyy-MM-dd HH:mm:ss'),
147- 'end_date': date_stop.toString('yyyy-MM-dd HH:mm:ss'),
148+ 'start_date': event_date_start.toString('yyyy-MM-dd HH:mm:ss'),
149+ 'end_date': event_date_stop.toString('yyyy-MM-dd HH:mm:ss'),
150 'text': res_text.join(', '),
151 'id': evt.id
152 };
153@@ -347,20 +367,35 @@
154 return r;
155 },
156 get_event_data: function(event_obj) {
157+ var date_start = event_obj.start_date;
158+ var date_stop = event_obj.end_date;
159+
160 var data = {
161 name: event_obj.text || scheduler.locale.labels.new_event
162 };
163- if (this.fields[this.date_start].type == 'date') {
164- data[this.date_start] = instance.web.date_to_str(event_obj.start_date)
165- }else {
166- data[this.date_start] = instance.web.datetime_to_str(event_obj.start_date)
167- }
168+
169+ if (!event_obj._timed) {
170+ date_start.clearTime().addHours(this.day_start_hour);
171+ if (this.day_length != 24) {
172+ date_stop.clearTime().addHours(this.day_stop_hour);
173+ }
174+ }
175+
176+ if (this.date_delay) {
177+ if (!event_obj._timed) {
178+ data[this.date_delay] = event_obj._length * this.day_length;
179+ } else {
180+ var diff_hours = (event_obj.end_date.getTime() - event_obj.start_date.getTime()) / 3600000;
181+ data[this.date_delay] = (diff_hours > this.day_length) ? this.day_length : diff_hours;
182+ }
183+ }
184+
185+ var fn = this.date_start_type === 'date' ? 'date_to_str' : 'datetime_to_str';
186+ data[this.date_start] = instance.web[fn](date_start);
187+
188 if (this.date_stop) {
189- data[this.date_stop] = instance.web.datetime_to_str(event_obj.end_date);
190- }
191- if (this.date_delay) {
192- var diff_seconds = Math.round((event_obj.end_date.getTime() - event_obj.start_date.getTime()) / 1000);
193- data[this.date_delay] = diff_seconds / 3600;
194+ fn = this.date_stop_type === 'date' ? 'date_to_str' : 'datetime_to_str';
195+ data[this.date_stop] = instance.web[fn](date_stop);
196 }
197 return data;
198 },