From 3bee7225b540a4888bf75d0b1fee9abf65ba203a Mon Sep 17 00:00:00 2001 From: "Pedro M. Baeza" Date: Sat, 12 Mar 2016 08:37:08 +0100 Subject: [PATCH] [MIG] base_location_geonames_import: Initial migration to 9.0 [IMP] base_location_geonames_import: Make tests more efficient [FIX] base_location_geonames_import: Don't alias Warning [IMP] base_location_geonames_import: Convert tests to Python + switch imported country Monaco country is very little and it allows to save some downloaded bytes plus making a test for entries deletion [IMP] base_location_geonames_import: Switch author [FIX] base_location_geonames_import: Fix test [FIX] base_location_geonames_import: Fix tests [MIG] Make modules uninstallable [MIG] Rename manifest files [FIX] base_location_geonames_import: Test logic changed For avoiding constant problems with this test, as Monaco data changes a lot, what we are testing now is the existence of the data, not the exact match of them. --- base_location_geonames_import/README.rst | 22 ++++++ base_location_geonames_import/__init__.py | 23 +------ base_location_geonames_import/__manifest__.py | 25 +++++++ base_location_geonames_import/__openerp__.py | 48 ------------- .../i18n/base_location_geonames_import.pot | 68 ------------------- base_location_geonames_import/test/import.yml | 54 --------------- .../tests/__init__.py | 4 ++ .../test_base_location_geonames_import.py | 46 +++++++++++++ .../wizard/__init__.py | 23 +------ .../wizard/geonames_import.py | 52 ++++++-------- 10 files changed, 120 insertions(+), 245 deletions(-) create mode 100644 base_location_geonames_import/__manifest__.py delete mode 100644 base_location_geonames_import/__openerp__.py delete mode 100644 base_location_geonames_import/i18n/base_location_geonames_import.pot delete mode 100644 base_location_geonames_import/test/import.yml create mode 100644 base_location_geonames_import/tests/__init__.py create mode 100644 base_location_geonames_import/tests/test_base_location_geonames_import.py diff --git a/base_location_geonames_import/README.rst b/base_location_geonames_import/README.rst index 219404f94..b5dd3e775 100644 --- a/base_location_geonames_import/README.rst +++ b/base_location_geonames_import/README.rst @@ -1,3 +1,8 @@ +.. image:: https://img.shields.io/badge/licence-AGPL--3-blue.svg + :target: http://www.gnu.org/licenses/agpl-3.0-standalone.html + :alt: License: AGPL-3 + +============================= Base Location Geonames Import ============================= @@ -29,6 +34,23 @@ selected country, it will delete all the current better zip entries, download the latest version of the list of cities from geonames.org and create new better zip entries. +.. image:: https://odoo-community.org/website/image/ir.attachment/5784_f2813bd/datas + :alt: Try me on Runbot + :target: https://runbot.odoo-community.org/runbot/134/9.0 + + +Bug Tracker +=========== + +Bugs are tracked on `GitHub Issues +`_. In case of trouble, please +check there if your issue has already been reported. If you spotted it first, +help us smashing it by providing a detailed and welcomed `feedback +`_. + Credits ======= diff --git a/base_location_geonames_import/__init__.py b/base_location_geonames_import/__init__.py index b63234221..d18ad148c 100644 --- a/base_location_geonames_import/__init__.py +++ b/base_location_geonames_import/__init__.py @@ -1,23 +1,4 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# Base Location Geonames Import module for OpenERP -# Copyright (C) 2014 Akretion (http://www.akretion.com) -# @author Alexis de Lattre -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import wizard diff --git a/base_location_geonames_import/__manifest__.py b/base_location_geonames_import/__manifest__.py new file mode 100644 index 000000000..415c08e06 --- /dev/null +++ b/base_location_geonames_import/__manifest__.py @@ -0,0 +1,25 @@ +# -*- coding: utf-8 -*- +# © 2014 Alexis de Lattre +# © 2014 Lorenzo Battistini +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +{ + 'name': 'Base Location Geonames Import', + 'version': '9.0.1.0.1', + 'category': 'Partner Management', + 'license': 'AGPL-3', + 'summary': 'Import better zip entries from Geonames', + 'author': 'Akretion,' + 'Agile Business Group,' + 'Antiun Ingeniería S.L.,' + 'Tecnativa,' + 'Odoo Community Association (OCA)', + 'website': 'http://www.akretion.com', + 'depends': ['base_location'], + 'external_dependencies': {'python': ['requests', 'unicodecsv']}, + 'data': [ + 'wizard/geonames_import_view.xml', + ], + 'installable': False, +} diff --git a/base_location_geonames_import/__openerp__.py b/base_location_geonames_import/__openerp__.py deleted file mode 100644 index 2a1c3a180..000000000 --- a/base_location_geonames_import/__openerp__.py +++ /dev/null @@ -1,48 +0,0 @@ -# -*- coding: utf-8 -*- -############################################################################## -# -# Base Location Geonames Import module for OpenERP -# Copyright (C) 2014 Akretion (http://www.akretion.com) -# @author Alexis de Lattre -# Copyright (C) 2014 Agile Business Group (http://www.agilebg.com) -# @author Lorenzo Battistini -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## - - -{ - 'name': 'Base Location Geonames Import', - 'version': '8.0.0.3.0', - 'category': 'Extra Tools', - 'license': 'AGPL-3', - 'summary': 'Import better zip entries from Geonames', - 'author': 'Akretion,' - 'Agile Business Group,' - 'Antiun Ingeniería S.L.,' - 'Serv. Tecnol. Avanzados - Pedro M. Baeza,' - 'Odoo Community Association (OCA)', - 'website': 'http://www.akretion.com', - 'depends': ['base_location'], - 'external_dependencies': {'python': ['requests', 'unicodecsv']}, - 'data': [ - 'wizard/geonames_import_view.xml', - ], - 'test': [ - 'test/import.yml' - ], - 'installable': True, - 'active': False, -} diff --git a/base_location_geonames_import/i18n/base_location_geonames_import.pot b/base_location_geonames_import/i18n/base_location_geonames_import.pot deleted file mode 100644 index 8b8fed1c9..000000000 --- a/base_location_geonames_import/i18n/base_location_geonames_import.pot +++ /dev/null @@ -1,68 +0,0 @@ -# Translation of OpenERP Server. -# This file contains the translation of the following modules: -# * base_location_geonames_import -# -msgid "" -msgstr "" -"Project-Id-Version: OpenERP Server 7.0\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2014-04-11 20:55+0000\n" -"PO-Revision-Date: 2014-04-11 20:55+0000\n" -"Last-Translator: <>\n" -"Language-Team: \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: \n" -"Plural-Forms: \n" - -#. module: base_location_geonames_import -#: view:better.zip.geonames.import:0 -msgid "Cancel" -msgstr "" - -#. module: base_location_geonames_import -#: field:better.zip.geonames.import,country_id:0 -msgid "Country" -msgstr "" - -#. module: base_location_geonames_import -#: code:addons/base_location_geonames_import/wizard/geonames_import.py:66 -#: code:addons/base_location_geonames_import/wizard/geonames_import.py:90 -#, python-format -msgid "Error:" -msgstr "" - -#. module: base_location_geonames_import -#: view:better.zip.geonames.import:0 -msgid "For the country selected above, this wizard will download the latest version of the list of cities from geonames.org, create new location entries if not found already in the system, and DELETE MISSING ENTRIES from new file." -msgstr "" - -#. module: base_location_geonames_import -#: code:addons/base_location_geonames_import/wizard/geonames_import.py:91 -#, python-format -msgid "Got an error %d when trying to download the file %s." -msgstr "" - -#. module: base_location_geonames_import -#: view:better.zip.geonames.import:0 -msgid "Import" -msgstr "" - -#. module: base_location_geonames_import -#: model:ir.model,name:base_location_geonames_import.model_better_zip_geonames_import -msgid "Import Better Zip from Geonames" -msgstr "" - -#. module: base_location_geonames_import -#: view:better.zip.geonames.import:0 -#: model:ir.actions.act_window,name:base_location_geonames_import.better_zip_geonames_import_action -#: model:ir.ui.menu,name:base_location_geonames_import.better_zip_geonames_import_menu -msgid "Import from Geonames" -msgstr "" - -#. module: base_location_geonames_import -#: code:addons/base_location_geonames_import/wizard/geonames_import.py:67 -#, python-format -msgid "The country code inside the file (%s) doesn't correspond to the selected country (%s)." -msgstr "" - diff --git a/base_location_geonames_import/test/import.yml b/base_location_geonames_import/test/import.yml deleted file mode 100644 index 66243d24a..000000000 --- a/base_location_geonames_import/test/import.yml +++ /dev/null @@ -1,54 +0,0 @@ -- - I create the wizard -- - !record {model: better.zip.geonames.import, id: import_wizard_1, view: better_zip_geonames_import_form}: - country_id: base.it -- - I run the import -- - !python {model: better.zip.geonames.import}: | - self.run_import(cr, uid, [ref('import_wizard_1')], context=context) -- - I check the data -- - !python {model: res.better.zip}: | - state_obj = self.pool['res.country.state'] - state_ids = state_obj.search(cr, uid, [ - ('code', '=', 'LG'), - ('country_id', '=', ref('base.it')), - ], context=context) - assert len(state_ids) == 1, "There must be 1 LG" - zip_ids = self.search(cr, uid, [ - ('name', '=', '16017'), - ('city', '=', 'Isola Del Cantone'), - ('state_id', '=', state_ids[0]), - ('country_id', '=', ref('base.it')) - ], context=context) - assert len(zip_ids) == 1, "There must be 1 'Isola Del Cantone'" -- - I create the wizard again -- - !record {model: better.zip.geonames.import, id: import_wizard_2, view: better_zip_geonames_import_form}: - country_id: base.it -- - I run the import again -- - !python {model: better.zip.geonames.import}: | - self.run_import(cr, uid, [ref('import_wizard_2')], context=context) -- - I check the data -- - !python {model: res.better.zip}: | - state_obj = self.pool['res.country.state'] - state_ids = state_obj.search(cr, uid, [ - ('code', '=', 'LG'), - ('country_id', '=', ref('base.it')), - ], context=context) - assert len(state_ids) == 1, "There must be 1 LG" - zip_ids = self.search(cr, uid, [ - ('name', '=', '16017'), - ('city', '=', 'Isola Del Cantone'), - ('state_id', '=', state_ids[0]), - ('country_id', '=', ref('base.it')) - ], context=context) - assert len(zip_ids) == 1, "There must be 1 'Isola Del Cantone'" diff --git a/base_location_geonames_import/tests/__init__.py b/base_location_geonames_import/tests/__init__.py new file mode 100644 index 000000000..b16fdcb7f --- /dev/null +++ b/base_location_geonames_import/tests/__init__.py @@ -0,0 +1,4 @@ +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from . import test_base_location_geonames_import diff --git a/base_location_geonames_import/tests/test_base_location_geonames_import.py b/base_location_geonames_import/tests/test_base_location_geonames_import.py new file mode 100644 index 000000000..cf6455505 --- /dev/null +++ b/base_location_geonames_import/tests/test_base_location_geonames_import.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). + +from openerp.tests import common + + +class TestBaseLocationGeonamesImport(common.TransactionCase): + def setUp(self): + super(TestBaseLocationGeonamesImport, self).setUp() + self.country = self.env.ref('base.mc') + self.wizard = self.env['better.zip.geonames.import'].create({ + 'country_id': self.country.id, + }) + + def test_import_country(self): + max_import = 10 + self.wizard.with_context(max_import=max_import).run_import() + # Look if there are imported states for the country + state_count = self.env['res.country.state'].search_count([ + ('country_id', '=', self.country.id) + ]) + self.assertTrue(state_count) + # Look if the are imported zips + zip_count = self.env['res.better.zip'].search_count([ + ('country_id', '=', self.country.id) + ]) + self.assertEqual(zip_count, max_import) + # Reimport again to see that there's no duplicates + self.wizard.with_context(max_import=max_import).run_import() + state_count2 = self.env['res.country.state'].search_count([ + ('country_id', '=', self.country.id) + ]) + self.assertEqual(state_count, state_count2) + zip_count = self.env['res.better.zip'].search_count([ + ('country_id', '=', self.country.id) + ]) + self.assertEqual(zip_count, max_import) + + def test_delete_old_entries(self): + zip_entry = self.env['res.better.zip'].create({ + 'city': 'Test city', + 'country_id': self.country.id, + }) + self.wizard.run_import() + self.assertFalse(zip_entry.exists()) diff --git a/base_location_geonames_import/wizard/__init__.py b/base_location_geonames_import/wizard/__init__.py index 2c9462e69..3c39c08d4 100644 --- a/base_location_geonames_import/wizard/__init__.py +++ b/base_location_geonames_import/wizard/__init__.py @@ -1,23 +1,4 @@ -# -*- encoding: utf-8 -*- -############################################################################## -# -# Base Location Geonames Import module for OpenERP -# Copyright (C) 2014 Akretion (http://www.akretion.com) -# @author Alexis de Lattre -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# -*- coding: utf-8 -*- +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from . import geonames_import diff --git a/base_location_geonames_import/wizard/geonames_import.py b/base_location_geonames_import/wizard/geonames_import.py index f04881c60..d0f1cc285 100644 --- a/base_location_geonames_import/wizard/geonames_import.py +++ b/base_location_geonames_import/wizard/geonames_import.py @@ -1,29 +1,11 @@ # -*- coding: utf-8 -*- -############################################################################## -# -# Base Location Geonames Import module for OpenERP -# Copyright (C) 2014 Akretion (http://www.akretion.com) -# @author Alexis de Lattre -# Copyright (C) 2014 Agile Business Group (http://www.agilebg.com) -# @author Lorenzo Battistini -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see . -# -############################################################################## +# © 2014 Alexis de Lattre +# © 2014 Lorenzo Battistini +# © 2016 Pedro M. Baeza +# License AGPL-3.0 or later (http://www.gnu.org/licenses/agpl.html). from openerp import models, fields, api, _ -from openerp.exceptions import Warning +from openerp.exceptions import UserError import requests import tempfile import StringIO @@ -79,7 +61,7 @@ class BetterZipGeonamesImport(models.TransientModel): @api.model def create_better_zip(self, row, country): if row[0] != country.code: - raise Warning( + raise UserError( _("The country code inside the file (%s) doesn't " "correspond to the selected country (%s).") % (row[0], country.code)) @@ -108,7 +90,7 @@ class BetterZipGeonamesImport(models.TransientModel): ('code', '=', row[code_row_index]), ]) if len(states) > 1: - raise Warning( + raise UserError( _("Too many states with code %s for country %s") % (row[code_row_index], country.code)) if len(states) == 1: @@ -120,8 +102,9 @@ class BetterZipGeonamesImport(models.TransientModel): 'country_id': country.id }) - @api.one + @api.multi def run_import(self): + self.ensure_one() zip_model = self.env['res.better.zip'] country_code = self.country_id.code config_url = self.env['ir.config_parameter'].get_param( @@ -131,7 +114,7 @@ class BetterZipGeonamesImport(models.TransientModel): logger.info('Starting to download %s' % url) res_request = requests.get(url) if res_request.status_code != requests.codes.ok: - raise Warning( + raise UserError( _('Got an error %d when trying to download the file %s.') % (res_request.status_code, url)) # Store current record list @@ -144,13 +127,16 @@ class BetterZipGeonamesImport(models.TransientModel): data_file = open(os.path.join(tempdir, '%s.txt' % country_code), 'r') data_file.seek(0) logger.info('Starting to create the better zip entries') - for row in unicodecsv.reader( - data_file, encoding='utf-8', delimiter=' '): - zip = self.create_better_zip(row, self.country_id) - if zip in zips_to_delete: - zips_to_delete -= zip + max_import = self.env.context.get('max_import', 0) + reader = unicodecsv.reader(data_file, encoding='utf-8', delimiter=' ') + for i, row in enumerate(reader): + zip_code = self.create_better_zip(row, self.country_id) + if zip_code in zips_to_delete: + zips_to_delete -= zip_code + if max_import and (i + 1) == max_import: + break data_file.close() - if zips_to_delete: + if zips_to_delete and not max_import: zips_to_delete.unlink() logger.info('%d better zip entries deleted for country %s' % (len(zips_to_delete), self.country_id.name))