from odoo import models, _ from odoo.exceptions import UserError class Base(models.AbstractModel): _inherit = 'base' def unlink(self): if not self.env.context.get('module_uninstall'): self._check_survey_record_creation_references() return super().unlink() def _check_survey_record_creation_references(self): if not self or self._name in ( 'survey.record.creation.field.values', 'survey.record.creation.field.values.x2m', ): return FieldValues = self.env['survey.record.creation.field.values'].sudo() if not FieldValues.search_count([('field_id.relation', '=', self._name)], limit=1): return references = [f"{self._name},{record.id}" for record in self] used_in_m2o = FieldValues.search([ ('fixed_value_many2one', 'in', references), ]) used_in_m2m = self.env['survey.record.creation.field.values.x2m'].sudo().search([ ('value_reference', 'in', references), ]) if not used_in_m2o and not used_in_m2m: return usages = set() for fv in used_in_m2o: usages.add(( fv.survey_id.display_name or '', fv.field_id.field_description or fv.field_id.name or '', fv.fixed_value_many2one.display_name or '', )) for fvx in used_in_m2m: parent = fvx.survey_record_creation_field_values_id usages.add(( parent.survey_id.display_name or '', parent.field_id.field_description or parent.field_id.name or '', fvx.value_reference.display_name or '', )) usage_lines = '\n'.join( '- ' + _( 'Survey "%(survey)s", field "%(field)s" (value: %(value)s)', survey=survey, field=field, value=value, ) for survey, field, value in sorted(usages) ) raise UserError(_( 'Cannot delete this record because it is used as a default value ' 'in the following survey record creation configurations:\n\n' '%(usages)s\n\n' 'Please update or remove the corresponding survey configuration first.', usages=usage_lines, ))