Files
suite/hibou_professional/models/update.py
2021-12-18 15:55:38 -08:00

209 lines
8.7 KiB
Python

# Part of Hibou Suite Professional. See LICENSE_PROFESSIONAL file for full copyright and licensing details.
import datetime
import requests
from odoo import api, fields, models, release, _
from odoo.exceptions import UserError
class PublisherWarrantyContract(models.AbstractModel):
_inherit = 'publisher_warranty.contract'
CONFIG_HIBOU_URL = 'https://api.hibou.io/hibouapi/v1/professional'
CONFIG_HIBOU_MESSAGE_URL = 'https://api.hibou.io/hibouapi/v1/professional/message'
CONFIG_HIBOU_QUOTE_URL = 'https://api.hibou.io/hibouapi/v1/professional/quote'
DAYS_ENDING_SOON = 7
@api.model
def hibou_professional_status(self):
get_param = self.env['ir.config_parameter'].sudo().get_param
expiration_date = get_param('database.hibou_professional_expiration_date')
expiration_reason = get_param('database.hibou_professional_expiration_reason')
dbuuid = get_param('database.uuid')
expiring = False
expired = False
if expiration_date:
expiration_date_date = fields.Date.from_string(expiration_date)
today = fields.Date.today()
if expiration_date_date < today:
if expiration_reason == 'trial':
expired = _('Your trial of Hibou Professional has ended.')
else:
expired = _('Your Hibou Professional subscription has ended.')
elif expiration_date_date < (today + datetime.timedelta(days=self.DAYS_ENDING_SOON)):
if expiration_reason == 'trial':
expiring = _('Your trial of Hibou Professional is ending soon.')
else:
expiring = _('Your Hibou Professional subscription is ending soon.')
is_admin = self.env.user.has_group('base.group_erp_manager')
allow_admin_message = get_param('database.hibou_allow_admin_message')
allow_message = get_param('database.hibou_allow_message')
return {
'expiration_date': expiration_date,
'expiration_reason': expiration_reason,
'expiring': expiring,
'expired': expired,
'professional_code': get_param('database.hibou_professional_code'),
'dbuuid': dbuuid,
'is_admin': is_admin,
'allow_admin_message': allow_admin_message,
'allow_message': allow_message,
}
@api.model
def hibou_professional_update_message_preferences(self, allow_admin_message, allow_message):
if self.env.user.has_group('base.group_erp_manager'):
set_param = self.env['ir.config_parameter'].sudo().set_param
set_param('database.hibou_allow_admin_message', allow_admin_message and '1')
set_param('database.hibou_allow_message', allow_message and '1')
return self.hibou_professional_status()
def _check_message_allow(self):
get_param = self.env['ir.config_parameter'].sudo().get_param
allow_message = get_param('database.hibou_allow_message')
if not allow_message:
allow_message = get_param('database.hibou_allow_admin_message') and self.env.user.has_group(
'base.group_erp_manager')
if not allow_message:
raise UserError(_('You are not allowed to send messages at this time.'))
@api.model
def hibou_professional_quote(self):
get_param = self.env['ir.config_parameter'].sudo().get_param
try:
self._hibou_install()
except:
pass
dbuuid = get_param('database.uuid')
dbtoken = get_param('database.hibou_token')
if dbuuid and dbtoken:
return {'url': self.CONFIG_HIBOU_QUOTE_URL + '/%s/%s' % (dbuuid, dbtoken)}
return {}
@api.model
def hibou_professional_send_message(self, type, priority, subject, body, user_url, res_id):
self._check_message_allow()
get_param = self.env['ir.config_parameter'].sudo().get_param
dbuuid = get_param('database.uuid')
dbtoken = get_param('database.hibou_token')
user_name = self.env.user.name
user_email = self.env.user.email or self.env.user.login
company_name = self.env.user.company_id.name
data = {
'jsonrpc': '2.0',
'method': 'call',
'params': {
'dbuuid': dbuuid,
'user_name': user_name,
'user_email': user_email,
'user_url': user_url,
'company_name': company_name,
'type': type,
'priority': priority,
'subject': subject,
'body': body,
'res_id': res_id,
},
}
if dbtoken:
data['params']['dbtoken'] = dbtoken
try:
r = requests.post(self.CONFIG_HIBOU_MESSAGE_URL + '/new', json=data, timeout=30)
r.raise_for_status()
wrapper = r.json()
return wrapper.get('result', {})
except:
return {'error': _('Error sending message.')}
@api.model
def hibou_professional_get_messages(self):
self._check_message_allow()
get_param = self.env['ir.config_parameter'].sudo().get_param
dbuuid = get_param('database.uuid')
dbtoken = get_param('database.hibou_token')
try:
r = requests.get(self.CONFIG_HIBOU_MESSAGE_URL + '/get/%s/%s' % (dbuuid, dbtoken), timeout=30)
r.raise_for_status()
# not jsonrpc
return r.json()
except:
return {'error': _('Error retrieving messages, maybe the token is wrong.')}
@api.model
def hibou_professional_update(self, professional_code):
set_param = self.env['ir.config_parameter'].sudo().set_param
set_param('database.hibou_professional_code', professional_code)
try:
self._hibou_install()
except:
pass
return self.hibou_professional_status()
def _get_hibou_modules(self):
domain = [('state', 'in', ['installed', 'to upgrade', 'to remove']), ('author', 'ilike', 'hibou')]
module_list = self.env['ir.module.module'].sudo().search_read(domain, ['name'])
return {module['name']: 1 for module in module_list}
def _get_hibou_message(self):
IrParamSudo = self.env['ir.config_parameter'].sudo()
dbuuid = IrParamSudo.get_param('database.uuid')
dbtoken = IrParamSudo.get_param('database.hibou_token')
db_create_date = IrParamSudo.get_param('database.create_date')
user = self.env.user.sudo()
professional_code = IrParamSudo.get_param('database.hibou_professional_code')
module_dictionary = self._get_hibou_modules()
modules = []
for module, qty in module_dictionary.items():
modules.append(module if qty == 1 else '%s,%s' % (module, qty))
web_base_url = IrParamSudo.get_param('web.base.url')
msg = {
"dbuuid": dbuuid,
"dbname": self._cr.dbname,
"db_create_date": db_create_date,
"version": release.version,
"language": user.lang,
"web_base_url": web_base_url,
"modules": '\n'.join(modules),
"professional_code": professional_code,
}
if dbtoken:
msg['dbtoken'] = dbtoken
msg.update({'company_' + key: value for key, value in user.company_id.read(["name", "email", "phone"])[0].items() if key != 'id'})
return msg
def _process_hibou_message(self, result):
if result.get('professional_info'):
set_param = self.env['ir.config_parameter'].sudo().set_param
set_param('database.hibou_professional_expiration_date', result['professional_info'].get('expiration_date'))
set_param('database.hibou_professional_expiration_reason', result['professional_info'].get('expiration_reason', 'trial'))
if result['professional_info'].get('professional_code'):
set_param('database.hibou_professional_code', result['professional_info'].get('professional_code'))
if result['professional_info'].get('dbtoken'):
set_param('database.hibou_token', result['professional_info'].get('dbtoken'))
def _hibou_install(self):
data = self._get_hibou_message()
data = {
'jsonrpc': '2.0',
'method': 'call',
'params': data,
}
r = requests.post(self.CONFIG_HIBOU_URL, json=data, timeout=30)
r.raise_for_status()
wrapper = r.json()
self._process_hibou_message(wrapper.get('result', {}))
@api.model
def _get_sys_logs(self):
try:
self._hibou_install()
except:
pass
return super(PublisherWarrantyContract, self)._get_sys_logs()