diff --git a/addons/crm/crm.py b/addons/crm/crm.py
index 6da437fd127..44988520898 100755
--- a/addons/crm/crm.py
+++ b/addons/crm/crm.py
@@ -1118,7 +1118,7 @@ class crm_calendar_config_wizard(osv.osv_memory):
res = self.read(cr, uid, ids)[0]
idref = {}
if res['caldav']:
- for fname in ('view', 'wizard'):
+ for fname in ('view', 'wizard', 'data'):
try:
fp = tools.file_open(os.path.join('crm', 'crm_caldav_' + fname + '.xml'))
except IOError, e:
diff --git a/addons/crm/crm_caldav_data.xml b/addons/crm/crm_caldav_data.xml
new file mode 100644
index 00000000000..91b80586d69
--- /dev/null
+++ b/addons/crm/crm_caldav_data.xml
@@ -0,0 +1,18 @@
+
+
+
+
+ Run Event Reminder
+
+
+ 1
+ days
+ -1
+
+
+
+
+
+
+
diff --git a/addons/crm/crm_caldav_view.xml b/addons/crm/crm_caldav_view.xml
index f5fc89cb233..dbfcb8efeaa 100644
--- a/addons/crm/crm_caldav_view.xml
+++ b/addons/crm/crm_caldav_view.xml
@@ -44,7 +44,7 @@
- crm.case.caldav.alarm
+ crm.case.caldav.alarm.form
crm.caldav.alarm
form
@@ -54,10 +54,10 @@
-
-
-
-
+
+
+
+
@@ -67,7 +67,7 @@
- crm.case.caldav.alarm
+ crm.case.caldav.alarm.tree
crm.caldav.alarm
tree
@@ -78,6 +78,7 @@
+
diff --git a/addons/crm/crm_calendar.py b/addons/crm/crm_calendar.py
index 9ce9c43c880..5f42a80c7b8 100644
--- a/addons/crm/crm_calendar.py
+++ b/addons/crm/crm_calendar.py
@@ -27,7 +27,7 @@ import base64
import vobject
from dateutil.rrule import *
from dateutil import parser
-from datetime import datetime
+import datetime
from time import strftime
from pytz import timezone
import tools
@@ -81,7 +81,10 @@ class crm_caldav_attendee(osv.osv):
'dir' : fields.char('DIR', size=124),
'language' : fields.char('LANGUAGE', size=124),
}
-
+ _defaults = {
+ 'cn' : lambda *x: 'MAILTO:',
+ }
+
crm_caldav_attendee()
@@ -108,6 +111,7 @@ class crm_caldav_alarm(osv.osv):
'duration' : fields.integer('Duration'),
'repeat' : fields.integer('Repeat'), # TODO
'attach' : fields.binary('Attachment'),
+ 'active' : fields.boolean('Active'),
}
_defaults = {
'action' : lambda *x: 'EMAIL',
@@ -190,7 +194,7 @@ class crm_case(osv.osv):
_columns = {
'class' : fields.selection([('PUBLIC', 'PUBLIC'), ('PRIVATE', 'PRIVATE'), \
('CONFIDENTIAL', 'CONFIDENTIAL')], 'Class'),
- 'location' : fields.function(_get_location, method=True, store = True, string='Location', type='text'),
+ 'location' : fields.function(_get_location, method=True, store=True, string='Location', type='text'),
'freebusy' : fields.text('FreeBusy'),
'transparent' : fields.selection([('OPAQUE', 'OPAQUE'), ('TRANSPARENT', 'TRANSPARENT')], 'Trensparent'),
'caldav_url' : fields.char('Caldav URL', size=34),
@@ -206,7 +210,50 @@ class crm_case(osv.osv):
'class': lambda *a: 'PUBLIC',
'transparent': lambda *a: 'OPAQUE',
}
-
+
+
+ def run_scheduler(self, cr, uid, automatic=False, use_new_cursor=False, context=None):
+ if not 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 \
+ join crm_caldav_alarm alarm on (alarm.id=c.alarm_id) \
+ where alarm_id is not null and alarm.active=True' )
+ case_with_alarm = cr.dictfetchall()
+ case_obj = self.pool.get('crm.case')
+ attendee_obj = self.pool.get('crm.caldav.attendee')
+ mail_to = []
+ for alarmdata in case_with_alarm:
+ dtstart = datetime.datetime.strptime(alarmdata['date'], "%Y-%m-%d %H:%M:%S")
+ if alarmdata['trigger_duration'] == 'DAYS':
+ delta = datetime.timedelta(days=alarmdata['trigger_interval'])
+ if alarmdata['trigger_duration'] == 'HOURS':
+ delta = datetime.timedelta(hours=alarmdata['trigger_interval'])
+ if alarmdata['trigger_duration'] == 'MINUTES':
+ delta = datetime.timedelta(minutes=alarmdata['trigger_interval'])
+ alarm_time = dtstart + ( alarmdata['trigger_related']== 'AFTER' and delta or -delta)
+ if datetime.datetime.now() >= alarm_time:
+ case_val = case_obj.browse(cr, uid, alarmdata.get('id'), context)
+ for att in case_val.attendees:
+ if att.cn[7:]:
+ mail_to.append(att.cn[7:])
+ if mail_to:
+ sub = 'Event Reminder for ' + case_val.name or ''
+ body = (case_val.name or '' )+ '\n\t' + ( case_val.description or '') + '\n\nEvent time: ' \
+ +(case_val.date) + '\n\nLocation: ' + (case_val.location or '' ) + \
+ '\n\nMembers Details: ' + '\n'.join(mail_to)
+ tools.email_send(
+ case_val.user_id.address_id.email,
+ mail_to,
+ sub,
+ body
+ )
+ cr.execute('update crm_caldav_alarm set active=False\
+ where id = %s' % alarmdata['alarm_id'])
+ cr.commit()
+ return True
+
def export_cal(self, cr, uid, ids, context={}):
crm_data = self.read(cr, uid, ids, [], context ={'read' :True})
ical = vobject.iCalendar()
@@ -311,8 +358,6 @@ class crm_case(osv.osv):
ids = map(lambda x:int(str(x).split('-')[0]), ids)
res = super(crm_case, self).read(cr, uid, ids, fields=fields, context=context, load=load)
read_ids = ",".join([str(x) for x in ids])
- if not read_ids:
- return []
cr.execute('select id,rrule,rdates from crm_case where id in (%s)' % read_ids)
rrules = filter(lambda x: not x['rrule']==None, cr.dictfetchall())
rdates = []