~gbaconnier-c2c/openobject-extension/oerp7.0-redesign

« back to all changes in this revision

Viewing changes to base_external_referentials/connector.py

  • Committer: Guewen Baconnier
  • Date: 2012-12-02 21:41:17 UTC
  • Revision ID: guewen.baconnier@camptocamp.com-20121202214117-anzu9l514eagmy92
[ADD] First implementation of an Observer Pattern to track the events

Put also a first draft of an importer, which delegate the knowledge but
handle the flow of an import.
Next step: the consumers have to create the tasks.

Show diffs side-by-side

added added

removed removed

Lines of Context:
23
23
 
24
24
from openerp.tools.translate import _
25
25
 
 
26
 
26
27
class ConnectorRegistry(object):
27
28
    def __init__(self):
28
29
        self.connectors = set()
48
49
 
49
50
REGISTRY = ConnectorRegistry()
50
51
 
 
52
 
 
53
 
 
54
class Session(object):
 
55
 
 
56
    def __init__(self, cr, uid, model, referential, context=None, **kwargs):
 
57
        self.cr = cr
 
58
        self.uid = uid
 
59
        self.model = model
 
60
        self.referential = referential
 
61
        if context is None:
 
62
            context = {}
 
63
        self.context = context
 
64
 
 
65
class SingleImport(object):
 
66
 
 
67
    def __init__(self, session, external_id, mode='create', **kwargs):
 
68
        self._session = session
 
69
        self._external_id = external_id
 
70
        assert mode in ('create', 'update'), "mode should be create or update"
 
71
        self._mode = mode
 
72
 
 
73
    def import_record(self):
 
74
        """ Import the record
 
75
 
 
76
        Delegates the knowledge to specialized instances
 
77
 
 
78
        :param mode: could be 'create' or 'update'
 
79
        """
 
80
        if self._has_to_skip():
 
81
            return
 
82
 
 
83
        ext_data = self._get_external_data()
 
84
 
 
85
        # import the missing linked resources
 
86
        self._import_dependencies(ext_data)
 
87
 
 
88
        # default_values = self._default_values()
 
89
 
 
90
        transfo_data = self._transform_data(ext_data)
 
91
 
 
92
        # special check on data before import
 
93
        # self._validate_data(transfo_data)
 
94
        openerp_id = getattr(self, '_%s' % self._mode)()
 
95
        return openerp_id
 
96
 
 
97
    def _has_to_skip(self):
 
98
        # delegate a check of existence of external_id
 
99
        return False
 
100
 
 
101
    def _get_external_data(self):
 
102
        # delegate a call to the backend
 
103
        return {}
 
104
 
 
105
    def _import_dependencies(self, data):
 
106
        # call SingleImport#import for each dependency
 
107
        # no commit should be done inside of a SingleImport
 
108
        # flow
 
109
        return {}
 
110
 
 
111
    def _transform_data(self, external_data):
 
112
        # delegate a call to mapping
 
113
        return {}
 
114
 
 
115
    def _create(data):
 
116
        # delegate creation of the record
 
117
        return
 
118
 
 
119
    def _update(data):
 
120
        # delegate update of the record
 
121
        return
 
122
 
 
123
 
 
124
 
51
125
class AbstractConnector(object):
52
126
    """base class for the connector
53
127
 
368
442
    def mapping_lines(self, res_obj):
369
443
        pass
370
444
 
 
445
 
371
446
class ModelMap(object):
372
447
    model_name = None # name of the OERP model
373
448
    _external_id_key = None
418
493
            context['recursive_import_from'] = parent_values
419
494
        defaults = self.connector.get_default_import_values(cr, uid, self.res_obj,
420
495
                                                            context=context)
 
496
        # FIXME: a mapping should not change any state: do not import resources
 
497
        # here
421
498
        res = self.connector.record_one_ext_resource(cr, uid, self.res_obj,
422
499
                                                     resource, defaults, context)
423
500
        if 'create_id' in res: