diff --git a/employee_dynamic_fields/README.rst b/employee_dynamic_fields/README.rst index 970527b95..e65894df1 100644 --- a/employee_dynamic_fields/README.rst +++ b/employee_dynamic_fields/README.rst @@ -12,25 +12,28 @@ Configuration - www.odoo.com/documentation/16.0/setup/install.html - Install our custom addon +Company +------- +* `Cybrosys Techno Solutions `__ + License ------- GNU AFFERO GENERAL PUBLIC LICENSE, Version 3 (AGPLv3) (https://www.gnu.org/licenses/agpl-3.0-standalone.html) -Company -------- -* `Cybrosys Techno Solutions `__ - Credits ------- -* Developers: V14: Minhaj T, Contact: odoo@cybrosys.com - V15: Musthafa C, Contact: odoo@cybrosys.com - V16: Viswanth K, Contact: odoo@cybrosys.com - V17: Sruthi Pavithran, Contact: odoo@cybrosys.com +* Developers: + (V14) Minhaj T, + (V15) Musthafa C, + (V16) Viswanth K, + (V17) Sruthi Pavithran + Contact: odoo@cybrosys.com Contacts -------- -* Contact : odoo@cybrosys.com +* Mail Contact : odoo@cybrosys.com +* Website : https://cybrosys.com Bug Tracker ----------- diff --git a/employee_dynamic_fields/__init__.py b/employee_dynamic_fields/__init__.py index d2f22105f..ad69b6c4b 100644 --- a/employee_dynamic_fields/__init__.py +++ b/employee_dynamic_fields/__init__.py @@ -20,21 +20,4 @@ # ############################################################################# from . import models -from . import wizard - -from odoo import api, SUPERUSER_ID - - -def uninstall_hook(cr, registry): - """ - It deactivates associated form views, deletes records from the - 'ir_model_fields' table, and unlinks the 'employee.dynamic.fields' - records. - """ - 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() +from . import wizards diff --git a/employee_dynamic_fields/__manifest__.py b/employee_dynamic_fields/__manifest__.py index d2c9f5ed1..478808f8f 100644 --- a/employee_dynamic_fields/__manifest__.py +++ b/employee_dynamic_fields/__manifest__.py @@ -24,8 +24,8 @@ 'version': '17.0.1.0.0', 'category': 'Extra Tools', 'summary': """Ability To Add Custom Fields in Employee From User Level""", - 'description': """Ability To Add Custom Fields in Employee From User Level, - Create/Delete Employee Custom Fields.""", + 'description': """ Dynamic Fields module helps with easy creation of custom + fields in employee without any coding""", 'author': 'Cybrosys Techno Solutions', 'company': 'Cybrosys Techno Solutions', 'maintainer': 'Cybrosys Techno Solutions', @@ -34,14 +34,13 @@ 'data': [ 'security/employee_dynamic_fields_groups.xml', 'security/ir.model.access.csv', - 'data/employee_field_widgets.xml', + 'data/employee_field_widgets_data.xml', 'views/ir_model_fields_views.xml', - 'wizard/employee_fields_wizard.xml' + 'wizards/employee_dynamic_fields_views.xml' ], 'images': ['static/description/banner.jpg'], 'license': 'AGPL-3', 'installable': True, 'auto_install': False, 'application': False, - 'uninstall_hook': 'uninstall_hook', } diff --git a/employee_dynamic_fields/data/employee_field_widgets.xml b/employee_dynamic_fields/data/employee_field_widgets_data.xml similarity index 100% rename from employee_dynamic_fields/data/employee_field_widgets.xml rename to employee_dynamic_fields/data/employee_field_widgets_data.xml diff --git a/employee_dynamic_fields/doc/RELEASE_NOTES.md b/employee_dynamic_fields/doc/RELEASE_NOTES.md index 3b05023f6..368a774a6 100644 --- a/employee_dynamic_fields/doc/RELEASE_NOTES.md +++ b/employee_dynamic_fields/doc/RELEASE_NOTES.md @@ -1,6 +1,6 @@ ## Module -#### 02.11.2023 +#### 29.02.2024 #### Version 17.0.1.0.0 ##### ADD -- Initial Commit for employee_dynamic_fields +- Initial Commit for Employee Dynamic Fields diff --git a/employee_dynamic_fields/models/__init__.py b/employee_dynamic_fields/models/__init__.py index 35617312c..bdc75ddab 100644 --- a/employee_dynamic_fields/models/__init__.py +++ b/employee_dynamic_fields/models/__init__.py @@ -20,4 +20,5 @@ # ############################################################################# from . import employee_field_widgets +from . import hr_employee from . import ir_model_fields diff --git a/employee_dynamic_fields/models/employee_field_widgets.py b/employee_dynamic_fields/models/employee_field_widgets.py index eefd48b97..b33ce4177 100644 --- a/employee_dynamic_fields/models/employee_field_widgets.py +++ b/employee_dynamic_fields/models/employee_field_widgets.py @@ -23,12 +23,11 @@ from odoo import fields, models class EmployeeFieldWidgets(models.Model): - """We can't filter a selection field dynamically - so when we select a field its widgets also need to change according to - the selected field type, we can't do it by a 'selection' field, need a - 'Many2one' field. """ - + We can't filter a selection field dynamically, so when we select a field + its widgets also need to change, according to the selected field type, + we can't do it by a 'selection' field, need a 'Many2one' field. + """ _name = 'employee.field.widgets' _rec_name = 'description' _description = 'Field Widgets' diff --git a/employee_dynamic_fields/models/hr_employee.py b/employee_dynamic_fields/models/hr_employee.py new file mode 100644 index 000000000..8edbe6456 --- /dev/null +++ b/employee_dynamic_fields/models/hr_employee.py @@ -0,0 +1,32 @@ +# -*- coding: utf-8 -*- +############################################################################# +# +# Cybrosys Technologies Pvt. Ltd. +# +# Copyright (C) 2023-TODAY Cybrosys Technologies(). +# Author: Sruthi Pavithran (odoo@cybrosys.com) +# +# You can modify it under the terms of the GNU AFFERO +# GENERAL PUBLIC LICENSE (AGPL v3), Version 3. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU AFFERO GENERAL PUBLIC LICENSE (AGPL v3) for more details. +# +# You should have received a copy of the GNU AFFERO GENERAL PUBLIC LICENSE +# (AGPL v3) along with this program. +# If not, see . +# +############################################################################# +from odoo import fields, models + + +class HrEmployee(models.Model): + """Inherit the hr.employee model for adding fields""" + _description = 'Employee' + _inherit = 'hr.employee' + + x_currency_id = fields.Many2one('res.currency', + help="Choose currency", + string='Currency') diff --git a/employee_dynamic_fields/models/ir_model_fields.py b/employee_dynamic_fields/models/ir_model_fields.py index 9bdf0d9fa..8c99999ba 100644 --- a/employee_dynamic_fields/models/ir_model_fields.py +++ b/employee_dynamic_fields/models/ir_model_fields.py @@ -24,7 +24,6 @@ from odoo import fields, models class IrModelFields(models.Model): """Adding a new field to understand the dynamically created fields.""" - _inherit = 'ir.model.fields' is_employee_dynamic = fields.Boolean(string="Dynamic Field", diff --git a/employee_dynamic_fields/security/ir.model.access.csv b/employee_dynamic_fields/security/ir.model.access.csv index f4105401c..646a59fcb 100644 --- a/employee_dynamic_fields/security/ir.model.access.csv +++ b/employee_dynamic_fields/security/ir.model.access.csv @@ -1,3 +1,3 @@ id,name,model_id/id,group_id/id,perm_read,perm_write,perm_create,perm_unlink -"access_wizard_employee_dynamic_fields_base_user","wizard.employee.dynamic.fields.base.user","model_employee_dynamic_fields",,1,1,1,1 -"access_employee_field_widgets_base_user","wizard.employee.field.widgets.base.user","model_employee_field_widgets",,1,1,1,1 +access_employee_field_widgets_user,access.employee.field.widgets.user.user,model_employee_field_widgets,base.group_user,1,1,1,1 +access_employee_dynamic_fields_user,access.employee.dynamic.fields.user,model_employee_dynamic_fields,base.group_user,1,1,1,1 diff --git a/employee_dynamic_fields/static/description/assets/modules/1.png b/employee_dynamic_fields/static/description/assets/modules/1.png deleted file mode 100644 index 3415917c2..000000000 Binary files a/employee_dynamic_fields/static/description/assets/modules/1.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/modules/2.png b/employee_dynamic_fields/static/description/assets/modules/2.png deleted file mode 100644 index 99298bf4b..000000000 Binary files a/employee_dynamic_fields/static/description/assets/modules/2.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/modules/4.png b/employee_dynamic_fields/static/description/assets/modules/4.png deleted file mode 100644 index f3c986fc1..000000000 Binary files a/employee_dynamic_fields/static/description/assets/modules/4.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/modules/5.png b/employee_dynamic_fields/static/description/assets/modules/5.png deleted file mode 100644 index 2c8fbb83f..000000000 Binary files a/employee_dynamic_fields/static/description/assets/modules/5.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/modules/6.png b/employee_dynamic_fields/static/description/assets/modules/6.png deleted file mode 100644 index 33372bdc1..000000000 Binary files a/employee_dynamic_fields/static/description/assets/modules/6.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/modules/7.png b/employee_dynamic_fields/static/description/assets/modules/7.png deleted file mode 100644 index 273effef7..000000000 Binary files a/employee_dynamic_fields/static/description/assets/modules/7.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/modules/m1.png b/employee_dynamic_fields/static/description/assets/modules/m1.png new file mode 100644 index 000000000..acb4c76c6 Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/modules/m1.png differ diff --git a/employee_dynamic_fields/static/description/assets/modules/m2.png b/employee_dynamic_fields/static/description/assets/modules/m2.png new file mode 100644 index 000000000..3ef91f771 Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/modules/m2.png differ diff --git a/employee_dynamic_fields/static/description/assets/modules/m3.png b/employee_dynamic_fields/static/description/assets/modules/m3.png new file mode 100644 index 000000000..72febf6ae Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/modules/m3.png differ diff --git a/employee_dynamic_fields/static/description/assets/modules/m4.png b/employee_dynamic_fields/static/description/assets/modules/m4.png new file mode 100644 index 000000000..f7d7f9241 Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/modules/m4.png differ diff --git a/employee_dynamic_fields/static/description/assets/modules/m5.png b/employee_dynamic_fields/static/description/assets/modules/m5.png new file mode 100644 index 000000000..1d3324e88 Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/modules/m5.png differ diff --git a/employee_dynamic_fields/static/description/assets/modules/m6.png b/employee_dynamic_fields/static/description/assets/modules/m6.png new file mode 100644 index 000000000..80938c15a Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/modules/m6.png differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/1.png b/employee_dynamic_fields/static/description/assets/screenshots/1.png new file mode 100644 index 000000000..dce593cc4 Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/screenshots/1.png differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/2.png b/employee_dynamic_fields/static/description/assets/screenshots/2.png new file mode 100644 index 000000000..629a6180a Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/screenshots/2.png differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/3.png b/employee_dynamic_fields/static/description/assets/screenshots/3.png new file mode 100644 index 000000000..c479c4686 Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/screenshots/3.png differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/4.png b/employee_dynamic_fields/static/description/assets/screenshots/4.png new file mode 100644 index 000000000..05d6169df Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/screenshots/4.png differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/5.png b/employee_dynamic_fields/static/description/assets/screenshots/5.png new file mode 100644 index 000000000..e91e9645e Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/screenshots/5.png differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/6.png b/employee_dynamic_fields/static/description/assets/screenshots/6.png new file mode 100644 index 000000000..423d69066 Binary files /dev/null and b/employee_dynamic_fields/static/description/assets/screenshots/6.png differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/dynamic1.png b/employee_dynamic_fields/static/description/assets/screenshots/dynamic1.png deleted file mode 100644 index f012c67c9..000000000 Binary files a/employee_dynamic_fields/static/description/assets/screenshots/dynamic1.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/dynamic2.png b/employee_dynamic_fields/static/description/assets/screenshots/dynamic2.png deleted file mode 100644 index 73d0ee4c6..000000000 Binary files a/employee_dynamic_fields/static/description/assets/screenshots/dynamic2.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/dynamic3.png b/employee_dynamic_fields/static/description/assets/screenshots/dynamic3.png deleted file mode 100644 index 07b1aee0f..000000000 Binary files a/employee_dynamic_fields/static/description/assets/screenshots/dynamic3.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/dynamic4.png b/employee_dynamic_fields/static/description/assets/screenshots/dynamic4.png deleted file mode 100644 index 71d7241d0..000000000 Binary files a/employee_dynamic_fields/static/description/assets/screenshots/dynamic4.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/dynamic5.png b/employee_dynamic_fields/static/description/assets/screenshots/dynamic5.png deleted file mode 100644 index 9664959dc..000000000 Binary files a/employee_dynamic_fields/static/description/assets/screenshots/dynamic5.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/dynamic6.png b/employee_dynamic_fields/static/description/assets/screenshots/dynamic6.png deleted file mode 100644 index 845ac0220..000000000 Binary files a/employee_dynamic_fields/static/description/assets/screenshots/dynamic6.png and /dev/null differ diff --git a/employee_dynamic_fields/static/description/assets/screenshots/hero.gif b/employee_dynamic_fields/static/description/assets/screenshots/hero.gif index a0dc3459d..10d413fed 100644 Binary files a/employee_dynamic_fields/static/description/assets/screenshots/hero.gif and b/employee_dynamic_fields/static/description/assets/screenshots/hero.gif differ diff --git a/employee_dynamic_fields/static/description/index.html b/employee_dynamic_fields/static/description/index.html index 93bc4f1dd..a1416fa0c 100644 --- a/employee_dynamic_fields/static/description/index.html +++ b/employee_dynamic_fields/static/description/index.html @@ -147,7 +147,7 @@
-
@@ -164,7 +164,7 @@
-
@@ -181,7 +181,7 @@
-
@@ -199,7 +199,7 @@
-
@@ -216,7 +216,7 @@
-
@@ -233,15 +233,14 @@
-

- We Can delete the dynamically created - fields from the menu.

+ We can remove dynamically created fields from the menu. When deleting, first deactivate the menu that was created.
@@ -326,51 +325,51 @@
@@ -381,50 +380,50 @@
diff --git a/employee_dynamic_fields/views/ir_model_fields_views.xml b/employee_dynamic_fields/views/ir_model_fields_views.xml index 57f64de84..c043b8fd4 100644 --- a/employee_dynamic_fields/views/ir_model_fields_views.xml +++ b/employee_dynamic_fields/views/ir_model_fields_views.xml @@ -1,8 +1,10 @@ - + - view.fields.search.inherit.employee.dynamic.fields + + ir.model.fields.search.inherit.employee.dynamic.fields + ir.model.fields diff --git a/employee_dynamic_fields/wizard/__init__.py b/employee_dynamic_fields/wizards/__init__.py similarity index 95% rename from employee_dynamic_fields/wizard/__init__.py rename to employee_dynamic_fields/wizards/__init__.py index 8b508e3a5..1a1f59417 100644 --- a/employee_dynamic_fields/wizard/__init__.py +++ b/employee_dynamic_fields/wizards/__init__.py @@ -19,4 +19,4 @@ # If not, see . # ############################################################################# -from . import employee_fields_wizard +from . import employee_dynamic_fields diff --git a/employee_dynamic_fields/wizard/employee_fields_wizard.py b/employee_dynamic_fields/wizards/employee_dynamic_fields.py similarity index 80% rename from employee_dynamic_fields/wizard/employee_fields_wizard.py rename to employee_dynamic_fields/wizards/employee_dynamic_fields.py index fe30a9845..03ff02c30 100644 --- a/employee_dynamic_fields/wizard/employee_fields_wizard.py +++ b/employee_dynamic_fields/wizards/employee_dynamic_fields.py @@ -21,6 +21,7 @@ ############################################################################# import xml.etree.ElementTree as xee from odoo import api, fields, models, _ +from odoo.exceptions import ValidationError class EmployeeDynamicFields(models.TransientModel): @@ -62,7 +63,7 @@ class EmployeeDynamicFields(models.TransientModel): def _set_default(self): """ This method is used to set a default filter in a domain expression - for the 'hr.employee' model.It retrieves the ID of the + for the 'hr.employee' model. It retrieves the ID of the 'hr.employee' model using a search query and sets it as a default filter in the domain expression. """ @@ -77,7 +78,7 @@ class EmployeeDynamicFields(models.TransientModel): the 'ir.model.fields' table, extends the 'hr.view_employee_form' view. """ - self.env['ir.model.fields'].sudo().create( + self.created_menu_id = self.env['ir.model.fields'].sudo().create( {'name': self.name, 'field_description': self.field_description, 'model_id': self.model_id.id, @@ -141,18 +142,49 @@ class EmployeeDynamicFields(models.TransientModel): index=True) selection_field = fields.Char(string="Selection Options") rel_field_id = fields.Many2one('ir.model.fields', - string='Related Field') + string='Related Field') field_type = fields.Selection(selection='get_possible_field_types', string='Field Type', required=True) ttype = fields.Selection(string="Field Type", related='field_type', help="Specifies the type of the field") widget_id = fields.Many2one('employee.field.widgets', - string='Widget', help="Widget of the field") + string='Widget', help="Widget of the field") + # Already existing field groups = fields.Many2many('res.groups', - 'employee_dynamic_fields_group_rel', - 'field_id', 'group_id') + 'fields_group_rel', + 'id_field', 'id_group', + string='Groups', help="User groups") extra_features = fields.Boolean(string="Show Extra Properties", help="Add extra features for the field") + created_menu_id = fields.Many2one('ir.model.fields', string='Created Menu', + help="Menu created using the dynamic " + "field creation option") + menu_state = fields.Selection([('active', 'Active'), + ('inactive', 'Inactive')], string='State', + help="State of the created menu", + default='active') + + def action_deactivate_menu(self): + """Method action_deactivate_menu to deactivate the created menu and the + created view""" + if self.form_view_id: + self.form_view_id.active = False + self.menu_state = 'inactive' + return { + 'type': 'ir.actions.client', + 'tag': 'reload', + } + + def action_activate_menu(self): + """Method action_activate_menu to activate the created menu and the + created view""" + if self.form_view_id: + self.form_view_id.active = True + self.menu_state = 'active' + return { + 'type': 'ir.actions.client', + 'tag': 'reload', + } @api.depends('field_type') @api.onchange('field_type') @@ -167,7 +199,8 @@ class EmployeeDynamicFields(models.TransientModel): return {'domain': {'widget_id': [('name', '=', 'image')]}} elif self.field_type == 'many2many': return {'domain': { - 'widget_id': [('name', 'in', ['many2many_tags', 'binary'])]}} + 'widget_id': [ + ('name', 'in', ['many2many_tags', 'binary'])]}} elif self.field_type == 'selection': return {'domain': { 'widget_id': [('name', 'in', ['radio', 'priority'])]}} @@ -185,21 +218,9 @@ class EmployeeDynamicFields(models.TransientModel): an instance of 'EmployeeDynamicFields' and deactivate the related form view. """ + if self.menu_state == 'active': + raise ValidationError(_("You cannot delete a menu that is active")) 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]) + self.form_view_id.unlink() + self.created_menu_id.unlink() return super(EmployeeDynamicFields, self).unlink() - - -class HrEmployee(models.Model): - """ - Inherit the hr.employee model for adding fields - """ - _description = 'Employee' - _inherit = 'hr.employee' - - x_currency_id = fields.Many2one('res.currency', - help="Choose currency", - string='Currency') diff --git a/employee_dynamic_fields/wizard/employee_fields_wizard.xml b/employee_dynamic_fields/wizards/employee_dynamic_fields_views.xml similarity index 79% rename from employee_dynamic_fields/wizard/employee_fields_wizard.xml rename to employee_dynamic_fields/wizards/employee_dynamic_fields_views.xml index 3910ad14d..acde27677 100644 --- a/employee_dynamic_fields/wizard/employee_fields_wizard.xml +++ b/employee_dynamic_fields/wizards/employee_dynamic_fields_views.xml @@ -1,6 +1,6 @@ - + employee.dynamic.fields.view.form employee.dynamic.fields @@ -59,6 +59,7 @@ + employee.dynamic.fields.view.tree employee.dynamic.fields @@ -67,17 +68,29 @@ + +