[IMP] Optimize the schedulers of the calendar, fetchmail and base_action_rules modules
Disable the the crons when they'd have nothing to do, re-enable them when a task is (probably) introduced
This commit is contained in:
parent
c3f52899dd
commit
1ff7ed2758
|
@ -37,9 +37,9 @@ trigger an automatic reminder email.
|
|||
'website': 'http://www.openerp.com',
|
||||
'depends': ['base', 'resource', 'mail'],
|
||||
'data': [
|
||||
'base_action_rule_data.xml',
|
||||
'base_action_rule_view.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'base_action_rule_data.xml'
|
||||
],
|
||||
'demo': [],
|
||||
'installable': True,
|
||||
|
|
|
@ -227,10 +227,20 @@ class base_action_rule(osv.osv):
|
|||
updated = True
|
||||
return updated
|
||||
|
||||
def _update_cron(self, cr, uid, context=None):
|
||||
try:
|
||||
cron = self.pool['ir.model.data'].get_object(
|
||||
cr, uid, 'base_action_rule', 'ir_cron_crm_action', context=context)
|
||||
except ValueError:
|
||||
return False
|
||||
|
||||
return cron.toggle(model=self._name, domain=[('kind', '=', 'on_time')])
|
||||
|
||||
def create(self, cr, uid, vals, context=None):
|
||||
res_id = super(base_action_rule, self).create(cr, uid, vals, context=context)
|
||||
if self._register_hook(cr, [res_id]):
|
||||
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
|
||||
self._update_cron(cr, uid, context=context)
|
||||
return res_id
|
||||
|
||||
def write(self, cr, uid, ids, vals, context=None):
|
||||
|
@ -239,8 +249,14 @@ class base_action_rule(osv.osv):
|
|||
super(base_action_rule, self).write(cr, uid, ids, vals, context=context)
|
||||
if self._register_hook(cr, ids):
|
||||
openerp.modules.registry.RegistryManager.signal_registry_change(cr.dbname)
|
||||
self._update_cron(cr, uid, context=context)
|
||||
return True
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
res = super(base_action_rule, self).unlink(cr, uid, ids, context=context)
|
||||
self._update_cron(cr, uid, context=context)
|
||||
return res
|
||||
|
||||
def onchange_model_id(self, cr, uid, ids, model_id, context=None):
|
||||
data = {'model': False, 'filter_pre_id': False, 'filter_id': False}
|
||||
if model_id:
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
<field eval="'base.action.rule'" name="model"/>
|
||||
<field eval="'_check'" name="function"/>
|
||||
<field eval="'(True,)'" name="args"/>
|
||||
<field name="active" eval="False" />
|
||||
</record>
|
||||
|
||||
</data>
|
||||
|
|
|
@ -40,6 +40,7 @@ If you need to manage your meetings, you should install the CRM module.
|
|||
'website': 'http://www.openerp.com',
|
||||
'demo': ['calendar_demo.xml'],
|
||||
'data': [
|
||||
'calendar_cron.xml',
|
||||
'security/calendar_security.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'calendar_view.xml',
|
||||
|
|
|
@ -431,11 +431,12 @@ class calendar_alarm_manager(osv.AbstractModel):
|
|||
return res
|
||||
|
||||
def get_next_mail(self, cr, uid, context=None):
|
||||
cron = self.pool.get('ir.cron').search(cr, uid, [('model', 'ilike', self._name)], context=context)
|
||||
if cron and len(cron) == 1:
|
||||
cron = self.pool.get('ir.cron').browse(cr, uid, cron[0], context=context)
|
||||
else:
|
||||
_logger.exception("Cron for " + self._name + " can not be identified !")
|
||||
try:
|
||||
cron = self.pool['ir.model.data'].get_object(
|
||||
cr, uid, 'calendar', 'ir_cron_scheduler_alarm', context=context)
|
||||
except ValueError:
|
||||
_logger.error("Cron for " + self._name + " can not be identified !")
|
||||
return False
|
||||
|
||||
if cron.interval_type == "weeks":
|
||||
cron_interval = cron.interval_number * 7 * 24 * 60 * 60
|
||||
|
@ -447,9 +448,12 @@ class calendar_alarm_manager(osv.AbstractModel):
|
|||
cron_interval = cron.interval_number * 60
|
||||
elif cron.interval_type == "seconds":
|
||||
cron_interval = cron.interval_number
|
||||
else:
|
||||
cron_interval = False
|
||||
|
||||
if not cron_interval:
|
||||
_logger.exception("Cron delay can not be computed !")
|
||||
_logger.error("Cron delay can not be computed !")
|
||||
return False
|
||||
|
||||
all_events = self.get_next_potential_limit_alarm(cr, uid, cron_interval, notif=False, context=context)
|
||||
|
||||
|
@ -574,6 +578,35 @@ class calendar_alarm(osv.Model):
|
|||
'interval': 'hours',
|
||||
}
|
||||
|
||||
def _update_cron(self, cr, uid, context=None):
|
||||
try:
|
||||
cron = self.pool['ir.model.data'].get_object(
|
||||
cr, uid, 'calendar', 'ir_cron_scheduler_alarm', context=context)
|
||||
except ValueError:
|
||||
return False
|
||||
return cron.toggle(model=self._name, domain=[('type', '=', 'email')])
|
||||
|
||||
def create(self, cr, uid, values, context=None):
|
||||
res = super(calendar_alarm, self).create(cr, uid, values, context=context)
|
||||
|
||||
self._update_cron(cr, uid, context=context)
|
||||
|
||||
return res
|
||||
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
res = super(calendar_alarm, self).write(cr, uid, ids, values, context=context)
|
||||
|
||||
self._update_cron(cr, uid, context=context)
|
||||
|
||||
return res
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
res = super(calendar_alarm, self).unlink(cr, uid, ids, context=context)
|
||||
|
||||
self._update_cron(cr, uid, context=context)
|
||||
|
||||
return res
|
||||
|
||||
|
||||
class ir_values(osv.Model):
|
||||
_inherit = 'ir.values'
|
||||
|
|
|
@ -0,0 +1,18 @@
|
|||
<?xml version="1.0"?>
|
||||
<openerp>
|
||||
<data noupdate="1">
|
||||
<!-- Scheduler for Event Alarm-->
|
||||
<record forcecreate="True" id="ir_cron_scheduler_alarm" model="ir.cron">
|
||||
<field name="name">Run Event Reminder</field>
|
||||
<field eval="False" name="active" />
|
||||
<field name="user_id" ref="base.user_root" />
|
||||
<field name="interval_number">30</field>
|
||||
<field name="interval_type">minutes</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'calendar.alarm_manager'" name="model" />
|
||||
<field eval="'get_next_mail'" name="function" />
|
||||
<!--<field eval="'(False,)'" name="args" />-->
|
||||
</record>
|
||||
</data>
|
||||
</openerp>
|
|
@ -72,21 +72,6 @@
|
|||
<field name="type">email</field>
|
||||
</record>
|
||||
|
||||
|
||||
<!-- Scheduler for Event Alarm-->
|
||||
<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">30</field>
|
||||
<field name="interval_type">minutes</field>
|
||||
<field name="numbercall">-1</field>
|
||||
<field eval="False" name="doall" />
|
||||
<field eval="'calendar.alarm_manager'" name="model" />
|
||||
<field eval="'get_next_mail'" name="function" />
|
||||
<!--<field eval="'(False,)'" name="args" />-->
|
||||
</record>
|
||||
|
||||
<record model="calendar.event.type" id="categ_meet1">
|
||||
<field name="name">Customer Meeting</field>
|
||||
</record>
|
||||
|
|
|
@ -56,8 +56,8 @@ For more specific needs, you may also assign custom-defined actions
|
|||
""",
|
||||
'website': 'http://www.openerp.com',
|
||||
'data': [
|
||||
'fetchmail_view.xml',
|
||||
'fetchmail_data.xml',
|
||||
'fetchmail_view.xml',
|
||||
'security/ir.model.access.csv',
|
||||
'fetchmail_installer_view.xml'
|
||||
],
|
||||
|
|
|
@ -251,27 +251,33 @@ openerp_mailgate: "|/path/to/openerp-mailgate.py --host=localhost -u %(uid)d -p
|
|||
server.write({'date': time.strftime(tools.DEFAULT_SERVER_DATETIME_FORMAT)})
|
||||
return True
|
||||
|
||||
def cron_update(self, cr, uid, context=None):
|
||||
if context is None:
|
||||
context = {}
|
||||
if not context.get('fetchmail_cron_running'):
|
||||
# Enabled/Disable cron based on the number of 'done' server of type pop or imap
|
||||
ids = self.search(cr, uid, [('state','=','done'),('type','in',['pop','imap'])])
|
||||
try:
|
||||
cron_id = self.pool.get('ir.model.data').get_object_reference(cr, uid, 'fetchmail', 'ir_cron_mail_gateway_action')[1]
|
||||
self.pool.get('ir.cron').write(cr, 1, [cron_id], {'active': bool(ids)})
|
||||
except ValueError:
|
||||
# Nevermind if default cron cannot be found
|
||||
pass
|
||||
def _update_cron(self, cr, uid, context=None):
|
||||
if context and context.get('fetchmail_cron_running'):
|
||||
return
|
||||
|
||||
try:
|
||||
cron = self.pool['ir.model.data'].get_object(
|
||||
cr, uid, 'fetchmail', 'ir_cron_mail_gateway_action', context=context)
|
||||
except ValueError:
|
||||
# Nevermind if default cron cannot be found
|
||||
return
|
||||
|
||||
# Enabled/Disable cron based on the number of 'done' server of type pop or imap
|
||||
cron.toggle(model=self._name, domain=[('state','=','done'), ('type','in',['pop','imap'])])
|
||||
|
||||
def create(self, cr, uid, values, context=None):
|
||||
res = super(fetchmail_server, self).create(cr, uid, values, context=context)
|
||||
self.cron_update(cr, uid, context=context)
|
||||
self._update_cron(cr, uid, context=context)
|
||||
return res
|
||||
|
||||
def write(self, cr, uid, ids, values, context=None):
|
||||
res = super(fetchmail_server, self).write(cr, uid, ids, values, context=context)
|
||||
self.cron_update(cr, uid, context=context)
|
||||
self._update_cron(cr, uid, context=context)
|
||||
return res
|
||||
|
||||
def unlink(self, cr, uid, ids, context=None):
|
||||
res = super(fetchmail_server, self).unlink(cr, uid, ids, context=context)
|
||||
self._update_cron(cr, uid, context=context)
|
||||
return res
|
||||
|
||||
class mail_mail(osv.osv):
|
||||
|
|
|
@ -294,4 +294,20 @@ class ir_cron(osv.osv):
|
|||
res = super(ir_cron, self).unlink(cr, uid, ids, context=context)
|
||||
return res
|
||||
|
||||
def try_write(self, cr, uid, ids, values, context=None):
|
||||
try:
|
||||
with cr.savepoint():
|
||||
cr.execute("""SELECT id FROM "%s" WHERE id IN %%s FOR UPDATE NOWAIT""" % self._table,
|
||||
(tuple(ids),), log_exceptions=False)
|
||||
except psycopg2.OperationalError:
|
||||
pass
|
||||
else:
|
||||
return super(ir_cron, self).write(cr, uid, ids, values, context=context)
|
||||
return False
|
||||
|
||||
def toggle(self, cr, uid, ids, model, domain, context=None):
|
||||
active = bool(self.pool[model].search_count(cr, uid, domain, context=context))
|
||||
|
||||
return self.try_write(cr, uid, ids, {'active': active}, context=context)
|
||||
|
||||
# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
|
||||
|
|
Loading…
Reference in New Issue