[IMP]: CRM : Implemented event reminder scheduler + Improvements
bzr revid: rpa@tinyerp.com-20091208141927-72h6dm2msmdgl3h7
This commit is contained in:
+1
-1
@@ -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:
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<record forcecreate="True" id="ir_cron_scheduler_alarm"
|
||||
model="ir.cron">
|
||||
<field name="name">Run Event Reminder</field>
|
||||
<field eval="True" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">1</field>
|
||||
<field name="interval_type">days</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'crm.case'" name="model" />
|
||||
<field eval="'run_scheduler'" name="function" />
|
||||
<field eval="'(False,)'" name="args" />
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
||||
@@ -44,7 +44,7 @@
|
||||
</record>
|
||||
|
||||
<record id="caldav_alarm_form_view" model="ir.ui.view">
|
||||
<field name="name">crm.case.caldav.alarm</field>
|
||||
<field name="name">crm.case.caldav.alarm.form</field>
|
||||
<field name="model">crm.caldav.alarm</field>
|
||||
<field name="type">form</field>
|
||||
<field name="arch" type="xml">
|
||||
@@ -54,10 +54,10 @@
|
||||
<separator string="Description" colspan="4"/>
|
||||
<field name="description" colspan="4" nolabel="1" attrs="{'required' : [('action','in',('EMAIL'))]}"/>
|
||||
<group string="Reminder details" col="4" colspan="4">
|
||||
<field name="trigger_interval" nolabel="1" />
|
||||
<field name="trigger_duration" nolabel="1"/>
|
||||
<field name="trigger_related" nolabel="1"/>
|
||||
<field name="trigger_occurs" nolabel="1"/>
|
||||
<field name="trigger_interval" nolabel="1" select="1"/>
|
||||
<field name="trigger_duration" nolabel="1" select="1"/>
|
||||
<field name="trigger_related" nolabel="1" select="1"/>
|
||||
<field name="trigger_occurs" nolabel="1" select="1"/>
|
||||
</group>
|
||||
<field name="duration"/>
|
||||
<field name="repeat"/>
|
||||
@@ -67,7 +67,7 @@
|
||||
</record>
|
||||
|
||||
<record id="caldav_alarm_tree_view" model="ir.ui.view">
|
||||
<field name="name">crm.case.caldav.alarm</field>
|
||||
<field name="name">crm.case.caldav.alarm.tree</field>
|
||||
<field name="model">crm.caldav.alarm</field>
|
||||
<field name="type">tree</field>
|
||||
<field name="arch" type="xml">
|
||||
@@ -78,6 +78,7 @@
|
||||
<field name="trigger_duration" select="1"/>
|
||||
<field name="trigger_related" select="1"/>
|
||||
<field name="trigger_occurs" select="1"/>
|
||||
<field name="active"/>
|
||||
</tree>
|
||||
</field>
|
||||
</record>
|
||||
|
||||
@@ -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 = []
|
||||
|
||||
Reference in New Issue
Block a user