From 2c32fb9183fa00725b8e7525e9056afd5598c50c Mon Sep 17 00:00:00 2001 From: AjmalCybro Date: Mon, 20 Mar 2023 10:45:08 +0530 Subject: [PATCH] Mar 20 : [UPDT] Bug Fixed 'employee_dynamic_fields' --- employee_dynamic_fields/__init__.py | 14 ++++ employee_dynamic_fields/__manifest__.py | 1 + .../wizard/employee_fields.py | 64 +++++++++++++------ .../wizard/employee_fields_view.xml | 52 +++++++++++++-- 4 files changed, 104 insertions(+), 27 deletions(-) diff --git a/employee_dynamic_fields/__init__.py b/employee_dynamic_fields/__init__.py index 391a73402..17ed61ccb 100644 --- a/employee_dynamic_fields/__init__.py +++ b/employee_dynamic_fields/__init__.py @@ -23,3 +23,17 @@ 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: + print(field.form_view_id,'new') + field.form_view_id.active = False + print(field.form_view_id,'old') + 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 af1f5cd92..e8f304d9d 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 775b6937b..64d92497b 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.""" @@ -43,16 +45,17 @@ class EmployeeDynamicFields(models.TransientModel): view_id = self.env.ref('hr.view_employee_form') view_arch = str(view_id.arch_base) doc = xee.fromstring(view_arch) - print("doc===", doc) field_list = [] for tag in doc.findall('.//field'): - print("tag==", tag) 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): @@ -76,41 +79,51 @@ 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', - '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', + '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', } position_field = fields.Many2one('ir.model.fields', string='Field Name', - domain=set_domain, required=True) + domain=set_domain, required=True, + ondelete='cascade') 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') @@ -120,7 +133,8 @@ 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'])]}} @@ -132,6 +146,14 @@ class EmployeeDynamicFields(models.TransientModel): 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() + class Employee(models.Model): _description = 'Employee' diff --git a/employee_dynamic_fields/wizard/employee_fields_view.xml b/employee_dynamic_fields/wizard/employee_fields_view.xml index a54b3c17f..d1a916e0e 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 +

+
+
+ + + +