From 30535503afb8ab5e861a8faccbd37abf1e18143c Mon Sep 17 00:00:00 2001 From: Alexis de Lattre Date: Sun, 30 Mar 2014 23:50:40 +0200 Subject: [PATCH] Add module base_location_geonames_import --- base_location_geonames_import/__init__.py | 23 ++++ base_location_geonames_import/__openerp__.py | 47 ++++++++ .../wizard/__init__.py | 23 ++++ .../wizard/geonames_import.py | 104 ++++++++++++++++++ .../wizard/geonames_import_view.xml | 44 ++++++++ 5 files changed, 241 insertions(+) create mode 100644 base_location_geonames_import/__init__.py create mode 100644 base_location_geonames_import/__openerp__.py create mode 100644 base_location_geonames_import/wizard/__init__.py create mode 100644 base_location_geonames_import/wizard/geonames_import.py create mode 100644 base_location_geonames_import/wizard/geonames_import_view.xml diff --git a/base_location_geonames_import/__init__.py b/base_location_geonames_import/__init__.py new file mode 100644 index 000000000..b63234221 --- /dev/null +++ b/base_location_geonames_import/__init__.py @@ -0,0 +1,23 @@ +# -*- 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 . +# +############################################################################## + +from . import wizard diff --git a/base_location_geonames_import/__openerp__.py b/base_location_geonames_import/__openerp__.py new file mode 100644 index 000000000..b3d9ad11a --- /dev/null +++ b/base_location_geonames_import/__openerp__.py @@ -0,0 +1,47 @@ +# -*- 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 . +# +############################################################################## + + +{ + 'name': 'Base Location Geonames Import', + 'version': '0.1', + 'category': 'Extra Tools', + 'license': 'AGPL-3', + 'summary': 'Import better zip entries from Geonames', + 'description': """ +Base Location Geonames Import +============================= + +This module adds a wizard to import better zip entries from Geonames (http://download.geonames.org/export/zip/). + +Please contact Alexis de Lattre from Akretion for any help or question about this module. + """, + 'author': 'Akretion', + 'website': 'http://www.akretion.com', + 'depends': ['base_location'], + 'external_dependencies': {'python': ['requests', 'unicodecsv']}, + 'data': [ + 'wizard/geonames_import_view.xml', + ], + 'installable': True, + 'active': False, +} diff --git a/base_location_geonames_import/wizard/__init__.py b/base_location_geonames_import/wizard/__init__.py new file mode 100644 index 000000000..2c9462e69 --- /dev/null +++ b/base_location_geonames_import/wizard/__init__.py @@ -0,0 +1,23 @@ +# -*- 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 . +# +############################################################################## + +from . import geonames_import diff --git a/base_location_geonames_import/wizard/geonames_import.py b/base_location_geonames_import/wizard/geonames_import.py new file mode 100644 index 000000000..79be0c2f7 --- /dev/null +++ b/base_location_geonames_import/wizard/geonames_import.py @@ -0,0 +1,104 @@ +# -*- 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 . +# +############################################################################## + +from openerp.osv import orm, fields +from openerp.tools.translate import _ +import requests +import tempfile +import StringIO +import unicodecsv +import zipfile +import os +import logging + +logger = logging.getLogger(__name__) + + +class better_zip_geonames_import(orm.TransientModel): + _name = 'better.zip.geonames.import' + _description = 'Import Better Zip from Geonames' + + _columns = { + 'country_id': fields.many2one('res.country', 'Country', required=True), + } + + def _prepare_better_zip( + self, cr, uid, row, country_id, context=None): + '''This function is designed to be inherited''' + return { + 'name': row[1], + 'city': row[2], + 'country_id': country_id, + } + + def create_better_zip( + self, cr, uid, row, country_id, country_code, context=None): + bzip_id = False + if row[0] != country_code: + raise orm.except_orm( + _('Error:'), + _("The content file doesn't correspond to the country")) + logger.debug('ZIP = %s - City = %s' % (row[1], row[2])) + if row[1] and row[2] and 'CEDEX' not in row[1]: + vals = self._prepare_better_zip( + cr, uid, row, country_id, context=context) + bzip_id = self.pool['res.better.zip'].create( + cr, uid, vals, context=context) + return bzip_id + + def run_import(self, cr, uid, ids, context=None): + assert len(ids) == 1, 'Only one ID for the better zip import wizard' + bzip_obj = self.pool['res.better.zip'] + wizard = self.browse(cr, uid, ids[0], context=context) + country_id = wizard.country_id.id + country_code = wizard.country_id.code.upper() + url = 'http://download.geonames.org/export/zip/%s.zip' % country_code + logger.info('Starting to download %s' % url) + res_request = requests.get(url) + if res_request.status_code != requests.codes.ok: + raise orm.except_orm( + _('Error:'), + _('Got an error %d when trying to download the file %s.') + % (res_request.status_code, url)) + bzip_ids_to_delete = bzip_obj.search( + cr, uid, [('country_id', '=', country_id)], context=context) + if bzip_ids_to_delete: + bzip_obj.unlink(cr, uid, bzip_ids_to_delete, context=context) + logger.info( + '%d better zip entries deleted for country %s' + % (len(bzip_ids_to_delete), wizard.country_id.name)) + f_geonames = zipfile.ZipFile(StringIO.StringIO(res_request.content)) + tempdir = tempfile.mkdtemp(prefix='openerp') + f_geonames.extract('%s.txt' % country_code, tempdir) + logger.info('The geonames zipfile has been decompressed') + 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=' '): + self.create_better_zip( + cr, uid, row, country_id, country_code, context=context) + data_file.close() + logger.info( + 'The wizard to create better zip entries from geonames ' + 'has been successfully completed.') + return True diff --git a/base_location_geonames_import/wizard/geonames_import_view.xml b/base_location_geonames_import/wizard/geonames_import_view.xml new file mode 100644 index 000000000..9608134b4 --- /dev/null +++ b/base_location_geonames_import/wizard/geonames_import_view.xml @@ -0,0 +1,44 @@ + + + + + + + + asterisk.server.company + better.zip.geonames.import + +
+ + +
+
+
+
+
+ + + Import Geonames + better.zip.geonames.import + form + form + new + + + + +
+