Alexis de Lattre
11 years ago
committed by
Lorenzo Battistini
5 changed files with 241 additions and 0 deletions
-
23base_location_geonames_import/__init__.py
-
47base_location_geonames_import/__openerp__.py
-
23base_location_geonames_import/wizard/__init__.py
-
104base_location_geonames_import/wizard/geonames_import.py
-
44base_location_geonames_import/wizard/geonames_import_view.xml
@ -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 <alexis.delattre@akretion.com> |
||||
|
# |
||||
|
# 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 <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
from . import wizard |
@ -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 <alexis.delattre@akretion.com> |
||||
|
# |
||||
|
# 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 <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
|
||||
|
{ |
||||
|
'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 <alexis.delattre@akretion.com> 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, |
||||
|
} |
@ -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 <alexis.delattre@akretion.com> |
||||
|
# |
||||
|
# 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 <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
from . import geonames_import |
@ -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 <alexis.delattre@akretion.com> |
||||
|
# |
||||
|
# 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 <http://www.gnu.org/licenses/>. |
||||
|
# |
||||
|
############################################################################## |
||||
|
|
||||
|
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 |
@ -0,0 +1,44 @@ |
|||||
|
<?xml version="1.0" encoding="utf-8"?> |
||||
|
<!-- |
||||
|
Copyright (C) 2014 Akretion (http://www.akretion.com/) |
||||
|
@author: Alexis de Lattre <alexis.delattre@akretion.com> |
||||
|
The licence is in the file __openerp__.py |
||||
|
--> |
||||
|
|
||||
|
<openerp> |
||||
|
<data> |
||||
|
|
||||
|
<record id="better_zip_geonames_import_form" model="ir.ui.view"> |
||||
|
<field name="name">asterisk.server.company</field> |
||||
|
<field name="model">better.zip.geonames.import</field> |
||||
|
<field name="arch" type="xml"> |
||||
|
<form string="Import Geonames" version="7.0"> |
||||
|
<group name="main"> |
||||
|
<label string="This wizard will delete all the better zip entries for the selected country, download the latest version from geonames.org for that country and create new better zip entries." |
||||
|
colspan="2" name="import-help"/> |
||||
|
<field name="country_id"/> |
||||
|
</group> |
||||
|
<footer> |
||||
|
<button name="run_import" type="object" |
||||
|
class="oe_highlight" string="Import"/> |
||||
|
<button special="cancel" string="Cancel" class="oe_link"/> |
||||
|
</footer> |
||||
|
</form> |
||||
|
</field> |
||||
|
</record> |
||||
|
|
||||
|
<record id="better_zip_geonames_import_action" model="ir.actions.act_window"> |
||||
|
<field name="name">Import Geonames</field> |
||||
|
<field name="res_model">better.zip.geonames.import</field> |
||||
|
<field name="view_type">form</field> |
||||
|
<field name="view_mode">form</field> |
||||
|
<field name="target">new</field> |
||||
|
</record> |
||||
|
|
||||
|
<menuitem id="better_zip_geonames_import_menu" |
||||
|
action="better_zip_geonames_import_action" |
||||
|
parent="base.menu_localisation" |
||||
|
sequence="50"/> |
||||
|
|
||||
|
</data> |
||||
|
</openerp> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue