diff --git a/base_sequence_option/__manifest__.py b/base_sequence_option/__manifest__.py index ad23285b6..3bbd82f7f 100644 --- a/base_sequence_option/__manifest__.py +++ b/base_sequence_option/__manifest__.py @@ -13,6 +13,7 @@ "depends": ["base"], "data": [ "security/ir.model.access.csv", + "security/sequence_option_security.xml", "views/sequence_option_view.xml", ], "license": "LGPL-3", diff --git a/base_sequence_option/models/__init__.py b/base_sequence_option/models/__init__.py index 94cb0ad40..e3f324a79 100644 --- a/base_sequence_option/models/__init__.py +++ b/base_sequence_option/models/__init__.py @@ -1,5 +1,5 @@ # Copyright 2021 Ecosoft Co., Ltd. (http://ecosoft.co.th) # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). -from . import sequence_option +from . import ir_sequence_option from . import ir_sequence diff --git a/base_sequence_option/models/sequence_option.py b/base_sequence_option/models/ir_sequence_option.py similarity index 72% rename from base_sequence_option/models/sequence_option.py rename to base_sequence_option/models/ir_sequence_option.py index e2197148c..c37d05d03 100644 --- a/base_sequence_option/models/sequence_option.py +++ b/base_sequence_option/models/ir_sequence_option.py @@ -6,9 +6,10 @@ from odoo.exceptions import ValidationError from odoo.tools import safe_eval -class BaseSequenceOption(models.Model): - _name = "base.sequence.option" +class IrSequenceOption(models.Model): + _name = "ir.sequence.option" _description = "Sequence Option Base Model" + _check_company_auto = True name = fields.Char(readonly=True) use_sequence_option = fields.Boolean( @@ -20,21 +21,32 @@ class BaseSequenceOption(models.Model): selection=[], string="Apply On Model", required=True, - readonly=True, + readonly=False, + index=True, ) option_ids = fields.One2many( string="Sequence Options", - comodel_name="sequence.option", + comodel_name="ir.sequence.option.line", inverse_name="base_id", ) + company_id = fields.Many2one( + comodel_name="res.company", + string="Company", + required=True, + readonly=False, + index=True, + default=lambda self: self.env.company, + help="Company related to this sequence option", + ) -class SequenceOption(models.Model): - _name = "sequence.option" - _description = "Sequence Options" +class IrSequenceOptionLine(models.Model): + _name = "ir.sequence.option.line" + _description = "Sequence Option Line" + _check_company_auto = True base_id = fields.Many2one( - comodel_name="base.sequence.option", + comodel_name="ir.sequence.option", index=True, required=True, ondelete="cascade", @@ -61,6 +73,7 @@ class SequenceOption(models.Model): comodel_name="ir.sequence", string="Sequence", required=True, + check_company=True, ) prefix = fields.Char( related="sequence_id.prefix", @@ -77,6 +90,11 @@ class SequenceOption(models.Model): string="Implementation", readonly=True, ) + company_id = fields.Many2one( + comodel_name="res.company", + related="base_id.company_id", + store=True, + ) def get_model_options(self, model): return self.sudo().search( @@ -89,6 +107,11 @@ class SequenceOption(models.Model): """ if not options: options = self.get_model_options(record._name) + # multi-company + company = ( + hasattr(record, "company_id") and record.company_id or self.env.company + ) + options = options.filtered(lambda l: l.company_id == company) sequence = self.env["ir.sequence"] for option in options: domain = safe_eval.safe_eval(option.filter_domain) diff --git a/base_sequence_option/security/ir.model.access.csv b/base_sequence_option/security/ir.model.access.csv index 8ab27d585..90a101a56 100644 --- a/base_sequence_option/security/ir.model.access.csv +++ b/base_sequence_option/security/ir.model.access.csv @@ -1,5 +1,5 @@ id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink -access_sequence_option,access_sequence_option,model_sequence_option,base.group_user,1,0,0,0 -access_sequence_option_system,access_sequence_option_system,model_sequence_option,base.group_system,1,1,1,1 -access_base_sequence_option,access_base_sequence_option,model_base_sequence_option,base.group_user,1,0,0,0 -access_base_sequence_option_system,access_base_sequence_option_system,model_base_sequence_option,base.group_system,1,1,1,1 +access_ir_sequence_option_line,access_ir_sequence_option_line,model_ir_sequence_option_line,base.group_user,1,0,0,0 +access_ir_sequence_option_line_system,access_ir_sequence_option_line_system,model_ir_sequence_option_line,base.group_system,1,1,1,1 +access_ir_sequence_option,access_ir_sequence_option,model_ir_sequence_option,base.group_user,1,0,0,0 +access_ir_sequence_option_system,access_ir_sequence_option_system,model_ir_sequence_option,base.group_system,1,1,1,1 diff --git a/base_sequence_option/security/sequence_option_security.xml b/base_sequence_option/security/sequence_option_security.xml new file mode 100644 index 000000000..14ab82d31 --- /dev/null +++ b/base_sequence_option/security/sequence_option_security.xml @@ -0,0 +1,18 @@ +<odoo noupdate="1"> + <record model="ir.rule" id="ir_sequence_option_multi_company_rule"> + <field name="name">Sequence Option: multi-company</field> + <field name="model_id" ref="model_ir_sequence_option" /> + <field name="global" eval="True" /> + <field name="domain_force"> + [('company_id', 'in', company_ids)] + </field> + </record> + <record model="ir.rule" id="ir_sequence_option_line_multi_company_rule"> + <field name="name">Sequence Option Line: multi-company</field> + <field name="model_id" ref="model_ir_sequence_option_line" /> + <field name="global" eval="True" /> + <field name="domain_force"> + [('company_id', 'in', company_ids)] + </field> + </record> +</odoo> diff --git a/base_sequence_option/tests/__init__.py b/base_sequence_option/tests/__init__.py index 627300169..118f59c2e 100644 --- a/base_sequence_option/tests/__init__.py +++ b/base_sequence_option/tests/__init__.py @@ -2,4 +2,4 @@ # License LGPL-3.0 or later (https://www.gnu.org/licenses/lgpl.html). from . import common -from . import test_base_sequence_option +from . import test_ir_sequence_option diff --git a/base_sequence_option/tests/base_sequence_tester.py b/base_sequence_option/tests/base_sequence_tester.py index d9f2a165c..652bcc9a3 100644 --- a/base_sequence_option/tests/base_sequence_tester.py +++ b/base_sequence_option/tests/base_sequence_tester.py @@ -13,7 +13,7 @@ class BaseSequenceTester(models.Model): @api.model def create(self, vals): - seq = self.env["sequence.option"].get_sequence(self.new(vals)) + seq = self.env["ir.sequence.option.line"].get_sequence(self.new(vals)) if seq: # use sequence from sequence.option, instead of base.sequence.tester self = self.with_context(sequence_option_id=seq.id) new_seq = self.env["ir.sequence"].next_by_code("base.sequence.tester") @@ -21,8 +21,8 @@ class BaseSequenceTester(models.Model): return super().create(vals) -class BaseSequenceOption(models.Model): - _inherit = "base.sequence.option" +class IrSequenceOption(models.Model): + _inherit = "ir.sequence.option" model = fields.Selection( selection_add=[("base.sequence.tester", "base.sequence.tester")], diff --git a/base_sequence_option/tests/common.py b/base_sequence_option/tests/common.py index a19f002c1..92efc699e 100644 --- a/base_sequence_option/tests/common.py +++ b/base_sequence_option/tests/common.py @@ -13,9 +13,9 @@ class CommonBaseSequenceOption(common.SavepointCase): cls.loader = FakeModelLoader(cls.env, cls.__module__) cls.loader.backup_registry() - from .base_sequence_tester import BaseSequenceOption, BaseSequenceTester + from .base_sequence_tester import BaseSequenceTester, IrSequenceOption - cls.loader.update_registry((BaseSequenceTester, BaseSequenceOption)) + cls.loader.update_registry((BaseSequenceTester, IrSequenceOption)) cls.test_model = cls.env[BaseSequenceTester._name] @@ -60,8 +60,8 @@ class CommonBaseSequenceOption(common.SavepointCase): } ) - # Create sequence options for model bsae.sequence.tester: - cls.base_sequence_obj = cls.env["base.sequence.option"] + # Create sequence options for model base.sequence.tester: + cls.base_sequence_obj = cls.env["ir.sequence.option"] cls.base_seq = cls.base_sequence_obj.create( { "name": "Test Model", @@ -69,7 +69,7 @@ class CommonBaseSequenceOption(common.SavepointCase): "use_sequence_option": True, } ) - cls.sequence_obj = cls.env["sequence.option"] + cls.sequence_obj = cls.env["ir.sequence.option.line"] cls.sequence_obj.create( { "base_id": cls.base_seq.id, diff --git a/base_sequence_option/tests/test_base_sequence_option.py b/base_sequence_option/tests/test_ir_sequence_option.py similarity index 100% rename from base_sequence_option/tests/test_base_sequence_option.py rename to base_sequence_option/tests/test_ir_sequence_option.py diff --git a/base_sequence_option/views/sequence_option_view.xml b/base_sequence_option/views/sequence_option_view.xml index 7b1724dd5..19b667ae0 100644 --- a/base_sequence_option/views/sequence_option_view.xml +++ b/base_sequence_option/views/sequence_option_view.xml @@ -4,21 +4,22 @@ <odoo> - <record id="view_base_sequence_option_tree" model="ir.ui.view"> - <field name="name">view.base.sequence.option.tree</field> - <field name="model">base.sequence.option</field> + <record id="view_ir_sequence_option_tree" model="ir.ui.view"> + <field name="name">view.ir.sequence.option.tree</field> + <field name="model">ir.sequence.option</field> <field name="arch" type="xml"> - <tree string="Manage Sequence Options" create="0" delete="0"> + <tree string="Manage Sequence Options" create="1" delete="1"> <field name="name" /> <field name="model" /> <field name="use_sequence_option" /> + <field name="company_id" groups="base.group_multi_company" /> </tree> </field> </record> - <record id="view_sequence_option_tree" model="ir.ui.view"> - <field name="name">view.sequence.option.tree</field> - <field name="model">sequence.option</field> + <record id="view_ir_sequence_option_line_tree" model="ir.ui.view"> + <field name="name">view.ir.sequence.option.line.tree</field> + <field name="model">ir.sequence.option.line</field> <field name="arch" type="xml"> <tree string="Doctype Sequence"> <field name="name" /> @@ -30,17 +31,18 @@ </field> </record> - <record id="view_base_sequence_option_form" model="ir.ui.view"> - <field name="name">view.base.sequence.option.form</field> - <field name="model">base.sequence.option</field> + <record id="view_ir_sequence_option_form" model="ir.ui.view"> + <field name="name">view.ir.sequence.option.form</field> + <field name="model">ir.sequence.option</field> <field name="arch" type="xml"> - <form string="Doctype Sequence" create="0" delete="0"> + <form string="Doctype Sequence" create="1" delete="1"> <h1> <field name="name" class="oe_inline" placeholder="Name" /> </h1> <group> <group> <field name="model" /> + <field name="company_id" groups="base.group_multi_company" /> </group> <group> <field name="use_sequence_option" widget="boolean_toggle" /> @@ -55,6 +57,7 @@ <field name="prefix" /> <field name="suffix" /> <field name="implementation" /> + <field name="company_id" invisible="1" /> </tree> <form> <group> @@ -69,6 +72,7 @@ </group> <group> <field name="sequence_id" /> + <field name="company_id" invisible="1" /> </group> </group> </form> @@ -77,17 +81,17 @@ </field> </record> - <record id="action_base_sequence_option" model="ir.actions.act_window"> + <record id="action_ir_sequence_option" model="ir.actions.act_window"> <field name="name">Manage Sequence Options</field> - <field name="res_model">base.sequence.option</field> + <field name="res_model">ir.sequence.option</field> <field name="view_mode">tree,form</field> - <field name="view_id" ref="view_base_sequence_option_tree" /> + <field name="view_id" ref="view_ir_sequence_option_tree" /> </record> <menuitem name="Manage Sequence Options" - id="menu_base_sequence_option" - action="action_base_sequence_option" + id="menu_ir_sequence_option" + action="action_ir_sequence_option" parent="base.next_id_5" sequence="20" />