You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
79 lines
3.4 KiB
79 lines
3.4 KiB
# Copyright (C) 2019 Open Source Integrators
|
|
# <https://www.opensourceintegrators.com>
|
|
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl).
|
|
|
|
|
|
from odoo import api, fields, models
|
|
from datetime import datetime, timedelta
|
|
from odoo.tools import DEFAULT_SERVER_DATETIME_FORMAT
|
|
from pytz import timezone
|
|
|
|
|
|
class BackendVoicent(models.Model):
|
|
_name = 'backend.voicent'
|
|
_description = 'Voicent Backend'
|
|
_inherit = ['connector.backend']
|
|
|
|
name = fields.Char(string='Name', required=True)
|
|
host = fields.Char(string='Host', default='localhost', required=True)
|
|
port = fields.Integer(string='Port', default='8155', required=True)
|
|
callerid = fields.Char(string='Caller ID', required=True)
|
|
line = fields.Integer(string='Number of lines', required=True)
|
|
next_call = fields.Datetime(string='Next Call', copy=False)
|
|
call_line_ids = fields.One2many(
|
|
string='Call Lines',
|
|
comodel_name='backend.voicent.call.line',
|
|
inverse_name='backend_id')
|
|
time_line_ids = fields.One2many(
|
|
string='Call Times',
|
|
comodel_name='backend.voicent.time.line',
|
|
inverse_name='backend_id')
|
|
active = fields.Boolean('Active', default=True)
|
|
|
|
@api.model
|
|
def _run_update_next_call(self):
|
|
""" This method is called from a cron job. """
|
|
|
|
cr_time_list = []
|
|
backends = self.search([('active', '=', True)])
|
|
for backend in backends:
|
|
current_dt = datetime.now(timezone('UTC'))
|
|
user_tz = timezone(
|
|
self.env.context.get('tz') or self.env.user.tz or 'UTC')
|
|
dt_value = current_dt.astimezone(user_tz)
|
|
convt_dt_strf = dt_value.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
|
|
convt_dt = datetime.strptime(
|
|
convt_dt_strf,
|
|
DEFAULT_SERVER_DATETIME_FORMAT)
|
|
current_time = convt_dt.strftime("%H:%M")
|
|
for time_line_rec in backend.time_line_ids:
|
|
hours, minutes = divmod(abs(time_line_rec.time) * 60, 60)
|
|
minutes = round(minutes)
|
|
if minutes == 60:
|
|
minutes = 0
|
|
hours += 1
|
|
line_time = '%02d:%02d' % (hours, minutes)
|
|
cr_time_list.append(line_time)
|
|
cr_time_list = sorted(cr_time_list)
|
|
next_call = False
|
|
for time_entry in cr_time_list:
|
|
if time_entry > current_time:
|
|
next_call = datetime.now().replace(
|
|
hour=int(time_entry.split(':')[0]),
|
|
minute=int(time_entry.split(':')[1]),
|
|
second=0)
|
|
break
|
|
if not next_call:
|
|
next_call = datetime.now().replace(
|
|
hour=int(cr_time_list[0].split(':')[0]),
|
|
minute=int(cr_time_list[0].split(':')[1]),
|
|
second=0) + timedelta(
|
|
days=0)
|
|
next_call_tz = timezone(self.env.context.get('tz') or
|
|
self.env.user.tz).localize(next_call,
|
|
is_dst=False)
|
|
next_call_utc = next_call_tz.astimezone(timezone('UTC'))
|
|
next_call_utc = datetime.strptime(
|
|
fields.Datetime.to_string(next_call_utc),
|
|
DEFAULT_SERVER_DATETIME_FORMAT)
|
|
backend.next_call = fields.Datetime.to_string(next_call_utc)
|