【Odoo】增加自定义字段--加密字段

自定义秘文保存在数据库的隐私数据

字段基于Char类型

加密方法采用Fernet

from cryptography.fernet import Fernet

def encrypt(key, text):
    cipher = Fernet(key)
    return cipher.encrypt(text.encode()).decode()


def decrypt(key, encrypted_text):
    # 解密
    cipher = Fernet(key)
    return cipher.decrypt(encrypted_text).decode()


class SecretChar(fields.Char):

    secretkey = tools.config.get('secretkey', '').encode()
    _slots = {"_secretkey": secretkey}

    def __init__(self, *args, **kwargs):
        if not self.secretkey:
            tools.config['secretkey'] = Fernet.generate_key().decode()
            _logger.info('init secretkey %s', tools.config['secretkey'])
            tools.config.save()
        return super(SecretChar, self).__init__(*args, **kwargs)

    def write(self, records, value):
        records.env.remove_to_compute(self, records)
        cache = records.env.cache
        cache_value = value
        records = cache.get_records_different_from(records, self, cache_value)
        if not records:
            return records
        cache.update(records, self, [cache_value] * len(records))
        if self.store:
            towrite = records.env.all.towrite[self.model_name]
            record = records[:1]
            column_value = self.convert_to_column(cache_value, record)
            for record in records.filtered('id'):
                towrite[record.id][self.name] = column_value
        return records

    def convert_to_column(self, value, record, values=None, validate=True):
        return encrypt(self.secretkey, value) if value else ''

    def convert_to_read(self, value, record, use_name_get=True):
        return decrypt(self.secretkey, value.encode()) if value else ''

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值