← Back to team overview

openerp-dev-web team mailing list archive

[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