Browse Source
[10.0][IMP] partner_identification: Add field computation and inverses (#419)
[10.0][IMP] partner_identification: Add field computation and inverses (#419)
* [IMP] partner_identification: Add field computation and inverses * Add methods to allow for computation and inverse of an ID field of a specific category type * [IMP] partner_identification: Add search optionpull/526/head
Dave Lasley
8 years ago
committed by
Simone Orsi
7 changed files with 290 additions and 11 deletions
-
3partner_identification/__openerp__.py
-
157partner_identification/models/res_partner.py
-
7partner_identification/models/res_partner_id_category.py
-
2partner_identification/models/res_partner_id_number.py
-
2partner_identification/tests/__init__.py
-
4partner_identification/tests/test_partner_identification.py
-
126partner_identification/tests/test_res_partner.py
@ -1,3 +1,5 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from . import test_partner_identification |
|||
from . import test_res_partner |
@ -0,0 +1,126 @@ |
|||
# -*- coding: utf-8 -*- |
|||
# Copyright 2017 LasLabs Inc. |
|||
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). |
|||
|
|||
from odoo import fields, models |
|||
from odoo.tests import common |
|||
from odoo.exceptions import ValidationError |
|||
|
|||
|
|||
class ResPartner(models.Model): |
|||
_inherit = 'res.partner' |
|||
|
|||
social_security = fields.Char( |
|||
compute=lambda s: s._compute_identification( |
|||
'social_security', 'SSN', |
|||
), |
|||
inverse=lambda s: s._inverse_identification( |
|||
'social_security', 'SSN', |
|||
), |
|||
search=lambda s, *a: s._search_identification( |
|||
'social_security', 'SSN', *a |
|||
), |
|||
) |
|||
|
|||
|
|||
class TestResPartner(common.SavepointCase): |
|||
|
|||
@classmethod |
|||
def _init_test_model(cls, model_cls): |
|||
""" Build a model from model_cls in order to test abstract models. |
|||
Note that this does not actually create a table in the database, so |
|||
there may be some unidentified edge cases. |
|||
Args: |
|||
model_cls (openerp.models.BaseModel): Class of model to initialize |
|||
Returns: |
|||
model_cls: Instance |
|||
""" |
|||
registry = cls.env.registry |
|||
cr = cls.env.cr |
|||
inst = model_cls._build_model(registry, cr) |
|||
model = cls.env[model_cls._inherit].with_context(todo=[]) |
|||
model._prepare_setup() |
|||
model._setup_base(partial=False) |
|||
model._setup_fields(partial=False) |
|||
model._setup_complete() |
|||
model._auto_init() |
|||
model.init() |
|||
model._auto_end() |
|||
return inst |
|||
|
|||
@classmethod |
|||
def setUpClass(cls): |
|||
super(TestResPartner, cls).setUpClass() |
|||
cls.env.registry.enter_test_mode() |
|||
cls._init_test_model(ResPartner) |
|||
|
|||
def setUp(self): |
|||
super(TestResPartner, self).setUp() |
|||
bad_cat = self.env['res.partner.id_category'].create({ |
|||
'code': 'another_code', |
|||
'name': 'another_name', |
|||
}) |
|||
self.env['res.partner.id_number'].create({ |
|||
'name': 'Bad ID', |
|||
'category_id': bad_cat.id, |
|||
'partner_id': self.env.user.partner_id.id, |
|||
}) |
|||
self.partner_id_category = self.env['res.partner.id_category'].create({ |
|||
'code': 'id_code', |
|||
'name': 'id_name', |
|||
}) |
|||
self.partner = self.env.user.partner_id |
|||
self.partner_id = self.env['res.partner.id_number'].create({ |
|||
'name': 'Good ID', |
|||
'category_id': self.partner_id_category.id, |
|||
'partner_id': self.partner.id, |
|||
}) |
|||
|
|||
def test_compute_identification(self): |
|||
""" It should set the proper field to the proper ID name. """ |
|||
self.partner._compute_identification('name', 'id_code') |
|||
self.assertEqual(self.partner.name, self.partner_id.name) |
|||
|
|||
def test_inverse_identification_saves(self): |
|||
""" It should set the ID name to the proper field value. """ |
|||
self.partner._inverse_identification('name', 'id_code') |
|||
self.assertEqual(self.partner_id.name, self.partner.name) |
|||
|
|||
def test_inverse_identification_creates_new_category(self): |
|||
""" It should create a new category of the type if non-existent. """ |
|||
self.partner._inverse_identification('name', 'new_code_type') |
|||
category = self.env['res.partner.id_category'].search([ |
|||
('code', '=', 'new_code_type'), |
|||
]) |
|||
self.assertTrue(category) |
|||
|
|||
def test_inverse_identification_creates_new_id(self): |
|||
""" It should create a new ID of the type if non-existent. """ |
|||
category = self.env['res.partner.id_category'].create({ |
|||
'code': 'new_code_type', |
|||
'name': 'new_code_type', |
|||
}) |
|||
self.partner._inverse_identification('name', 'new_code_type') |
|||
identification = self.env['res.partner.id_number'].search([ |
|||
('category_id', '=', category.id), |
|||
('partner_id', '=', self.partner.id), |
|||
]) |
|||
self.assertEqual(identification.name, self.partner.name) |
|||
|
|||
def test_inverse_identification_multi_exception(self): |
|||
""" It should not allow a write when multiple IDs of same type. """ |
|||
self.env['res.partner.id_number'].create({ |
|||
'name': 'Another ID', |
|||
'category_id': self.partner_id_category.id, |
|||
'partner_id': self.partner.id, |
|||
}) |
|||
with self.assertRaises(ValidationError): |
|||
self.partner._inverse_identification('name', 'id_code') |
|||
|
|||
def test_search_identification(self): |
|||
""" It should return the right record when searched by ID. """ |
|||
self.partner.social_security = 'Test' |
|||
partner = self.env['res.partner'].search([ |
|||
('social_security', '=', 'Test'), |
|||
]) |
|||
self.assertEqual(partner, self.partner) |
Write
Preview
Loading…
Cancel
Save
Reference in new issue