diff --git a/.copier-answers.yml b/.copier-answers.yml index dfc9853ab..68c58b4dc 100644 --- a/.copier-answers.yml +++ b/.copier-answers.yml @@ -1,14 +1,17 @@ # Do NOT update manually; changes here will be overwritten by Copier -_commit: v1.3.6 +_commit: v1.5.2 _src_path: gh:oca/oca-addons-repo-template ci: Travis dependency_installation_mode: PIP generate_requirements_txt: true include_wkhtmltopdf: false odoo_version: 14.0 +org_name: Odoo Community Association (OCA) +org_slug: OCA rebel_module_groups: [] repo_description: 'TODO: add repo description.' repo_name: partner-contact repo_slug: partner-contact +repo_website: https://github.com/OCA/partner-contact travis_apt_packages: [] travis_apt_sources: [] diff --git a/.eslintrc.yml b/.eslintrc.yml index d4cc423cc..9429bc688 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -4,7 +4,7 @@ env: # See https://github.com/OCA/odoo-community.org/issues/37#issuecomment-470686449 parserOptions: - ecmaVersion: 2017 + ecmaVersion: 2019 overrides: - files: diff --git a/.github/workflows/pre-commit.yml b/.github/workflows/pre-commit.yml index 80ab1a211..a7a139046 100644 --- a/.github/workflows/pre-commit.yml +++ b/.github/workflows/pre-commit.yml @@ -2,7 +2,12 @@ name: pre-commit on: pull_request: + branches: + - "14.0*" push: + branches: + - "14.0" + - "14.0-ocabot-*" jobs: pre-commit: @@ -10,11 +15,21 @@ jobs: steps: - uses: actions/checkout@v2 - uses: actions/setup-python@v2 + - name: Get python version + run: echo "PY=$(python -VV | sha256sum | cut -d' ' -f1)" >> $GITHUB_ENV + - uses: actions/cache@v1 with: - # The pylint-odoo version we use here does not support python 3.10 - # https://github.com/OCA/oca-addons-repo-template/issues/80 - # We also need to pin to an older version of python for older odoo versions - # where we are not using black > 21. Older black versions won't work with - # Python 3.9.8+, and we can't bump black without reformatting. - python-version: "3.9.7" - - uses: pre-commit/action@v2.0.0 + path: ~/.cache/pre-commit + key: pre-commit|${{ env.PY }}|${{ hashFiles('.pre-commit-config.yaml') }} + - name: Install pre-commit + run: pip install pre-commit + - name: Run pre-commit + run: pre-commit run --all-files --show-diff-on-failure --color=always + - name: Check that all files generated by pre-commit are in git + run: | + newfiles="$(git ls-files --others --exclude-from=.gitignore)" + if [ "$newfiles" != "" ] ; then + echo "Please check-in the following files:" + echo "$newfiles" + exit 1 + fi diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 298e39359..ee6e14ad0 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -46,7 +46,7 @@ repos: - --remove-duplicate-keys - --remove-unused-variables - repo: https://github.com/psf/black - rev: 20.8b1 + rev: 22.3.0 hooks: - id: black - repo: https://github.com/pre-commit/mirrors-prettier @@ -120,7 +120,7 @@ repos: name: flake8 additional_dependencies: ["flake8-bugbear==20.1.4"] - repo: https://github.com/PyCQA/pylint - rev: pylint-2.5.3 + rev: v2.11.1 hooks: - id: pylint name: pylint with optional checks @@ -129,7 +129,7 @@ repos: - --exit-zero verbose: true additional_dependencies: &pylint_deps - - pylint-odoo==3.5.0 + - pylint-odoo==5.0.5 - id: pylint name: pylint with mandatory checks args: diff --git a/README.md b/README.md index dfb8e1704..f143659c4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ -[![Runbot Status](https://runbot.odoo-community.org/runbot/badge/flat/134/14.0.svg)](https://runbot.odoo-community.org/runbot/repo/github-com-oca-partner-contact-134) + +[![Runboat](https://img.shields.io/badge/runboat-Try%20me-875A7B.png)](https://runboat.odoo-community.org/builds?repo=OCA/partner-contact&target_branch=14.0) [![Build Status](https://travis-ci.com/OCA/partner-contact.svg?branch=14.0)](https://travis-ci.com/OCA/partner-contact) [![codecov](https://codecov.io/gh/OCA/partner-contact/branch/14.0/graph/badge.svg)](https://codecov.io/gh/OCA/partner-contact) [![Translation Status](https://translation.odoo-community.org/widgets/partner-contact-14-0/-/svg-badge.svg)](https://translation.odoo-community.org/engage/partner-contact-14-0/?utm_source=widget) @@ -87,12 +88,11 @@ addon | version | maintainers | summary This repository is licensed under [AGPL-3.0](LICENSE). -However, each module can have a totally different license, as long as they adhere to OCA +However, each module can have a totally different license, as long as they adhere to Odoo Community Association (OCA) policy. Consult each module's `__manifest__.py` file, which contains a `license` key that explains its license. ---- - OCA, or the [Odoo Community Association](http://odoo-community.org/), is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use. diff --git a/base_location_nuts/tests/test_base_location_nuts.py b/base_location_nuts/tests/test_base_location_nuts.py index 9f584364f..503888799 100644 --- a/base_location_nuts/tests/test_base_location_nuts.py +++ b/base_location_nuts/tests/test_base_location_nuts.py @@ -71,7 +71,7 @@ class TestBaseLocationNuts(common.SavepointCase): self.assertEqual(self.partner.nuts1_id.country_id, self.country_1) def test_download_exceptions(self): - """ Tests download exceptions """ + """Tests download exceptions""" with self.assertRaises(UserError): self.importer._download_nuts(url_base="htttt://test.com") with self.assertRaises(UserError): diff --git a/partner_address_street3/hooks.py b/partner_address_street3/hooks.py index c46c578d3..35913b240 100644 --- a/partner_address_street3/hooks.py +++ b/partner_address_street3/hooks.py @@ -3,7 +3,7 @@ def post_init_hook(cr, registry): - """ Add street3 to address format """ + """Add street3 to address format""" query = """ UPDATE res_country SET address_format = replace( @@ -16,7 +16,7 @@ def post_init_hook(cr, registry): def uninstall_hook(cr, registry): - """ Remove street3 from address format """ + """Remove street3 from address format""" # Remove %(street3)s\n from address_format query = """ UPDATE res_country diff --git a/partner_address_version/tests/test_address_version.py b/partner_address_version/tests/test_address_version.py index 84619c9c1..87c5a89fd 100644 --- a/partner_address_version/tests/test_address_version.py +++ b/partner_address_version/tests/test_address_version.py @@ -14,11 +14,11 @@ class TestAddressVersion(SavepointCase): super(TestAddressVersion, cls).setUpClass() cls.partner_vals = OrderedDict( [ - ("name", u"Name"), - ("street", u"Street"), - ("street2", u"Street2"), - ("zip", u"Zip"), - ("city", u"City"), + ("name", "Name"), + ("street", "Street"), + ("street2", "Street2"), + ("zip", "Zip"), + ("city", "City"), ("country_id", cls.env.ref("base.fr")), ] ) diff --git a/partner_contact_department/tests/test_recursion.py b/partner_contact_department/tests/test_recursion.py index 5a56a5e40..80b0b9a14 100644 --- a/partner_contact_department/tests/test_recursion.py +++ b/partner_contact_department/tests/test_recursion.py @@ -17,7 +17,7 @@ class TestRecursion(common.SavepointCase): ) def test_recursion(self): - """ Testing recursion """ + """Testing recursion""" self.dpt3 = self.department_obj.create( {"name": "Dep. 3", "parent_id": self.dpt2.id} ) diff --git a/partner_email_check/tests/test_partner_email_check.py b/partner_email_check/tests/test_partner_email_check.py index 2301226c3..a7f442f96 100644 --- a/partner_email_check/tests/test_partner_email_check.py +++ b/partner_email_check/tests/test_partner_email_check.py @@ -41,7 +41,7 @@ class TestPartnerEmailCheck(SavepointCase): def test_email_domain_normalization(self): """Test normalization of email domain names, including punycode.""" self.test_partner.write({"email": "goodemail@xn--xamPle-9ua.com"}) - self.assertEqual(self.test_partner.email, u"goodemail@éxample.com") + self.assertEqual(self.test_partner.email, "goodemail@éxample.com") def test_multi_email_domain_normalization(self): """Test normalization of email domain names of multiple addresses.""" @@ -49,7 +49,7 @@ class TestPartnerEmailCheck(SavepointCase): {"email": "goodemail@doMAIN.com,othergood@xn--xample-9ua.com"} ) self.assertEqual( - self.test_partner.email, u"goodemail@domain.com,othergood@éxample.com" + self.test_partner.email, "goodemail@domain.com,othergood@éxample.com" ) def test_email_local_normalization(self): diff --git a/partner_firstname/tests/test_copy.py b/partner_firstname/tests/test_copy.py index 15376b71c..20ce455d4 100644 --- a/partner_firstname/tests/test_copy.py +++ b/partner_firstname/tests/test_copy.py @@ -15,10 +15,10 @@ class UserCase(TransactionCase, MailInstalled): def create_original(self): self.original = self.env["res.users"].create( { - "firstname": u"Firstname", - "lastname": u"Lastname", - "name": u"Firstname Lastname", - "login": u"firstname.lastname", + "firstname": "Firstname", + "lastname": "Lastname", + "name": "Firstname Lastname", + "login": "firstname.lastname", } ) @@ -26,29 +26,27 @@ class UserCase(TransactionCase, MailInstalled): super(UserCase, self).tearDown() def compare(self, copy): - self.assertEqual(copy.lastname, u"Lastname2") - self.assertEqual(copy.firstname, u"Firstname2") - self.assertEqual(copy.name, u"Firstname2 Lastname2") + self.assertEqual(copy.lastname, "Lastname2") + self.assertEqual(copy.firstname, "Firstname2") + self.assertEqual(copy.name, "Firstname2 Lastname2") def test_copy_name(self): """Copy original with default name set - firstname lastname not set.""" - copy = self.original.copy({"name": u"Firstname2 Lastname2"}) + copy = self.original.copy({"name": "Firstname2 Lastname2"}) self.compare(copy) def test_copy_firstname_lastname(self): """Copy original with default firstname and lastname set""" - copy = self.original.copy( - {"firstname": u"Firstname2", "lastname": u"Lastname2"} - ) + copy = self.original.copy({"firstname": "Firstname2", "lastname": "Lastname2"}) self.compare(copy) def test_copy_firstname_lastname_name(self): """Copy original with default firstname, lastname and name set""" copy = self.original.copy( { - "firstname": u"Firstname2", - "lastname": u"Lastname2", - "name": u"Firstname2 Lastname2", + "firstname": "Firstname2", + "lastname": "Lastname2", + "name": "Firstname2 Lastname2", } ) self.compare(copy) diff --git a/partner_identification/tests/test_partner_identification.py b/partner_identification/tests/test_partner_identification.py index 3a9f638bb..edfe0a756 100644 --- a/partner_identification/tests/test_partner_identification.py +++ b/partner_identification/tests/test_partner_identification.py @@ -111,7 +111,7 @@ if id_number.name != '1234' # missing : ) def test_bad_validation_code_override(self): - """ It should allow a bad validation code if context overrides. """ + """It should allow a bad validation code if context overrides.""" partner_id_category = self.env["res.partner.id_category"].create( { "code": "id_code", diff --git a/partner_identification/tests/test_res_partner.py b/partner_identification/tests/test_res_partner.py index 68a1fd658..8e74eda8f 100644 --- a/partner_identification/tests/test_res_partner.py +++ b/partner_identification/tests/test_res_partner.py @@ -40,17 +40,17 @@ class TestResPartner(common.SavepointCase): super().tearDownClass() def test_compute_identification(self): - """ It should set the proper field to the proper ID name. """ + """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. """ + """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. """ + """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")] @@ -58,7 +58,7 @@ class TestResPartner(common.SavepointCase): self.assertTrue(category) def test_inverse_identification_creates_new_id(self): - """ It should create a new ID of the type if non-existent. """ + """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"} ) @@ -69,7 +69,7 @@ class TestResPartner(common.SavepointCase): 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. """ + """It should not allow a write when multiple IDs of same type.""" self.env["res.partner.id_number"].create( { "name": "Another ID", @@ -81,7 +81,7 @@ class TestResPartner(common.SavepointCase): self.partner._inverse_identification("name", "id_code") def test_search_identification(self): - """ It should return the right record when searched by ID. """ + """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) diff --git a/partner_industry_secondary/models/res_partner_industry.py b/partner_industry_secondary/models/res_partner_industry.py index 3fb903fbf..734710b54 100644 --- a/partner_industry_secondary/models/res_partner_industry.py +++ b/partner_industry_secondary/models/res_partner_industry.py @@ -25,7 +25,7 @@ class ResPartnerIndustry(models.Model): def name_get(self): def get_names(cat): - """ Return the list [cat.name, cat.parent_id.name, ...] """ + """Return the list [cat.name, cat.parent_id.name, ...]""" res = [] while cat: res.insert(0, cat.name) diff --git a/partner_pricelist_search/tests/test_partner_pricelist_search.py b/partner_pricelist_search/tests/test_partner_pricelist_search.py index d33287d81..ac7b95a55 100644 --- a/partner_pricelist_search/tests/test_partner_pricelist_search.py +++ b/partner_pricelist_search/tests/test_partner_pricelist_search.py @@ -24,14 +24,14 @@ class TestPartnerPricelistSearch(common.SavepointCase): cls.partner_obj = cls.env["res.partner"] def test_partner_pricelist_search_equal(self): - """ Test search '=' """ + """Test search '='""" partners = self.partner_obj.search( [("property_product_pricelist", "=", self.pricelist_1.id)] ) self.assertEqual(partners, self.customer_1) def test_partner_pricelist_search_in(self): - """ Test search 'in' """ + """Test search 'in'""" partners = self.partner_obj.search( [ ( @@ -45,7 +45,7 @@ class TestPartnerPricelistSearch(common.SavepointCase): self.assertIn(self.customer_2, partners) def test_partner_pricelist_search_not_equal(self): - """ Test search 'not equal' """ + """Test search 'not equal'""" partners = self.partner_obj.search( [("property_product_pricelist", "!=", self.pricelist_1.id)] ) @@ -53,7 +53,7 @@ class TestPartnerPricelistSearch(common.SavepointCase): self.assertIn(self.customer_2, partners) def test_partner_pricelist_search_not_in(self): - """ Test search 'not in' """ + """Test search 'not in'""" partners = self.partner_obj.search( [ ( @@ -67,7 +67,7 @@ class TestPartnerPricelistSearch(common.SavepointCase): self.assertNotIn(self.customer_2, partners) def test_partner_pricelist_search_not_implemented(self): - """ Test search not implemented """ + """Test search not implemented""" with self.assertRaises(UserError): self.partner_obj.search( [("property_product_pricelist", "ilike", "pricelist xx")] diff --git a/partner_second_lastname/models/res_partner.py b/partner_second_lastname/models/res_partner.py index b1b09deb5..2b3c6974f 100644 --- a/partner_second_lastname/models/res_partner.py +++ b/partner_second_lastname/models/res_partner.py @@ -90,12 +90,12 @@ class ResPartner(models.Model): if order in ("first_last", "last_first_comma"): parts = self._split_part("lastname", result) if parts: - result.update({"lastname": parts[0], "lastname2": u" ".join(parts[1:])}) + result.update({"lastname": parts[0], "lastname2": " ".join(parts[1:])}) else: parts = self._split_part("firstname", result) if parts: result.update( - {"firstname": parts[-1], "lastname2": u" ".join(parts[:-1])} + {"firstname": parts[-1], "lastname2": " ".join(parts[:-1])} ) return result