diff --git a/addons/caldav/calendar.py b/addons/caldav/calendar.py
index 7800c773112..2e671ddedf1 100644
--- a/addons/caldav/calendar.py
+++ b/addons/caldav/calendar.py
@@ -69,14 +69,17 @@ class CalDAV(object):
__attribute__ = {
}
def get_recurrent_dates(self, rrulestring, exdate, startdate=None):
- todate = parser.parse
+ def todate(date):
+ val = parser.parse(''.join((re.compile('\d')).findall(date)) + 'Z')
+ return val
+
if not startdate:
startdate = datetime.now()
else:
- startdate = todate(''.join((re.compile('\d')).findall(startdate)) + 'Z')
+ startdate = todate(startdate)
rset1 = rrulestr(rrulestring, dtstart=startdate, forceset=True)
for date in exdate:
- datetime_obj = datetime.strptime(date, "%Y-%m-%d %H:%M:%S")
+ datetime_obj = todate(date)
rset1._exdate.append(datetime_obj)
re_dates = rset1._iter()
recurrent_dates = map(lambda x:x.strftime('%Y-%m-%d %H:%M:%S'), re_dates)
@@ -93,9 +96,12 @@ class CalDAV(object):
valtype = self.__attribute__.get(name).get('type', None)
if type == 'value':
if valtype and valtype=='datetime' and val:
- val = val.strftime('%Y-%m-%d %H:%M:%S')
+ if isinstance(val, list):
+ val = ','.join(map(lambda x: x.strftime('%Y-%m-%d %H:%M:%S'), val))
+ else:
+ val = val.strftime('%Y-%m-%d %H:%M:%S')
if valtype and valtype=='integer' and val:
- val = int(val)
+ val = int(val)
return val
else:
return self.__attribute__.get(name, None)
@@ -124,8 +130,10 @@ class CalDAV(object):
if map_type == "text":
vevent.add(field).value = str(data[map_field])
elif map_type == 'datetime' and data[map_field]:
- vevent.add(field).value = datetime.strptime(data[map_field], \
- "%Y-%m-%d %H:%M:%S")
+ if field in ('exdate'):
+ vevent.add(field).value = [parser.parse(data[map_field])]
+ else:
+ vevent.add(field).value = parser.parse(data[map_field])
elif map_type == "timedelta":
vevent.add(field).value = timedelta(hours=data[map_field])
if self.__attribute__.get(field).has_key('mapping'):
diff --git a/addons/crm/crm_caldav_view.xml b/addons/crm/crm_caldav_view.xml
index eefa9cd280f..a68970c3bf5 100644
--- a/addons/crm/crm_caldav_view.xml
+++ b/addons/crm/crm_caldav_view.xml
@@ -98,12 +98,23 @@
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/addons/crm/crm_calendar.py b/addons/crm/crm_calendar.py
index 4ce6b6038e5..98fef31c6e9 100644
--- a/addons/crm/crm_calendar.py
+++ b/addons/crm/crm_calendar.py
@@ -19,18 +19,13 @@
#
##############################################################################
-from osv import fields, osv
-from time import strftime
-import time
-import base64
-import vobject
from dateutil.rrule import *
-from dateutil import parser
+from osv import fields, osv
import datetime
-from time import strftime
-from pytz import timezone
+import base64
+import re
+import time
import tools
-from service import web_services
def caldevIDs2readIDs(caldev_ID = None):
if caldev_ID:
@@ -68,8 +63,8 @@ class crm_case(osv.osv):
# 'categories' : {'field':None , 'sub-field':'name', 'type':'text'}, # keep none for now
'comment' : None,
'contact' : None,
- 'exdate' : None,
- 'exrule' : None,
+ 'exdate' : {'field':'exdate', 'type':'datetime'},
+ 'exrule' : {'field':'exrule', 'type':'text'},
'rstatus' : None,
'related' : None,
'resources' : None,
@@ -100,10 +95,10 @@ class crm_case(osv.osv):
def _get_rdates(self, cr, uid, ids, name, arg, context=None):
res = {}
context.update({'read':True})
- for case in self.read(cr, uid, ids, ['date', 'rrule'], context=context):
+ for case in self.read(cr, uid, ids, ['date', 'rrule', 'exdate', 'exrule'], context=context):
if case['rrule']:
- rule = case['rrule'].split('\n')[0]
- exdate = case['rrule'].split('\n')[1:]
+ rule = case['rrule']
+ exdate = case['exdate'] and case['exdate'].split(',') or []
event_obj = self.pool.get('caldav.event')
res[case['id']] = str(event_obj.get_recurrent_dates(str(rule), exdate, case['date']))
return res
@@ -116,6 +111,10 @@ class crm_case(osv.osv):
'freebusy' : fields.text('FreeBusy'),
'transparent' : fields.selection([('OPAQUE', 'OPAQUE'), ('TRANSPARENT', 'TRANSPARENT')], 'Trensparent'),
'caldav_url' : fields.char('Caldav URL', size=34),
+ 'exdate' : fields.text('Exception Date/Times', help="This property defines the list\
+ of date/time exceptions for arecurring calendar component."),
+ 'exrule' : fields.text('Exception Rule', help="defines a rule or repeating pattern\
+ for anexception to a recurrence set"),
'rrule' : fields.text('Recurrent Rule'),
'rdates' : fields.function(_get_rdates, method=True, string='Recurrent Dates', \
store=True, type='text'),
@@ -134,7 +133,7 @@ class crm_case(osv.osv):
def run_scheduler(self, cr, uid, automatic=False, use_new_cursor=False, \
context=None):
if not context:
- context={}
+ context = {}
cr.execute('select c.id as id, c.date as date, alarm.id as alarm_id, alarm.name as name,\
alarm.trigger_interval, alarm.trigger_duration, alarm.trigger_related, \
alarm.trigger_occurs from crm_case c \
@@ -196,7 +195,7 @@ class crm_case(osv.osv):
file_content = base64.decodestring(data['form']['file_path'])
event_obj = self.pool.get('caldav.event')
event_obj.__attribute__.update(self.__attribute__)
-
+
attendee_obj = self.pool.get('caldav.attendee')
crm_attendee = self.pool.get('crm.caldav.attendee')
attendee_obj.__attribute__.update(crm_attendee.__attribute__)
@@ -236,8 +235,7 @@ class crm_case(osv.osv):
select = map(lambda x:caldevIDs2readIDs(x), select)
return super(crm_case, self).browse(cr, uid, select, context, list_class, fields_process)
- def read(self, cr, uid, ids, fields=None, context={},
- load='_classic_read'):
+ def read(self, cr, uid, ids, fields=None, context={}, load='_classic_read'):
""" logic for recurrent event
example : 123-20091111170822"""
if context and context.has_key('read'):
@@ -269,7 +267,6 @@ class crm_case(osv.osv):
result.remove(val)
for rdate in rdates:
- import re
idval = (re.compile('\d')).findall(rdate)
val['date'] = rdate
id = str(val['id']).split('-')[0]
@@ -287,10 +284,12 @@ class crm_case(osv.osv):
if len(str(id).split('-')) > 1:
date_new = time.strftime("%Y-%m-%d %H:%M:%S", \
time.strptime(str(str(id).split('-')[1]), "%Y%m%d%H%M%S"))
- for record in self.read(cr, uid, [caldevIDs2readIDs(id)], ['date', 'rdates', 'rrule']):
+ for record in self.read(cr, uid, [caldevIDs2readIDs(id)], \
+ ['date', 'rdates', 'rrule', 'exdate']):
+ exdate = (record['exdate'] and (record['exdate'] + ',' ) or '') + \
+ ''.join((re.compile('\d')).findall(date_new)) + 'Z'
if record['date'] == date_new:
- self.write(cr, uid, [caldevIDs2readIDs(id)], \
- {'rrule' : record['rrule'] +"\n" + str(date_new)})
+ self.write(cr, uid, [caldevIDs2readIDs(id)], {'exdate' : exdate})
else:
return super(crm_case, self).unlink(cr, uid, ids)
diff --git a/addons/project_calendar/project_calendar.py b/addons/project_calendar/project_calendar.py
index 82ae10ff4f7..8e7b3852bec 100644
--- a/addons/project_calendar/project_calendar.py
+++ b/addons/project_calendar/project_calendar.py
@@ -23,6 +23,8 @@ from datetime import datetime
from osv import fields, osv
from service import web_services
import base64
+import time
+import re
def caldevIDs2readIDs(caldev_ID = None):
if caldev_ID:
@@ -36,12 +38,12 @@ class project_task(osv.osv):
def _get_rdates(self, cr, uid, ids, name, arg, context=None):
res = {}
context.update({'read':True})
- for task in self.read(cr, uid, ids, ['date_start', 'rrule'], context=context):
+ for task in self.read(cr, uid, ids, ['date_start', 'rrule', 'exdate', 'exrule'], context=context):
if task['rrule']:
- rule = task['rrule'].split('\n')[0]
+ rule = task['rrule']
if rule.upper().find('COUNT') < 0: # Temp fix, needs review
rule += ';COUNT=5'
- exdate = task['rrule'].split('\n')[1:]
+ exdate = task['exdate'] and task['exdate'].split(',') or []
todo_obj = self.pool.get('caldav.todo')
res[task['id']] = str(todo_obj.get_recurrent_dates(str(rule), exdate, task['date_start']))
return res
@@ -51,9 +53,13 @@ class project_task(osv.osv):
('CONFIDENTIAL', 'CONFIDENTIAL')], 'Class'),
'location': fields.text('Location'),
'rrule': fields.text('Recurrent Rule'),
+ 'exdate' : fields.text('Exception Date/Times', help="This property defines the list\
+ of date/time exceptions for arecurring calendar component."),
+ 'exrule' : fields.text('Exception Rule', help="defines a rule or repeating pattern\
+ for anexception to a recurrence set"),
'rdates': fields.function(_get_rdates, method=True, string='Recurrent Dates', \
store=True, type='text'),
- 'attendee_ids': fields.many2many('crm.caldav.attendee', 'crm_attendee_rel', 'case_id', \
+ 'attendee_ids': fields.many2many('crm.caldav.attendee', 'task_attendee_rel', 'case_id', \
'attendee_id', 'Attendees'),
'alarm_id': fields.many2one('crm.caldav.alarm', 'Alarm'),
'caldav_url': fields.char('Caldav URL', size=34),
@@ -87,8 +93,8 @@ class project_task(osv.osv):
# 'categories': {'field': 'type', 'type': 'text'}, # Needs review
'comment': {'field': 'notes', 'type': 'text'},
# 'contact': {'field': 'field', 'type': 'text'},
-# 'exdate': {'field': 'field', 'type': 'text'},
-# 'exrule': {'field': 'field', 'type': 'text'},
+ 'exdate' : {'field':'exdate', 'type':'datetime'},
+ 'exrule' : {'field':'exrule', 'type':'text'},
# 'rstatus': {'field': 'field', 'type': 'text'},
# 'related': {'field': 'field', 'type': 'text'},
# 'resources': {'field': 'field', 'type': 'text'},
@@ -143,8 +149,8 @@ class project_task(osv.osv):
return caendar_val
def read(self, cr, uid, ids, fields=None, context={}, load='_classic_read'):
- """ logic for recurrent task
- example : 123-20091111170822""", ids, fields, context
+ """ Logic for recurrent task
+ example : 123-20091111170822"""
if context and context.has_key('read'):
return super(project_task, self).read(cr, uid, ids, fields, context, load)
if not type(ids) == list :
@@ -173,7 +179,6 @@ class project_task(osv.osv):
result.remove(val)
for rdate in rdates:
- import re
idval = (re.compile('\d')).findall(rdate)
val['date_start'] = rdate
id = str(val['id']).split('-')[0]
@@ -210,10 +215,12 @@ class project_task(osv.osv):
if len(str(id).split('-')) > 1:
date_new = time.strftime("%Y-%m-%d %H:%M:%S", \
time.strptime(str(str(id).split('-')[1]), "%Y%m%d%H%M%S"))
- for record in self.read(cr, uid, [caldevIDs2readIDs(id)], ['date_start', 'rdates', 'rrule']):
+ for record in self.read(cr, uid, [caldevIDs2readIDs(id)], \
+ ['date', 'rdates', 'rrule', 'exdate']):
+ exdate = (record['exdate'] and (record['exdate'] + ',' ) or '') + \
+ ''.join((re.compile('\d')).findall(date_new)) + 'Z'
if record['date_start'] == date_new:
- self.write(cr, uid, [caldevIDs2readIDs(id)], \
- {'rrule' : record['rrule'] +"\n" + str(date_new)})
+ self.write(cr, uid, [caldevIDs2readIDs(id)], {'exdate' : exdate})
else:
return super(project_task, self).unlink(cr, uid, ids)
diff --git a/addons/project_calendar/project_calendar_view.xml b/addons/project_calendar/project_calendar_view.xml
index 826d0788b04..6ed99321b13 100644
--- a/addons/project_calendar/project_calendar_view.xml
+++ b/addons/project_calendar/project_calendar_view.xml
@@ -109,10 +109,20 @@
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+