# -*- coding: utf-8 -*- # Copyright 2016 Florent de Labarre # Copyright 2017 Camptocamp # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl) from odoo import api, fields, models class AuthOauthMultiToken(models.Model): """Define a set of tokens.""" _name = 'auth.oauth.multi.token' _description = 'OAuth2 token' _order = 'id desc' EMPTY_OAUTH_TOKEN = '****************************' oauth_access_token = fields.Char( string='OAuth Access Token', readonly=True, copy=False ) user_id = fields.Many2one( comodel_name='res.users', string='User', required=True ) active_token = fields.Boolean('Active') @api.model def create(self, vals): """Override to validate tokens.""" token = super(AuthOauthMultiToken, self).create(vals) token._oauth_validate_multi_token() return token @api.model def _oauth_user_tokens(self, user_id, active=True): """Retrieve tokens for given user. :param user_id: Odoo ID of the user :param active: retrieve active or inactive tokens """ return self.search([ ('user_id', '=', user_id), ('active_token', '=', active) ]) def _oauth_validate_multi_token(self): """Check current user's token and clear them if max number reached.""" user_tokens = self._oauth_user_tokens(self.user_id.id) max_token = self.user_id.oauth_access_max_token if user_tokens and len(user_tokens) > max_token: # clear last token user_tokens[max_token - 1]._oauth_clear_token() @api.multi def _oauth_clear_token(self): """Disable current token records.""" self.write({ 'oauth_access_token': self.EMPTY_OAUTH_TOKEN, 'active_token': False })