mirror of
https://github.com/bringout/oca-technical.git
synced 2026-04-19 01:51:59 +02:00
Initial commit: OCA Technical packages (595 packages)
This commit is contained in:
commit
2cc02aac6e
24950 changed files with 2318079 additions and 0 deletions
|
|
@ -0,0 +1,3 @@
|
|||
from . import models_mixin
|
||||
from . import sale_test
|
||||
from . import test_base_substate
|
||||
|
|
@ -0,0 +1,125 @@
|
|||
# Copyright 2018 Simone Orsi - Camptocamp SA
|
||||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
|
||||
from operator import attrgetter
|
||||
|
||||
|
||||
class TestMixin(object):
|
||||
"""Mixin to setup fake models for tests.
|
||||
|
||||
Usage - the model:
|
||||
|
||||
class FakeModel(models.Model, TestMixin):
|
||||
_name = 'fake.model'
|
||||
|
||||
name = fields.Char()
|
||||
|
||||
Usage - the test klass:
|
||||
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super().setUpClass()
|
||||
FakeModel._test_setup_model(cls.env)
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
FakeModel._test_teardown_model(cls.env)
|
||||
super().tearDownClass()
|
||||
"""
|
||||
|
||||
# Generate xmlids
|
||||
# This is needed if you want to load data tied to a test model via xid.
|
||||
_test_setup_gen_xid = False
|
||||
# If you extend a real model (ie: res.partner) you must enable this
|
||||
# to not delete the model on tear down.
|
||||
_test_teardown_no_delete = False
|
||||
# You can add custom fields to real models (eg: res.partner).
|
||||
# In this case you must delete them to leave registry and model clean.
|
||||
# This is mandatory for relational fields that link a fake model.
|
||||
_test_purge_fields = []
|
||||
|
||||
@classmethod
|
||||
def _test_setup_models(cls, env, model_clses):
|
||||
"""
|
||||
Setup models at the same time
|
||||
if one fake model ref to another in relational
|
||||
field.
|
||||
ex : many2one fields
|
||||
in this case we should don't use manual=True as an option in field.
|
||||
"""
|
||||
for model_cls in model_clses:
|
||||
model_cls._build_model(env.registry, env.cr)
|
||||
|
||||
env.registry.setup_models(env.cr)
|
||||
ctx = dict(env.context, update_custom_fields=True)
|
||||
if cls._test_setup_gen_xid:
|
||||
ctx["module"] = cls._module
|
||||
env.registry.init_models(
|
||||
env.cr, [model_cls._name for model_cls in model_clses], ctx
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def _test_setup_model(cls, env):
|
||||
"""Initialize it."""
|
||||
cls._build_model(env.registry, env.cr)
|
||||
env.registry.setup_models(env.cr)
|
||||
ctx = dict(env.context, update_custom_fields=True)
|
||||
if cls._test_setup_gen_xid:
|
||||
ctx["module"] = cls._module
|
||||
env.registry.init_models(env.cr, [cls._name], ctx)
|
||||
|
||||
@classmethod
|
||||
def _test_teardown_model(cls, env):
|
||||
"""Cleanup registry and real models."""
|
||||
|
||||
for fname in cls._test_purge_fields:
|
||||
model = env[cls._name]
|
||||
if fname in model:
|
||||
model._pop_field(fname)
|
||||
|
||||
if not getattr(cls, "_test_teardown_no_delete", False):
|
||||
del env.registry.models[cls._name]
|
||||
# here we must remove the model from list of children of inherited
|
||||
# models
|
||||
parents = cls._inherit
|
||||
parents = [parents] if isinstance(parents, str) else (parents or [])
|
||||
# keep a copy to be sure to not modify the original _inherit
|
||||
parents = list(parents)
|
||||
parents.extend(cls._inherits.keys())
|
||||
parents.append("base")
|
||||
funcs = [
|
||||
attrgetter(kind + "_children") for kind in ["_inherits", "_inherit"]
|
||||
]
|
||||
for parent in parents:
|
||||
for func in funcs:
|
||||
children = func(env.registry[parent])
|
||||
if cls._name in children:
|
||||
# at this stage our cls is referenced as children of
|
||||
# parent -> must un reference it
|
||||
children.remove(cls._name)
|
||||
|
||||
def _test_get_model_id(self):
|
||||
self.env.cr.execute("SELECT id FROM ir_model WHERE model = %s", (self._name,))
|
||||
res = self.env.cr.fetchone()
|
||||
return res[0] if res else None
|
||||
|
||||
def _test_create_ACL(self, **kw):
|
||||
model_id = self._test_get_model_id()
|
||||
if not model_id:
|
||||
self._reflect()
|
||||
model_id = self._test_get_model_id()
|
||||
if model_id:
|
||||
vals = self._test_ACL_values(model_id)
|
||||
vals.update(kw)
|
||||
self.env["ir.model.access"].create(vals)
|
||||
|
||||
def _test_ACL_values(self, model_id):
|
||||
values = {
|
||||
"name": "Fake ACL for %s" % self._name,
|
||||
"model_id": model_id,
|
||||
"perm_read": 1,
|
||||
"perm_create": 1,
|
||||
"perm_write": 1,
|
||||
"perm_unlink": 1,
|
||||
"active": True,
|
||||
}
|
||||
return values
|
||||
|
|
@ -0,0 +1,55 @@
|
|||
# Copyright 2020 Akretion Mourad EL HADJ MIMOUNE
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||
from odoo import api, fields, models
|
||||
|
||||
from .models_mixin import TestMixin
|
||||
|
||||
|
||||
class SaleTest(models.Model, TestMixin):
|
||||
_name = "base.substate.test.sale"
|
||||
_inherit = ["base.substate.mixin", "mail.thread"]
|
||||
_description = "Base substate Test Model"
|
||||
|
||||
name = fields.Char(required=True)
|
||||
user_id = fields.Many2one("res.users", string="Responsible")
|
||||
state = fields.Selection(
|
||||
[("draft", "New"), ("cancel", "Cancelled"), ("sale", "Sale"), ("done", "Done")],
|
||||
string="Status",
|
||||
readonly=True,
|
||||
default="draft",
|
||||
)
|
||||
active = fields.Boolean(default=True)
|
||||
partner_id = fields.Many2one("res.partner", string="Partner")
|
||||
line_ids = fields.One2many(
|
||||
comodel_name="base.substate.test.sale.line",
|
||||
inverse_name="sale_id",
|
||||
context={"active_test": False},
|
||||
)
|
||||
amount_total = fields.Float(compute="_compute_amount_total", store=True)
|
||||
|
||||
@api.depends("line_ids")
|
||||
def _compute_amount_total(self):
|
||||
for record in self:
|
||||
for line in record.line_ids:
|
||||
record.amount_total += line.amount * line.qty
|
||||
|
||||
def button_confirm(self):
|
||||
self.write({"state": "sale"})
|
||||
return True
|
||||
|
||||
def button_cancel(self):
|
||||
self.write({"state": "cancel"})
|
||||
|
||||
|
||||
class LineTest(models.Model, TestMixin):
|
||||
_name = "base.substate.test.sale.line"
|
||||
_description = "Base substate Test Model Line"
|
||||
|
||||
name = fields.Char()
|
||||
sale_id = fields.Many2one(
|
||||
comodel_name="base.substate.test.sale",
|
||||
ondelete="cascade",
|
||||
context={"active_test": False},
|
||||
)
|
||||
qty = fields.Float()
|
||||
amount = fields.Float()
|
||||
|
|
@ -0,0 +1,133 @@
|
|||
# Copyright 2020 Akretion Mourad EL HADJ MIMOUNE
|
||||
# License AGPL-3.0 or later (https://www.gnu.org/licenses/agpl.html).
|
||||
|
||||
from odoo.tests import common
|
||||
|
||||
from .sale_test import LineTest, SaleTest
|
||||
|
||||
|
||||
@common.tagged("post_install", "-at_install")
|
||||
class TestBaseSubstate(common.TransactionCase):
|
||||
@classmethod
|
||||
def setUpClass(cls):
|
||||
super(TestBaseSubstate, cls).setUpClass()
|
||||
SaleTest._test_setup_models(cls.env, [SaleTest, LineTest])
|
||||
LineTest._test_setup_model(cls.env)
|
||||
|
||||
cls.substate_test_sale = cls.env["base.substate.test.sale"]
|
||||
cls.substate_test_sale_line = cls.env["base.substate.test.sale.line"]
|
||||
|
||||
cls.mail_template = cls.env["mail.template"].create(
|
||||
{
|
||||
"name": "Waiting for legal documents",
|
||||
"model_id": cls.substate_test_sale.id,
|
||||
"subject": "Test Email Substate",
|
||||
}
|
||||
)
|
||||
|
||||
cls.base_substate = cls.env["base.substate.mixin"]
|
||||
cls.substate_type = cls.env["base.substate.type"]
|
||||
|
||||
cls.substate_type._fields["model"].selection.append(
|
||||
("base.substate.test.sale", "Sale Order")
|
||||
)
|
||||
|
||||
cls.substate_type = cls.env["base.substate.type"].create(
|
||||
{
|
||||
"name": "Sale",
|
||||
"model": "base.substate.test.sale",
|
||||
"target_state_field": "state",
|
||||
}
|
||||
)
|
||||
|
||||
cls.substate_val_quotation = cls.env["target.state.value"].create(
|
||||
{
|
||||
"name": "Quotation",
|
||||
"base_substate_type_id": cls.substate_type.id,
|
||||
"target_state_value": "draft",
|
||||
}
|
||||
)
|
||||
|
||||
cls.substate_val_sale = cls.env["target.state.value"].create(
|
||||
{
|
||||
"name": "Sale order",
|
||||
"base_substate_type_id": cls.substate_type.id,
|
||||
"target_state_value": "sale",
|
||||
}
|
||||
)
|
||||
cls.substate_under_negotiation = cls.env["base.substate"].create(
|
||||
{
|
||||
"name": "Under negotiation",
|
||||
"sequence": 1,
|
||||
"target_state_value_id": cls.substate_val_quotation.id,
|
||||
}
|
||||
)
|
||||
|
||||
cls.substate_won = cls.env["base.substate"].create(
|
||||
{
|
||||
"name": "Won",
|
||||
"sequence": 1,
|
||||
"target_state_value_id": cls.substate_val_quotation.id,
|
||||
}
|
||||
)
|
||||
|
||||
cls.substate_wait_docs = cls.env["base.substate"].create(
|
||||
{
|
||||
"name": "Waiting for legal documents",
|
||||
"sequence": 2,
|
||||
"target_state_value_id": cls.substate_val_sale.id,
|
||||
"mail_template_id": cls.mail_template.id,
|
||||
}
|
||||
)
|
||||
|
||||
cls.substate_valid_docs = cls.env["base.substate"].create(
|
||||
{
|
||||
"name": "To validate legal documents",
|
||||
"sequence": 3,
|
||||
"target_state_value_id": cls.substate_val_sale.id,
|
||||
}
|
||||
)
|
||||
|
||||
cls.substate_in_delivering = cls.env["base.substate"].create(
|
||||
{
|
||||
"name": "In delivering",
|
||||
"sequence": 4,
|
||||
"target_state_value_id": cls.substate_val_sale.id,
|
||||
}
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def tearDownClass(cls):
|
||||
SaleTest._test_teardown_model(cls.env)
|
||||
LineTest._test_teardown_model(cls.env)
|
||||
return super().tearDownClass()
|
||||
|
||||
def test_sale_order_substate(self):
|
||||
partner = self.env.ref("base.res_partner_1")
|
||||
so_test1 = self.substate_test_sale.create(
|
||||
{
|
||||
"name": "Test base substate to basic sale",
|
||||
"partner_id": partner.id,
|
||||
"line_ids": [
|
||||
(0, 0, {"name": "line test", "amount": 120.0, "qty": 1.5})
|
||||
],
|
||||
}
|
||||
)
|
||||
self.assertTrue(so_test1.state == "draft")
|
||||
self.assertTrue(so_test1.substate_id == self.substate_under_negotiation)
|
||||
self.assertNotIn(
|
||||
self.mail_template.subject, so_test1.message_ids.mapped("subject")
|
||||
)
|
||||
# Test that validation of sale order change substate_id
|
||||
so_test1.button_confirm()
|
||||
self.assertTrue(so_test1.state == "sale")
|
||||
self.assertTrue(so_test1.substate_id == self.substate_wait_docs)
|
||||
# Check some message_ids are created and sent email
|
||||
self.assertIn(
|
||||
self.mail_template.subject, so_test1.message_ids.mapped("subject")
|
||||
)
|
||||
# Test that substate_id is set to false if
|
||||
# there is not substate corresponding to state
|
||||
so_test1.button_cancel()
|
||||
self.assertTrue(so_test1.state == "cancel")
|
||||
self.assertTrue(not so_test1.substate_id)
|
||||
Loading…
Add table
Add a link
Reference in a new issue