Browse Source

[MIG] partner_firstname: Black, isort

14.0
Laurent Mignon (ACSONE) 5 years ago
committed by Luis Torres
parent
commit
cb381a52d1
  1. 32
      partner_firstname/__manifest__.py
  2. 4
      partner_firstname/hooks.py
  3. 9
      partner_firstname/migrations/12.0.1.0.0/pre-ir_config_param.py
  4. 56
      partner_firstname/models/base_config_settings.py
  5. 83
      partner_firstname/models/res_partner.py
  6. 33
      partner_firstname/models/res_users.py
  7. 25
      partner_firstname/tests/base.py
  8. 28
      partner_firstname/tests/test_copy.py
  9. 25
      partner_firstname/tests/test_create.py
  10. 28
      partner_firstname/tests/test_defaults.py
  11. 1
      partner_firstname/tests/test_delete.py
  12. 24
      partner_firstname/tests/test_empty.py
  13. 8
      partner_firstname/tests/test_name.py
  14. 28
      partner_firstname/tests/test_order.py
  15. 1
      partner_firstname/tests/test_user_onchange.py

32
partner_firstname/__manifest__.py

@ -4,26 +4,26 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
{ {
'name': 'Partner first name and last name',
'summary': "Split first name and last name for non company partners",
'version': '12.0.1.0.0',
'author': "Camptocamp, "
"name": "Partner first name and last name",
"summary": "Split first name and last name for non company partners",
"version": "13.0.1.0.0",
"author": "Camptocamp, "
"Grupo ESOC Ingeniería de Servicios, " "Grupo ESOC Ingeniería de Servicios, "
"Tecnativa, " "Tecnativa, "
"LasLabs, " "LasLabs, "
"ACSONE SA/NV, " "ACSONE SA/NV, "
"Odoo Community Association (OCA)", "Odoo Community Association (OCA)",
'license': "AGPL-3",
'maintainer': 'Camptocamp, Acsone',
'category': 'Extra Tools',
'website': 'https://odoo-community.org/',
'depends': ['base_setup'],
'post_init_hook': 'post_init_hook',
'data': [
'views/base_config_view.xml',
'views/res_partner.xml',
'views/res_user.xml',
"license": "AGPL-3",
"maintainer": "Camptocamp, Acsone",
"category": "Extra Tools",
"website": "https://odoo-community.org/",
"depends": ["base_setup"],
"post_init_hook": "post_init_hook",
"data": [
"views/base_config_view.xml",
"views/res_partner.xml",
"views/res_user.xml",
], ],
'auto_install': False,
'installable': True,
"auto_install": False,
"installable": True,
} }

4
partner_firstname/hooks.py

@ -1,10 +1,10 @@
# Copyright 2017 LasLabs Inc. # Copyright 2017 LasLabs Inc.
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, SUPERUSER_ID
from odoo import SUPERUSER_ID, api
def post_init_hook(cr, _): def post_init_hook(cr, _):
with api.Environment.manage(): with api.Environment.manage():
env = api.Environment(cr, SUPERUSER_ID, {}) env = api.Environment(cr, SUPERUSER_ID, {})
env['res.partner']._install_partner_firstname()
env["res.partner"]._install_partner_firstname()

9
partner_firstname/migrations/12.0.1.0.0/pre-ir_config_param.py

@ -3,11 +3,12 @@ def store_ir_config_param(cr):
names was last_first. In order to retain this behaviour we names was last_first. In order to retain this behaviour we
store the config parameter if it is not present. store the config parameter if it is not present.
""" """
cr.execute("SELECT 1 FROM ir_config_parameter "
"WHERE key = 'partner_names_order'")
cr.execute("SELECT 1 FROM ir_config_parameter " "WHERE key = 'partner_names_order'")
if not cr.fetchone(): if not cr.fetchone():
cr.execute("INSERT INTO ir_config_parameter (key, value) VALUES "
"('partner_names_order', 'last_first')")
cr.execute(
"INSERT INTO ir_config_parameter (key, value) VALUES "
"('partner_names_order', 'last_first')"
)
def migrate(cr, version): def migrate(cr, version):

56
partner_firstname/models/base_config_settings.py

@ -2,12 +2,14 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging import logging
from odoo import api, fields, models from odoo import api, fields, models
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
class ResConfigSettings(models.TransientModel): class ResConfigSettings(models.TransientModel):
_inherit = 'res.config.settings'
_inherit = "res.config.settings"
partner_names_order = fields.Selection( partner_names_order = fields.Selection(
string="Partner names order", string="Partner names order",
@ -15,36 +17,41 @@ class ResConfigSettings(models.TransientModel):
help="Order to compose partner fullname", help="Order to compose partner fullname",
required=True, required=True,
) )
partner_names_order_changed = fields.Boolean(
compute="_compute_names_order_changed",
)
partner_names_order_changed = fields.Boolean(compute="_compute_names_order_changed")
def _partner_names_order_selection(self): def _partner_names_order_selection(self):
return [ return [
('last_first', 'Lastname Firstname'),
('last_first_comma', 'Lastname, Firstname'),
('first_last', 'Firstname Lastname'),
("last_first", "Lastname Firstname"),
("last_first_comma", "Lastname, Firstname"),
("first_last", "Firstname Lastname"),
] ]
@api.multi @api.multi
def _partner_names_order_default(self): def _partner_names_order_default(self):
return self.env['res.partner']._names_order_default()
return self.env["res.partner"]._names_order_default()
@api.model @api.model
def get_values(self): def get_values(self):
res = super(ResConfigSettings, self).get_values() res = super(ResConfigSettings, self).get_values()
partner_names_order = self.env['ir.config_parameter'].sudo().get_param(
'partner_names_order',
default=self._partner_names_order_default()
partner_names_order = (
self.env["ir.config_parameter"]
.sudo()
.get_param(
"partner_names_order", default=self._partner_names_order_default()
)
) )
res.update(partner_names_order=partner_names_order) res.update(partner_names_order=partner_names_order)
return res return res
@api.multi @api.multi
@api.depends('partner_names_order')
@api.depends("partner_names_order")
def _compute_names_order_changed(self): def _compute_names_order_changed(self):
current = self.env['ir.config_parameter'].sudo().get_param(
'partner_names_order', default=self._partner_names_order_default()
current = (
self.env["ir.config_parameter"]
.sudo()
.get_param(
"partner_names_order", default=self._partner_names_order_default()
)
) )
for record in self: for record in self:
record.partner_names_order_changed = bool( record.partner_names_order_changed = bool(
@ -52,28 +59,31 @@ class ResConfigSettings(models.TransientModel):
) )
@api.multi @api.multi
@api.onchange('partner_names_order')
@api.onchange("partner_names_order")
def _onchange_partner_names_order(self): def _onchange_partner_names_order(self):
self._compute_names_order_changed() self._compute_names_order_changed()
@api.multi @api.multi
def set_values(self): def set_values(self):
super(ResConfigSettings, self).set_values() super(ResConfigSettings, self).set_values()
self.env['ir.config_parameter'].sudo().set_param(
'partner_names_order', self.partner_names_order
self.env["ir.config_parameter"].sudo().set_param(
"partner_names_order", self.partner_names_order
) )
@api.multi @api.multi
def _partners_for_recalculating(self): def _partners_for_recalculating(self):
return self.env['res.partner'].search([
('is_company', '=', False),
('firstname', '!=', False), ('lastname', '!=', False),
])
return self.env["res.partner"].search(
[
("is_company", "=", False),
("firstname", "!=", False),
("lastname", "!=", False),
]
)
@api.multi @api.multi
def action_recalculate_partners_name(self): def action_recalculate_partners_name(self):
self.env['ir.config_parameter'].sudo().set_param(
'partner_names_order', self.partner_names_order
self.env["ir.config_parameter"].sudo().set_param(
"partner_names_order", self.partner_names_order
) )
partners = self._partners_for_recalculating() partners = self._partners_for_recalculating()
_logger.info("Recalculating names for %d partners.", len(partners)) _logger.info("Recalculating names for %d partners.", len(partners))

83
partner_firstname/models/res_partner.py

@ -3,7 +3,9 @@
# Copyright 2015 Grupo ESOC (<http://www.grupoesoc.es>) # Copyright 2015 Grupo ESOC (<http://www.grupoesoc.es>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
import logging import logging
from odoo import api, fields, models from odoo import api, fields, models
from .. import exceptions from .. import exceptions
_logger = logging.getLogger(__name__) _logger = logging.getLogger(__name__)
@ -11,21 +13,17 @@ _logger = logging.getLogger(__name__)
class ResPartner(models.Model): class ResPartner(models.Model):
"""Adds last name and first name; name becomes a stored function field.""" """Adds last name and first name; name becomes a stored function field."""
_inherit = 'res.partner'
firstname = fields.Char(
"First name",
index=True,
)
lastname = fields.Char(
"Last name",
index=True,
)
_inherit = "res.partner"
firstname = fields.Char("First name", index=True)
lastname = fields.Char("Last name", index=True)
name = fields.Char( name = fields.Char(
compute="_compute_name", compute="_compute_name",
inverse="_inverse_name_after_cleaning_whitespace", inverse="_inverse_name_after_cleaning_whitespace",
required=False, required=False,
store=True)
store=True,
)
@api.model @api.model
def create(self, vals): def create(self, vals):
@ -37,8 +35,8 @@ class ResPartner(models.Model):
# Calculate the splitted fields # Calculate the splitted fields
inverted = self._get_inverse_name( inverted = self._get_inverse_name(
self._get_whitespace_cleaned_name(name), self._get_whitespace_cleaned_name(name),
vals.get("is_company",
self.default_get(["is_company"])["is_company"]))
vals.get("is_company", self.default_get(["is_company"])["is_company"]),
)
for key, value in inverted.items(): for key, value in inverted.items():
if not vals.get(key) or context.get("copy"): if not vals.get(key) or context.get("copy"):
vals[key] = value vals[key] = value
@ -68,7 +66,8 @@ class ResPartner(models.Model):
inverted = self._get_inverse_name( inverted = self._get_inverse_name(
self._get_whitespace_cleaned_name(result.get("name", "")), self._get_whitespace_cleaned_name(result.get("name", "")),
result.get("is_company", False))
result.get("is_company", False),
)
for field in list(inverted.keys()): for field in list(inverted.keys()):
if field in fields_list: if field in fields_list:
@ -78,15 +77,18 @@ class ResPartner(models.Model):
@api.model @api.model
def _names_order_default(self): def _names_order_default(self):
return 'first_last'
return "first_last"
@api.model @api.model
def _get_names_order(self): def _get_names_order(self):
"""Get names order configuration from system parameters. """Get names order configuration from system parameters.
You can override this method to read configuration from language, You can override this method to read configuration from language,
country, company or other""" country, company or other"""
return self.env['ir.config_parameter'].sudo().get_param(
'partner_names_order', self._names_order_default())
return (
self.env["ir.config_parameter"]
.sudo()
.get_param("partner_names_order", self._names_order_default())
)
@api.model @api.model
def _get_computed_name(self, lastname, firstname): def _get_computed_name(self, lastname, firstname):
@ -94,21 +96,19 @@ class ResPartner(models.Model):
You can override this method to change the order of lastname and You can override this method to change the order of lastname and
firstname the computed name""" firstname the computed name"""
order = self._get_names_order() order = self._get_names_order()
if order == 'last_first_comma':
return ", ".join((p for p in (lastname, firstname) if p))
elif order == 'first_last':
return " ".join((p for p in (firstname, lastname) if p))
if order == "last_first_comma":
return ", ".join(p for p in (lastname, firstname) if p)
elif order == "first_last":
return " ".join(p for p in (firstname, lastname) if p)
else: else:
return " ".join((p for p in (lastname, firstname) if p))
return " ".join(p for p in (lastname, firstname) if p)
@api.multi @api.multi
@api.depends("firstname", "lastname") @api.depends("firstname", "lastname")
def _compute_name(self): def _compute_name(self):
"""Write the 'name' field according to splitted data.""" """Write the 'name' field according to splitted data."""
for record in self: for record in self:
record.name = record._get_computed_name(
record.lastname, record.firstname,
)
record.name = record._get_computed_name(record.lastname, record.firstname)
@api.multi @api.multi
def _inverse_name_after_cleaning_whitespace(self): def _inverse_name_after_cleaning_whitespace(self):
@ -144,7 +144,7 @@ class ResPartner(models.Model):
# conversion that Python does for us. # conversion that Python does for us.
# In that case we need to manually decode the string to get a # In that case we need to manually decode the string to get a
# proper unicode string. # proper unicode string.
name = ' '.join(name.decode('utf-8').split()) if name else name
name = " ".join(name.decode("utf-8").split()) if name else name
if comma: if comma:
name = name.replace(" ,", ",") name = name.replace(" ,", ",")
@ -173,10 +173,11 @@ class ResPartner(models.Model):
order = self._get_names_order() order = self._get_names_order()
# Remove redundant spaces # Remove redundant spaces
name = self._get_whitespace_cleaned_name( name = self._get_whitespace_cleaned_name(
name, comma=(order == 'last_first_comma'))
parts = name.split("," if order == 'last_first_comma' else " ", 1)
name, comma=(order == "last_first_comma")
)
parts = name.split("," if order == "last_first_comma" else " ", 1)
if len(parts) > 1: if len(parts) > 1:
if order == 'first_last':
if order == "first_last":
parts = [" ".join(parts[1:]), parts[0]] parts = [" ".join(parts[1:]), parts[0]]
else: else:
parts = [parts[0], " ".join(parts[1:])] parts = [parts[0], " ".join(parts[1:])]
@ -190,18 +191,20 @@ class ResPartner(models.Model):
"""Try to revert the effect of :meth:`._compute_name`.""" """Try to revert the effect of :meth:`._compute_name`."""
for record in self: for record in self:
parts = record._get_inverse_name(record.name, record.is_company) parts = record._get_inverse_name(record.name, record.is_company)
record.lastname = parts['lastname']
record.firstname = parts['firstname']
record.lastname = parts["lastname"]
record.firstname = parts["firstname"]
@api.multi @api.multi
@api.constrains("firstname", "lastname") @api.constrains("firstname", "lastname")
def _check_name(self): def _check_name(self):
"""Ensure at least one name is set.""" """Ensure at least one name is set."""
for record in self: for record in self:
if all((
record.type == 'contact' or record.is_company,
not (record.firstname or record.lastname)
)):
if all(
(
record.type == "contact" or record.is_company,
not (record.firstname or record.lastname),
)
):
raise exceptions.EmptyNamesError(record) raise exceptions.EmptyNamesError(record)
@api.onchange("firstname", "lastname") @api.onchange("firstname", "lastname")
@ -220,8 +223,7 @@ class ResPartner(models.Model):
"""Ensure :attr:`~.name` is inverted in the UI.""" """Ensure :attr:`~.name` is inverted in the UI."""
if self.env.context.get("skip_onchange"): if self.env.context.get("skip_onchange"):
# Do not skip next onchange # Do not skip next onchange
self.env.context = (
self.with_context(skip_onchange=False).env.context)
self.env.context = self.with_context(skip_onchange=False).env.context
else: else:
self._inverse_name_after_cleaning_whitespace() self._inverse_name_after_cleaning_whitespace()
@ -234,8 +236,7 @@ class ResPartner(models.Model):
correctly into the database. This can be called later too if needed. correctly into the database. This can be called later too if needed.
""" """
# Find records with empty firstname and lastname # Find records with empty firstname and lastname
records = self.search([("firstname", "=", False),
("lastname", "=", False)])
records = self.search([("firstname", "=", False), ("lastname", "=", False)])
# Force calculations there # Force calculations there
records._inverse_name() records._inverse_name()
@ -243,8 +244,4 @@ class ResPartner(models.Model):
# Disabling SQL constraint givint a more explicit error using a Python # Disabling SQL constraint givint a more explicit error using a Python
# contstraint # contstraint
_sql_constraints = [(
'check_name',
"CHECK( 1=1 )",
'Contacts require a name.'
)]
_sql_constraints = [("check_name", "CHECK( 1=1 )", "Contacts require a name.")]

33
partner_firstname/models/res_users.py

@ -2,21 +2,22 @@
# Copyright 2014 Agile Business Group (<http://www.agilebg.com>) # Copyright 2014 Agile Business Group (<http://www.agilebg.com>)
# Copyright 2015 Grupo ESOC (<http://www.grupoesoc.es>) # Copyright 2015 Grupo ESOC (<http://www.grupoesoc.es>)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo import api, models, _
from odoo import _, api, models
class ResUser(models.Model): class ResUser(models.Model):
_inherit = 'res.users'
_inherit = "res.users"
@api.model @api.model
def default_get(self, fields_list): def default_get(self, fields_list):
"""Invert name when getting default values.""" """Invert name when getting default values."""
result = super(ResUser, self).default_get(fields_list) result = super(ResUser, self).default_get(fields_list)
partner_model = self.env['res.partner']
partner_model = self.env["res.partner"]
inverted = partner_model._get_inverse_name( inverted = partner_model._get_inverse_name(
partner_model._get_whitespace_cleaned_name(result.get("name", "")), partner_model._get_whitespace_cleaned_name(result.get("name", "")),
result.get("is_company", False))
result.get("is_company", False),
)
for field in list(inverted.keys()): for field in list(inverted.keys()):
if field in fields_list: if field in fields_list:
@ -28,22 +29,22 @@ class ResUser(models.Model):
def _compute_name(self): def _compute_name(self):
"""Write the 'name' field according to splitted data.""" """Write the 'name' field according to splitted data."""
for rec in self: for rec in self:
rec.name = rec.partner_id._get_computed_name(
rec.lastname, rec.firstname)
rec.name = rec.partner_id._get_computed_name(rec.lastname, rec.firstname)
@api.multi @api.multi
def copy(self, default=None): def copy(self, default=None):
self.ensure_one() self.ensure_one()
default = dict(default or {}) default = dict(default or {})
if (('name' not in default) and
('partner_id' not in default)):
default['name'] = _("%s (copy)") % self.name
if 'login' not in default:
default['login'] = _("%s (copy)") % self.login
if (('firstname' not in default) and
('lastname' not in default) and
('name' in default)):
default.update(self.env['res.partner']._get_inverse_name(
default['name'], False)
if ("name" not in default) and ("partner_id" not in default):
default["name"] = _("%s (copy)") % self.name
if "login" not in default:
default["login"] = _("%s (copy)") % self.login
if (
("firstname" not in default)
and ("lastname" not in default)
and ("name" in default)
):
default.update(
self.env["res.partner"]._get_inverse_name(default["name"], False)
) )
return super(ResUser, self).copy(default) return super(ResUser, self).copy(default)

25
partner_firstname/tests/base.py

@ -1,17 +1,18 @@
# Copyright 2014 Nemry Jonathan (Acsone SA/NV) (http://www.acsone.eu) # Copyright 2014 Nemry Jonathan (Acsone SA/NV) (http://www.acsone.eu)
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from .. import exceptions as ex from .. import exceptions as ex
class MailInstalled():
class MailInstalled:
def mail_installed(self): def mail_installed(self):
"""Check if ``mail`` module is installed.``""" """Check if ``mail`` module is installed.``"""
return (self.env["ir.module.module"]
.search([("name", "=", "mail")])
.state == "installed")
return (
self.env["ir.module.module"].search([("name", "=", "mail")]).state
== "installed"
)
class BaseCase(TransactionCase, MailInstalled): class BaseCase(TransactionCase, MailInstalled):
@ -22,15 +23,15 @@ class BaseCase(TransactionCase, MailInstalled):
self.create_original() self.create_original()
def create_original(self): def create_original(self):
self.original = self.env["res.partner"].create({
"firstname": self.firstname,
"lastname": self.lastname})
self.original = self.env["res.partner"].create(
{"firstname": self.firstname, "lastname": self.lastname}
)
def expect(self, lastname, firstname, name=None): def expect(self, lastname, firstname, name=None):
"""Define what is expected in each field when ending.""" """Define what is expected in each field when ending."""
self.lastname = lastname self.lastname = lastname
self.firstname = firstname self.firstname = firstname
self.name = name or "%s %s" % (firstname, lastname)
self.name = name or "{} {}".format(firstname, lastname)
def tearDown(self): def tearDown(self):
if self.check_fields: if self.check_fields:
@ -41,15 +42,15 @@ class BaseCase(TransactionCase, MailInstalled):
self.assertEqual( self.assertEqual(
getattr(self.changed, field), getattr(self.changed, field),
getattr(self, field), getattr(self, field),
"Test failed with wrong %s" % field)
"Test failed with wrong %s" % field,
)
super(BaseCase, self).tearDown() super(BaseCase, self).tearDown()
def test_copy(self): def test_copy(self):
"""Copy the partner and compare the result.""" """Copy the partner and compare the result."""
self.expect("%s (copy)" % self.lastname, self.firstname) self.expect("%s (copy)" % self.lastname, self.firstname)
self.changed = (self.original.with_context(copy=True, lang="en_US")
.copy())
self.changed = self.original.with_context(copy=True, lang="en_US").copy()
def test_one_name(self): def test_one_name(self):
"""Test what happens when only one name is given.""" """Test what happens when only one name is given."""

28
partner_firstname/tests/test_copy.py

@ -1,6 +1,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
"""Test copy function for models.""" """Test copy function for models."""
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from .base import MailInstalled from .base import MailInstalled
@ -12,12 +13,14 @@ class UserCase(TransactionCase, MailInstalled):
self.create_original() self.create_original()
def create_original(self): def create_original(self):
self.original = self.env["res.users"].create({
self.original = self.env["res.users"].create(
{
"firstname": u"Firstname", "firstname": u"Firstname",
"lastname": u"Lastname", "lastname": u"Lastname",
"name": u"Firstname Lastname", "name": u"Firstname Lastname",
"login": u"firstname.lastname"
})
"login": u"firstname.lastname",
}
)
def tearDown(self): def tearDown(self):
super(UserCase, self).tearDown() super(UserCase, self).tearDown()
@ -29,24 +32,23 @@ class UserCase(TransactionCase, MailInstalled):
def test_copy_name(self): def test_copy_name(self):
"""Copy original with default name set - firstname lastname not set.""" """Copy original with default name set - firstname lastname not set."""
copy = self.original.copy({
"name": u"Firstname2 Lastname2"
})
copy = self.original.copy({"name": u"Firstname2 Lastname2"})
self.compare(copy) self.compare(copy)
def test_copy_firstname_lastname(self): def test_copy_firstname_lastname(self):
"""Copy original with default firstname and lastname set""" """Copy original with default firstname and lastname set"""
copy = self.original.copy({
"firstname": u"Firstname2",
"lastname": u"Lastname2"
})
copy = self.original.copy(
{"firstname": u"Firstname2", "lastname": u"Lastname2"}
)
self.compare(copy) self.compare(copy)
def test_copy_firstname_lastname_name(self): def test_copy_firstname_lastname_name(self):
"""Copy original with default firstname, lastname and name set""" """Copy original with default firstname, lastname and name set"""
copy = self.original.copy({
copy = self.original.copy(
{
"firstname": u"Firstname2", "firstname": u"Firstname2",
"lastname": u"Lastname2", "lastname": u"Lastname2",
"name": u"Firstname2 Lastname2"
})
"name": u"Firstname2 Lastname2",
}
)
self.compare(copy) self.compare(copy)

25
partner_firstname/tests/test_create.py

@ -4,35 +4,32 @@
"""Test default values for models.""" """Test default values for models."""
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from .base import MailInstalled from .base import MailInstalled
class PersonCase(TransactionCase): class PersonCase(TransactionCase):
"""Test ``res.partner`` when it is a person.""" """Test ``res.partner`` when it is a person."""
context = {"default_is_company": False} context = {"default_is_company": False}
model = "res.partner" model = "res.partner"
def setUp(self): def setUp(self):
super(PersonCase, self).setUp() super(PersonCase, self).setUp()
self.good_values = {
"firstname": "Núñez",
"lastname": "Fernán",
}
self.good_values["name"] = "%s %s" % (self.good_values["firstname"],
self.good_values["lastname"])
self.good_values = {"firstname": "Núñez", "lastname": "Fernán"}
self.good_values["name"] = "{} {}".format(
self.good_values["firstname"], self.good_values["lastname"]
)
if "default_is_company" in self.context: if "default_is_company" in self.context:
self.good_values["is_company"] = self.context["default_is_company"] self.good_values["is_company"] = self.context["default_is_company"]
self.values = self.good_values.copy() self.values = self.good_values.copy()
def tearDown(self): def tearDown(self):
self.record = (self.env[self.model]
.with_context(self.context)
.create(self.values))
self.record = (
self.env[self.model].with_context(self.context).create(self.values)
)
for key, value in self.good_values.items(): for key, value in self.good_values.items():
self.assertEqual(
self.record[key],
value,
"Checking key %s" % key)
self.assertEqual(self.record[key], value, "Checking key %s" % key)
super(PersonCase, self).tearDown() super(PersonCase, self).tearDown()
@ -57,6 +54,7 @@ class PersonCase(TransactionCase):
class CompanyCase(PersonCase): class CompanyCase(PersonCase):
"""Test ``res.partner`` when it is a company.""" """Test ``res.partner`` when it is a company."""
context = {"default_is_company": True} context = {"default_is_company": True}
def setUp(self): def setUp(self):
@ -67,6 +65,7 @@ class CompanyCase(PersonCase):
class UserCase(PersonCase, MailInstalled): class UserCase(PersonCase, MailInstalled):
"""Test ``res.users``.""" """Test ``res.users``."""
model = "res.users" model = "res.users"
context = {"default_login": "user@example.com"} context = {"default_login": "user@example.com"}

28
partner_firstname/tests/test_defaults.py

@ -4,44 +4,43 @@
"""Test default values for models.""" """Test default values for models."""
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from .base import MailInstalled from .base import MailInstalled
class PersonCase(TransactionCase): class PersonCase(TransactionCase):
"""Test ``res.partner`` when it is a person.""" """Test ``res.partner`` when it is a person."""
context = {"default_is_company": False} context = {"default_is_company": False}
model = "res.partner" model = "res.partner"
def setUp(self): def setUp(self):
super(PersonCase, self).setUp() super(PersonCase, self).setUp()
self.values = {
"firstname": "Núñez",
"lastname": "Fernán",
}
self.values["name"] = "%s %s" % (self.values["firstname"],
self.values["lastname"])
self.values = {"firstname": "Núñez", "lastname": "Fernán"}
self.values["name"] = "{} {}".format(
self.values["firstname"], self.values["lastname"]
)
if "default_is_company" in self.context: if "default_is_company" in self.context:
self.values["is_company"] = self.context["default_is_company"] self.values["is_company"] = self.context["default_is_company"]
def tearDown(self): def tearDown(self):
for key, value in self.values.items(): for key, value in self.values.items():
self.assertEqual(
self.defaults.get(key),
value,
"Checking key %s" % key)
self.assertEqual(self.defaults.get(key), value, "Checking key %s" % key)
return super(PersonCase, self).tearDown() return super(PersonCase, self).tearDown()
def test_default_get(self): def test_default_get(self):
"""Getting default values for fields includes new fields.""" """Getting default values for fields includes new fields."""
self.defaults = (self.env[self.model]
.with_context(self.context,
default_name=self.values["name"])
.default_get(list(self.values.keys())))
self.defaults = (
self.env[self.model]
.with_context(self.context, default_name=self.values["name"])
.default_get(list(self.values.keys()))
)
class CompanyCase(PersonCase): class CompanyCase(PersonCase):
"""Test ``res.partner`` when it is a company.""" """Test ``res.partner`` when it is a company."""
context = {"default_is_company": True} context = {"default_is_company": True}
def tearDown(self): def tearDown(self):
@ -51,6 +50,7 @@ class CompanyCase(PersonCase):
class UserCase(PersonCase, MailInstalled): class UserCase(PersonCase, MailInstalled):
"""Test ``res.users``.""" """Test ``res.users``."""
model = "res.users" model = "res.users"
context = {"default_login": "user@example.com"} context = {"default_login": "user@example.com"}

1
partner_firstname/tests/test_delete.py

@ -2,6 +2,7 @@
# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). # License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html).
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from .base import MailInstalled from .base import MailInstalled

24
partner_firstname/tests/test_empty.py

@ -6,12 +6,14 @@
To have more accurate results, remove the ``mail`` module before testing. To have more accurate results, remove the ``mail`` module before testing.
""" """
from odoo.tests.common import TransactionCase from odoo.tests.common import TransactionCase
from .base import MailInstalled
from .. import exceptions as ex from .. import exceptions as ex
from .base import MailInstalled
class CompanyCase(TransactionCase): class CompanyCase(TransactionCase):
"""Test ``res.partner`` when it is a company.""" """Test ``res.partner`` when it is a company."""
model = "res.partner" model = "res.partner"
context = {"default_is_company": True} context = {"default_is_company": True}
@ -35,11 +37,13 @@ class CompanyCase(TransactionCase):
class PersonCase(CompanyCase): class PersonCase(CompanyCase):
"""Test ``res.partner`` when it is a person.""" """Test ``res.partner`` when it is a person."""
context = {"default_is_company": False, "default_type": 'contact'}
context = {"default_is_company": False, "default_type": "contact"}
class UserCase(CompanyCase, MailInstalled): class UserCase(CompanyCase, MailInstalled):
"""Test ``res.users``.""" """Test ``res.users``."""
model = "res.users" model = "res.users"
context = {"default_login": "user@example.com"} context = {"default_login": "user@example.com"}
@ -58,16 +62,12 @@ class AddressCase(TransactionCase):
def test_new_empty_invoice_address(self): def test_new_empty_invoice_address(self):
"""Create an invoice patner without name.""" """Create an invoice patner without name."""
self.original = self.env["res.partner"].create({
"is_company": False,
"type": 'invoice',
"lastname": "",
"firstname": ""})
self.original = self.env["res.partner"].create(
{"is_company": False, "type": "invoice", "lastname": "", "firstname": ""}
)
def test_new_empty_shipping_address(self): def test_new_empty_shipping_address(self):
"""Create an shipping patner without name.""" """Create an shipping patner without name."""
self.original = self.env["res.partner"].create({
"is_company": False,
"type": 'delivery',
"lastname": "",
"firstname": ""})
self.original = self.env["res.partner"].create(
{"is_company": False, "type": "delivery", "lastname": "", "firstname": ""}
)

8
partner_firstname/tests/test_name.py

@ -70,16 +70,16 @@ class PartnerCompanyCase(BaseCase):
class UserCase(PartnerContactCase): class UserCase(PartnerContactCase):
def create_original(self): def create_original(self):
name = "%s %s" % (self.firstname, self.lastname)
name = "{} {}".format(self.firstname, self.lastname)
# Cannot create users if ``mail`` is installed # Cannot create users if ``mail`` is installed
if self.mail_installed(): if self.mail_installed():
self.original = self.env.ref("base.user_demo") self.original = self.env.ref("base.user_demo")
self.original.name = name self.original.name = name
else: else:
self.original = self.env["res.users"].create({
"name": name,
"login": "firstnametest@example.com"})
self.original = self.env["res.users"].create(
{"name": name, "login": "firstnametest@example.com"}
)
def test_copy(self): def test_copy(self):
"""Copy the partner and compare the result.""" """Copy the partner and compare the result."""

28
partner_firstname/tests/test_order.py

@ -6,34 +6,36 @@ from odoo.tests.common import TransactionCase
class PartnerNamesOrder(TransactionCase): class PartnerNamesOrder(TransactionCase):
def order_set(self, order): def order_set(self, order):
return self.env['ir.config_parameter'].sudo().set_param(
'partner_names_order', order)
return (
self.env["ir.config_parameter"]
.sudo()
.set_param("partner_names_order", order)
)
def test_get_computed_name(self): def test_get_computed_name(self):
lastname = "García Lorca" lastname = "García Lorca"
firstname = "Federico" firstname = "Federico"
cases = ( cases = (
('last_first', "García Lorca Federico"),
('last_first_comma', "García Lorca, Federico"),
('first_last', "Federico García Lorca"),
("last_first", "García Lorca Federico"),
("last_first_comma", "García Lorca, Federico"),
("first_last", "Federico García Lorca"),
) )
for order, name in cases: for order, name in cases:
self.order_set(order) self.order_set(order)
result = self.env['res.partner']._get_computed_name(
lastname, firstname)
result = self.env["res.partner"]._get_computed_name(lastname, firstname)
self.assertEqual(result, name) self.assertEqual(result, name)
def test_get_inverse_name(self): def test_get_inverse_name(self):
lastname = "Flanker" lastname = "Flanker"
firstname = "Petër" firstname = "Petër"
cases = ( cases = (
('last_first', "Flanker Petër"),
('last_first_comma', "Flanker, Petër"),
('first_last', "Petër Flanker"),
("last_first", "Flanker Petër"),
("last_first_comma", "Flanker, Petër"),
("first_last", "Petër Flanker"),
) )
for order, name in cases: for order, name in cases:
self.order_set(order) self.order_set(order)
result = self.env['res.partner']._get_inverse_name(name)
self.assertEqual(result['lastname'], lastname)
self.assertEqual(result['firstname'], firstname)
result = self.env["res.partner"]._get_inverse_name(name)
self.assertEqual(result["lastname"], lastname)
self.assertEqual(result["firstname"], firstname)

1
partner_firstname/tests/test_user_onchange.py

@ -5,7 +5,6 @@ from odoo.tests.common import TransactionCase
class UserOnchangeCase(TransactionCase): class UserOnchangeCase(TransactionCase):
def test_create_from_form_only_firstname(self): def test_create_from_form_only_firstname(self):
"""In a new users form, a user set only the firstname.""" """In a new users form, a user set only the firstname."""
firstname = "Zoë" firstname = "Zoë"

Loading…
Cancel
Save