#!/usr/bin/env python
# -*- coding: utf8 -*-
################################################################################
#
# Copyright (c) 2012 STEPHANE MANGIN. (http://le-spleen.net) All Rights Reserved
# Stéphane MANGIN <stephane.mangin@freesbee.fr>
# Copyright (c) 2012 OSIELL SARL. (http://osiell.com) All Rights Reserved
# Eric Flaux <contact@osiell.com>
#
# WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsability of assessing all potential
# consequences resulting from its eventual inadequacies and bugs
# End users who are looking for a ready-to-use solution with commercial
# garantees and support are strongly adviced to contract a Free Software
# Service Company
#
# This program is Free Software; you can redistribute it and/or
# modify it under the terms of the GNU 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 General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
################################################################################
"""
csv2oerp is intended to be used to simplify data migration into OpenERP.
"""
import os
import sys
import xmlrpclib
import copy
import logging
import logging.handlers
from copy import copy
from copy import deepcopy
from optparse import OptionParser
import exceptions
import unicode_csv
from pprint import pformat
import tools
import fields
from constants_and_vars import STATS
from constants_and_vars import FORMAT
from constants_and_vars import ACTION_PATTERN
from constants_and_vars import HOST
from constants_and_vars import USER
from constants_and_vars import UID
from constants_and_vars import PORT
from constants_and_vars import DB
from constants_and_vars import PWD
from constants_and_vars import EXIT_OK, EXIT_WARNING, EXIT_ERROR, EXIT_UNKNOWN
def _get_special_actions(model):
res = {}
for item, attr in ACTION_PATTERN.iteritems():
res[item] = attr in model.split('::')[0].split(',') and True or False
return res
def set_global_connection(*args, **kwargs):
raise DeprecationWarning('set_global_connection is deprecated.'
'Use connect method instead.')
def _connect():
""" Open a connection throught a socket to OpenERP XMLRPC service
return an uid and a opened socket linked to this connection
"""
global UID
url = 'http://%s:%s/xmlrpc/' % (HOST, PORT)
sock_common = xmlrpclib.ServerProxy(url + 'common', allow_none=True)
UID = sock_common.login(DB, USER, PWD)
return xmlrpclib.ServerProxy(url + 'object', allow_none=True)
def connect(host=HOST, port=PORT, user=USER, pwd=PWD, dbname=DB):
"""Set globals constants needed to initialize a connection to openerp
:param host: IP or DNS name of the OERP server
:type host: str
:param port: Port number to reach
:type port: int
:param user: Username in the OERP server
:type user: str
:param pwd: Password of the username
:type pwd: str
:param dbname: Name of the database to reach
:type dbname: str
:raises: nothing
"""
global HOST, USER, PORT, DB, PWD, OERP
HOST = host
PORT = port
USER = user
PWD = pwd
DB = dbname
OERP = _connect()
class Import(object):
"""Main class which provides the functionnal part of the importation process
.. note:: `sys.argv` is integrated if you want to use the command line parser.
Here are the available command line arguments::
-h, --help Show this kind of help message and exit
-o OFFSET, --offset=OFFSET Offset (Usually for header omission)
-l LIMIT, --limit=LIMIT Limit
-c, --check-mapping Check mapping template
-v, --verbose Verbose mode
-d, --debug
debug mode
-q, --quiet Doesn't print anything to stdout
"""
@property
def server(self):
""" Return the current socket connection to the OpenERP server (xmlrpc).
"""
return self._server
@property
def host(self):
""" Return the current connection host for this session.
"""
return self._host
@property
def port(self):
""" Return the current connection port for this session.
"""
return self._port
@property
def db(self):
""" Return the current database name for this session.
"""
return self._db
@property
def user(self):
""" Return the current username for this session.
"""
return self._user
@property
def uid(self):
""" Return the current UID for this session.
"""
return self._uid
@property
def pwd(self):
""" Return the current password for this session
"""
return self._pwd
@property
def lines(self):
"""Getting all lines from CSV parser
:returns: list
"""
return self._lines
@property
def options(self):
"""Getting all arguments from command line (OptionParser)
"""
return self._options
@property
def mapping(self):
"""Getting columns mapping configuration
"""
return self._columns_mapping
@property
def lang(self):
"""Getting current language
"""
return self._lang
def __init__(self):
self._arg_treatments()
self._syslog_mode = False
self._columns_mapping = {}
self._lines = None
self._server = None
self._uid = None
self._preconfigure = None
self._relationnal_prefix = 'REL_'
self._current_mapping = None
self._lang = 'fr_FR'
self._encoding = 'utf-8'
self._logger = None
def _arg_treatments(self):
parser = OptionParser()
parser.add_option("-o", "--offset",
action="store",
type="int",
dest="offset",
default=0,
help="Offset (Usually for header omission)")
parser.add_option("-c", "--check-mapping",
action="store_true",
dest="checkmapping",
default=False,
help="Check mapping template")
parser.add_option("-d", "--debug",
action="store_true",
dest="debug",
default=False,
help="debug mode")
parser.add_option("-v", "--verbose",
action="store_true",
dest="verbose",
default=False,
help="verbose mode")
parser.add_option("-q", "--quiet",
action="store_true",
dest="quiet",
default=False,
help="don't print anything to stdout")
parser.add_option("-l", "--limit",
action="store",
dest="limit",
type="int",
default=None,
help="Limit")
# Connection options
parser.add_option("-u", "--username",
action="store",
dest="username",
default=USER,
help="Username")
parser.add_option("-p", "--password",
action="store",
dest="password",
default=PWD,
help="Password")
parser.add_option("-r", "--host",
action="store",