From 312ce4d690cb19938ec91345b2ae60f97dcb0456 Mon Sep 17 00:00:00 2001 From: "rpa (Open ERP)" Date: Tue, 22 Dec 2009 18:44:25 +0530 Subject: [PATCH] [IMP]: Caldav+crm+project_calendar , Implemented exdates for Event and tasks bzr revid: rpa@tinyerp.com-20091222131425-8wxl8xv01wznl56v --- addons/caldav/calendar.py | 22 +++++++--- addons/crm/crm_caldav_view.xml | 23 +++++++--- addons/crm/crm_calendar.py | 43 +++++++++---------- addons/project_calendar/project_calendar.py | 31 +++++++------ .../project_calendar_view.xml | 18 ++++++-- 5 files changed, 86 insertions(+), 51 deletions(-) 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 @@ - - - - + + + + + + + + + + + + + +