class TestEncrypted(models.TransientModel): _name = 'encrypted_fields.test' encrypted = fields.Encrypted() encrypted_password = fields.Encrypted() boolean = fields.Boolean(encrypt='encrypted') integer = fields.Integer(encrypt='encrypted') float = fields.Float(encrypt='encrypted') char = fields.Char(encrypt='encrypted') password = fields.Char(encrypt='encrypted_password') selection = fields.Selection(selection=[('one', 'One'), ('two', 'Two')], encrypt='encrypted') html = fields.Html(encrypt='encrypted') partner = fields.Many2one('res.partner', encrypt='encrypted')
class EncryptedVaultHistory(models.Model): _name = 'encrypted.vault.history' _order = 'create_date desc' encrypted_data = fields.Encrypted() name = fields.Char( string="Name", related="vault_id.name", ) username = fields.Char( string="Username", required=True, encrypt="encrypted_data", ) password = fields.Char( string="Password", required=True, encrypt="encrypted_data", ) uri = fields.Char( string="URI", required=True, encrypt="encrypted_data", ) create_date = fields.Datetime( comodel_name='Create Date', readonly=True ) user_id = fields.Many2one( comodel_name='res.users', string='Modified by', readonly=True, ) vault_id = fields.Many2one( comodel_name="encrypted.vault", string="Vault", required=True, ondelete="cascade", ) @api.multi def restore(self): self.ensure_one() self.vault_id.write({ 'username': self.username, 'password': self.password, 'uri': self.uri, })
class IFIEmployee(models.Model): _inherit = "hr.employee" encrypted = fields.Encrypted() # name = fields.Char(related='resource_id.name', store=True, oldname='name_related', readonly=False, encrypt='encrypted') birthday = fields.Date('Date of Birth', groups="hr.group_hr_user") # skype = fields.Char(string='Skype', encrypt='encrypted') skype = fields.Char(string='Skype') job_title = fields.Char("Job Title", required=True) work_email = fields.Char('Work Email') department_id = fields.Many2one('hr.department', string='Department', required=True) staff_id = fields.Char(string='Staff ID') state = fields.Selection([ ('working', 'Working'), ('resigning', 'Resigning'), ('terminated', 'Terminated'), ('permanent', 'Permanent'), ('maternity', 'Maternity'), ], string="State", default='working', track_visibility='onchange') employment_status = fields.Selection([('internship', 'Internship'), ('probation', 'Probation'), ('permanent', 'Permanent')], default='permanent', track_visibility='onchange') staff_code = fields.Char() @api.model def create(self, vals): res = super(IFIEmployee, self).create(vals) if not vals.get('user_id', False): # user_id = self.env['res.users'].create({'name': res.name, 'login': res.work_email}) user_id = self.with_context( default_customer=False).env['res.users'].create({ 'name': res.name, 'login': res.work_email }) if user_id: res.user_id = user_id res.work_email = user_id.login user_id.partner_id.email = user_id.login return res
class EncryptedVaultCustomField(models.Model): _name = 'encrypted.vault.custom.field' encrypted_data = fields.Encrypted() name = fields.Char( string="Name", required=True, encrypt="encrypted_data", ) type = fields.Selection( selection=FIELD_TYPES, string="Type", default='text', required=True, encrypt="encrypted_data" ) vault_id = fields.Many2one( comodel_name="encrypted.vault", string="Vault", required=True, ondelete="cascade", ) text = fields.Char( string="Value", encrypt="encrypted_data" ) hidden = fields.Char( string="Value", encrypt="encrypted_data" ) boolean = fields.Boolean( string="Value", encrypt="encrypted_data" ) @api.onchange("type") def _on_type_change(self): for record in self: if not record.type: continue for t in FIELD_TYPES: if record.type != t[0]: record[record.type] = False
class EncryptedVault(models.Model): _name = 'encrypted.vault' @api.model def random_password(self, pass_len=False): get_param = self.env['ir.config_parameter'].sudo().get_param pass_len = pass_len if pass_len else literal_eval( get_param('encrypted_vault.encrypted_vault_password_length')) characters = "" use_digits = literal_eval( get_param('encrypted_vault.encrypted_vault_use_digits')) use_letters = literal_eval( get_param('encrypted_vault.encrypted_vault_use_letters')) use_special = literal_eval( get_param('encrypted_vault.encrypted_vault_use_special')) if use_digits: characters += digits if use_special: characters += "!@#$%^&*()=" if use_letters: characters += ascii_letters if not characters: characters += ascii_letters + digits password = ''.join(choice(characters) for x in range(pass_len)) return password encrypted_data = fields.Encrypted() name = fields.Char(required=True, ) username = fields.Char(required=False, ) password = fields.Char(required=False, encrypt="encrypted_data", default=random_password) uri = fields.Char( string="URI", required=False, ) notes = fields.Text(encrypt="encrypted_data", ) # This will be implemented in future. # uri_ids = fields.One2many( # comodel_name="encrypted.vault.uri", # inverse_name="vault_id", # string="URIs", # required=False, # ) history_ids = fields.One2many( comodel_name="encrypted.vault.history", inverse_name="vault_id", string="History", required=False, ) history_count = fields.Integer(compute='_compute_history_count', ) custom_field_ids = fields.One2many( comodel_name="encrypted.vault.custom.field", inverse_name="vault_id", string="Custom Fields", required=False, copy=True, ) @api.multi def _compute_history_count(self): for vault in self: vault.history_count = len(vault.history_ids) @api.multi def write(self, vals): if any(key in vals for key in self.get_history_fields()): for record in self: self.env["encrypted.vault.history"].sudo() \ .create(self.prepare_history_vals(record)) return super(EncryptedVault, self).write(vals) @api.model def get_history_fields(self): return ["username", "password", "uri"] @api.model def prepare_history_vals(self, record): return { "user_id": self.env.uid, "vault_id": record.id, "username": record.username, "password": record.password, "uri": record.uri, } @api.multi def random_password_button(self): self.ensure_one() self.password = self.random_password()