********
csv2oerp
********

`csv2oerp` is a simple tool to perform a data migration, through an `OpenERP` 
mapping bounded to a `CSV` file.
You can easily order your data as the manner of `OpenERP` (`models`, `fields`).
The structure of the mapping is simple and intuitive, you can also perform a 
pre-process on data being imported, omit it or just modify it.

Quick start
===========

Import csv2oerp and some callbacks::

    from csv2oerp import Import_session
    from csv2oerp.fields import Column, Custom, Relation
    from csv2oerp.callbacks import get_id, get_ids

Configure OpenERP connection::

    host = '198.168.0.1'
    port = 8069
    dbname = 'database'
    user = 'admin'
    pwd = 'admin'
    csv2oerp.connect(host, port, user, pwd, dbname)

Create a new importation instance::

    example_file = Import_session()

Set the CSV file to use::

    example_file.set_input_file('example_file.csv', ',', '"', 'utf-8')

Define a custom callback(Field's value pre-treatment)::

    def country_code(self, model, field, value, line):
        """Return the first two uppered characters from current column value
        """
        return value[:2].upper()

Define your mapping to link both csv and OpenERP::

    mapping = {
        # Define a base model (Always in list form)
        'res.partner.address': [
            {
    
            # Custom field's value
            'type':         Custom('default', search=True),
    
            # Concatenated columns fields
            'street':       Column([7, 6]),
            'street2':      Column([8, 5]),
    
            # Simple fields
            'zip':          Column(9),
            'city':         Column(10),
            'cedex':        Column(68),
            'phone':        Column(14),
            'fax':          Column(15),
            'email':        Column(17),
    
            # Model's relation with dynamic insertion from OpenERP database
            # Not native object from OpenERP framework
            'region_id':    Custom(11, get_id('res.region', ['name']))
            'dep_id':       Custom(12, get_id('res.dep', ['name']))
    
            # Model's relations not updated if exists
            'country_id':   Relation('REL_res_partner_address,NO_UPDATE::res.country'),
    
            # Model's relations with unique value between objects
            'partner_id':   Relation('REL_res_partner_address::res.partner', search=True),
    
            },
        ],
    
        # Define relations between models
        'REL_res_partner_address::res.partner': {
            'name':         Column(1),
            'siren':        Column(2),
            'website':      Column(16),
            'comment':      Column(56),
            },
    
        # Relation without write if exists
        'REL_res_partner_address,NO_UPDATE::res.country':  {
            'code':         Column(13, callback=_country_code, search=True),
            'name':         Column(13, search=True),
            },
        })
    example_file.set_mapping(mapping)

Finally start the import process::

    example_file.start()

And show statistics of objects's activities during the importation process::

    csv2oerp.show_stats()

.. note::

    A progress statistics will be shown during the process if you install the
    python-progressbar package.
