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.
130 lines
4.2 KiB
130 lines
4.2 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
|
|
from ..examples import voicent
|
|
|
|
|
|
class BackendVoicent(models.Model):
|
|
_name = 'backend.voicent'
|
|
_description = 'Voicent Backend'
|
|
_inherit = ['connector.backend']
|
|
_rec_name = 'host'
|
|
|
|
host = fields.Char(
|
|
string='Host',
|
|
required=True,
|
|
)
|
|
port = fields.Integer(
|
|
string='Port',
|
|
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',
|
|
)
|
|
is_active = fields.Boolean('Is Active')
|
|
|
|
@api.model
|
|
def _run_check_the_voicent_status(self):
|
|
''' This method is called from a cron job. '''
|
|
|
|
cr_time_list = []
|
|
is_next_day = False
|
|
backend_voicent_rec = self.search([('is_active', '=', True)])
|
|
for backend_voicent in backend_voicent_rec:
|
|
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_voicent.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 = datetime.now()
|
|
for each_time_entry in cr_time_list:
|
|
if each_time_entry > current_time and not is_next_day:
|
|
next_call = datetime.now().replace(
|
|
hour=int(each_time_entry.split(':')[0]),
|
|
minute=int(each_time_entry.split(':')[1]))
|
|
is_next_day = True
|
|
if cr_time_list and not is_next_day:
|
|
next_call = datetime.now().replace(
|
|
hour=int(cr_time_list[0].split(':')[0]),
|
|
minute=int(cr_time_list[0].split(':')[1])) + timedelta(
|
|
days=1)
|
|
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_voicent.next_call = fields.Datetime.to_string(
|
|
next_call_utc)
|
|
|
|
|
|
class BackendVoicentTimeLine(models.Model):
|
|
_name = 'backend.voicent.time.line'
|
|
_description = 'Voicent Backend Time Line'
|
|
|
|
name = fields.Char(
|
|
string='Name',
|
|
required=True,
|
|
)
|
|
time = fields.Float(
|
|
string='Time',
|
|
copy=False,
|
|
)
|
|
backend_id = fields.Many2one(
|
|
string='Backend',
|
|
comodel_name='backend.voicent',
|
|
ondelete='set null',
|
|
)
|
|
|
|
|
|
class BackendVoicentCallLine(models.Model):
|
|
_name = 'backend.voicent.call.line'
|
|
_description = 'Voicent Backend Call Line'
|
|
|
|
name = fields.Char(
|
|
string='Name',
|
|
required=True,
|
|
)
|
|
applies_on = fields.Selection(
|
|
string='Applies on',
|
|
selection=[],
|
|
)
|
|
voicent_app = fields.Char(
|
|
string='Voicent App',
|
|
)
|
|
backend_id = fields.Many2one(
|
|
string='Backend',
|
|
comodel_name='backend.voicent',
|
|
ondelete='set null',
|
|
)
|