# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). import logging from lxml import etree from odoo.osv.orm import setup_modifiers from odoo import _, api, models from odoo.exceptions import ValidationError from odoo.tools.config import config _logger = logging.getLogger(__name__) class ServerEnvMixin(models.AbstractModel): _inherit = "server.env.mixin" def _compute_server_env_from_default(self, field_name, options): """ First return database encrypted value then default value """ self.ensure_one() encrypted_data_name = "{},{}".format(self._name, self.id) env = self.env.context.get("environment", None) vals = ( self.env["encrypted.data"] .sudo() ._encrypted_read_json(encrypted_data_name, env=env) ) if vals.get(field_name): self[field_name] = vals[field_name] else: return super()._compute_server_env_from_default(field_name, options) def _inverse_server_env(self, field_name): """ When this module is installed, we store values into encrypted data env instead of a default field in database (not env dependent). """ is_editable_field = self._server_env_is_editable_fieldname(field_name) encrypted_data_obj = self.env["encrypted.data"].sudo() env = self.env.context.get("environment", None) for record in self: if record[is_editable_field]: encrypted_data_name = "{},{}".format(record._name, record.id) values = encrypted_data_obj._encrypted_read_json( encrypted_data_name, env=env ) new_val = {field_name: record[field_name]} values.update(new_val) encrypted_data_obj._encrypted_store_json( encrypted_data_name, values, env=env ) def action_change_env_data_encrypted_fields(self): action_id = self.env.context.get("params", {}).get("action") if not action_id: # We don't know which action we are using... take default one action = self.get_formview_action() else: action = self.env["ir.actions.act_window"].browse(action_id).read()[0] action["view_mode"] = "form" action["res_id"] = self.id views_form = [] for view_id, view_type in action.get("views", []): if view_type == "form": views_form.append((view_id, view_type)) action["views"] = views_form return action def _get_extra_environment_info_div(self, current_env, extra_envs): # TODO we could use a qweb template here button_div = "