openerp-dev-web team mailing list archive
-
openerp-dev-web team
-
Mailing list archive
-
Message #06127
[Merge] lp:~openerp-dev/openobject-client/trunk-calendar_speed_imp-rga into lp:openobject-client
Ravi Gadhia (OpenERP) has proposed merging lp:~openerp-dev/openobject-client/trunk-calendar_speed_imp-rga into lp:openobject-client.
Requested reviews:
Naresh(OpenERP) (nch-openerp)
For more details, see:
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-calendar_speed_imp-rga/+merge/59370
hello,
Calendar view improvements:
parser clean up
reduce rpc call
replace time with datetime library
fix bug:
https://bugs.launchpad.net/openobject-client/+bug/693330
https://bugs.launchpad.net/openobject-client/+bug/761550
--
https://code.launchpad.net/~openerp-dev/openobject-client/trunk-calendar_speed_imp-rga/+merge/59370
Your team OpenERP R&D Team is subscribed to branch lp:~openerp-dev/openobject-client/trunk-calendar_speed_imp-rga.
=== modified file 'bin/modules/gui/window/form.py'
--- bin/modules/gui/window/form.py 2011-04-21 09:23:36 +0000
+++ bin/modules/gui/window/form.py 2011-04-28 13:26:18 +0000
@@ -254,8 +254,9 @@
id = self.screen.id_get()
if mode<>self.screen.current_view.view_type:
self.screen.switch_view(mode=mode)
- if id:
+ if id :
self.sig_reload()
+ elif mode != 'calendar':
self.get_resource(get_id=id)
def sig_logs(self, widget=None):
=== modified file 'bin/widget/screen/screen.py'
--- bin/widget/screen/screen.py 2011-04-13 09:12:58 +0000
+++ bin/widget/screen/screen.py 2011-04-28 13:26:18 +0000
@@ -202,28 +202,6 @@
self.screen_container.action_combo.set_active(0)
self.clear()
- def get_calenderDomain(self, field_name=None, old_date='', mode='month'):
- args = []
- old_date = old_date.date()
- if not old_date:
- old_date = datetime.today().date()
- if mode =='month':
- start_date = (old_date + relativedelta(months = -1)).strftime('%Y-%m-%d')
- args.append((field_name, '>',start_date))
- end_date = (old_date + relativedelta(months = 1)).strftime('%Y-%m-%d')
- args.append((field_name, '<',end_date))
- if mode=='week':
- start_date = (old_date + relativedelta(weeks = -1)).strftime('%Y-%m-%d')
- args.append((field_name, '>',start_date))
- end_date = (old_date + relativedelta(weeks = 1)).strftime('%Y-%m-%d')
- args.append((field_name, '<',end_date))
- if mode=='day':
- start_date = (old_date + relativedelta(days = -1)).strftime('%Y-%m-%d')
- args.append((field_name, '>',start_date))
- end_date = (old_date + relativedelta(days = 1)).strftime('%Y-%m-%d')
- args.append((field_name, '<',end_date))
- return args
-
def search_filter(self, *args):
if not self.auto_search:
self.auto_search = True
@@ -240,10 +218,7 @@
v += self.win_search_domain
limit = self.screen_container.get_limit()
if self.current_view.view_type == 'calendar':
- field_name = self.current_view.view.date_start
- old_date = self.current_view.view.date
- mode = self.current_view.view.mode
- calendar_domain = self.get_calenderDomain(field_name, old_date, mode)
+ calendar_domain = self.current_view.view.get_domain()
v += calendar_domain
filter_keys = []
@@ -407,7 +382,7 @@
pass
def _model_changed(self, model_group, model):
- if (not model) or (model==self.current_model):
+ if ((not model) or (model==self.current_model)) and self.current_view.view_type != 'calendar':
self.display()
def _get_current_model(self):
=== modified file 'bin/widget/view/calendar_gtk/parser.py'
--- bin/widget/view/calendar_gtk/parser.py 2011-04-18 13:17:38 +0000
+++ bin/widget/view/calendar_gtk/parser.py 2011-04-28 13:26:18 +0000
@@ -27,12 +27,10 @@
import common
import gobject
from mx import DateTime
-from datetime import datetime, date
+from datetime import datetime, date, timedelta
from SpiffGtkWidgets import Calendar
-from datetime import datetime
from dateutil.relativedelta import relativedelta
-import time
import math
import rpc
@@ -40,6 +38,12 @@
import logging
import widget.model.field as wmodel_fields
+DT_SERVER_FORMATS = {
+ 'datetime': '%Y-%m-%d %H:%M:%S',
+ 'date': '%Y-%m-%d',
+ 'time': '%H:%M:%S'
+ }
+
COLOR_PALETTE = ['#f57900', '#cc0000', '#d400a8', '#75507b', '#3465a4', '#73d216', '#c17d11', '#edd400',
'#fcaf3e', '#ef2929', '#ff00c9', '#ad7fa8', '#729fcf', '#8ae234', '#e9b96e', '#fce94f',
'#ff8e00', '#ff0000', '#b0008c', '#9000ff', '#0078ff', '#00ff00', '#e6ff00', '#ffff00',
@@ -113,7 +117,6 @@
else:
self._radio_month.set_active(True)
self.mode = mode
- self.modex = mode
self.cal_model = TinyCalModel()
self.cal_view = Calendar.Calendar(self.cal_model, mode)
@@ -149,7 +152,6 @@
self.day_length = int(attrs.get('day_length', 8))
self.models = None
self.models_record_group = None
-
if self.color_field:
self.color_model = gtk.ListStore(str, str, str, gobject.TYPE_BOOLEAN)
self._calendar_treeview.set_model(self.color_model)
@@ -225,9 +227,15 @@
if isinstance(widget, gtk.Calendar):
t = list(widget.get_date())
t[1] += 1
+ self.date = datetime(*t[0:6])
+ self.mode = 'day'
+ self.screen.search_filter()
+ self.process = True
+ self._radio_day.set_active(True)
+ self.process = False
else:
t = list(date_selected.timetuple()[:3])
- self.date = datetime(*t[0:6])
+ self.date = datetime(*t[0:6])
self.display(None)
# if action = double click
@@ -242,6 +250,7 @@
def _today(self, widget, *args, **argv):
self.date = datetime.today()
+ self.screen.search_filter()
self.display(None)
def _back_forward(self, widget, type, *args, **argv):
@@ -260,7 +269,8 @@
return True
self.process = True
self.mode = type
- self.display(None, force=True)
+ self.screen.search_filter()
+ self.display(None)
self.process = False
return True
@@ -328,10 +338,7 @@
if self.models:
self.__update_colors()
self.cal_model.add_events(self.__get_events())
- self.modex = self.mode
- self.mode = self.mode == 'month' and 'week' or 'month'
self.refresh()
- self.mode = self.modex
elif force == True:
self.cal_model.remove_events()
self.cal_model.add_events(self.__get_events())
@@ -344,15 +351,12 @@
sysencoding = getlocale()[1]
if self.mode == 'month':
- self._radio_month.set_active(True)
self.cal_view.range = self.cal_view.RANGE_MONTH
self._label_current.set_text(ustr(self.date.strftime('%B %Y'), sysencoding))
elif self.mode == 'week':
- self._radio_week.set_active(True)
self.cal_view.range = self.cal_view.RANGE_WEEK
self._label_current.set_text(_('Week') + ' ' + self.date.strftime('%W, %Y'))
elif self.mode == 'day':
- self._radio_day.set_active(True)
self.cal_view.range = self.cal_view.RANGE_CUSTOM
d1 = datetime(*t[:3])
d2 = Calendar.util.end_of_day(d1)
@@ -364,7 +368,41 @@
self._small_calendar.select_day(t[2])
self.cal_view.refresh()
-
+
+ def get_date_by_mode(self, current_date, mode= 'month' ):
+ start_date = end_date = current_date
+ if mode == 'month':
+ start_date, end_date = self.cal_model.get_month_weeks(current_date)
+ if mode == 'week':
+ start_date, end_date = self.cal_model.get_week(current_date)
+ if mode == 'day':
+ start_date = current_date + relativedelta(days = -1)
+ end_date = current_date + relativedelta(days = 1)
+ return start_date, end_date
+
+ def get_domain(self):
+ args = []
+ old_date = self.date.date()
+ start_field = self.date_start
+ stop_field = self.date_stop
+ if not old_date:
+ old_date = datetime.today().date()
+
+ if stop_field:
+ start_date, end_date = self.get_date_by_mode(old_date, self.mode)
+ start = start_date.strftime('%Y-%m-%d')
+ end = end_date.strftime('%Y-%m-%d')
+ # need to fix server
+ # 'in' operator not working on date field
+ args = ['|', '|', '&', (start_field, '>=',start),(start_field, '<', end), '&', (stop_field, '>', start), \
+ (stop_field, '<=', end), '&', (start_field, '<', start), (stop_field, '>', end)]
+ else:
+ start_date, end_date = self.get_date_by_mode(old_date, 'month')
+ start = start_date.strftime('%Y-%m-%d')
+ end = end_date.strftime('%Y-%m-%d')
+ args = [(start_field, '>',start),(start_field, '<',end)]
+ return args
+
def __get_events(self):
do_color_filtering = len(self.color_filters.keys()) and True or False
@@ -384,7 +422,6 @@
# We need to skip this item
continue
-
e = self.__get_event(model)
if e:
if e.color_info:
@@ -393,34 +430,44 @@
return events
def __convert(self, event):
- # method from eTiny
- DT_SERVER_FORMATS = {
- 'datetime': '%Y-%m-%d %H:%M:%S',
- 'date': '%Y-%m-%d',
- 'time': '%H:%M:%S'
- }
-
+
fields = [x for x in [self.date_start, self.date_stop] if x]
for fld in fields:
typ = self.fields[fld]['type']
fmt = DT_SERVER_FORMATS[typ]
if event[fld] and fmt:
- event[fld] = time.strptime(event[fld][:19], fmt)
+ event['type'] = typ
+ event[fld] = datetime.strptime(event[fld], fmt)
# default start/stop time is 9:00 AM / 5:00 PM
# if you set it to 0:00, then Calendar.Event removes 1 second to date_stop,
# which sets it back to the day before at 23:59:59
if typ == 'date' and event[fld]:
- ds = list(event[fld])
if fld == self.date_start:
- ds[3] = 9
+ event[fld] = event[fld] + timedelta(hours=9)
elif fld == self.date_stop:
- ds[3] = 17
- event[fld] = tuple(ds)
-
+ event[fld] = event[fld] + timedelta(hours=17)
+
+ def get_end_date(self, start, duration):
+ span = 0
+ day = 0
+ hour = duration or 1
+ if duration == self.day_length: span = 1
+
+ if duration > self.day_length:
+ day = duration / self.day_length
+ hour = duration % self.day_length
+ day = int(math.floor(day))
+
+ if day > 0:
+ if not hour:
+ day = day - 1
+ span = day + 1
+ end_date = start + timedelta(days=day, hours=hour)
+ return end_date, span
+
def __get_event(self, model):
-
event = model.value.copy()
self.__convert(event)
@@ -430,61 +477,30 @@
ends = None
if self.axis:
-
f = self.axis[0]
s = event[f]
-
if isinstance(s, (tuple, list)): s = s[-1]
-
caption = ustr(s)
-
for f in self.axis[1:]:
s = event[f]
if isinstance(s, (tuple, list)): s = s[-1]
-
description += [ustr(s)]
starts = event.get(self.date_start)
ends = event.get(self.date_delay) or 1.0
span = 0
-
- if starts and ends:
-
- n = 0
- h = ends or 1
-
- if ends == self.day_length: span = 1
-
- if ends > self.day_length:
- n = ends / self.day_length
- h = ends % self.day_length
-
- n = int(math.floor(n))
-
- if n > 0:
- if not h:
- n = n - 1
- span = n + 1
-
- ends= time.localtime(time.mktime(starts)+(h * 60 * 60) + (n * 24 * 60 * 60))
+
+ if starts and ends and not self.date_stop:
+ caption = ustr(ends) + ' : ' + caption
+ ends, span = self.get_end_date(starts ,ends)
+
if starts and self.date_stop:
-
ends = event.get(self.date_stop)
if not ends:
- ends = time.localtime(time.mktime(starts) + 60 * 60)
-
- tds = time.mktime(starts)
- tde = time.mktime(ends)
-
- if tds >= tde:
- tde = tds + 60 * 60
- ends = time.localtime(tde)
-
- n = (tde - tds) / (60 * 60)
-
- if n > self.day_length:
- span = math.floor(n / 24.)
+ ends = starts + timedelta(hours=1)
+ time_delta = ends - starts
+ span = time_delta.days
if not starts:
return None
@@ -496,10 +512,16 @@
color = color_info and color_info[2] or 'black'
description = ', '.join(description).strip()
all_day = self.mode == 'month' and True or span > 0
+ if ends < starts:
+ str_start= starts.strftime(DT_SERVER_FORMATS[event['type']])
+ str_end = ends.strftime(DT_SERVER_FORMATS[event['type']])
+ self.log.error('Can not load %s : event end (%s) before start (%s)' % ((caption), (str_end), (str_start)))
+ return None
+
return TinyEvent(model=model,
caption=caption.strip(),
- start=datetime(*starts[:7]),
- end=datetime(*ends[:7]),
+ start= starts,
+ end= ends,
description=description,
dayspan=span,
all_day=all_day,
Follow ups