Files
Odoo-Modules/fusion_api/models/api_key.py
gsinghpal e56974d46f update
2026-03-16 08:14:56 -04:00

106 lines
3.6 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
from odoo import models, fields, api, _
from odoo.exceptions import UserError
class FusionApiKey(models.Model):
_name = 'fusion.api.key'
_description = 'API Key'
_order = 'provider_id, is_default desc, name'
provider_id = fields.Many2one(
'fusion.api.provider', required=True, ondelete='cascade',
)
provider_type = fields.Selection(
related='provider_id.provider_type', store=True, readonly=True,
)
name = fields.Char(required=True, string='Label')
api_key = fields.Char(string='API Key', groups='fusion_api.group_admin')
client_id = fields.Char(groups='fusion_api.group_admin')
client_secret = fields.Char(groups='fusion_api.group_admin')
access_token = fields.Char(groups='fusion_api.group_admin')
refresh_token = fields.Char(groups='fusion_api.group_admin')
token_expiry = fields.Datetime()
redirect_uri = fields.Char()
environment = fields.Selection([
('production', 'Production'),
('sandbox', 'Sandbox'),
], default='production', required=True)
is_active = fields.Boolean(default=True)
is_default = fields.Boolean(default=False)
last_validated_at = fields.Datetime(readonly=True)
validation_status = fields.Selection([
('unknown', 'Not Validated'),
('valid', 'Valid'),
('invalid', 'Invalid'),
], default='unknown', readonly=True)
notes = fields.Text()
masked_key = fields.Char(compute='_compute_masked_key')
company_id = fields.Many2one('res.company', default=lambda self: self.env.company)
@api.depends('api_key')
def _compute_masked_key(self):
for rec in self:
key = rec.api_key
if key and len(key) > 8:
rec.masked_key = key[:4] + '*' * (len(key) - 8) + key[-4:]
elif key:
rec.masked_key = '****'
else:
rec.masked_key = ''
@api.constrains('is_default', 'provider_id', 'environment')
def _check_single_default(self):
for rec in self:
if rec.is_default:
duplicates = self.search([
('provider_id', '=', rec.provider_id.id),
('environment', '=', rec.environment),
('is_default', '=', True),
('id', '!=', rec.id),
])
if duplicates:
raise UserError(_(
"Only one default key per provider per environment. "
"Key '%(other)s' is already the default.",
other=duplicates[0].name,
))
def action_validate(self):
self.ensure_one()
try:
self.env['fusion.api.service']._validate_key(self)
self.write({
'last_validated_at': fields.Datetime.now(),
'validation_status': 'valid',
})
return {
'type': 'ir.actions.client',
'tag': 'display_notification',
'params': {
'title': _('Validation Successful'),
'message': _('API key is valid and working.'),
'type': 'success',
'sticky': False,
},
}
except UserError as e:
self.write({'validation_status': 'invalid'})
raise
def write(self, vals):
if 'api_key' in vals and not vals['api_key']:
for rec in self:
if rec.api_key:
vals.pop('api_key')
break
return super().write(vals)