diff --git a/employee_dynamic_fields/__init__.py b/employee_dynamic_fields/__init__.py index 350976f47..b95857f0e 100644 --- a/employee_dynamic_fields/__init__.py +++ b/employee_dynamic_fields/__init__.py @@ -23,3 +23,15 @@ from . import models from . import wizard + +from odoo import api, SUPERUSER_ID + + +def uninstall_hook(cr, registry): + env = api.Environment(cr, SUPERUSER_ID, {}) + fields = env['employee.dynamic.fields'].search([]) + for field in fields: + field.form_view_id.active = False + query = """delete FROM ir_model_fields WHERE name = %s""" + env.cr.execute(query, [field.name]) + fields.unlink() diff --git a/employee_dynamic_fields/__manifest__.py b/employee_dynamic_fields/__manifest__.py index 5fe9a553a..c0f983b06 100644 --- a/employee_dynamic_fields/__manifest__.py +++ b/employee_dynamic_fields/__manifest__.py @@ -45,4 +45,5 @@ 'installable': True, 'auto_install': False, 'application': False, + 'uninstall_hook': 'uninstall_hook', } diff --git a/employee_dynamic_fields/wizard/employee_fields.py b/employee_dynamic_fields/wizard/employee_fields.py index 253a812f1..237f5d202 100644 --- a/employee_dynamic_fields/wizard/employee_fields.py +++ b/employee_dynamic_fields/wizard/employee_fields.py @@ -30,6 +30,8 @@ class EmployeeDynamicFields(models.TransientModel): _description = 'Dynamic Fields' _inherit = 'ir.model.fields' + form_view_id = fields.Many2one('ir.ui.view', string="Form View ID") + @api.model def get_possible_field_types(self): """Return all available field types other than 'one2many' and 'reference' fields.""" @@ -49,11 +51,14 @@ class EmployeeDynamicFields(models.TransientModel): pass else: field_list.append(tag.attrib['name']) - model_id = self.env['ir.model'].sudo().search([('model', '=', 'hr.employee')]) - return [('model_id', '=', model_id.id), ('state', '=', 'base'), ('name', 'in', field_list)] + model_id = self.env['ir.model'].sudo().search( + [('model', '=', 'hr.employee')]) + return [('model_id', '=', model_id.id), ('state', '=', 'base'), + ('name', 'in', field_list)] def _set_default(self): - model_id = self.env['ir.model'].sudo().search([('model', '=', 'hr.employee')]) + model_id = self.env['ir.model'].sudo().search( + [('model', '=', 'hr.employee')]) return [('id', '=', model_id.id)] def create_fields(self): @@ -77,22 +82,26 @@ class EmployeeDynamicFields(models.TransientModel): '' '' '' - '') % (self.position_field.name, self.position, self.name) + '') % ( + self.position_field.name, self.position, self.name) if self.widget: arch_base = _('' '' '' '' '' - '') % (self.position_field.name, self.position, self.name, self.widget.name) + '') % ( + self.position_field.name, self.position, self.name, + self.widget.name) - self.env['ir.ui.view'].sudo().create({'name': 'employee.dynamic.fields.%s' % self.name, - 'type': 'form', - 'model': 'hr.employee', - 'mode': 'extension', - 'inherit_id': inherit_id.id, - 'arch_base': arch_base, - 'active': True}) + self.form_view_id = self.env['ir.ui.view'].sudo().create( + {'name': 'employee.dynamic.fields.%s' % self.name, + 'type': 'form', + 'model': 'hr.employee', + 'mode': 'extension', + 'inherit_id': inherit_id.id, + 'arch_base': arch_base, + 'active': True}) return { 'type': 'ir.actions.client', 'tag': 'reload', @@ -101,17 +110,22 @@ class EmployeeDynamicFields(models.TransientModel): position_field = fields.Many2one('ir.model.fields', string='Field Name', domain=set_domain, required=True) position = fields.Selection([('before', 'Before'), - ('after', 'After')], string='Position', required=True) - model_id = fields.Many2one('ir.model', string='Model', required=True, index=True, ondelete='cascade', - help="The model this field belongs to", domain=_set_default) + ('after', 'After')], string='Position', + required=True) + model_id = fields.Many2one('ir.model', string='Model', required=True, + index=True, ondelete='cascade', + help="The model this field belongs to", + domain=_set_default) ref_model_id = fields.Many2one('ir.model', string='Model', index=True) # In odoo 13 the field 'selection' is deprecated, so adding a new field to get the selection values. selection_field = fields.Char(string="Selection Options") rel_field = fields.Many2one('ir.model.fields', string='Related Field') - field_type = fields.Selection(selection='get_possible_field_types', string='Field Type', required=True) + field_type = fields.Selection(selection='get_possible_field_types', + string='Field Type', required=True) ttype = fields.Selection(string="Field Type", related='field_type') widget = fields.Many2one('employee.field.widgets', string='Widget') - groups = fields.Many2many('res.groups', 'employee_dynamic_fields_group_rel', 'field_id', 'group_id') + groups = fields.Many2many('res.groups', 'employee_dynamic_fields_group_rel', + 'field_id', 'group_id') extra_features = fields.Boolean(string="Show Extra Properties") @api.depends('field_type') @@ -121,9 +135,11 @@ class EmployeeDynamicFields(models.TransientModel): if self.field_type == 'binary': return {'domain': {'widget': [('name', '=', 'image')]}} elif self.field_type == 'many2many': - return {'domain': {'widget': [('name', 'in', ['many2many_tags', 'binary'])]}} + return {'domain': { + 'widget': [('name', 'in', ['many2many_tags', 'binary'])]}} elif self.field_type == 'selection': - return {'domain': {'widget': [('name', 'in', ['radio', 'priority'])]}} + return {'domain': { + 'widget': [('name', 'in', ['radio', 'priority'])]}} elif self.field_type == 'float': return {'domain': {'widget': [('name', '=', 'monetary')]}} elif self.field_type == 'many2one': @@ -131,3 +147,11 @@ class EmployeeDynamicFields(models.TransientModel): else: return {'domain': {'widget': [('id', '=', False)]}} return {'domain': {'widget': [('id', '=', False)]}} + + def unlink(self): + if self.form_view_id: + self.form_view_id.active = False + for field in self: + query = """delete FROM ir_model_fields WHERE name = %s""" + self.env.cr.execute(query, [field.name]) + return super(EmployeeDynamicFields, self).unlink() diff --git a/employee_dynamic_fields/wizard/employee_fields_view.xml b/employee_dynamic_fields/wizard/employee_fields_view.xml index a54b3c17f..606a68a72 100644 --- a/employee_dynamic_fields/wizard/employee_fields_view.xml +++ b/employee_dynamic_fields/wizard/employee_fields_view.xml @@ -11,14 +11,19 @@ - - + + - - - + @@ -46,7 +52,8 @@ @@ -54,6 +61,18 @@ + + employee.dynamic.fields.tree + employee.dynamic.fields + + + + + + + + + Create Custom Fields employee.dynamic.fields @@ -62,6 +81,19 @@ new + + Delete Fields + employee.dynamic.fields + tree + + + + Delete created custom fields + + + + + +
+ Delete created custom fields +