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.
88 lines
2.6 KiB
88 lines
2.6 KiB
# -*- coding: utf-8 -*-
|
|
# Copyright 2017 LasLabs Inc.
|
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/lgpl.html).
|
|
|
|
from datetime import datetime
|
|
|
|
from odoo import api, fields, models
|
|
from odoo.addons.bus.models.bus_presence import AWAY_TIMER, DISCONNECTION_TIMER
|
|
|
|
from ..status_constants import ONLINE, AWAY, OFFLINE
|
|
|
|
|
|
class BusPresence(models.Model):
|
|
|
|
_inherit = 'bus.presence'
|
|
|
|
status_realtime = fields.Selection(
|
|
selection=[
|
|
(ONLINE, 'Online'),
|
|
(AWAY, 'Away'),
|
|
(OFFLINE, 'Offline')
|
|
],
|
|
string='Realtime IM Status',
|
|
compute='_compute_status_realtime',
|
|
help='Status that is affected by disconnection '
|
|
'and away timers. Used to override the bus.presence '
|
|
'status field in _get_partners_statuses or '
|
|
'_get_users_statuses if the timers have been reached. '
|
|
'If wanting to change the user status, write '
|
|
'directly to the status field.',
|
|
)
|
|
partner_id = fields.Many2one(
|
|
string='Partner',
|
|
related='user_id.partner_id',
|
|
comodel_name='res.partner',
|
|
)
|
|
|
|
@api.multi
|
|
def _get_partners_statuses(self):
|
|
self._status_check_disconnection_and_away_timers()
|
|
return {rec.partner_id.id: rec.status for rec in self}
|
|
|
|
@api.multi
|
|
def _get_users_statuses(self):
|
|
self._status_check_disconnection_and_away_timers()
|
|
return {rec.user_id.id: rec.status for rec in self}
|
|
|
|
@api.multi
|
|
def _status_check_disconnection_and_away_timers(self):
|
|
""" Overrides user-defined status if timers reached """
|
|
for record in self:
|
|
|
|
status_realtime = record.status_realtime
|
|
status_stored = record.status
|
|
|
|
conditions = (
|
|
status_realtime == OFFLINE,
|
|
status_realtime == AWAY and status_stored == ONLINE,
|
|
)
|
|
|
|
if any(conditions):
|
|
record.status = status_realtime
|
|
|
|
@api.multi
|
|
def _compute_status_realtime(self):
|
|
|
|
now_dt = datetime.now()
|
|
|
|
for record in self:
|
|
|
|
last_poll = fields.Datetime.from_string(
|
|
record.last_poll
|
|
)
|
|
last_presence = fields.Datetime.from_string(
|
|
record.last_presence
|
|
)
|
|
|
|
last_poll_s = (now_dt - last_poll).total_seconds()
|
|
last_presence_s = (now_dt - last_presence).total_seconds()
|
|
|
|
if last_poll_s > DISCONNECTION_TIMER:
|
|
record.status_realtime = OFFLINE
|
|
|
|
elif last_presence_s > AWAY_TIMER:
|
|
record.status_realtime = AWAY
|
|
|
|
else:
|
|
record.status_realtime = ONLINE
|