import datetime from openerp import api, exceptions, fields, models, tools from openerp.tools.translate import _ class FetchMailServer(models.Model): _inherit = "fetchmail.server" _name = "fetchmail.server" _last_updated = None run_time = fields.Datetime(string="Launch time") def _run_time(self): if not self._last_updated: self._last_updated = tools.datetime.now() src_tstamp_str = self._last_updated.strftime( tools.misc.DEFAULT_SERVER_DATETIME_FORMAT ) src_format = tools.misc.DEFAULT_SERVER_DATETIME_FORMAT dst_format = tools.misc.DEFAULT_SERVER_DATETIME_FORMAT dst_tz_name = self._context.get("tz") or self.env.user.tz _now = tools.misc.server_to_local_timestamp( src_tstamp_str, src_format, dst_format, dst_tz_name ) return _now @api.model def _fetch_mails(self): if self._context.get("run_fetchmail_manually"): # if interval less than 5 seconds if self._last_updated and ( datetime.datetime.now() - self._last_updated ) < datetime.timedelta(0, 5): raise exceptions.Warning( _("Error"), _("Task can be started no earlier than 5 seconds.") ) super(FetchMailServer, self)._fetch_mails() res = ( self.env["fetchmail.server"] .sudo() .with_context(tz=self.env.user.tz) .search([("state", "=", "done")]) ) if res: res[0].run_time = self._run_time() class FetchMailImmediately(models.AbstractModel): _name = "fetch_mail.imm" @api.model def get_last_update_time(self): res = ( self.env["fetchmail.server"] .sudo() .with_context(tz=self.env.user.tz) .search([("state", "=", "done")]) ) array = [r.run_time for r in res] if array: return array[0] else: return None @api.model def run_fetchmail_manually(self): fetchmail_task = self.env.ref("fetchmail.ir_cron_mail_gateway_action") fetchmail_model = self.env["fetchmail.server"].sudo() fetchmail_task._try_lock() fetchmail_model.with_context(run_fetchmail_manually=True)._fetch_mails()