Merge lp:~chafique-delli/openerp-connector/7.0-magentoerpconnect-map-product into lp:~openerp-connector-core-editors/openerp-connector/7.0

Proposed by Chafique DELLI
Status: Rejected
Rejected by: Nicolas Bessi - Camptocamp
Proposed branch: lp:~chafique-delli/openerp-connector/7.0-magentoerpconnect-map-product
Merge into: lp:~openerp-connector-core-editors/openerp-connector/7.0
Diff against target: 40949 lines (+40198/-0) (has conflicts)
138 files modified
.bzrignore (+3/-0)
customize_example/__init__.py (+6/-0)
customize_example/__openerp__.py (+42/-0)
customize_example/backend.py (+6/-0)
customize_example/connector.py (+31/-0)
customize_example/magento_model.py (+22/-0)
customize_example/partner.py (+40/-0)
magentoerpconnect/CHANGES.rst (+16/-0)
magentoerpconnect/__init__.py (+17/-0)
magentoerpconnect/__openerp__.py (+138/-0)
magentoerpconnect/backend.py (+29/-0)
magentoerpconnect/connector.py (+85/-0)
magentoerpconnect/consumer.py (+80/-0)
magentoerpconnect/delivery.py (+83/-0)
magentoerpconnect/delivery_view.xml (+21/-0)
magentoerpconnect/doc/Makefile (+153/-0)
magentoerpconnect/doc/_themes/.gitignore (+3/-0)
magentoerpconnect/doc/_themes/LICENSE (+37/-0)
magentoerpconnect/doc/_themes/README (+31/-0)
magentoerpconnect/doc/_themes/flask/layout.html (+25/-0)
magentoerpconnect/doc/_themes/flask/relations.html (+19/-0)
magentoerpconnect/doc/_themes/flask/static/flasky.css_t (+395/-0)
magentoerpconnect/doc/_themes/flask/static/small_flask.css (+70/-0)
magentoerpconnect/doc/_themes/flask/theme.conf (+9/-0)
magentoerpconnect/doc/_themes/flask_small/layout.html (+22/-0)
magentoerpconnect/doc/_themes/flask_small/static/flasky.css_t (+287/-0)
magentoerpconnect/doc/_themes/flask_small/theme.conf (+10/-0)
magentoerpconnect/doc/_themes/flask_theme_support.py (+86/-0)
magentoerpconnect/doc/api/api_backend.rst (+7/-0)
magentoerpconnect/doc/api/api_backend_adapter.rst (+7/-0)
magentoerpconnect/doc/api/api_binder.rst (+7/-0)
magentoerpconnect/doc/api/api_connector.rst (+7/-0)
magentoerpconnect/doc/api/api_consumer.rst (+7/-0)
magentoerpconnect/doc/api/api_delivery.rst (+7/-0)
magentoerpconnect/doc/api/api_exception.rst (+9/-0)
magentoerpconnect/doc/api/api_invoice.rst (+7/-0)
magentoerpconnect/doc/api/api_magento_model.rst (+7/-0)
magentoerpconnect/doc/api/api_partner.rst (+7/-0)
magentoerpconnect/doc/api/api_partner_category.rst (+7/-0)
magentoerpconnect/doc/api/api_product.rst (+7/-0)
magentoerpconnect/doc/api/api_product_category.rst (+7/-0)
magentoerpconnect/doc/api/api_sale.rst (+7/-0)
magentoerpconnect/doc/api/api_stock_picking.rst (+7/-0)
magentoerpconnect/doc/api/api_stock_tracking.rst (+7/-0)
magentoerpconnect/doc/api/api_synchronizer.rst (+26/-0)
magentoerpconnect/doc/conf.py (+275/-0)
magentoerpconnect/doc/guides/connector_checkpoint.rst (+20/-0)
magentoerpconnect/doc/guides/installation_guide.rst (+143/-0)
magentoerpconnect/doc/guides/key_questions.rst (+281/-0)
magentoerpconnect/doc/guides/monitor_resolve_jobs.rst (+83/-0)
magentoerpconnect/doc/guides/tutorial_customize.rst (+407/-0)
magentoerpconnect/doc/guides/tutorial_development.rst (+398/-0)
magentoerpconnect/doc/howto/configure_automatic_workflows.rst (+12/-0)
magentoerpconnect/doc/howto/configure_emails.rst (+14/-0)
magentoerpconnect/doc/howto/configure_exception_rules.rst (+12/-0)
magentoerpconnect/doc/howto/configure_payment_methods.rst (+14/-0)
magentoerpconnect/doc/howto/configure_pricing.rst (+41/-0)
magentoerpconnect/doc/howto/configure_schedulers.rst (+25/-0)
magentoerpconnect/doc/howto/configure_shipping_methods.rst (+36/-0)
magentoerpconnect/doc/howto/configure_translations.rst (+15/-0)
magentoerpconnect/doc/howto/configure_warehouse.rst (+19/-0)
magentoerpconnect/doc/howto/modify_an_order.rst (+45/-0)
magentoerpconnect/doc/index.rst (+154/-0)
magentoerpconnect/doc/make.bat (+190/-0)
magentoerpconnect/doc/project/changes.rst (+8/-0)
magentoerpconnect/doc/project/contribute.rst (+19/-0)
magentoerpconnect/doc/project/contributors.rst (+10/-0)
magentoerpconnect/doc/project/roadmap.rst (+61/-0)
magentoerpconnect/exception.py (+26/-0)
magentoerpconnect/i18n/fr_FR.po (+1007/-0)
magentoerpconnect/i18n/magentoerpconnect.pot (+977/-0)
magentoerpconnect/invoice.py (+229/-0)
magentoerpconnect/invoice_view.xml (+48/-0)
magentoerpconnect/magento_model.py (+570/-0)
magentoerpconnect/magento_model_view.xml (+338/-0)
magentoerpconnect/magentoerpconnect_data.xml (+107/-0)
magentoerpconnect/magentoerpconnect_menu.xml (+35/-0)
magentoerpconnect/old_stuff.py (+2594/-0)
magentoerpconnect/old_xml_stuff.xml (+110/-0)
magentoerpconnect/partner.py (+527/-0)
magentoerpconnect/partner_category.py (+111/-0)
magentoerpconnect/partner_view.xml (+115/-0)
magentoerpconnect/product.py (+492/-0)
magentoerpconnect/product_category.py (+240/-0)
magentoerpconnect/product_view.xml (+100/-0)
magentoerpconnect/sale.py (+782/-0)
magentoerpconnect/sale_view.xml (+7/-0)
magentoerpconnect/security/ir.model.access.csv (+39/-0)
magentoerpconnect/setting.py (+39/-0)
magentoerpconnect/setting_view.xml (+42/-0)
magentoerpconnect/settings/1.3.2.4/external.mapping.template.csv (+13/-0)
magentoerpconnect/settings/1.3.2.4/external.mappinglines.template.csv (+251/-0)
magentoerpconnect/settings/1.3.2.4/external.referential.version.csv (+2/-0)
magentoerpconnect/settings/1.5.0.0/account.invoice/external.mappinglines.template.csv (+10/-0)
magentoerpconnect/settings/1.5.0.0/attribut.group/external.mappinglines.template.csv (+5/-0)
magentoerpconnect/settings/1.5.0.0/attribut.set/external.mappinglines.template.csv (+5/-0)
magentoerpconnect/settings/1.5.0.0/attribut/external.mappinglines.template.csv (+26/-0)
magentoerpconnect/settings/1.5.0.0/external.mapping.template.csv (+15/-0)
magentoerpconnect/settings/1.5.0.0/external.referential.version.csv (+2/-0)
magentoerpconnect/settings/1.5.0.0/external.shop.group/external.mappinglines.template.csv (+6/-0)
magentoerpconnect/settings/1.5.0.0/magerp.storeviews/external.mappinglines.template.csv (+6/-0)
magentoerpconnect/settings/1.5.0.0/product.category/external.mappinglines.template.csv (+60/-0)
magentoerpconnect/settings/1.5.0.0/product.link/external.mappinglines.template.csv (+5/-0)
magentoerpconnect/settings/1.5.0.0/product/external.mappinglines.template.csv (+67/-0)
magentoerpconnect/settings/1.5.0.0/res.partner.address/external.mappinglines.template.csv (+59/-0)
magentoerpconnect/settings/1.5.0.0/res.partner.category/external.mappinglines.template.csv (+3/-0)
magentoerpconnect/settings/1.5.0.0/res.partner/external.mappinglines.template.csv (+21/-0)
magentoerpconnect/settings/1.5.0.0/sale.order.line/external.mappinglines.template.csv (+24/-0)
magentoerpconnect/settings/1.5.0.0/sale.order/external.mappinglines.template.csv (+44/-0)
magentoerpconnect/settings/1.5.0.0/sale.shop/external.mappinglines.template.csv (+5/-0)
magentoerpconnect/stock_picking.py (+253/-0)
magentoerpconnect/stock_tracking.py (+120/-0)
magentoerpconnect/stock_view.xml (+50/-0)
magentoerpconnect/tests/__init__.py (+29/-0)
magentoerpconnect/tests/common.py (+70/-0)
magentoerpconnect/tests/test_data.py (+24507/-0)
magentoerpconnect/tests/test_synchronization.py (+214/-0)
magentoerpconnect/unit/__init__.py (+8/-0)
magentoerpconnect/unit/backend_adapter.py (+177/-0)
magentoerpconnect/unit/binder.py (+113/-0)
magentoerpconnect/unit/delete_synchronizer.py (+45/-0)
magentoerpconnect/unit/export_synchronizer.py (+204/-0)
magentoerpconnect/unit/import_synchronizer.py (+309/-0)
magentoerpconnect_catalog/__init__.py (+1/-0)
magentoerpconnect_catalog/__openerp__.py (+51/-0)
magentoerpconnect_export_partner/__init__.py (+4/-0)
magentoerpconnect_export_partner/__openerp__.py (+46/-0)
magentoerpconnect_export_partner/connector.py (+32/-0)
magentoerpconnect_export_partner/consumer.py (+46/-0)
magentoerpconnect_export_partner/partner.py (+70/-0)
magentoerpconnect_export_partner/partner_view.xml (+53/-0)
magentoerpconnect_pricing/__init__.py (+6/-0)
magentoerpconnect_pricing/__openerp__.py (+45/-0)
magentoerpconnect_pricing/connector.py (+31/-0)
magentoerpconnect_pricing/magento_model.py (+133/-0)
magentoerpconnect_pricing/magento_model_view.xml (+30/-0)
magentoerpconnect_pricing/product.py (+154/-0)
magentoerpconnect_pricing/sale.py (+45/-0)
Conflict adding file .bzrignore.  Moved existing file to .bzrignore.moved.
To merge this branch: bzr merge lp:~chafique-delli/openerp-connector/7.0-magentoerpconnect-map-product
Reviewer Review Type Date Requested Status
Guewen Baconnier @ Camptocamp Needs Resubmitting
Review via email: mp+179967@code.launchpad.net

Description of the change

When we import the product from Magento and this product already exist in OpenERP (same code/sku) we should link the existing product instead of creating a new one

To post a comment you must log in.
Revision history for this message
Guewen Baconnier @ Camptocamp (gbaconnier-c2c) wrote :

Hi Chafique, you have targeted the wrong branch, can you merge into lp:openerp-connector/7.0-magentoerpconnect instead of lp:openerp-connector please?

review: Needs Resubmitting
Revision history for this message
Chafique DELLI (chafique-delli) wrote :

Le 15/08/2013 09:47, Guewen Baconnier @ Camptocamp a écrit :
> Review: Resubmit
>
> Hi Chafique, you have targeted the wrong branch, can you merge into lp:openerp-connector/7.0-magentoerpconnect instead of lp:openerp-connector please?
Hi Guewen, it's done.

--
Chafique DELLI
www.akretion.com/fr
intégration OpenERP
35B rue Montgolfier
69100 Villeurbanne
Email: <email address hidden>

Revision history for this message
Nicolas Bessi - Camptocamp (nbessi-c2c-deactivatedaccount) wrote :

Wrong target branch, MP rejected

Regards

Nicolas

Unmerged revisions

884. By Chafique DELLI

[IMP]:add mapping on openerp_id for an existing product with the same code

883. By Brendan Clune (Logic Supply)

[FIX] Define the partners relationships only on the creation of new records, allowing manual specification of company / contact relationships within OpenERP

882. By Brendan Clune (Logic Supply)

[FIX] State information for partners not mapped correctly

881. By Guewen Baconnier @ Camptocamp

[ADD] note in installation guide to install ntp

880. By Guewen Baconnier @ Camptocamp

[IMP] import batch of sales orders is now delayed in a job and not executed directly, should avoid TransactionRollbackError which seems to happen occasionally on this method (maybe due to the duration of the transaction?)

879. By Guewen Baconnier @ Camptocamp

[FIX] remove the transient fields from the result of the sales order mapper, they are used to create extra sales order lines but if they are still there when we create the SO, OpenERP will raise warnings (fields do not exist in magento.sale.order) or even fail to create the SO

878. By Guewen Baconnier @ Camptocamp

[FIX] removed unused code

877. By Guewen Baconnier @ Camptocamp

[IMP] a round of documentation improvement, see nested history for details

876. By Guewen Baconnier @ Camptocamp

[ADD] add the external dependency on the magento package in the manifest

875. By Guewen Baconnier @ Camptocamp

[ADD] french translation and empty .pot

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== added file '.bzrignore'
2--- .bzrignore 1970-01-01 00:00:00 +0000
3+++ .bzrignore 2013-08-13 17:30:12 +0000
4@@ -0,0 +1,3 @@
5+.project
6+.pydevproject
7+*/doc/_build/*
8
9=== renamed file '.bzrignore' => '.bzrignore.moved'
10=== added directory 'customize_example'
11=== added file 'customize_example/__init__.py'
12--- customize_example/__init__.py 1970-01-01 00:00:00 +0000
13+++ customize_example/__init__.py 2013-08-13 17:30:12 +0000
14@@ -0,0 +1,6 @@
15+# -*- coding: utf-8 -*-
16+
17+import connector
18+import backend
19+import magento_model
20+import partner
21
22=== added file 'customize_example/__openerp__.py'
23--- customize_example/__openerp__.py 1970-01-01 00:00:00 +0000
24+++ customize_example/__openerp__.py 2013-08-13 17:30:12 +0000
25@@ -0,0 +1,42 @@
26+# -*- coding: utf-8 -*-
27+##############################################################################
28+#
29+# Author: Guewen Baconnier
30+# Copyright 2013 Camptocamp SA
31+#
32+# This program is free software: you can redistribute it and/or modify
33+# it under the terms of the GNU Affero General Public License as
34+# published by the Free Software Foundation, either version 3 of the
35+# License, or (at your option) any later version.
36+#
37+# This program is distributed in the hope that it will be useful,
38+# but WITHOUT ANY WARRANTY; without even the implied warranty of
39+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
40+# GNU Affero General Public License for more details.
41+#
42+# You should have received a copy of the GNU Affero General Public License
43+# along with this program. If not, see <http://www.gnu.org/licenses/>.
44+#
45+##############################################################################
46+
47+{'name': 'Magento Connector Customization Example',
48+ 'version': '1.0.0',
49+ 'category': 'Connector',
50+ 'depends': ['magentoerpconnect',
51+ ],
52+ 'author': 'Camptocamp',
53+ 'license': 'AGPL-3',
54+ 'description': """
55+Magento Connector Customization Example
56+=======================================
57+
58+Example of customizations:
59+
60+* mappings
61+
62+""",
63+ 'data': [],
64+ 'installable': True,
65+ 'application': False,
66+}
67+
68
69=== added file 'customize_example/backend.py'
70--- customize_example/backend.py 1970-01-01 00:00:00 +0000
71+++ customize_example/backend.py 2013-08-13 17:30:12 +0000
72@@ -0,0 +1,6 @@
73+# -*- coding: utf-8 -*-
74+import openerp.addons.connector.backend as backend
75+import openerp.addons.magentoerpconnect.backend as magento_backend
76+
77+magento_myversion = backend.Backend(parent=magento_backend.magento1700,
78+ version='1.7-myversion')
79
80=== added file 'customize_example/connector.py'
81--- customize_example/connector.py 1970-01-01 00:00:00 +0000
82+++ customize_example/connector.py 2013-08-13 17:30:12 +0000
83@@ -0,0 +1,31 @@
84+# -*- coding: utf-8 -*-
85+##############################################################################
86+#
87+# Author: Guewen Baconnier
88+# Copyright 2013 Camptocamp SA
89+#
90+# This program is free software: you can redistribute it and/or modify
91+# it under the terms of the GNU Affero General Public License as
92+# published by the Free Software Foundation, either version 3 of the
93+# License, or (at your option) any later version.
94+#
95+# This program is distributed in the hope that it will be useful,
96+# but WITHOUT ANY WARRANTY; without even the implied warranty of
97+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
98+# GNU Affero General Public License for more details.
99+#
100+# You should have received a copy of the GNU Affero General Public License
101+# along with this program. If not, see <http://www.gnu.org/licenses/>.
102+#
103+##############################################################################
104+
105+from openerp.osv import orm
106+
107+
108+class customize_example_installed(orm.AbstractModel):
109+ """Empty model used to know if the module is installed on the
110+ database.
111+
112+ If the model is in the registry, the module is installed.
113+ """
114+ _name = 'customize_example.installed'
115
116=== added file 'customize_example/magento_model.py'
117--- customize_example/magento_model.py 1970-01-01 00:00:00 +0000
118+++ customize_example/magento_model.py 2013-08-13 17:30:12 +0000
119@@ -0,0 +1,22 @@
120+# -*- coding: utf-8 -*-
121+from openerp.osv import orm, fields
122+
123+
124+class magento_backend(orm.Model):
125+ _inherit = 'magento.backend'
126+
127+ def _select_versions(self, cr, uid, context=None):
128+ """ Available versions
129+
130+ Can be inherited to add custom versions.
131+ """
132+ versions = super(magento_backend, self)._select_versions(cr, uid, context=context)
133+ versions.append(('1.7-myversion', '1.7 My Version'))
134+ return versions
135+
136+ _columns = {
137+ 'version': fields.selection(
138+ _select_versions,
139+ string='Version',
140+ required=True),
141+ }
142
143=== added file 'customize_example/partner.py'
144--- customize_example/partner.py 1970-01-01 00:00:00 +0000
145+++ customize_example/partner.py 2013-08-13 17:30:12 +0000
146@@ -0,0 +1,40 @@
147+# -*- coding: utf-8 -*-
148+
149+from openerp.osv import orm, fields
150+from openerp.addons.connector.unit.mapper import mapping
151+from openerp.addons.magentoerpconnect.partner import PartnerImportMapper
152+from .backend import magento_myversion
153+
154+
155+class magento_res_partner(orm.Model):
156+ _inherit = 'magento.res.partner'
157+
158+ _columns = {
159+ 'created_in': fields.char('Created In', readonly=True),
160+ }
161+
162+
163+class res_partner(orm.Model):
164+ _inherit = 'res.partner'
165+
166+ _columns = {
167+ 'gender': fields.selection([('male', 'Male'),
168+ ('female', 'Female')],
169+ string='Gender'),
170+ }
171+
172+
173+MAGENTO_GENDER = {'123': 'male',
174+ '124': 'female'}
175+
176+
177+@magento_myversion
178+class MyPartnerImportMapper(PartnerImportMapper):
179+ _model_name = 'magento.res.partner'
180+
181+ direct = PartnerImportMapper.direct + [('created_in', 'created_in')]
182+
183+ @mapping
184+ def gender(self, record):
185+ gender = MAGENTO_GENDER.get(record.get('gender'))
186+ return {'gender': gender}
187
188=== added directory 'magentoerpconnect'
189=== added file 'magentoerpconnect/CHANGES.rst'
190--- magentoerpconnect/CHANGES.rst 1970-01-01 00:00:00 +0000
191+++ magentoerpconnect/CHANGES.rst 2013-08-13 17:30:12 +0000
192@@ -0,0 +1,16 @@
193+Changelog
194+---------
195+
196+2.0.0
197+~~~~~
198+
199+* First release
200+
201+
202+..
203+ Model:
204+ 2.0.1 (date of release)
205+ ~~~~~~~~~~~~~~~~~~~~~~~
206+
207+ * change 1
208+ * change 2
209
210=== added file 'magentoerpconnect/__init__.py'
211--- magentoerpconnect/__init__.py 1970-01-01 00:00:00 +0000
212+++ magentoerpconnect/__init__.py 2013-08-13 17:30:12 +0000
213@@ -0,0 +1,17 @@
214+# -*- coding: utf-8 -*-
215+import setting
216+import connector
217+import backend
218+
219+import magento_model
220+import product
221+import product_category
222+import partner
223+import partner_category
224+import invoice
225+import sale
226+import delivery
227+import stock_picking
228+import stock_tracking
229+
230+import consumer
231
232=== added file 'magentoerpconnect/__openerp__.py'
233--- magentoerpconnect/__openerp__.py 1970-01-01 00:00:00 +0000
234+++ magentoerpconnect/__openerp__.py 2013-08-13 17:30:12 +0000
235@@ -0,0 +1,138 @@
236+# -*- coding: utf-8 -*-
237+##############################################################################
238+#
239+# Author: Guewen Baconnier
240+# Copyright 2013 Camptocamp SA
241+# Copyright 2013 Akretion
242+#
243+# This program is free software: you can redistribute it and/or modify
244+# it under the terms of the GNU Affero General Public License as
245+# published by the Free Software Foundation, either version 3 of the
246+# License, or (at your option) any later version.
247+#
248+# This program is distributed in the hope that it will be useful,
249+# but WITHOUT ANY WARRANTY; without even the implied warranty of
250+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
251+# GNU Affero General Public License for more details.
252+#
253+# You should have received a copy of the GNU Affero General Public License
254+# along with this program. If not, see <http://www.gnu.org/licenses/>.
255+#
256+##############################################################################
257+
258+{'name': 'Magento Connector',
259+ 'version': '2.0.0',
260+ 'category': 'Connector',
261+ 'depends': ['account',
262+ 'product',
263+ 'delivery',
264+ 'sale_stock',
265+ 'connector_ecommerce',
266+ 'product_m2mcategories',
267+ ],
268+ 'external_dependencies': {
269+ 'python': ['magento'],
270+ },
271+ 'author': 'MagentoERPconnect Core Editors',
272+ 'license': 'AGPL-3',
273+ 'website': 'https://launchpad.net/magentoerpconnect',
274+ 'description': """
275+Magento Connector
276+=================
277+
278+This is the new release of the Open-Source connector linking OpenERP and
279+Magento also known under the name of **Magentoerpconnect**. It is
280+build on top of the `connector`_ framework. It is is structured so that
281+it can be extended or modified easily from separate addons, a factor of
282+success when the implementations of Magento vary a lot.
283+
284+Magento OpenERP Connector is mainly developed by the Magentoerpconnect Core
285+Editors, these being Camptocamp_ and Akretion_. The `source is on
286+launchpad`_.
287+
288+This connector is designed to have a strong and efficient core, with the
289+ability to extend it with extension modules or local customizations.
290+
291+In other words, the core module contains the minimal scope to run your
292+e-commerce with OpenERP and Magento. More advanced features are
293+installable using extensions.
294+
295+It features:
296+
297+Synchronizations:
298+
299+* Import the partners and addresses book
300+* Import the customer groups (becomes partner tags)
301+* Import the categories of products, with translations
302+* Import the products, with translations and main image
303+* Import the sales orders
304+* Update the the stock quantities,
305+ with configuration of the warehouse and stock field to use
306+* Export the delivery orders
307+* Export the tracking numbers
308+* Create the invoices on Magento and get their number back
309+* Import the dependencies when they are not yet imported
310+ (ie. customer, products for sale order)
311+
312+Automatizations:
313+
314+* Use the `Automatic workflows` to automatize the workflow of the sales
315+ according to the payment method (confirm orders, create and reconcile
316+ payments, ...)
317+* Per payment method, choose when the orders are imported
318+ (only when a payment is received, always, never)
319+* Use the `Sales Exceptions` to prevents the processing of sales orders
320+ with issues
321+
322+Technical points:
323+
324+* Built on top of the `connector`_ framework
325+* Use the `connector_ecommerce`_ addon to share the e-commerce capabilities
326+ with other e-commerce addons
327+* Use the jobs system of the `connector`_ framework
328+* Create `connector`_ checkpoints when new records to verify are imported
329+* Support Magento 1.7, the support of earlier versions should be easy to
330+ add, the `connector`_ framework being designed to handle multiple
331+ versions with ease.
332+* Licensed under AGPL version 3
333+* Designed to be usable with multiple Magento or any other e-commerce backends
334+ in the same time.
335+
336+Available extensions:
337+
338+* Pricing
339+ allows to manage the prices in OpenERP using pricelists,
340+ prices are update to Magento when changed
341+* Export of partners (Experimental)
342+ Export new partners on Magento, not complete.
343+
344+
345+.. _connector: https://code.launchpad.net/openerp-connector
346+.. _connector_ecommerce: https://code.launchpad.net/openerp-connector
347+.. _Camptocamp: http://www.camptocamp.com
348+.. _Akretion: http://www.akretion.com
349+.. _`source is on launchpad`: https://launchpad.net/magentoerpconnect
350+
351+""",
352+ 'images': ['images/magento_backend.png',
353+ 'images/jobs.png',
354+ 'images/product_binding.png',
355+ 'images/invoice_binding.png',
356+ 'images/magentoerpconnect.png',
357+ ],
358+ 'demo': [],
359+ 'data': ['setting_view.xml',
360+ 'magentoerpconnect_data.xml',
361+ 'magento_model_view.xml',
362+ 'product_view.xml',
363+ 'partner_view.xml',
364+ 'sale_view.xml',
365+ 'invoice_view.xml',
366+ 'magentoerpconnect_menu.xml',
367+ 'delivery_view.xml',
368+ 'stock_view.xml',
369+ 'security/ir.model.access.csv',
370+ ],
371+ 'installable': True,
372+ 'application': True,
373+}
374
375=== added file 'magentoerpconnect/backend.py'
376--- magentoerpconnect/backend.py 1970-01-01 00:00:00 +0000
377+++ magentoerpconnect/backend.py 2013-08-13 17:30:12 +0000
378@@ -0,0 +1,29 @@
379+# -*- coding: utf-8 -*-
380+##############################################################################
381+#
382+# Author: Guewen Baconnier
383+# Copyright 2013 Camptocamp SA
384+#
385+# This program is free software: you can redistribute it and/or modify
386+# it under the terms of the GNU Affero General Public License as
387+# published by the Free Software Foundation, either version 3 of the
388+# License, or (at your option) any later version.
389+#
390+# This program is distributed in the hope that it will be useful,
391+# but WITHOUT ANY WARRANTY; without even the implied warranty of
392+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
393+# GNU Affero General Public License for more details.
394+#
395+# You should have received a copy of the GNU Affero General Public License
396+# along with this program. If not, see <http://www.gnu.org/licenses/>.
397+#
398+##############################################################################
399+
400+import openerp.addons.connector.backend as backend
401+
402+
403+magento = backend.Backend('magento')
404+""" Generic Magento Backend """
405+
406+magento1700 = backend.Backend(parent=magento, version='1.7')
407+""" Magento Backend for version 1.7 """
408
409=== added file 'magentoerpconnect/connector.py'
410--- magentoerpconnect/connector.py 1970-01-01 00:00:00 +0000
411+++ magentoerpconnect/connector.py 2013-08-13 17:30:12 +0000
412@@ -0,0 +1,85 @@
413+# -*- coding: utf-8 -*-
414+##############################################################################
415+#
416+# Author: Guewen Baconnier
417+# Copyright 2013 Camptocamp SA
418+#
419+# This program is free software: you can redistribute it and/or modify
420+# it under the terms of the GNU Affero General Public License as
421+# published by the Free Software Foundation, either version 3 of the
422+# License, or (at your option) any later version.
423+#
424+# This program is distributed in the hope that it will be useful,
425+# but WITHOUT ANY WARRANTY; without even the implied warranty of
426+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
427+# GNU Affero General Public License for more details.
428+#
429+# You should have received a copy of the GNU Affero General Public License
430+# along with this program. If not, see <http://www.gnu.org/licenses/>.
431+#
432+##############################################################################
433+
434+from openerp.osv import orm, fields
435+from openerp.addons.connector.connector import Environment
436+from openerp.addons.connector.checkpoint import checkpoint
437+
438+
439+class magentoerpconnect_installed(orm.AbstractModel):
440+ """Empty model used to know if the module is installed on the
441+ database.
442+
443+ If the model is in the registry, the module is installed.
444+ """
445+ _name = 'magentoerpconnect.installed'
446+
447+
448+def get_environment(session, model_name, backend_id):
449+ """ Create an environment to work with. """
450+ backend_record = session.browse('magento.backend', backend_id)
451+ env = Environment(backend_record, session, model_name)
452+ lang = backend_record.default_lang_id
453+ lang_code = lang.code if lang else 'en_US'
454+ env.set_lang(code=lang_code)
455+ return env
456+
457+class magento_binding(orm.AbstractModel):
458+ """ Abstract Model for the Bindigs.
459+
460+ All the models used as bindings between Magento and OpenERP
461+ (``magento.res.partner``, ``magento.product.product``, ...) should
462+ ``_inherit`` it.
463+ """
464+ _name = 'magento.binding'
465+ _inherit = 'external.binding'
466+ _description = 'Magento Binding (abstract)'
467+
468+ _columns = {
469+ # 'openerp_id': openerp-side id must be declared in concrete model
470+ 'backend_id': fields.many2one(
471+ 'magento.backend',
472+ 'Magento Backend',
473+ required=True,
474+ ondelete='restrict'),
475+ # fields.char because 0 is a valid Magento ID
476+ 'magento_id': fields.char('ID on Magento'),
477+ }
478+
479+ # the _sql_contraints cannot be there due to this bug:
480+ # https://bugs.launchpad.net/openobject-server/+bug/1151703
481+
482+
483+def add_checkpoint(session, model_name, record_id, backend_id):
484+ """ Add a row in the model ``connector.checkpoint`` for a record,
485+ meaning it has to be reviewed by a user.
486+
487+ :param session: current session
488+ :type session: :py:class:`openerp.addons.connector.session.ConnectorSession`
489+ :param model_name: name of the model of the record to be reviewed
490+ :type model_name: str
491+ :param record_id: ID of the record to be reviewed
492+ :type record_id: int
493+ :param backend_id: ID of the Magento Backend
494+ :type backend_id: int
495+ """
496+ return checkpoint.add_checkpoint(session, model_name, record_id,
497+ 'magento.backend', backend_id)
498
499=== added file 'magentoerpconnect/consumer.py'
500--- magentoerpconnect/consumer.py 1970-01-01 00:00:00 +0000
501+++ magentoerpconnect/consumer.py 2013-08-13 17:30:12 +0000
502@@ -0,0 +1,80 @@
503+# -*- coding: utf-8 -*-
504+##############################################################################
505+#
506+# Author: Guewen Baconnier
507+# Copyright 2013 Camptocamp SA
508+#
509+# This program is free software: you can redistribute it and/or modify
510+# it under the terms of the GNU Affero General Public License as
511+# published by the Free Software Foundation, either version 3 of the
512+# License, or (at your option) any later version.
513+#
514+# This program is distributed in the hope that it will be useful,
515+# but WITHOUT ANY WARRANTY; without even the implied warranty of
516+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
517+# GNU Affero General Public License for more details.
518+#
519+# You should have received a copy of the GNU Affero General Public License
520+# along with this program. If not, see <http://www.gnu.org/licenses/>.
521+#
522+##############################################################################
523+
524+from functools import wraps
525+
526+from openerp.addons.connector.event import (on_record_write,
527+ on_record_create,
528+ on_record_unlink
529+ )
530+from openerp.addons.connector.connector import Binder
531+from .unit.export_synchronizer import export_record
532+from .unit.delete_synchronizer import export_delete_record
533+from .connector import get_environment
534+
535+_MODEL_NAMES = ()
536+_BIND_MODEL_NAMES = ()
537+
538+
539+@on_record_create(model_names=_BIND_MODEL_NAMES)
540+@on_record_write(model_names=_BIND_MODEL_NAMES)
541+def delay_export(session, model_name, record_id, fields=None):
542+ """ Delay a job which export a binding record.
543+
544+ (A binding record being a ``magento.res.partner``,
545+ ``magento.product.product``, ...)
546+ """
547+ if session.context.get('connector_no_export'):
548+ return
549+ export_record.delay(session, model_name, record_id, fields=fields)
550+
551+
552+@on_record_write(model_names=_MODEL_NAMES)
553+def delay_export_all_bindings(session, model_name, record_id, fields=None):
554+ """ Delay a job which export all the bindings of a record.
555+
556+ In this case, it is called on records of normal models and will delay
557+ the export for all the bindings.
558+ """
559+ if session.context.get('connector_no_export'):
560+ return
561+ model = session.pool.get(model_name)
562+ record = model.browse(session.cr, session.uid,
563+ record_id, context=session.context)
564+ for binding in record.magento_bind_ids:
565+ export_record.delay(session, binding._model._name, binding.id,
566+ fields=fields)
567+
568+
569+@on_record_unlink(model_names=_BIND_MODEL_NAMES)
570+def delay_unlink(session, model_name, record_id):
571+ """ Delay a job which delete a record on Magento.
572+
573+ Called on binding records."""
574+ model = session.pool.get(model_name)
575+ record = model.browse(session.cr, session.uid,
576+ record_id, context=session.context)
577+ env = get_environment(session, model_name, record.backend_id.id)
578+ binder = env.get_connector_unit(Binder)
579+ magento_id = binder.to_backend(record_id)
580+ if magento_id:
581+ export_delete_record.delay(session, model_name,
582+ record.backend_id.id, magento_id)
583
584=== added file 'magentoerpconnect/delivery.py'
585--- magentoerpconnect/delivery.py 1970-01-01 00:00:00 +0000
586+++ magentoerpconnect/delivery.py 2013-08-13 17:30:12 +0000
587@@ -0,0 +1,83 @@
588+# -*- coding: utf-8 -*-
589+##############################################################################
590+#
591+# Authors: Guewen Baconnier, Sébastien Beau
592+# Copyright (C) 2010 BEAU Sébastien
593+# Copyright 2011-2013 Camptocamp SA
594+#
595+# This program is free software: you can redistribute it and/or modify
596+# it under the terms of the GNU Affero General Public License as
597+# published by the Free Software Foundation, either version 3 of the
598+# License, or (at your option) any later version.
599+#
600+# This program is distributed in the hope that it will be useful,
601+# but WITHOUT ANY WARRANTY; without even the implied warranty of
602+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
603+# GNU Affero General Public License for more details.
604+#
605+# You should have received a copy of the GNU Affero General Public License
606+# along with this program. If not, see <http://www.gnu.org/licenses/>.
607+#
608+##############################################################################
609+
610+from openerp.osv import fields, orm
611+
612+
613+# TODO magento.delivery.carrier & move specific stuff
614+class delivery_carrier(orm.Model):
615+ """ Adds Magento specific fields to ``delivery.carrier``
616+
617+ ``magento_code``
618+
619+ Code of the carrier delivery method in Magento.
620+ Example: ``colissimo_express``
621+
622+ ``magento_tracking_title``
623+
624+ Display name of the carrier for the tracking in Magento.
625+ Example: Colissimo Express
626+
627+ ``magento_carrier_code``
628+
629+ General code of the carrier, the first part of the ``magento_code``.
630+ Example: ``colissimo`` for the method ``colissimo_express``.
631+
632+ ``magento_export_tracking``
633+
634+ Defines if the tracking numbers should be exported to Magento.
635+ """
636+ _inherit = "delivery.carrier"
637+
638+ def _carrier_code(self, cr, uid, ids, name, args, context=None):
639+ res = {}
640+ for carrier in self.browse(cr, uid, ids, context=context):
641+ if not carrier.magento_code:
642+ res[carrier.id] = False
643+ continue
644+ res[carrier.id] = carrier.magento_code.split('_')[0]
645+ return res
646+
647+ _columns = {
648+ 'magento_code': fields.char(
649+ 'Magento Carrier Code',
650+ size=64,
651+ required=False),
652+ 'magento_tracking_title': fields.char(
653+ 'Magento Tracking Title',
654+ size=64,
655+ required=False),
656+ # in Magento, the delivery method is something like that:
657+ # tntmodule2_tnt_basic
658+ # where the first part before the _ is always the carrier code
659+ # in this example, the carrier code is tntmodule2
660+ 'magento_carrier_code':
661+ fields.function(_carrier_code,
662+ string='Magento Base Carrier Code',
663+ size=32,
664+ type='char'),
665+ 'magento_export_tracking': fields.boolean('Export tracking numbers')
666+ }
667+
668+ _defaults = {
669+ 'magento_export_tracking': True,
670+ }
671
672=== added file 'magentoerpconnect/delivery_view.xml'
673--- magentoerpconnect/delivery_view.xml 1970-01-01 00:00:00 +0000
674+++ magentoerpconnect/delivery_view.xml 2013-08-13 17:30:12 +0000
675@@ -0,0 +1,21 @@
676+<?xml version="1.0" encoding="utf-8"?>
677+<openerp>
678+ <data>
679+
680+ <record id="view_magento_delivery_carrier_form" model="ir.ui.view">
681+ <field name="name">magento.delivery.carrier.form</field>
682+ <field name="model">delivery.carrier</field>
683+ <field name="inherit_id" ref="delivery.view_delivery_carrier_form" />
684+ <field name="arch" type="xml">
685+ <data>
686+ <field name="product_id" select="1" position="after">
687+ <field name="magento_code"/>
688+ <field name="magento_tracking_title"/>
689+ <field name="magento_export_tracking"/>
690+ </field>
691+ </data>
692+ </field>
693+ </record>
694+
695+ </data>
696+</openerp>
697
698=== added directory 'magentoerpconnect/doc'
699=== added file 'magentoerpconnect/doc/Makefile'
700--- magentoerpconnect/doc/Makefile 1970-01-01 00:00:00 +0000
701+++ magentoerpconnect/doc/Makefile 2013-08-13 17:30:12 +0000
702@@ -0,0 +1,153 @@
703+# Makefile for Sphinx documentation
704+#
705+
706+# You can set these variables from the command line.
707+SPHINXOPTS =
708+SPHINXBUILD = sphinx-build
709+PAPER =
710+BUILDDIR = _build
711+
712+# Internal variables.
713+PAPEROPT_a4 = -D latex_paper_size=a4
714+PAPEROPT_letter = -D latex_paper_size=letter
715+ALLSPHINXOPTS = -d $(BUILDDIR)/doctrees $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
716+# the i18n builder cannot share the environment and doctrees with the others
717+I18NSPHINXOPTS = $(PAPEROPT_$(PAPER)) $(SPHINXOPTS) .
718+
719+.PHONY: help clean html dirhtml singlehtml pickle json htmlhelp qthelp devhelp epub latex latexpdf text man changes linkcheck doctest gettext
720+
721+help:
722+ @echo "Please use \`make <target>' where <target> is one of"
723+ @echo " html to make standalone HTML files"
724+ @echo " dirhtml to make HTML files named index.html in directories"
725+ @echo " singlehtml to make a single large HTML file"
726+ @echo " pickle to make pickle files"
727+ @echo " json to make JSON files"
728+ @echo " htmlhelp to make HTML files and a HTML help project"
729+ @echo " qthelp to make HTML files and a qthelp project"
730+ @echo " devhelp to make HTML files and a Devhelp project"
731+ @echo " epub to make an epub"
732+ @echo " latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter"
733+ @echo " latexpdf to make LaTeX files and run them through pdflatex"
734+ @echo " text to make text files"
735+ @echo " man to make manual pages"
736+ @echo " texinfo to make Texinfo files"
737+ @echo " info to make Texinfo files and run them through makeinfo"
738+ @echo " gettext to make PO message catalogs"
739+ @echo " changes to make an overview of all changed/added/deprecated items"
740+ @echo " linkcheck to check all external links for integrity"
741+ @echo " doctest to run all doctests embedded in the documentation (if enabled)"
742+
743+clean:
744+ -rm -rf $(BUILDDIR)/*
745+
746+html:
747+ $(SPHINXBUILD) -b html $(ALLSPHINXOPTS) $(BUILDDIR)/html
748+ @echo
749+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/html."
750+
751+dirhtml:
752+ $(SPHINXBUILD) -b dirhtml $(ALLSPHINXOPTS) $(BUILDDIR)/dirhtml
753+ @echo
754+ @echo "Build finished. The HTML pages are in $(BUILDDIR)/dirhtml."
755+
756+singlehtml:
757+ $(SPHINXBUILD) -b singlehtml $(ALLSPHINXOPTS) $(BUILDDIR)/singlehtml
758+ @echo
759+ @echo "Build finished. The HTML page is in $(BUILDDIR)/singlehtml."
760+
761+pickle:
762+ $(SPHINXBUILD) -b pickle $(ALLSPHINXOPTS) $(BUILDDIR)/pickle
763+ @echo
764+ @echo "Build finished; now you can process the pickle files."
765+
766+json:
767+ $(SPHINXBUILD) -b json $(ALLSPHINXOPTS) $(BUILDDIR)/json
768+ @echo
769+ @echo "Build finished; now you can process the JSON files."
770+
771+htmlhelp:
772+ $(SPHINXBUILD) -b htmlhelp $(ALLSPHINXOPTS) $(BUILDDIR)/htmlhelp
773+ @echo
774+ @echo "Build finished; now you can run HTML Help Workshop with the" \
775+ ".hhp project file in $(BUILDDIR)/htmlhelp."
776+
777+qthelp:
778+ $(SPHINXBUILD) -b qthelp $(ALLSPHINXOPTS) $(BUILDDIR)/qthelp
779+ @echo
780+ @echo "Build finished; now you can run "qcollectiongenerator" with the" \
781+ ".qhcp project file in $(BUILDDIR)/qthelp, like this:"
782+ @echo "# qcollectiongenerator $(BUILDDIR)/qthelp/Connectors.qhcp"
783+ @echo "To view the help file:"
784+ @echo "# assistant -collectionFile $(BUILDDIR)/qthelp/Connectors.qhc"
785+
786+devhelp:
787+ $(SPHINXBUILD) -b devhelp $(ALLSPHINXOPTS) $(BUILDDIR)/devhelp
788+ @echo
789+ @echo "Build finished."
790+ @echo "To view the help file:"
791+ @echo "# mkdir -p $$HOME/.local/share/devhelp/Connectors"
792+ @echo "# ln -s $(BUILDDIR)/devhelp $$HOME/.local/share/devhelp/Connectors"
793+ @echo "# devhelp"
794+
795+epub:
796+ $(SPHINXBUILD) -b epub $(ALLSPHINXOPTS) $(BUILDDIR)/epub
797+ @echo
798+ @echo "Build finished. The epub file is in $(BUILDDIR)/epub."
799+
800+latex:
801+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
802+ @echo
803+ @echo "Build finished; the LaTeX files are in $(BUILDDIR)/latex."
804+ @echo "Run \`make' in that directory to run these through (pdf)latex" \
805+ "(use \`make latexpdf' here to do that automatically)."
806+
807+latexpdf:
808+ $(SPHINXBUILD) -b latex $(ALLSPHINXOPTS) $(BUILDDIR)/latex
809+ @echo "Running LaTeX files through pdflatex..."
810+ $(MAKE) -C $(BUILDDIR)/latex all-pdf
811+ @echo "pdflatex finished; the PDF files are in $(BUILDDIR)/latex."
812+
813+text:
814+ $(SPHINXBUILD) -b text $(ALLSPHINXOPTS) $(BUILDDIR)/text
815+ @echo
816+ @echo "Build finished. The text files are in $(BUILDDIR)/text."
817+
818+man:
819+ $(SPHINXBUILD) -b man $(ALLSPHINXOPTS) $(BUILDDIR)/man
820+ @echo
821+ @echo "Build finished. The manual pages are in $(BUILDDIR)/man."
822+
823+texinfo:
824+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
825+ @echo
826+ @echo "Build finished. The Texinfo files are in $(BUILDDIR)/texinfo."
827+ @echo "Run \`make' in that directory to run these through makeinfo" \
828+ "(use \`make info' here to do that automatically)."
829+
830+info:
831+ $(SPHINXBUILD) -b texinfo $(ALLSPHINXOPTS) $(BUILDDIR)/texinfo
832+ @echo "Running Texinfo files through makeinfo..."
833+ make -C $(BUILDDIR)/texinfo info
834+ @echo "makeinfo finished; the Info files are in $(BUILDDIR)/texinfo."
835+
836+gettext:
837+ $(SPHINXBUILD) -b gettext $(I18NSPHINXOPTS) $(BUILDDIR)/locale
838+ @echo
839+ @echo "Build finished. The message catalogs are in $(BUILDDIR)/locale."
840+
841+changes:
842+ $(SPHINXBUILD) -b changes $(ALLSPHINXOPTS) $(BUILDDIR)/changes
843+ @echo
844+ @echo "The overview file is in $(BUILDDIR)/changes."
845+
846+linkcheck:
847+ $(SPHINXBUILD) -b linkcheck $(ALLSPHINXOPTS) $(BUILDDIR)/linkcheck
848+ @echo
849+ @echo "Link check complete; look for any errors in the above output " \
850+ "or in $(BUILDDIR)/linkcheck/output.txt."
851+
852+doctest:
853+ $(SPHINXBUILD) -b doctest $(ALLSPHINXOPTS) $(BUILDDIR)/doctest
854+ @echo "Testing of doctests in the sources finished, look at the " \
855+ "results in $(BUILDDIR)/doctest/output.txt."
856
857=== added directory 'magentoerpconnect/doc/_build'
858=== added directory 'magentoerpconnect/doc/_static'
859=== added directory 'magentoerpconnect/doc/_templates'
860=== added directory 'magentoerpconnect/doc/_themes'
861=== added file 'magentoerpconnect/doc/_themes/.gitignore'
862--- magentoerpconnect/doc/_themes/.gitignore 1970-01-01 00:00:00 +0000
863+++ magentoerpconnect/doc/_themes/.gitignore 2013-08-13 17:30:12 +0000
864@@ -0,0 +1,3 @@
865+*.pyc
866+*.pyo
867+.DS_Store
868
869=== added file 'magentoerpconnect/doc/_themes/LICENSE'
870--- magentoerpconnect/doc/_themes/LICENSE 1970-01-01 00:00:00 +0000
871+++ magentoerpconnect/doc/_themes/LICENSE 2013-08-13 17:30:12 +0000
872@@ -0,0 +1,37 @@
873+Copyright (c) 2010 by Armin Ronacher.
874+
875+Some rights reserved.
876+
877+Redistribution and use in source and binary forms of the theme, with or
878+without modification, are permitted provided that the following conditions
879+are met:
880+
881+* Redistributions of source code must retain the above copyright
882+ notice, this list of conditions and the following disclaimer.
883+
884+* Redistributions in binary form must reproduce the above
885+ copyright notice, this list of conditions and the following
886+ disclaimer in the documentation and/or other materials provided
887+ with the distribution.
888+
889+* The names of the contributors may not be used to endorse or
890+ promote products derived from this software without specific
891+ prior written permission.
892+
893+We kindly ask you to only use these themes in an unmodified manner just
894+for Flask and Flask-related products, not for unrelated projects. If you
895+like the visual style and want to use it for your own projects, please
896+consider making some larger changes to the themes (such as changing
897+font faces, sizes, colors or margins).
898+
899+THIS THEME IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
900+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
901+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
902+ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
903+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
904+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
905+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
906+INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
907+CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
908+ARISING IN ANY WAY OUT OF THE USE OF THIS THEME, EVEN IF ADVISED OF THE
909+POSSIBILITY OF SUCH DAMAGE.
910
911=== added file 'magentoerpconnect/doc/_themes/README'
912--- magentoerpconnect/doc/_themes/README 1970-01-01 00:00:00 +0000
913+++ magentoerpconnect/doc/_themes/README 2013-08-13 17:30:12 +0000
914@@ -0,0 +1,31 @@
915+Flask Sphinx Styles
916+===================
917+
918+This repository contains sphinx styles for Flask and Flask related
919+projects. To use this style in your Sphinx documentation, follow
920+this guide:
921+
922+1. put this folder as _themes into your docs folder. Alternatively
923+ you can also use git submodules to check out the contents there.
924+2. add this to your conf.py:
925+
926+ sys.path.append(os.path.abspath('_themes'))
927+ html_theme_path = ['_themes']
928+ html_theme = 'flask'
929+
930+The following themes exist:
931+
932+- 'flask' - the standard flask documentation theme for large
933+ projects
934+- 'flask_small' - small one-page theme. Intended to be used by
935+ very small addon libraries for flask.
936+
937+The following options exist for the flask_small theme:
938+
939+ [options]
940+ index_logo = '' filename of a picture in _static
941+ to be used as replacement for the
942+ h1 in the index.rst file.
943+ index_logo_height = 120px height of the index logo
944+ github_fork = '' repository name on github for the
945+ "fork me" badge
946
947=== added directory 'magentoerpconnect/doc/_themes/flask'
948=== added file 'magentoerpconnect/doc/_themes/flask/layout.html'
949--- magentoerpconnect/doc/_themes/flask/layout.html 1970-01-01 00:00:00 +0000
950+++ magentoerpconnect/doc/_themes/flask/layout.html 2013-08-13 17:30:12 +0000
951@@ -0,0 +1,25 @@
952+{%- extends "basic/layout.html" %}
953+{%- block extrahead %}
954+ {{ super() }}
955+ {% if theme_touch_icon %}
956+ <link rel="apple-touch-icon" href="{{ pathto('_static/' ~ theme_touch_icon, 1) }}" />
957+ {% endif %}
958+ <link media="only screen and (max-device-width: 480px)" href="{{
959+ pathto('_static/small_flask.css', 1) }}" type= "text/css" rel="stylesheet" />
960+{% endblock %}
961+{%- block relbar2 %}{% endblock %}
962+{% block header %}
963+ {{ super() }}
964+ {% if pagename == 'index' %}
965+ <div class=indexwrapper>
966+ {% endif %}
967+{% endblock %}
968+{%- block footer %}
969+ <div class="footer">
970+ &copy; Copyright {{ copyright }}
971+ Created using <a href="http://sphinx.pocoo.org/">Sphinx</a> and a modified <a href="https://github.com/mitsuhiko/flask-sphinx-themes">Flask theme</a>.
972+ </div>
973+ {% if pagename == 'index' %}
974+ </div>
975+ {% endif %}
976+{%- endblock %}
977
978=== added file 'magentoerpconnect/doc/_themes/flask/relations.html'
979--- magentoerpconnect/doc/_themes/flask/relations.html 1970-01-01 00:00:00 +0000
980+++ magentoerpconnect/doc/_themes/flask/relations.html 2013-08-13 17:30:12 +0000
981@@ -0,0 +1,19 @@
982+<h3>Related Topics</h3>
983+<ul>
984+ <li><a href="{{ pathto(master_doc) }}">Documentation overview</a><ul>
985+ {%- for parent in parents %}
986+ <li><a href="{{ parent.link|e }}">{{ parent.title }}</a><ul>
987+ {%- endfor %}
988+ {%- if prev %}
989+ <li>Previous: <a href="{{ prev.link|e }}" title="{{ _('previous chapter')
990+ }}">{{ prev.title }}</a></li>
991+ {%- endif %}
992+ {%- if next %}
993+ <li>Next: <a href="{{ next.link|e }}" title="{{ _('next chapter')
994+ }}">{{ next.title }}</a></li>
995+ {%- endif %}
996+ {%- for parent in parents %}
997+ </ul></li>
998+ {%- endfor %}
999+ </ul></li>
1000+</ul>
1001
1002=== added directory 'magentoerpconnect/doc/_themes/flask/static'
1003=== added file 'magentoerpconnect/doc/_themes/flask/static/flasky.css_t'
1004--- magentoerpconnect/doc/_themes/flask/static/flasky.css_t 1970-01-01 00:00:00 +0000
1005+++ magentoerpconnect/doc/_themes/flask/static/flasky.css_t 2013-08-13 17:30:12 +0000
1006@@ -0,0 +1,395 @@
1007+/*
1008+ * flasky.css_t
1009+ * ~~~~~~~~~~~~
1010+ *
1011+ * :copyright: Copyright 2010 by Armin Ronacher.
1012+ * :license: Flask Design License, see LICENSE for details.
1013+ */
1014+
1015+{% set page_width = '80em' %}
1016+{% set sidebar_width = '16em' %}
1017+
1018+@import url("basic.css");
1019+
1020+/* -- page layout ----------------------------------------------------------- */
1021+
1022+body {
1023+ font-family: 'Georgia', serif;
1024+ font-size: 15px;
1025+ background-color: white;
1026+ color: #000;
1027+ margin: 0;
1028+ padding: 0;
1029+}
1030+
1031+div.document {
1032+ width: {{ page_width }};
1033+ margin: 30px auto 0 auto;
1034+}
1035+
1036+div.documentwrapper {
1037+ float: left;
1038+ width: 100%;
1039+}
1040+
1041+div.bodywrapper {
1042+ margin: 0 0 0 {{ sidebar_width }};
1043+}
1044+
1045+div.sphinxsidebar {
1046+ width: {{ sidebar_width }};
1047+}
1048+
1049+hr {
1050+ border: 1px solid #B1B4B6;
1051+}
1052+
1053+div.body {
1054+ background-color: #ffffff;
1055+ color: #3E4349;
1056+ padding: 0 0px 0 0px;
1057+}
1058+
1059+img.floatingflask {
1060+ padding: 0 0 10px 10px;
1061+ float: right;
1062+}
1063+
1064+div.footer {
1065+ width: {{ page_width }};
1066+ margin: 20px auto 30px auto;
1067+ font-size: 12px;
1068+ color: #888;
1069+ text-align: right;
1070+}
1071+
1072+div.footer a {
1073+ color: #888;
1074+}
1075+
1076+div.related {
1077+ display: none;
1078+}
1079+
1080+div.sphinxsidebar a {
1081+ color: #444;
1082+ text-decoration: none;
1083+ border-bottom: 1px dotted #999;
1084+}
1085+
1086+div.sphinxsidebar a:hover {
1087+ border-bottom: 1px solid #999;
1088+}
1089+
1090+div.sphinxsidebar {
1091+ font-size: 12px;
1092+ line-height: 1.5;
1093+}
1094+
1095+div.sphinxsidebarwrapper {
1096+ padding: 0px 10px;
1097+}
1098+
1099+div.sphinxsidebarwrapper p.logo {
1100+ padding: 0 0 20px 0;
1101+ margin: 0;
1102+ text-align: center;
1103+}
1104+
1105+div.sphinxsidebar h3,
1106+div.sphinxsidebar h4 {
1107+ font-family: 'Garamond', 'Georgia', serif;
1108+ color: #444;
1109+ font-size: 22px;
1110+ font-weight: normal;
1111+ margin: 0 0 5px 0;
1112+ padding: 0;
1113+}
1114+
1115+div.sphinxsidebar h4 {
1116+ font-size: 18px;
1117+}
1118+
1119+div.sphinxsidebar h3 a {
1120+ color: #444;
1121+}
1122+
1123+div.sphinxsidebar p.logo a,
1124+div.sphinxsidebar h3 a,
1125+div.sphinxsidebar p.logo a:hover,
1126+div.sphinxsidebar h3 a:hover {
1127+ border: none;
1128+}
1129+
1130+div.sphinxsidebar p {
1131+ color: #555;
1132+ margin: 10px 0;
1133+}
1134+
1135+div.sphinxsidebar ul {
1136+ margin: 10px 0;
1137+ padding: 0;
1138+ color: #000;
1139+}
1140+
1141+div.sphinxsidebar input {
1142+ border: 1px solid #ccc;
1143+ font-family: 'Georgia', serif;
1144+ font-size: 1em;
1145+}
1146+
1147+/* -- body styles ----------------------------------------------------------- */
1148+
1149+a {
1150+ color: #004B6B;
1151+ text-decoration: underline;
1152+}
1153+
1154+a:hover {
1155+ color: #6D4100;
1156+ text-decoration: underline;
1157+}
1158+
1159+div.body h1,
1160+div.body h2,
1161+div.body h3,
1162+div.body h4,
1163+div.body h5,
1164+div.body h6 {
1165+ font-family: 'Garamond', 'Georgia', serif;
1166+ font-weight: normal;
1167+ margin: 30px 0px 10px 0px;
1168+ padding: 0;
1169+}
1170+
1171+{% if theme_index_logo %}
1172+div.indexwrapper h1 {
1173+ text-indent: -999999px;
1174+ background: url({{ theme_index_logo }}) no-repeat center center;
1175+ height: {{ theme_index_logo_height }};
1176+}
1177+{% endif %}
1178+
1179+div.body h1 { margin-top: 0; padding-top: 0; font-size: 240%; }
1180+div.body h2 { font-size: 180%; }
1181+div.body h3 { font-size: 150%; }
1182+div.body h4 { font-size: 130%; }
1183+div.body h5 { font-size: 100%; }
1184+div.body h6 { font-size: 100%; }
1185+
1186+a.headerlink {
1187+ color: #ddd;
1188+ padding: 0 4px;
1189+ text-decoration: none;
1190+}
1191+
1192+a.headerlink:hover {
1193+ color: #444;
1194+ background: #eaeaea;
1195+}
1196+
1197+div.body p, div.body dd, div.body li {
1198+ line-height: 1.4em;
1199+}
1200+
1201+div.admonition {
1202+ background: #fafafa;
1203+ margin: 20px -30px;
1204+ padding: 10px 30px;
1205+ border-top: 1px solid #ccc;
1206+ border-bottom: 1px solid #ccc;
1207+}
1208+
1209+div.admonition tt.xref, div.admonition a tt {
1210+ border-bottom: 1px solid #fafafa;
1211+}
1212+
1213+dd div.admonition {
1214+ margin-left: -60px;
1215+ padding-left: 60px;
1216+}
1217+
1218+div.admonition p.admonition-title {
1219+ font-family: 'Garamond', 'Georgia', serif;
1220+ font-weight: normal;
1221+ font-size: 22px;
1222+ margin: 0 0 10px 0;
1223+ padding: 0;
1224+ line-height: 1;
1225+}
1226+
1227+div.admonition p.last {
1228+ margin-bottom: 0;
1229+}
1230+
1231+div.highlight {
1232+ background-color: white;
1233+}
1234+
1235+dt:target, .highlight {
1236+ background: #FAF3E8;
1237+}
1238+
1239+div.note {
1240+ background-color: #eee;
1241+ border: 1px solid #ccc;
1242+}
1243+
1244+div.seealso {
1245+ background-color: #ffc;
1246+ border: 1px solid #ff6;
1247+}
1248+
1249+div.topic {
1250+ background-color: #eee;
1251+}
1252+
1253+p.admonition-title {
1254+ display: inline;
1255+}
1256+
1257+p.admonition-title:after {
1258+ content: ":";
1259+}
1260+
1261+pre, tt {
1262+ font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
1263+ font-size: 0.9em;
1264+}
1265+
1266+img.screenshot {
1267+}
1268+
1269+tt.descname, tt.descclassname {
1270+ font-size: 0.95em;
1271+}
1272+
1273+tt.descname {
1274+ padding-right: 0.08em;
1275+}
1276+
1277+img.screenshot {
1278+ -moz-box-shadow: 2px 2px 4px #eee;
1279+ -webkit-box-shadow: 2px 2px 4px #eee;
1280+ box-shadow: 2px 2px 4px #eee;
1281+}
1282+
1283+table.docutils {
1284+ border: 1px solid #888;
1285+ -moz-box-shadow: 2px 2px 4px #eee;
1286+ -webkit-box-shadow: 2px 2px 4px #eee;
1287+ box-shadow: 2px 2px 4px #eee;
1288+}
1289+
1290+table.docutils td, table.docutils th {
1291+ border: 1px solid #888;
1292+ padding: 0.25em 0.7em;
1293+}
1294+
1295+table.field-list, table.footnote {
1296+ border: none;
1297+ -moz-box-shadow: none;
1298+ -webkit-box-shadow: none;
1299+ box-shadow: none;
1300+}
1301+
1302+table.footnote {
1303+ margin: 15px 0;
1304+ width: 100%;
1305+ border: 1px solid #eee;
1306+ background: #fdfdfd;
1307+ font-size: 0.9em;
1308+}
1309+
1310+table.footnote + table.footnote {
1311+ margin-top: -15px;
1312+ border-top: none;
1313+}
1314+
1315+table.field-list th {
1316+ padding: 0 0.8em 0 0;
1317+}
1318+
1319+table.field-list td {
1320+ padding: 0;
1321+}
1322+
1323+table.footnote td.label {
1324+ width: 0px;
1325+ padding: 0.3em 0 0.3em 0.5em;
1326+}
1327+
1328+table.footnote td {
1329+ padding: 0.3em 0.5em;
1330+}
1331+
1332+dl {
1333+ margin: 0;
1334+ padding: 0;
1335+}
1336+
1337+dl dd {
1338+ margin-left: 30px;
1339+}
1340+
1341+blockquote {
1342+ margin: 0 0 0 30px;
1343+ padding: 0;
1344+}
1345+
1346+ul, ol {
1347+ margin: 10px 0 10px 30px;
1348+ padding: 0;
1349+}
1350+
1351+pre {
1352+ background: #eee;
1353+ padding: 7px 30px;
1354+ margin: 15px -30px;
1355+ line-height: 1.3em;
1356+}
1357+
1358+dl pre, blockquote pre, li pre {
1359+ margin-left: -60px;
1360+ padding-left: 60px;
1361+}
1362+
1363+dl dl pre {
1364+ margin-left: -90px;
1365+ padding-left: 90px;
1366+}
1367+
1368+tt {
1369+ background-color: #ecf0f3;
1370+ color: #222;
1371+ /* padding: 1px 2px; */
1372+}
1373+
1374+tt.xref, a tt {
1375+ background-color: #FBFBFB;
1376+ border-bottom: 1px solid white;
1377+}
1378+
1379+a.reference {
1380+ text-decoration: none;
1381+ border-bottom: 1px dotted #004B6B;
1382+}
1383+
1384+a.reference:hover {
1385+ border-bottom: 1px solid #6D4100;
1386+}
1387+
1388+a.footnote-reference {
1389+ text-decoration: none;
1390+ font-size: 0.7em;
1391+ vertical-align: top;
1392+ border-bottom: 1px dotted #004B6B;
1393+}
1394+
1395+a.footnote-reference:hover {
1396+ border-bottom: 1px solid #6D4100;
1397+}
1398+
1399+a:hover tt {
1400+ background: #EEE;
1401+}
1402
1403=== added file 'magentoerpconnect/doc/_themes/flask/static/small_flask.css'
1404--- magentoerpconnect/doc/_themes/flask/static/small_flask.css 1970-01-01 00:00:00 +0000
1405+++ magentoerpconnect/doc/_themes/flask/static/small_flask.css 2013-08-13 17:30:12 +0000
1406@@ -0,0 +1,70 @@
1407+/*
1408+ * small_flask.css_t
1409+ * ~~~~~~~~~~~~~~~~~
1410+ *
1411+ * :copyright: Copyright 2010 by Armin Ronacher.
1412+ * :license: Flask Design License, see LICENSE for details.
1413+ */
1414+
1415+body {
1416+ margin: 0;
1417+ padding: 20px 30px;
1418+}
1419+
1420+div.documentwrapper {
1421+ float: none;
1422+ background: white;
1423+}
1424+
1425+div.sphinxsidebar {
1426+ display: block;
1427+ float: none;
1428+ width: 102.5%;
1429+ margin: 50px -30px -20px -30px;
1430+ padding: 10px 20px;
1431+ background: #333;
1432+ color: white;
1433+}
1434+
1435+div.sphinxsidebar h3, div.sphinxsidebar h4, div.sphinxsidebar p,
1436+div.sphinxsidebar h3 a {
1437+ color: white;
1438+}
1439+
1440+div.sphinxsidebar a {
1441+ color: #aaa;
1442+}
1443+
1444+div.sphinxsidebar p.logo {
1445+ display: none;
1446+}
1447+
1448+div.document {
1449+ width: 100%;
1450+ margin: 0;
1451+}
1452+
1453+div.related {
1454+ display: block;
1455+ margin: 0;
1456+ padding: 10px 0 20px 0;
1457+}
1458+
1459+div.related ul,
1460+div.related ul li {
1461+ margin: 0;
1462+ padding: 0;
1463+}
1464+
1465+div.footer {
1466+ display: none;
1467+}
1468+
1469+div.bodywrapper {
1470+ margin: 0;
1471+}
1472+
1473+div.body {
1474+ min-height: 0;
1475+ padding: 0;
1476+}
1477
1478=== added file 'magentoerpconnect/doc/_themes/flask/theme.conf'
1479--- magentoerpconnect/doc/_themes/flask/theme.conf 1970-01-01 00:00:00 +0000
1480+++ magentoerpconnect/doc/_themes/flask/theme.conf 2013-08-13 17:30:12 +0000
1481@@ -0,0 +1,9 @@
1482+[theme]
1483+inherit = basic
1484+stylesheet = flasky.css
1485+pygments_style = flask_theme_support.FlaskyStyle
1486+
1487+[options]
1488+index_logo =
1489+index_logo_height = 120px
1490+touch_icon =
1491
1492=== added directory 'magentoerpconnect/doc/_themes/flask_small'
1493=== added file 'magentoerpconnect/doc/_themes/flask_small/layout.html'
1494--- magentoerpconnect/doc/_themes/flask_small/layout.html 1970-01-01 00:00:00 +0000
1495+++ magentoerpconnect/doc/_themes/flask_small/layout.html 2013-08-13 17:30:12 +0000
1496@@ -0,0 +1,22 @@
1497+{% extends "basic/layout.html" %}
1498+{% block header %}
1499+ {{ super() }}
1500+ {% if pagename == 'index' %}
1501+ <div class=indexwrapper>
1502+ {% endif %}
1503+{% endblock %}
1504+{% block footer %}
1505+ {% if pagename == 'index' %}
1506+ </div>
1507+ {% endif %}
1508+{% endblock %}
1509+{# do not display relbars #}
1510+{% block relbar1 %}{% endblock %}
1511+{% block relbar2 %}
1512+ {% if theme_github_fork %}
1513+ <a href="http://github.com/{{ theme_github_fork }}"><img style="position: fixed; top: 0; right: 0; border: 0;"
1514+ src="http://s3.amazonaws.com/github/ribbons/forkme_right_darkblue_121621.png" alt="Fork me on GitHub" /></a>
1515+ {% endif %}
1516+{% endblock %}
1517+{% block sidebar1 %}{% endblock %}
1518+{% block sidebar2 %}{% endblock %}
1519
1520=== added directory 'magentoerpconnect/doc/_themes/flask_small/static'
1521=== added file 'magentoerpconnect/doc/_themes/flask_small/static/flasky.css_t'
1522--- magentoerpconnect/doc/_themes/flask_small/static/flasky.css_t 1970-01-01 00:00:00 +0000
1523+++ magentoerpconnect/doc/_themes/flask_small/static/flasky.css_t 2013-08-13 17:30:12 +0000
1524@@ -0,0 +1,287 @@
1525+/*
1526+ * flasky.css_t
1527+ * ~~~~~~~~~~~~
1528+ *
1529+ * Sphinx stylesheet -- flasky theme based on nature theme.
1530+ *
1531+ * :copyright: Copyright 2007-2010 by the Sphinx team, see AUTHORS.
1532+ * :license: BSD, see LICENSE for details.
1533+ *
1534+ */
1535+
1536+@import url("basic.css");
1537+
1538+/* -- page layout ----------------------------------------------------------- */
1539+
1540+body {
1541+ font-family: 'Georgia', serif;
1542+ font-size: 17px;
1543+ color: #000;
1544+ background: white;
1545+ margin: 0;
1546+ padding: 0;
1547+}
1548+
1549+div.documentwrapper {
1550+ float: left;
1551+ width: 100%;
1552+}
1553+
1554+div.bodywrapper {
1555+ margin: 40px auto 0 auto;
1556+ width: 700px;
1557+}
1558+
1559+hr {
1560+ border: 1px solid #B1B4B6;
1561+}
1562+
1563+div.body {
1564+ background-color: #ffffff;
1565+ color: #3E4349;
1566+ padding: 0 30px 30px 30px;
1567+}
1568+
1569+img.floatingflask {
1570+ padding: 0 0 10px 10px;
1571+ float: right;
1572+}
1573+
1574+div.footer {
1575+ text-align: right;
1576+ color: #888;
1577+ padding: 10px;
1578+ font-size: 14px;
1579+ width: 650px;
1580+ margin: 0 auto 40px auto;
1581+}
1582+
1583+div.footer a {
1584+ color: #888;
1585+ text-decoration: underline;
1586+}
1587+
1588+div.related {
1589+ line-height: 32px;
1590+ color: #888;
1591+}
1592+
1593+div.related ul {
1594+ padding: 0 0 0 10px;
1595+}
1596+
1597+div.related a {
1598+ color: #444;
1599+}
1600+
1601+/* -- body styles ----------------------------------------------------------- */
1602+
1603+a {
1604+ color: #004B6B;
1605+ text-decoration: underline;
1606+}
1607+
1608+a:hover {
1609+ color: #6D4100;
1610+ text-decoration: underline;
1611+}
1612+
1613+div.body {
1614+ padding-bottom: 40px; /* saved for footer */
1615+}
1616+
1617+div.body h1,
1618+div.body h2,
1619+div.body h3,
1620+div.body h4,
1621+div.body h5,
1622+div.body h6 {
1623+ font-family: 'Garamond', 'Georgia', serif;
1624+ font-weight: normal;
1625+ margin: 30px 0px 10px 0px;
1626+ padding: 0;
1627+}
1628+
1629+{% if theme_index_logo %}
1630+div.indexwrapper h1 {
1631+ text-indent: -999999px;
1632+ background: url({{ theme_index_logo }}) no-repeat center center;
1633+ height: {{ theme_index_logo_height }};
1634+}
1635+{% endif %}
1636+
1637+div.body h2 { font-size: 180%; }
1638+div.body h3 { font-size: 150%; }
1639+div.body h4 { font-size: 130%; }
1640+div.body h5 { font-size: 100%; }
1641+div.body h6 { font-size: 100%; }
1642+
1643+a.headerlink {
1644+ color: white;
1645+ padding: 0 4px;
1646+ text-decoration: none;
1647+}
1648+
1649+a.headerlink:hover {
1650+ color: #444;
1651+ background: #eaeaea;
1652+}
1653+
1654+div.body p, div.body dd, div.body li {
1655+ line-height: 1.4em;
1656+}
1657+
1658+div.admonition {
1659+ background: #fafafa;
1660+ margin: 20px -30px;
1661+ padding: 10px 30px;
1662+ border-top: 1px solid #ccc;
1663+ border-bottom: 1px solid #ccc;
1664+}
1665+
1666+div.admonition p.admonition-title {
1667+ font-family: 'Garamond', 'Georgia', serif;
1668+ font-weight: normal;
1669+ font-size: 24px;
1670+ margin: 0 0 10px 0;
1671+ padding: 0;
1672+ line-height: 1;
1673+}
1674+
1675+div.admonition p.last {
1676+ margin-bottom: 0;
1677+}
1678+
1679+div.highlight{
1680+ background-color: white;
1681+}
1682+
1683+dt:target, .highlight {
1684+ background: #FAF3E8;
1685+}
1686+
1687+div.note {
1688+ background-color: #eee;
1689+ border: 1px solid #ccc;
1690+}
1691+
1692+div.seealso {
1693+ background-color: #ffc;
1694+ border: 1px solid #ff6;
1695+}
1696+
1697+div.topic {
1698+ background-color: #eee;
1699+}
1700+
1701+div.warning {
1702+ background-color: #ffe4e4;
1703+ border: 1px solid #f66;
1704+}
1705+
1706+p.admonition-title {
1707+ display: inline;
1708+}
1709+
1710+p.admonition-title:after {
1711+ content: ":";
1712+}
1713+
1714+pre, tt {
1715+ font-family: 'Consolas', 'Menlo', 'Deja Vu Sans Mono', 'Bitstream Vera Sans Mono', monospace;
1716+ font-size: 0.85em;
1717+}
1718+
1719+img.screenshot {
1720+}
1721+
1722+tt.descname, tt.descclassname {
1723+ font-size: 0.95em;
1724+}
1725+
1726+tt.descname {
1727+ padding-right: 0.08em;
1728+}
1729+
1730+img.screenshot {
1731+ -moz-box-shadow: 2px 2px 4px #eee;
1732+ -webkit-box-shadow: 2px 2px 4px #eee;
1733+ box-shadow: 2px 2px 4px #eee;
1734+}
1735+
1736+table.docutils {
1737+ border: 1px solid #888;
1738+ -moz-box-shadow: 2px 2px 4px #eee;
1739+ -webkit-box-shadow: 2px 2px 4px #eee;
1740+ box-shadow: 2px 2px 4px #eee;
1741+}
1742+
1743+table.docutils td, table.docutils th {
1744+ border: 1px solid #888;
1745+ padding: 0.25em 0.7em;
1746+}
1747+
1748+table.field-list, table.footnote {
1749+ border: none;
1750+ -moz-box-shadow: none;
1751+ -webkit-box-shadow: none;
1752+ box-shadow: none;
1753+}
1754+
1755+table.footnote {
1756+ margin: 15px 0;
1757+ width: 100%;
1758+ border: 1px solid #eee;
1759+}
1760+
1761+table.field-list th {
1762+ padding: 0 0.8em 0 0;
1763+}
1764+
1765+table.field-list td {
1766+ padding: 0;
1767+}
1768+
1769+table.footnote td {
1770+ padding: 0.5em;
1771+}
1772+
1773+dl {
1774+ margin: 0;
1775+ padding: 0;
1776+}
1777+
1778+dl dd {
1779+ margin-left: 30px;
1780+}
1781+
1782+pre {
1783+ padding: 0;
1784+ margin: 15px -30px;
1785+ padding: 8px;
1786+ line-height: 1.3em;
1787+ padding: 7px 30px;
1788+ background: #eee;
1789+ border-radius: 2px;
1790+ -moz-border-radius: 2px;
1791+ -webkit-border-radius: 2px;
1792+}
1793+
1794+dl pre {
1795+ margin-left: -60px;
1796+ padding-left: 60px;
1797+}
1798+
1799+tt {
1800+ background-color: #ecf0f3;
1801+ color: #222;
1802+ /* padding: 1px 2px; */
1803+}
1804+
1805+tt.xref, a tt {
1806+ background-color: #FBFBFB;
1807+}
1808+
1809+a:hover tt {
1810+ background: #EEE;
1811+}
1812
1813=== added file 'magentoerpconnect/doc/_themes/flask_small/theme.conf'
1814--- magentoerpconnect/doc/_themes/flask_small/theme.conf 1970-01-01 00:00:00 +0000
1815+++ magentoerpconnect/doc/_themes/flask_small/theme.conf 2013-08-13 17:30:12 +0000
1816@@ -0,0 +1,10 @@
1817+[theme]
1818+inherit = basic
1819+stylesheet = flasky.css
1820+nosidebar = true
1821+pygments_style = flask_theme_support.FlaskyStyle
1822+
1823+[options]
1824+index_logo = ''
1825+index_logo_height = 120px
1826+github_fork = ''
1827
1828=== added file 'magentoerpconnect/doc/_themes/flask_theme_support.py'
1829--- magentoerpconnect/doc/_themes/flask_theme_support.py 1970-01-01 00:00:00 +0000
1830+++ magentoerpconnect/doc/_themes/flask_theme_support.py 2013-08-13 17:30:12 +0000
1831@@ -0,0 +1,86 @@
1832+# flasky extensions. flasky pygments style based on tango style
1833+from pygments.style import Style
1834+from pygments.token import Keyword, Name, Comment, String, Error, \
1835+ Number, Operator, Generic, Whitespace, Punctuation, Other, Literal
1836+
1837+
1838+class FlaskyStyle(Style):
1839+ background_color = "#f8f8f8"
1840+ default_style = ""
1841+
1842+ styles = {
1843+ # No corresponding class for the following:
1844+ #Text: "", # class: ''
1845+ Whitespace: "underline #f8f8f8", # class: 'w'
1846+ Error: "#a40000 border:#ef2929", # class: 'err'
1847+ Other: "#000000", # class 'x'
1848+
1849+ Comment: "italic #8f5902", # class: 'c'
1850+ Comment.Preproc: "noitalic", # class: 'cp'
1851+
1852+ Keyword: "bold #004461", # class: 'k'
1853+ Keyword.Constant: "bold #004461", # class: 'kc'
1854+ Keyword.Declaration: "bold #004461", # class: 'kd'
1855+ Keyword.Namespace: "bold #004461", # class: 'kn'
1856+ Keyword.Pseudo: "bold #004461", # class: 'kp'
1857+ Keyword.Reserved: "bold #004461", # class: 'kr'
1858+ Keyword.Type: "bold #004461", # class: 'kt'
1859+
1860+ Operator: "#582800", # class: 'o'
1861+ Operator.Word: "bold #004461", # class: 'ow' - like keywords
1862+
1863+ Punctuation: "bold #000000", # class: 'p'
1864+
1865+ # because special names such as Name.Class, Name.Function, etc.
1866+ # are not recognized as such later in the parsing, we choose them
1867+ # to look the same as ordinary variables.
1868+ Name: "#000000", # class: 'n'
1869+ Name.Attribute: "#c4a000", # class: 'na' - to be revised
1870+ Name.Builtin: "#004461", # class: 'nb'
1871+ Name.Builtin.Pseudo: "#3465a4", # class: 'bp'
1872+ Name.Class: "#000000", # class: 'nc' - to be revised
1873+ Name.Constant: "#000000", # class: 'no' - to be revised
1874+ Name.Decorator: "#888", # class: 'nd' - to be revised
1875+ Name.Entity: "#ce5c00", # class: 'ni'
1876+ Name.Exception: "bold #cc0000", # class: 'ne'
1877+ Name.Function: "#000000", # class: 'nf'
1878+ Name.Property: "#000000", # class: 'py'
1879+ Name.Label: "#f57900", # class: 'nl'
1880+ Name.Namespace: "#000000", # class: 'nn' - to be revised
1881+ Name.Other: "#000000", # class: 'nx'
1882+ Name.Tag: "bold #004461", # class: 'nt' - like a keyword
1883+ Name.Variable: "#000000", # class: 'nv' - to be revised
1884+ Name.Variable.Class: "#000000", # class: 'vc' - to be revised
1885+ Name.Variable.Global: "#000000", # class: 'vg' - to be revised
1886+ Name.Variable.Instance: "#000000", # class: 'vi' - to be revised
1887+
1888+ Number: "#990000", # class: 'm'
1889+
1890+ Literal: "#000000", # class: 'l'
1891+ Literal.Date: "#000000", # class: 'ld'
1892+
1893+ String: "#4e9a06", # class: 's'
1894+ String.Backtick: "#4e9a06", # class: 'sb'
1895+ String.Char: "#4e9a06", # class: 'sc'
1896+ String.Doc: "italic #8f5902", # class: 'sd' - like a comment
1897+ String.Double: "#4e9a06", # class: 's2'
1898+ String.Escape: "#4e9a06", # class: 'se'
1899+ String.Heredoc: "#4e9a06", # class: 'sh'
1900+ String.Interpol: "#4e9a06", # class: 'si'
1901+ String.Other: "#4e9a06", # class: 'sx'
1902+ String.Regex: "#4e9a06", # class: 'sr'
1903+ String.Single: "#4e9a06", # class: 's1'
1904+ String.Symbol: "#4e9a06", # class: 'ss'
1905+
1906+ Generic: "#000000", # class: 'g'
1907+ Generic.Deleted: "#a40000", # class: 'gd'
1908+ Generic.Emph: "italic #000000", # class: 'ge'
1909+ Generic.Error: "#ef2929", # class: 'gr'
1910+ Generic.Heading: "bold #000080", # class: 'gh'
1911+ Generic.Inserted: "#00A000", # class: 'gi'
1912+ Generic.Output: "#888", # class: 'go'
1913+ Generic.Prompt: "#745334", # class: 'gp'
1914+ Generic.Strong: "bold #000000", # class: 'gs'
1915+ Generic.Subheading: "bold #800080", # class: 'gu'
1916+ Generic.Traceback: "bold #a40000", # class: 'gt'
1917+ }
1918
1919=== added directory 'magentoerpconnect/doc/api'
1920=== added file 'magentoerpconnect/doc/api/api_backend.rst'
1921--- magentoerpconnect/doc/api/api_backend.rst 1970-01-01 00:00:00 +0000
1922+++ magentoerpconnect/doc/api/api_backend.rst 2013-08-13 17:30:12 +0000
1923@@ -0,0 +1,7 @@
1924+Backend
1925+=======
1926+
1927+.. automodule:: openerp.addons.magentoerpconnect.backend
1928+ :members:
1929+ :undoc-members:
1930+ :show-inheritance:
1931
1932=== added file 'magentoerpconnect/doc/api/api_backend_adapter.rst'
1933--- magentoerpconnect/doc/api/api_backend_adapter.rst 1970-01-01 00:00:00 +0000
1934+++ magentoerpconnect/doc/api/api_backend_adapter.rst 2013-08-13 17:30:12 +0000
1935@@ -0,0 +1,7 @@
1936+Backend Adapters
1937+================
1938+
1939+.. automodule:: openerp.addons.magentoerpconnect.unit.backend_adapter
1940+ :members:
1941+ :undoc-members:
1942+ :show-inheritance:
1943
1944=== added file 'magentoerpconnect/doc/api/api_binder.rst'
1945--- magentoerpconnect/doc/api/api_binder.rst 1970-01-01 00:00:00 +0000
1946+++ magentoerpconnect/doc/api/api_binder.rst 2013-08-13 17:30:12 +0000
1947@@ -0,0 +1,7 @@
1948+Binders
1949+=======
1950+
1951+.. automodule:: openerp.addons.magentoerpconnect.unit.binder
1952+ :members:
1953+ :undoc-members:
1954+ :show-inheritance:
1955
1956=== added file 'magentoerpconnect/doc/api/api_connector.rst'
1957--- magentoerpconnect/doc/api/api_connector.rst 1970-01-01 00:00:00 +0000
1958+++ magentoerpconnect/doc/api/api_connector.rst 2013-08-13 17:30:12 +0000
1959@@ -0,0 +1,7 @@
1960+Connector
1961+=========
1962+
1963+.. automodule:: openerp.addons.magentoerpconnect.connector
1964+ :members:
1965+ :undoc-members:
1966+ :show-inheritance:
1967
1968=== added file 'magentoerpconnect/doc/api/api_consumer.rst'
1969--- magentoerpconnect/doc/api/api_consumer.rst 1970-01-01 00:00:00 +0000
1970+++ magentoerpconnect/doc/api/api_consumer.rst 2013-08-13 17:30:12 +0000
1971@@ -0,0 +1,7 @@
1972+Consumers
1973+=========
1974+
1975+.. automodule:: openerp.addons.magentoerpconnect.consumer
1976+ :members:
1977+ :undoc-members:
1978+ :show-inheritance:
1979
1980=== added file 'magentoerpconnect/doc/api/api_delivery.rst'
1981--- magentoerpconnect/doc/api/api_delivery.rst 1970-01-01 00:00:00 +0000
1982+++ magentoerpconnect/doc/api/api_delivery.rst 2013-08-13 17:30:12 +0000
1983@@ -0,0 +1,7 @@
1984+Delivery
1985+========
1986+
1987+.. automodule:: openerp.addons.magentoerpconnect.delivery
1988+ :members:
1989+ :undoc-members:
1990+ :show-inheritance:
1991
1992=== added file 'magentoerpconnect/doc/api/api_exception.rst'
1993--- magentoerpconnect/doc/api/api_exception.rst 1970-01-01 00:00:00 +0000
1994+++ magentoerpconnect/doc/api/api_exception.rst 2013-08-13 17:30:12 +0000
1995@@ -0,0 +1,9 @@
1996+Exceptions
1997+==========
1998+
1999+.. automodule:: openerp.addons.magentoerpconnect.exception
2000+ :members:
2001+ :undoc-members:
2002+ :show-inheritance:
2003+
2004+
2005
2006=== added file 'magentoerpconnect/doc/api/api_invoice.rst'
2007--- magentoerpconnect/doc/api/api_invoice.rst 1970-01-01 00:00:00 +0000
2008+++ magentoerpconnect/doc/api/api_invoice.rst 2013-08-13 17:30:12 +0000
2009@@ -0,0 +1,7 @@
2010+Invoice
2011+=======
2012+
2013+.. automodule:: openerp.addons.magentoerpconnect.invoice
2014+ :members:
2015+ :undoc-members:
2016+ :show-inheritance:
2017
2018=== added file 'magentoerpconnect/doc/api/api_magento_model.rst'
2019--- magentoerpconnect/doc/api/api_magento_model.rst 1970-01-01 00:00:00 +0000
2020+++ magentoerpconnect/doc/api/api_magento_model.rst 2013-08-13 17:30:12 +0000
2021@@ -0,0 +1,7 @@
2022+Magento Models
2023+==============
2024+
2025+.. automodule:: openerp.addons.magentoerpconnect.magento_model
2026+ :members:
2027+ :undoc-members:
2028+ :show-inheritance:
2029
2030=== added file 'magentoerpconnect/doc/api/api_partner.rst'
2031--- magentoerpconnect/doc/api/api_partner.rst 1970-01-01 00:00:00 +0000
2032+++ magentoerpconnect/doc/api/api_partner.rst 2013-08-13 17:30:12 +0000
2033@@ -0,0 +1,7 @@
2034+Partner
2035+=======
2036+
2037+.. automodule:: openerp.addons.magentoerpconnect.partner
2038+ :members:
2039+ :undoc-members:
2040+ :show-inheritance:
2041
2042=== added file 'magentoerpconnect/doc/api/api_partner_category.rst'
2043--- magentoerpconnect/doc/api/api_partner_category.rst 1970-01-01 00:00:00 +0000
2044+++ magentoerpconnect/doc/api/api_partner_category.rst 2013-08-13 17:30:12 +0000
2045@@ -0,0 +1,7 @@
2046+Partner Category
2047+================
2048+
2049+.. automodule:: openerp.addons.magentoerpconnect.partner_category
2050+ :members:
2051+ :undoc-members:
2052+ :show-inheritance:
2053
2054=== added file 'magentoerpconnect/doc/api/api_product.rst'
2055--- magentoerpconnect/doc/api/api_product.rst 1970-01-01 00:00:00 +0000
2056+++ magentoerpconnect/doc/api/api_product.rst 2013-08-13 17:30:12 +0000
2057@@ -0,0 +1,7 @@
2058+Product
2059+=======
2060+
2061+.. automodule:: openerp.addons.magentoerpconnect.product
2062+ :members:
2063+ :undoc-members:
2064+ :show-inheritance:
2065
2066=== added file 'magentoerpconnect/doc/api/api_product_category.rst'
2067--- magentoerpconnect/doc/api/api_product_category.rst 1970-01-01 00:00:00 +0000
2068+++ magentoerpconnect/doc/api/api_product_category.rst 2013-08-13 17:30:12 +0000
2069@@ -0,0 +1,7 @@
2070+Product Category
2071+================
2072+
2073+.. automodule:: openerp.addons.magentoerpconnect.product_category
2074+ :members:
2075+ :undoc-members:
2076+ :show-inheritance:
2077
2078=== added file 'magentoerpconnect/doc/api/api_sale.rst'
2079--- magentoerpconnect/doc/api/api_sale.rst 1970-01-01 00:00:00 +0000
2080+++ magentoerpconnect/doc/api/api_sale.rst 2013-08-13 17:30:12 +0000
2081@@ -0,0 +1,7 @@
2082+Sale
2083+====
2084+
2085+.. automodule:: openerp.addons.magentoerpconnect.sale
2086+ :members:
2087+ :undoc-members:
2088+ :show-inheritance:
2089
2090=== added file 'magentoerpconnect/doc/api/api_stock_picking.rst'
2091--- magentoerpconnect/doc/api/api_stock_picking.rst 1970-01-01 00:00:00 +0000
2092+++ magentoerpconnect/doc/api/api_stock_picking.rst 2013-08-13 17:30:12 +0000
2093@@ -0,0 +1,7 @@
2094+Stock Picking
2095+=============
2096+
2097+.. automodule:: openerp.addons.magentoerpconnect.stock_picking
2098+ :members:
2099+ :undoc-members:
2100+ :show-inheritance:
2101
2102=== added file 'magentoerpconnect/doc/api/api_stock_tracking.rst'
2103--- magentoerpconnect/doc/api/api_stock_tracking.rst 1970-01-01 00:00:00 +0000
2104+++ magentoerpconnect/doc/api/api_stock_tracking.rst 2013-08-13 17:30:12 +0000
2105@@ -0,0 +1,7 @@
2106+Stock Tracking
2107+==============
2108+
2109+.. automodule:: openerp.addons.magentoerpconnect.stock_tracking
2110+ :members:
2111+ :undoc-members:
2112+ :show-inheritance:
2113
2114=== added file 'magentoerpconnect/doc/api/api_synchronizer.rst'
2115--- magentoerpconnect/doc/api/api_synchronizer.rst 1970-01-01 00:00:00 +0000
2116+++ magentoerpconnect/doc/api/api_synchronizer.rst 2013-08-13 17:30:12 +0000
2117@@ -0,0 +1,26 @@
2118+Synchronizers
2119+=============
2120+
2121+Import
2122+------
2123+
2124+.. automodule:: openerp.addons.magentoerpconnect.unit.import_synchronizer
2125+ :members:
2126+ :undoc-members:
2127+ :show-inheritance:
2128+
2129+Export
2130+------
2131+
2132+.. automodule:: openerp.addons.magentoerpconnect.unit.export_synchronizer
2133+ :members:
2134+ :undoc-members:
2135+ :show-inheritance:
2136+
2137+Delete
2138+------
2139+
2140+.. automodule:: openerp.addons.magentoerpconnect.unit.delete_synchronizer
2141+ :members:
2142+ :undoc-members:
2143+ :show-inheritance:
2144
2145=== added file 'magentoerpconnect/doc/conf.py'
2146--- magentoerpconnect/doc/conf.py 1970-01-01 00:00:00 +0000
2147+++ magentoerpconnect/doc/conf.py 2013-08-13 17:30:12 +0000
2148@@ -0,0 +1,275 @@
2149+# -*- coding: utf-8 -*-
2150+#
2151+# Connectors documentation build configuration file, created by
2152+# sphinx-quickstart on Mon Feb 4 11:35:44 2013.
2153+#
2154+# This file is execfile()d with the current directory set to its containing dir.
2155+#
2156+# Note that not all possible configuration values are present in this
2157+# autogenerated file.
2158+#
2159+# All configuration values have a default; values that are commented out
2160+# serve to show the default.
2161+
2162+import sys, os
2163+
2164+# If extensions (or modules to document with autodoc) are in another directory,
2165+# add these directories to sys.path here. If the directory is relative to the
2166+# documentation root, use os.path.abspath to make it absolute, like shown here.
2167+#sys.path.insert(0, os.path.abspath('.'))
2168+sys.path.append(os.path.abspath('_themes'))
2169+sys.path.append(os.path.abspath('../../../server'))
2170+
2171+# Load OpenERP with correct addons-path so the doc can be built even if
2172+# the addon import modules from other branches
2173+import openerp
2174+BASE_PATH = os.path.abspath(os.path.join(os.getcwd(), '../../..'))
2175+# You may need to change with your own paths
2176+ADDONS_PATHS = ('server/openerp/addons',
2177+ 'webclient/addons',
2178+ 'addons',
2179+ 'connector',
2180+ 'e-commerce-addons',
2181+ 'magentoerpconnect')
2182+pathes = [os.path.join(BASE_PATH, path) for path in ADDONS_PATHS]
2183+options = ['--addons-path', ','.join(pathes)]
2184+openerp.tools.config.parse_config(options)
2185+os.environ['TZ'] = 'UTC'
2186+openerp.service.start_internal()
2187+
2188+# -- General configuration -----------------------------------------------------
2189+
2190+# If your documentation needs a minimal Sphinx version, state it here.
2191+#needs_sphinx = '1.0'
2192+
2193+# Add any Sphinx extension module names here, as strings. They can be extensions
2194+# coming with Sphinx (named 'sphinx.ext.*') or your custom ones.
2195+extensions = ['sphinx.ext.autodoc',
2196+ 'sphinx.ext.intersphinx',
2197+ 'sphinx.ext.todo',
2198+ 'sphinx.ext.viewcode']
2199+
2200+todo_include_todos = True
2201+
2202+# Add any paths that contain templates here, relative to this directory.
2203+templates_path = ['_templates']
2204+
2205+# The suffix of source filenames.
2206+source_suffix = '.rst'
2207+
2208+# The encoding of source files.
2209+#source_encoding = 'utf-8-sig'
2210+
2211+# The master toctree document.
2212+master_doc = 'index'
2213+
2214+# General information about the project.
2215+project = u'Magentoerpconnect'
2216+copyright = u'2013, Camptocamp SA'
2217+
2218+# The version info for the project you're documenting, acts as replacement for
2219+# |version| and |release|, also used in various other places throughout the
2220+# built documents.
2221+#
2222+# The short X.Y version.
2223+version = '0.1'
2224+# The full version, including alpha/beta/rc tags.
2225+release = '0.1'
2226+
2227+# The language for content autogenerated by Sphinx. Refer to documentation
2228+# for a list of supported languages.
2229+#language = None
2230+
2231+# There are two options for replacing |today|: either, you set today to some
2232+# non-false value, then it is used:
2233+#today = ''
2234+# Else, today_fmt is used as the format for a strftime call.
2235+#today_fmt = '%B %d, %Y'
2236+
2237+# List of patterns, relative to source directory, that match files and
2238+# directories to ignore when looking for source files.
2239+exclude_patterns = ['_build']
2240+
2241+# The reST default role (used for this markup: `text`) to use for all documents.
2242+#default_role = None
2243+
2244+# If true, '()' will be appended to :func: etc. cross-reference text.
2245+#add_function_parentheses = True
2246+
2247+# If true, the current module name will be prepended to all description
2248+# unit titles (such as .. function::).
2249+#add_module_names = True
2250+
2251+# If true, sectionauthor and moduleauthor directives will be shown in the
2252+# output. They are ignored by default.
2253+#show_authors = False
2254+
2255+# The name of the Pygments (syntax highlighting) style to use.
2256+pygments_style = 'sphinx'
2257+
2258+# A list of ignored prefixes for module index sorting.
2259+#modindex_common_prefix = []
2260+
2261+
2262+# -- Options for HTML output ---------------------------------------------------
2263+
2264+# The theme to use for HTML and HTML Help pages. See the documentation for
2265+# a list of builtin themes.
2266+html_theme = 'flask'
2267+
2268+# Theme options are theme-specific and customize the look and feel of a theme
2269+# further. For a list of options available for each theme, see the
2270+# documentation.
2271+#html_theme_options = {}
2272+
2273+# Add any paths that contain custom themes here, relative to this directory.
2274+html_theme_path = ['_themes']
2275+
2276+# The name for this set of Sphinx documents. If None, it defaults to
2277+# "<project> v<release> documentation".
2278+#html_title = None
2279+
2280+# A shorter title for the navigation bar. Default is the same as html_title.
2281+#html_short_title = None
2282+
2283+# The name of an image file (relative to this directory) to place at the top
2284+# of the sidebar.
2285+#html_logo = None
2286+
2287+# The name of an image file (within the static path) to use as favicon of the
2288+# docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32
2289+# pixels large.
2290+#html_favicon = None
2291+
2292+# Add any paths that contain custom static files (such as style sheets) here,
2293+# relative to this directory. They are copied after the builtin static files,
2294+# so a file named "default.css" will overwrite the builtin "default.css".
2295+html_static_path = ['_static']
2296+
2297+# If not '', a 'Last updated on:' timestamp is inserted at every page bottom,
2298+# using the given strftime format.
2299+#html_last_updated_fmt = '%b %d, %Y'
2300+
2301+# If true, SmartyPants will be used to convert quotes and dashes to
2302+# typographically correct entities.
2303+#html_use_smartypants = True
2304+
2305+# Custom sidebar templates, maps document names to template names.
2306+#html_sidebars = {}
2307+
2308+# Additional templates that should be rendered to pages, maps page names to
2309+# template names.
2310+#html_additional_pages = {}
2311+
2312+# If false, no module index is generated.
2313+#html_domain_indices = True
2314+
2315+# If false, no index is generated.
2316+#html_use_index = True
2317+
2318+# If true, the index is split into individual pages for each letter.
2319+#html_split_index = False
2320+
2321+# If true, links to the reST sources are added to the pages.
2322+#html_show_sourcelink = True
2323+
2324+# If true, "Created using Sphinx" is shown in the HTML footer. Default is True.
2325+#html_show_sphinx = True
2326+
2327+# If true, "(C) Copyright ..." is shown in the HTML footer. Default is True.
2328+#html_show_copyright = True
2329+
2330+# If true, an OpenSearch description file will be output, and all pages will
2331+# contain a <link> tag referring to it. The value of this option must be the
2332+# base URL from which the finished HTML is served.
2333+#html_use_opensearch = ''
2334+
2335+# This is the file name suffix for HTML files (e.g. ".xhtml").
2336+#html_file_suffix = None
2337+
2338+# Output file base name for HTML help builder.
2339+htmlhelp_basename = 'magentoerpconnect-doc'
2340+
2341+
2342+# -- Options for LaTeX output --------------------------------------------------
2343+
2344+latex_elements = {
2345+# The paper size ('letterpaper' or 'a4paper').
2346+#'papersize': 'letterpaper',
2347+
2348+# The font size ('10pt', '11pt' or '12pt').
2349+#'pointsize': '10pt',
2350+
2351+# Additional stuff for the LaTeX preamble.
2352+#'preamble': '',
2353+}
2354+
2355+# Grouping the document tree into LaTeX files. List of tuples
2356+# (source start file, target name, title, author, documentclass [howto/manual]).
2357+latex_documents = [
2358+ ('index', 'Magentoerpconnect.tex', u'Magentoerpconnect Documentation',
2359+ u'Camptocamp SA', 'manual'),
2360+]
2361+
2362+# The name of an image file (relative to this directory) to place at the top of
2363+# the title page.
2364+#latex_logo = None
2365+
2366+# For "manual" documents, if this is true, then toplevel headings are parts,
2367+# not chapters.
2368+#latex_use_parts = False
2369+
2370+# If true, show page references after internal links.
2371+#latex_show_pagerefs = False
2372+
2373+# If true, show URL addresses after external links.
2374+#latex_show_urls = False
2375+
2376+# Documents to append as an appendix to all manuals.
2377+#latex_appendices = []
2378+
2379+# If false, no module index is generated.
2380+#latex_domain_indices = True
2381+
2382+
2383+# -- Options for manual page output --------------------------------------------
2384+
2385+# One entry per manual page. List of tuples
2386+# (source start file, name, description, authors, manual section).
2387+man_pages = [
2388+ ('index', 'magentoerpconnect', u'Magentoerpconnect Documentation',
2389+ [u'Camptocamp SA'], 1)
2390+]
2391+
2392+# If true, show URL addresses after external links.
2393+#man_show_urls = False
2394+
2395+
2396+# -- Options for Texinfo output ------------------------------------------------
2397+
2398+# Grouping the document tree into Texinfo files. List of tuples
2399+# (source start file, target name, title, author,
2400+# dir menu entry, description, category)
2401+texinfo_documents = [
2402+ ('index', 'Magentoerpconnect', u'Magentoerpconnect Documentation',
2403+ u'Camptocamp SA', 'Magentoerpconnect', 'Connector between OpenERP and Magento',
2404+ 'Miscellaneous'),
2405+]
2406+
2407+# Documents to append as an appendix to all manuals.
2408+#texinfo_appendices = []
2409+
2410+# If false, no module index is generated.
2411+#texinfo_domain_indices = True
2412+
2413+# How to display URL addresses: 'footnote', 'no', or 'inline'.
2414+#texinfo_show_urls = 'footnote'
2415+
2416+
2417+# Example configuration for intersphinx: refer to the Python standard library.
2418+intersphinx_mapping = {
2419+ 'python': ('http://docs.python.org/2.6', None),
2420+ 'openerpweb': ('http://doc.openerp.com/trunk/developers/web', None),
2421+ 'openerpdev': ('http://doc.openerp.com/trunk/developers', None),
2422+# 'openerpconnector': ('', None),
2423+}
2424
2425=== added directory 'magentoerpconnect/doc/develop'
2426=== added directory 'magentoerpconnect/doc/guides'
2427=== added file 'magentoerpconnect/doc/guides/connector_checkpoint.rst'
2428--- magentoerpconnect/doc/guides/connector_checkpoint.rst 1970-01-01 00:00:00 +0000
2429+++ magentoerpconnect/doc/guides/connector_checkpoint.rst 2013-08-13 17:30:12 +0000
2430@@ -0,0 +1,20 @@
2431+.. _connector-checkpoint:
2432+
2433+
2434+##############################
2435+Check the connector checkpoint
2436+##############################
2437+
2438+Located at `Connectors > Connectors > Checkpoint`,
2439+this is a list of records which have been imported
2440+from Magento and have to be verified.
2441+
2442+Records such as products or product categories could
2443+have some configuration to do once they are imported,
2444+so they appear in that list.
2445+
2446+For each item in that list,
2447+you can open the related record,
2448+proceed with your configuration or verification,
2449+and when you are done,
2450+click on the `Reviewed` button.
2451
2452=== added file 'magentoerpconnect/doc/guides/installation_guide.rst'
2453--- magentoerpconnect/doc/guides/installation_guide.rst 1970-01-01 00:00:00 +0000
2454+++ magentoerpconnect/doc/guides/installation_guide.rst 2013-08-13 17:30:12 +0000
2455@@ -0,0 +1,143 @@
2456+.. _installation-guide:
2457+
2458+
2459+##################
2460+Installation Guide
2461+##################
2462+
2463+
2464+************
2465+Installation
2466+************
2467+
2468+The installation steps assume that you already have a working OpenERP
2469+setup with all the OpenERP pre-requisites.
2470+
2471+Requirements on both servers
2472+============================
2473+
2474+The ``ntp`` package should be install on the servers hosting Magento and
2475+OpenERP to ensure a correct synchronization between them
2476+
2477+OpenERP
2478+=======
2479+
2480+Download the branches where you installed OpenERP::
2481+
2482+ $ bzr branch lp:openerp-connector/7.0 connector
2483+ $ bzr branch lp:openerp-connector/7.0-e-commerce-addons e-commerce-addons
2484+ $ bzr branch lp:openerp-connector/7.0-magentoerpconnect magentoerpconnect
2485+ $ bzr branch lp:openerp-product-attributes/7.0 openerp-product-attributes
2486+
2487+Add the branches in the addons path, either using the server command
2488+line or adding them in the OpenERP server configuration file.
2489+
2490+You also need to install the ``magento`` Python package.
2491+So install it with either pip or either easy_install::
2492+
2493+ $ pip install magento
2494+
2495+ $ easy_install magento
2496+
2497+Note that you may need to use the root rights on your system.
2498+
2499+In OpenERP, update the modules list using `Settings > Modules > Update
2500+Modules List`.
2501+
2502+Go to the menu `Settings > Modules > Installed Modules`, remove the
2503+`Installed` filter and search for `Magento Connector`, then click on
2504+`Install`.
2505+
2506+
2507+Magento
2508+=======
2509+
2510+For the time being, the Magento extension originally built by OpenLabs
2511+is still used by the connector. But the version published on `Magento
2512+Connect` is outdated.
2513+
2514+Download the following branch and install it in Magento::
2515+
2516+ $ bzr branch lp:magentoerpconnect/magento-module-oerp6.x-stable magento-module
2517+
2518+In order to install it:
2519+
2520+1. Move the `Openlabs` folder in the
2521+ `magento_root/app/code/community`.
2522+#. Move the file `app/etc/modules/Openlabs_OpenERPConnector.xml` in
2523+ `magento_root/app/etc/modules`.
2524+#. Flush the Magento cache from the admin panel or by removing everything in
2525+ `magento_root/var/cache`
2526+
2527+Configuring the Magento web-services
2528+====================================
2529+
2530+1. In the Magento admin panel, go to `System > Web-Services >
2531+ SOAP/XML-RPC - Roles`.
2532+#. Create a new role named `openerp` with access to `All` resources.
2533+#. In `System > Web-Services > SOAP/XML-RPC - Users`, create a new user
2534+ named as you want, for instance `openerp_connect`, and an API key.
2535+ In `User Role`, choose the `openerp` role.
2536+
2537+
2538+**********************
2539+After the installation
2540+**********************
2541+
2542+Once the addon is installed, you may want to:
2543+
2544+1. Read or read again :ref:`key-questions`
2545+
2546+#. Assign the `Connector Manager` group on your user.
2547+
2548+#. Create the Backend in `Connectors > Magento > Backend`,
2549+ use the role created in `Configuring the Magento web-services`_.
2550+
2551+#. Synchronize the initial metadata using the button `Synchronize Metadata` on the backend.
2552+
2553+#. Configure the translations if you use them: :ref:`configure-translations`
2554+
2555+#. Configure: :ref:`configure-emails`
2556+
2557+#. Configure: :ref:`configure-payment-methods`
2558+
2559+#. Configure: :ref:`configure-automatic-workflows`
2560+
2561+#. Configure: :ref:`configure-shipping-methods`
2562+
2563+#. Configure: :ref:`configure-warehouses`
2564+
2565+#. Configure: :ref:`configure-pricing`
2566+
2567+On the backend,
2568+
2569+#. Import the customer groups
2570+
2571+#. Optionally, import the partners, otherwise they
2572+ will be imported on the fly with the sales orders
2573+
2574+#. Import the product categories
2575+
2576+#. Configure the default values (accounting, ...)
2577+ of the new categories, using the :ref:`connector-checkpoint`
2578+
2579+#. Import the products
2580+
2581+#. Configure the new products (accounting, suppliers, stock rules, ...)
2582+ of the new products, using the :ref:`connector-checkpoint`
2583+
2584+#. Create an inventory for your products
2585+
2586+#. Update the stock quantities on Magento
2587+
2588+#. Import the sales orders
2589+
2590+#. Once you are all done and happy, configure the schedulers: :ref:`configure-schedulers`
2591+
2592+
2593+****************
2594+On a daily basis
2595+****************
2596+
2597+* :ref:`connector-checkpoint`
2598+* :ref:`monitor-resolve-jobs`
2599
2600=== added file 'magentoerpconnect/doc/guides/key_questions.rst'
2601--- magentoerpconnect/doc/guides/key_questions.rst 1970-01-01 00:00:00 +0000
2602+++ magentoerpconnect/doc/guides/key_questions.rst 2013-08-13 17:30:12 +0000
2603@@ -0,0 +1,281 @@
2604+.. _key-questions:
2605+
2606+
2607+##################################################
2608+Key questions when connecting OpenERP with Magento
2609+##################################################
2610+
2611+Installing a connector between OpenERP and Magento
2612+is not as simple as clicking on the 'Install' button
2613+in the OpenERP Apps.
2614+
2615+In the e-commerce domain,
2616+there are many use cases
2617+which are strongly domain-specific.
2618+Every website has its own set of specific requirements.
2619+As such, the connector cannot include all the
2620+domain-specific requirements in a generic manner.
2621+
2622+This document lists the key questions
2623+you have to answer when connecting your applications.
2624+The questions link to the relevant part in the
2625+documentation when it currently exists.
2626+Some points have no response,
2627+but are things you have to consider and think
2628+before and meanwhile your setup.
2629+You can also consider it as
2630+a checklist for your implementation.
2631+
2632+**************
2633+Sale workflows
2634+**************
2635+
2636+Payment methods
2637+===============
2638+
2639+Are you going to use 'manual' payment types like check or invoices?
2640+
2641+Are you going to use 'automatic' payment types like bankcard, paypal,
2642+...?
2643+
2644+Each method needs to be configured, follows:
2645+:ref:`configure-payment-methods`.
2646+
2647+Automatic workflows
2648+===================
2649+
2650+For each `Payment methods`_,
2651+you will want to configure a different workflow,
2652+for instance,
2653+the sales orders of an automatic payment is automatically confirmed.
2654+
2655+More details on this configuration in
2656+:ref:`configure-automatic-workflows`.
2657+
2658+
2659+Exception rules
2660+===============
2661+
2662+Do you need to block a sale order according to some conditions?
2663+
2664+The connector adds this possibility,
2665+it applies some rules,
2666+for example, it blocks the sale order
2667+if the total amount is different in OpenERP and in Magento,
2668+so that is a safe-guard against errors.
2669+
2670+You can add your own rules, see :ref:`configure-exception-rules`.
2671+
2672+
2673+Support and Claims
2674+==================
2675+
2676+How will you handle them?
2677+
2678+*******
2679+Catalog
2680+*******
2681+
2682+Master of data
2683+==============
2684+
2685+Where should the data of the products be maintained and edited?
2686+
2687+Magento is the master of data:
2688+
2689+ Managing the catalog in Magento has the lowest impact on OpenERP.
2690+ Much information stay only on Magento
2691+ (product attributes, images, links).
2692+ The categories of products are still imported in OpenERP for
2693+ classification.
2694+ However 2 related informations will be updated in OpenERP and
2695+ exported to Magento:
2696+
2697+ * Price of the products, based on the OpenERP pricelists
2698+ * Available quantity in the stock
2699+
2700+OpenERP is the master of data:
2701+
2702+ As of today, the handling of the catalog
2703+ in the connector has not been implemented
2704+ (it was in the version for OpenERP 6.1).
2705+ It is in the :doc:`/project/roadmap` though.
2706+
2707+Types of products
2708+=================
2709+
2710+Magento is able to handle many types of products:
2711+simple, configurable, bundle, grouped, virtual, downloadable
2712+
2713+Special options can also be added on the products.
2714+
2715+None all of theses types are supported by the connector.
2716+All the product types are planned to be supported
2717+(:doc:`/project/roadmap`).
2718+But, as of today, only simple products are supported.
2719+Using advanced types of products like bundle or configurable,
2720+will need development,
2721+wether it is generic or specific to your implementation
2722+
2723+However, the fact is using a bundle or configurable products
2724+complexifies a lot the synchronizations of the products.
2725+If you need them, try to use only bundle, or only configurable.
2726+
2727+The special options would probably be part of a specific development.
2728+
2729+
2730+*******
2731+Pricing
2732+*******
2733+
2734+Taxes included
2735+==============
2736+
2737+When you input the prices of your products,
2738+are the taxes included?
2739+
2740+Note that, although it is possible to work with taxes included,
2741+that's never recommended because you will lose a lot in OpenERP,
2742+mainly in analysis.
2743+
2744+Only the base price is relevant,
2745+Magento itself can display tax included or tax excluded
2746+without issues.
2747+
2748+Discounts
2749+=========
2750+
2751+What kind of discount do you plan do use?
2752+OpenERP can't have such advanced discounts as Magento,
2753+so try to keep the things simple here
2754+if you do not want too much specific developments
2755+in your implementation.
2756+
2757+Pricing
2758+=======
2759+
2760+Do you plan to use multi-currency?
2761+
2762+Do you plan to have different prices per websites?
2763+You will need to create different price lists in OpenERP.
2764+
2765+**********
2766+Accounting
2767+**********
2768+
2769+Reconciliations
2770+===============
2771+
2772+The connector automatically reconcile the payments
2773+and the invoices entries for the 'automatic' workflows.
2774+
2775+However, you will still need to reconcile the bank entries.
2776+
2777+You may want to use the reconciliation modules of the
2778+branch `lp:banking-addons/bank-statement-reconcile/7.0`_.
2779+They are widely used in production and
2780+are specifically designed for the e-commerce.
2781+
2782+.. _`lp:banking-addons/bank-statement-reconcile/7.0`: https://code.launchpad.net/~banking-addons-team/banking-addons/bank-statement-reconcile-70
2783+
2784+
2785+Fiscal Positions
2786+================
2787+
2788+Due to the limitations of the Magento API and the intrinsic difference
2789+between OpenERP and Magento,
2790+the fiscal positions are not synchronized.
2791+If you need to use fiscal positions,
2792+you may want to use the module
2793+`account_fiscal_position_rules` in the project
2794+`lp:openerp-fiscal-rules`_.
2795+
2796+Note that this configuration will be done
2797+1 time in Magento and 1 time in OpenERP.
2798+But once the configuration is done, that works fine.
2799+
2800+.. _`lp:openerp-fiscal-rules`: https://code.launchpad.net/openerp-fiscal-rules
2801+
2802+
2803+*******************************
2804+Stock, availability, deliveries
2805+*******************************
2806+
2807+Shipping methods
2808+================
2809+
2810+Which shipping methods will be available?
2811+
2812+Configure them using the :ref:`configure-shipping-methods`.
2813+
2814+Warehouses
2815+==========
2816+
2817+How are you going to organize your warehouses,
2818+do you have several of them?
2819+If you have several Magento Stores,
2820+do you have a warehouse per store
2821+or do they share the same one?
2822+
2823+Keep in mind that Magento,
2824+in a standard installation,
2825+does not allow to have different stock quantities
2826+on each store.
2827+
2828+Shipping
2829+========
2830+
2831+Do you send partial deliveries, or only complete ones?
2832+
2833+Replacement of products
2834+=======================
2835+
2836+Do you sometimes replace products in the sales orders?
2837+Are you going to modify the sale order on Magento,
2838+or do you want to modify the delivery orders in OpenERP?
2839+
2840+The latter choice could be complicated because Magento
2841+does not allow to change products in delivery orders.
2842+
2843+Tracking and delivery labels
2844+============================
2845+
2846+Do you want tracking numbers on your deliveries?
2847+
2848+For the printing of your packets' labels,
2849+are you going to use external software
2850+or do you want to print them directly from OpenERP?
2851+
2852+.. todo:: add a pointer to the modules, I don't have the url actually.
2853+
2854+Management of returned goods
2855+============================
2856+
2857+How will you manage the returned goods (RMA)?
2858+
2859+
2860+*********
2861+Technical
2862+*********
2863+
2864+E-mails
2865+=======
2866+
2867+Would you want to send e-mails from Magento or from OpenERP?
2868+Which transactional e-mails do you plan to send?
2869+
2870+Translations
2871+============
2872+
2873+Do you need translations for the descriptions of your products?
2874+
2875+The language must be configured on the Magento Storeviews in OpenERP,
2876+think about it before importing your whole catalog.
2877+
2878+Which fields to synchronize
2879+===========================
2880+
2881+Think about which fields you have in Magento and you need in OpenERP.
2882+You will maybe need to create a customization module
2883+and add the mapping for the new fields,
2884+see :ref:`add-custom-mappings`
2885
2886=== added file 'magentoerpconnect/doc/guides/monitor_resolve_jobs.rst'
2887--- magentoerpconnect/doc/guides/monitor_resolve_jobs.rst 1970-01-01 00:00:00 +0000
2888+++ magentoerpconnect/doc/guides/monitor_resolve_jobs.rst 2013-08-13 17:30:12 +0000
2889@@ -0,0 +1,83 @@
2890+.. _monitor-resolve-jobs:
2891+
2892+
2893+########################
2894+Monitor and resolve jobs
2895+########################
2896+
2897+Jobs are located in ``Connector > Queue > Jobs``.
2898+
2899+A job is a unit of work for a single synchronization action.
2900+Jobs are executed by the 'Workers'.
2901+
2902+***
2903+Q&A
2904+***
2905+
2906+My jobs are not executed, why?
2907+==============================
2908+
2909+The first thing to note is that the jobs are enqueued all the minutes.
2910+Their execution is not immediate.
2911+
2912+If you see no jobs executed in more than 1 minute, possibilities are:
2913+
2914+1. Jobs are assigned to a worker which died. A worker
2915+ can die when OpenERP reloads his modules registry (after a module
2916+ upgrade for instance). The dead workers are cleaned after 5 minutes,
2917+ then the jobs are enqueued in a new one.
2918+
2919+#. The jobs all have an ``eta`` (estimated time of arrival), so they
2920+ will be executed later.
2921+
2922+#. The scheduler action is not running, check in ``Settings > Scheduler
2923+ > Scheduled Actions`` if the action ``Enqueue Jobs`` is active.
2924+
2925+#. OpenERP is running in multiprocess and it doesn't have a Cron Worker
2926+ process running (when using Gunicorn).
2927+
2928+
2929+A job is in state 'Failed', what should I do?
2930+=============================================
2931+
2932+The job encountered a problem.
2933+Display the details of the job,
2934+a section displays information about the exception.
2935+
2936+The most comprehensible part of the error
2937+is at the bottom of the error trace.
2938+Sometimes, it proposes a resolution action.
2939+Other times, you'll have to dive deeper to find the cause of the issue.
2940+Anyway, once you think the issue should not happen anymore,
2941+you can retry the job by clicking on ``Requeue``.
2942+
2943+.. danger:: At any time, you can use the button ``Set to 'Done'``. This
2944+ button will cancel the job. It should be used only if you
2945+ really, really know what you are doing, because you may miss
2946+ important synchronizations actions.
2947+
2948+
2949+What happens if I shutdown the server when jobs are processing?
2950+===============================================================
2951+
2952+When jobs are interrupted, they won't commit any changes to the database
2953+and will be restarted on the start of the OpenERP server.
2954+
2955+Note that the actions performed on Magento by a job could of course not
2956+be reverted, so they will be done 2 times.
2957+
2958+
2959+Why do I have a couple of Workers?
2960+==================================
2961+
2962+When OpenERP is running in standalone (one process),
2963+you'll always have 1 Jobs Worker.
2964+When OpenERP is running in multiprocess,
2965+you'll have 1 Jobs Worker for each OpenERP worker.
2966+
2967+.. note:: To benefits of multiple workers, you need to:
2968+
2969+ * have multiple Cron Workers (using the ``--max-cron-threads``
2970+ option).
2971+ * Copy the Scheduled Actions ``Enqueue Jobs`` as many times as
2972+ you have Cron Workers.
2973
2974=== added file 'magentoerpconnect/doc/guides/tutorial_customize.rst'
2975--- magentoerpconnect/doc/guides/tutorial_customize.rst 1970-01-01 00:00:00 +0000
2976+++ magentoerpconnect/doc/guides/tutorial_customize.rst 2013-08-13 17:30:12 +0000
2977@@ -0,0 +1,407 @@
2978+.. _tutorial-customize:
2979+
2980+
2981+#################################
2982+Tutorial: customize the connector
2983+#################################
2984+
2985+This tutorial will explain how you can customize several parts of the
2986+connector in your own OpenERP module. It assumes that you already have
2987+some knowledge in the OpenERP development. You can still refer to the
2988+`official OpenERP documentation`_.
2989+
2990+
2991+.. contents:: Sections:
2992+ :local:
2993+ :backlinks: top
2994+
2995+
2996+.. _official OpenERP documentation: http://doc.openerp.com/trunk/developers/server/
2997+
2998+***************************************
2999+Bootstrap your own customization module
3000+***************************************
3001+
3002+You should never make changes in the official modules, instead, you need
3003+to create your own module and apply your personalizations from there.
3004+
3005+As an example, throughout this tutorial, we'll create our own
3006+customization module, we'll name it, in a very original manner,
3007+``customize_example``. The final example module can be found in the root
3008+of the ``magentoerpconnect`` bazaar branch.
3009+
3010+Common OpenERP files
3011+====================
3012+
3013+A ``magentoerpconnect`` customization module is like any OpenERP module,
3014+so you will first need to create the **manifest**
3015+``customize_example/__openerp__.py``:
3016+
3017+.. code-block:: python
3018+ :emphasize-lines: 4,5
3019+
3020+ # -*- coding: utf-8 -*-
3021+ {'name': 'Magento Connector Customization',
3022+ 'version': '1.0.0',
3023+ 'category': 'Connector',
3024+ 'depends': ['magentoerpconnect',
3025+ ],
3026+ 'author': 'Myself',
3027+ 'license': 'AGPL-3',
3028+ 'description': """
3029+ Magento Connector Customization
3030+ ===============================
3031+
3032+ Explain what this module changes.
3033+ """,
3034+ 'data': [],
3035+ 'installable': True,
3036+ 'application': False,
3037+ }
3038+
3039+Nothing special but 2 things to note:
3040+
3041+* It depends from ``magentoerpconnect``.
3042+* The module category should preferably be ``Connector``.
3043+
3044+Of course, you also need to create the ``__init__.py`` file where you will
3045+put the imports of your python modules.
3046+
3047+Declare the module to the connector
3048+===================================
3049+
3050+Each module using the ``connector`` needs to create a special empty
3051+model, which will be used by the framework to know if the module is
3052+installed or not on each database.
3053+
3054+That's just a matter of following a convention and creating in ``customize_example/connector.py``::
3055+
3056+ from openerp.osv import orm
3057+
3058+
3059+ class customize_example_installed(orm.AbstractModel):
3060+ """Empty model used to know if the module is installed on the
3061+ database.
3062+
3063+ If the model is in the registry, the module is installed.
3064+ """
3065+ _name = 'customize_example.installed'
3066+
3067+Note:
3068+
3069+* the ``_name`` is in the form: ``module_name.installed``, where
3070+ ``.installed`` is the part which does never change.
3071+
3072+
3073+Create your custom Backend
3074+==========================
3075+
3076+The connector can support the synchronization with various Magento
3077+versions.
3078+
3079+Actually the supported versions are referenced in
3080+``magentoerpconnect/backend.py``::
3081+
3082+ import openerp.addons.connector.backend as backend
3083+
3084+ magento = backend.Backend('magento')
3085+ magento1700 = backend.Backend(parent=magento, version='1.7')
3086+
3087+In the connector, we are able to link pieces of code to a specific
3088+version of Magento. If I link a piece of code to ``magento1700``, it
3089+will be executed only if my Magento's version is actually Magento 1.7.
3090+
3091+``magento`` is the parent of ``magento1700``. When the latter has no
3092+specific piece of code, it will execute the former's one.
3093+
3094+As you want to change parts of code specifically to **your version** of
3095+Magento, you need to:
3096+
3097+* create your own backend version
3098+* link your custom parts of code with your own backend version (we'll
3099+ cover this later)
3100+
3101+Let's create our own backend, in ``customize_example/backend.py``::
3102+
3103+ # -*- coding: utf-8 -*-
3104+ import openerp.addons.connector.backend as backend
3105+ import openerp.addons.magentoerpconnect.backend as magento_backend
3106+
3107+ magento_myversion = backend.Backend(parent=magento_backend.magento1700,
3108+ version='1.7-myversion')
3109+
3110+And in ``customize_example/magento_model.py``::
3111+
3112+ # -*- coding: utf-8 -*-
3113+ from openerp.osv import orm
3114+
3115+
3116+ class magento_backend(orm.Model):
3117+ _inherit = 'magento.backend'
3118+
3119+ def _select_versions(self, cr, uid, context=None):
3120+ """ Available versions
3121+
3122+ Can be inherited to add custom versions.
3123+ """
3124+ versions = super(magento_backend, self)._select_versions(cr, uid, context=context)
3125+ versions.append(('1.7-myversion', '1.7 - My Version'))
3126+ return versions
3127+
3128+ _columns = {
3129+ 'version': fields.selection(_select_versions, string='Version', required=True),
3130+ }
3131+
3132+Things to note:
3133+
3134+* The ``parent`` argument of my version is the 1.7 version. You have to
3135+ set the correct parent according to your Magento version. If your
3136+ Magento version does not exist, take the nearest version.
3137+* the version should be the same in the ``backend.Backend`` and the
3138+ model.
3139+* We add the version in the model ``magento.backend`` so we'll be able to
3140+ select it from the OpenERP front-end.
3141+* Do not forget to add the new python modules in ``__init__.py``.
3142+
3143+Use it in OpenERP
3144+=================
3145+
3146+Great, you now have the minimal stuff required to customize your
3147+connector. When you create your backend in OpenERP (menu ``Connectors >
3148+Magento > Backends``), you have now to select **1.7 - My Version**.
3149+
3150+In the next chapter, we'll cover the most common personalization:
3151+`Add mappings of fields`_.
3152+
3153+
3154+.. _add-custom-mappings:
3155+
3156+**********************
3157+Add mappings of fields
3158+**********************
3159+
3160+The mappings of the fields define how the fields are related between OpenERP and Magento.
3161+
3162+They defines whether field `A` should be written in field `B`, whether
3163+it should be converted then written to `C` and `D`, etc.
3164+
3165+To be able to customize the mappings, you need to already have a
3166+customization module. If that's not already done, you can go through the
3167+previous chapter: `Bootstrap your own customization module`_.
3168+
3169+We'll see how to map new fields on the imports.
3170+
3171+A bit of theory
3172+===============
3173+
3174+The mappings of the fields are defined in subclasses of
3175+:py:class:`connector.connector.unit.mapper.ImportMapper` or
3176+:py:class:`connector.connector.unit.mapper.ExportMapper`, respectively
3177+for the imports and the exports.
3178+
3179+.. note:: The connector almost never works with the OpenERP Models
3180+ directly. Instead, it works with its own models, which
3181+ ``_inherits`` (note the final ``s``) the base models. For
3182+ instance, the Magento model for ``res.partner`` is
3183+ ``magento.res.partner``. That's why you'll see
3184+ ``magento.res.partner`` below.
3185+
3186+ More details in `Magento Models`_.
3187+
3188+When you need to change the mappings, you'll need to dive in the
3189+``magentoerpconnect``'s code and locate the class which does this job for
3190+your model. You won't change anything on this class, but you'll extend
3191+it so you need to have a look on it. For example, the mapping for
3192+``magento.res.partner`` in ``magentoerpconnect`` is the following
3193+(excerpt)::
3194+
3195+ @magento
3196+ class PartnerImportMapper(ImportMapper):
3197+ _model_name = 'magento.res.partner'
3198+
3199+ direct = [('email', 'email'),
3200+ ('dob', 'birthday'),
3201+ ('created_at', 'created_at'),
3202+ ('updated_at', 'updated_at'),
3203+ ('email', 'emailid'),
3204+ ('taxvat', 'taxvat'),
3205+ ('group_id', 'group_id'),
3206+ ]
3207+
3208+ @mapping
3209+ def is_company(self, record):
3210+ # partners are companies so we can bind
3211+ # addresses on them
3212+ return {'is_company': True}
3213+
3214+ @mapping
3215+ def names(self, record):
3216+ parts = [part for part in (record['firstname'],
3217+ record['middlename'],
3218+ record['lastname']) if part]
3219+ return {'name': ' '.join(parts)}
3220+
3221+ [...snip...]
3222+
3223+Here we can see 2 types of mappings:
3224+
3225+* ``direct`` mappings, a field in Magento is directly written in the
3226+ OpenERP field. The Magento field is on the left, the OpenERP one is on
3227+ the right.
3228+* methods decorated with ``@mapping``, when the mapping is more complex
3229+ and need to apply some logic. The name of the methods is meaningless.
3230+ They should return a ``dict`` with the field(s) to update and their
3231+ values. A ``None`` return value will be ignored.
3232+* the ``record`` argument receives the Magento record.
3233+
3234+.. note:: This is not covered here, but for the ``ExportMapper``, an
3235+ additional decorator ``@changed_by()`` is used to filter the
3236+ mappings to apply according to the fields modified in OpenERP.
3237+
3238+
3239+Magento Models
3240+==============
3241+
3242+As said in the previous section, the connector uses its own models
3243+on top of the base ones. The connector's models are usually in the form
3244+``magento.{model_name}``.
3245+
3246+Basically, a Magento Model is an ``_inherits`` from the base model, so
3247+it knows all the original fields along with its own. Its own fields are
3248+the ID of the record on Magento, the ``many2one`` relations to the
3249+``magento.backend`` or to the ``magento.website`` and the attributes
3250+which are peculiar to Magento.
3251+
3252+Example with an excerpt of the fields for ``magento.res.partner``:
3253+
3254+* ``openerp_id``: ``many2one`` to the ``res.partner`` (``_inherits``)
3255+* ``backend_id``: ``many2one`` to the ``magento.backend`` model (Magento
3256+ Instance), for the partner this is a ``related`` because we already
3257+ have a link to the website, itself associated to a ``magento.backend``.
3258+* ``website_id``: ``many2one`` to the ``magento.website`` model
3259+* ``magento_id``: the ID of the customer on Magento
3260+* ``group_id``: ``many2one`` to the ``magento.res.partner.category``,
3261+ itself a Magento model for ``res.partner.category`` (Customer Groups)
3262+* ``created_at``: created_at field from Magento
3263+* ``taxvat``: taxvat field from Magento
3264+* and all the fields from ``res.partner``
3265+
3266+This datamodel allows to:
3267+
3268+* Share the same ``res.partner`` with several ``magento.website`` (or
3269+ even several ``magento.backend``) as we can have as many
3270+ ``magento.res.partner`` as we want on top of a ``res.partner``.
3271+* The values can be different for each website or backend
3272+
3273+
3274+.. note:: In the mappings, we'll write some fields on ``res.partner``
3275+ (via ``_inherits``) and some on ``magento.res.partner``. When
3276+ we want to add a new field, we have to decide where to add it.
3277+ That's a matter of: does it make more sense do have this data
3278+ on the base model rather than on the Magento's one and should
3279+ this data be shared between all websites / backends?
3280+
3281+Examples
3282+========
3283+
3284+Example 1.
3285+----------
3286+
3287+I want to import the field ``created_in`` from customers.
3288+
3289+I add it on ``magento.res.partner`` because it doesn't make sense on
3290+``res.partner``.
3291+
3292+For this field, the Magento API returns a string. I add it in
3293+``customize_example/partner.py`` (I willingly skip the part 'add them in
3294+the views')::
3295+
3296+ # -*- coding: utf-8 -*-
3297+ from openerp.osv import orm, fields
3298+
3299+ class magento_res_partner(orm.Model):
3300+ _inherit = 'magento.res.partner'
3301+
3302+ _columns = {
3303+ 'created_in': fields.char('Created In', readonly=True),
3304+ }
3305+
3306+
3307+In the same file, I add the import of the Magento Backend to use and the
3308+current mapper::
3309+
3310+ from openerp.addons.magentoerpconnect.partner import PartnerImportMapper
3311+ from .backend import magento_myversion
3312+
3313+And I extend the partner's mapper, decorated with
3314+``@magento_myversion``::
3315+
3316+ @magento_myversion
3317+ class MyPartnerImportMapper(PartnerImportMapper):
3318+ _model_name = 'magento.res.partner'
3319+
3320+ direct = PartnerImportMapper.direct + [('created_in', 'created_in')]
3321+
3322+And that's it! The field will be imported along with the other fields.
3323+
3324+.. attention:: Verify that you have selected the right version when you
3325+ have created your backend in ``Connectors > Magento > Backends``
3326+ otherwise your code will not be used.
3327+
3328+Example 2.
3329+----------
3330+
3331+I want to import the ``gender`` field. This one is a bit special because
3332+Magento maps 'Male' to ``123`` and 'Female' to ``124``. They are surely
3333+the identifiers of the attributes in Magento, and there's maybe an entry
3334+point in the API to get the proper values, but for the sake of the
3335+example, we'll assume we can hard-code theses values in the mappings.
3336+
3337+This time, I will create the field in ``res.partner``, because the value
3338+will likely be the same even if we have many ``magento.res.partner`` and
3339+this information can be useful at this level.
3340+
3341+In ``customize_example/partner.py``, I write::
3342+
3343+ # -*- coding: utf-8 -*-
3344+ from openerp.osv import orm, fields
3345+
3346+ class res_partner(orm.Model):
3347+ _inherit = 'res.partner'
3348+
3349+ _columns = {
3350+ 'gender': fields.selection([('male', 'Male'),
3351+ ('female', 'Female')],
3352+ string='Gender'),
3353+ }
3354+
3355+The same imports than in the `Example 1.`_ are needed, but we need to
3356+import ``mapping`` too::
3357+
3358+ from openerp.addons.connector.unit.mapper import mapping
3359+ from openerp.addons.magentoerpconnect.partner import PartnerImportMapper
3360+ from .backend import magento_myversion
3361+
3362+This is not a `direct` mapping, I will use a method to define the
3363+``gender`` value::
3364+
3365+ MAGENTO_GENDER = {'123': 'male',
3366+ '124': 'female'}
3367+
3368+ @magento_myversion
3369+ class MyPartnerImportMapper(PartnerImportMapper):
3370+ _model_name = 'magento.res.partner'
3371+
3372+ @mapping
3373+ def gender(self, record):
3374+ gender = MAGENTO_GENDER.get(record.get('gender'))
3375+ return {'gender': gender}
3376+
3377+The ``gender`` field will now be imported.
3378+
3379+And now?
3380+========
3381+
3382+With theses principles, you should now be able to extend the original
3383+mappings and add your own ones. This is applicable for the customers but
3384+for any other model actually imported as well.
3385
3386=== added file 'magentoerpconnect/doc/guides/tutorial_development.rst'
3387--- magentoerpconnect/doc/guides/tutorial_development.rst 1970-01-01 00:00:00 +0000
3388+++ magentoerpconnect/doc/guides/tutorial_development.rst 2013-08-13 17:30:12 +0000
3389@@ -0,0 +1,398 @@
3390+.. _tutorial-development:
3391+
3392+
3393+Tutorial: development
3394+=====================
3395+
3396+This tutorial explains how to take part in the development of
3397+Magentoerpconnect. It will explain how to use the different pieces of
3398+the ``Connector`` addon to synchronize records with Magento.
3399+
3400+.. contents:: Sections:
3401+ :local:
3402+ :backlinks: top
3403+
3404+
3405+Run a function on an Event
3406+--------------------------
3407+
3408+3 events are registered in the ``Connector`` addon:
3409+
3410+* ``on_record_create``
3411+* ``on_record_write``
3412+* ``on_record_unlink``
3413+
3414+If you need to create a new :py:class:`connector.event.Event`, please
3415+refer to the ``Connector`` documentation.
3416+
3417+When a function has to be run when an event is fired, it must be
3418+registered on this event. Those functions are called ``Consumers``.
3419+
3420+In ``magentoerpconnect/consumer.py``, some consumers are already
3421+defined. You can add your one, it should be decorated by
3422+:py:func:`magentoerpconnect.consumer.magento_consumer` and by the event
3423+which has to fire it::
3424+
3425+ @on_record_write(model_names=['my.model'])
3426+ @magento_consumer
3427+ def my_consumer(session, model_name, record_id, fields=None):
3428+ print 'Yeah'
3429+
3430+.. note:: The consumers always start with the arguments ``session`` and
3431+ ``model_name``. The next arguments vary, but they are defined
3432+ by the :py:class:`connector.event.Event`
3433+
3434+
3435+Find the 'connector unit' for a model
3436+-------------------------------------
3437+
3438+Assume that you already have an ``Environment``.
3439+
3440+.. note:: An ``Environment`` is the scope where the synchronizations are
3441+ done. It contains the browse record of the backend
3442+ (``magento.backend``), a ``ConnectorSession`` (container for
3443+ ``cr``, ``uid``, ``context``) and the name of the model we are
3444+ working with).
3445+
3446+You can get an instance of the ``ConnectorUnit`` to use from the
3447+environment. You'll need to ask a connector unit with the base class
3448+which interests you. Say you want a Synchronizer which import records
3449+from Magento::
3450+
3451+ importer = environment.get_connector_unit(MagentoImportSynchronizer)
3452+
3453+``importer`` is an instance of the importer to use for the model of the
3454+environment.
3455+
3456+Say you want a binder for your model::
3457+
3458+ binder = environment.get_connector_unit(connector.Binder)
3459+
3460+``binder`` is an instance of the binder for your model.
3461+
3462+And so on...
3463+
3464+.. note:: Every ``ConnectorUnit`` instance keeps the environment as
3465+ attribute. It means that you can access to the environment
3466+ from a synchronizer with ``self.environment``.
3467+
3468+
3469+Create an import
3470+----------------
3471+
3472+You'll need to work on at least 4 connector units:
3473+
3474+* a Synchronizer (presumably 2, we'll see why soon)
3475+* a Mapper
3476+* a Backend Adapter
3477+* a Binder
3478+
3479+You will also need to create / change the OpenERP models.
3480+
3481+.. note:: Keep in mind: try to modify at least as possible the OpenERP
3482+ models and classes.
3483+
3484+The synchronizer will handle the flow of the synchronization. It will
3485+get the data from Magento using the Backend Adapter, transform it using
3486+the Mapper, and use the Binder(s) to search the relation(s) with other
3487+imported records.
3488+
3489+Why do we need 2 synchronizers? Because an import is generally done in 2
3490+phases:
3491+
3492+1. The first synchronizer searches the list of all the ids to import.
3493+2. The second synchronizer imports all the ids atomically.
3494+
3495+We'll see in details a simple import: customer groups.
3496+Customer groups are importer as categories of partners
3497+(``res.partner.category``).
3498+
3499+Models
3500+''''''
3501+
3502+First, we create the model::
3503+
3504+ class magento_res_partner_category(orm.Model):
3505+ _name = 'magento.res.partner.category'
3506+ _inherit = 'magento.binding'
3507+ _inherits = {'res.partner.category': 'openerp_id'}
3508+
3509+ _columns = {
3510+ 'openerp_id': fields.many2one('res.partner.category',
3511+ string='Partner Category',
3512+ required=True,
3513+ ondelete='cascade'),
3514+ 'tax_class_id': fields.integer('Tax Class ID'),
3515+ }
3516+
3517+ _sql_constraints = [
3518+ ('magento_uniq', 'unique(backend_id, magento_id)',
3519+ 'A partner tag with same ID on Magento already exists.'),
3520+ ]
3521+
3522+Observations:
3523+
3524+* We do not change ``res.partner.category`` but create a
3525+ ``magento.res.partner.category`` model instead.
3526+* It `_inherit` from `magento.binding`
3527+* It contains the links to the Magento backend, the category and the
3528+ ID on Magento.
3529+* This model stores the data related to one category and one Magento
3530+ backend as well, so this data does not pollute the category and does
3531+ not criss-cross when several backends are connected.
3532+* It ``_inherits`` the ``res.partner.category`` so we can directly use
3533+ this model for the imports and the exports without complications.
3534+
3535+We need to add the field ``magento_bind_ids`` in
3536+``res.partner.category`` to relate to the Magento Bindings::
3537+
3538+ class res_partner_category(orm.Model):
3539+ _inherit = 'res.partner.category'
3540+
3541+ _columns = {
3542+ 'magento_bind_ids': fields.one2many(
3543+ 'magento.res.partner.category',
3544+ 'openerp_id',
3545+ string='Magento Bindings',
3546+ readonly=True),
3547+ }
3548+
3549+That's the only thing we need to change (besides the view) on the
3550+OpenERP category!
3551+
3552+.. note:: The name of the field ``magento_bind_ids`` is a convention.
3553+
3554+Ok, we're done with the models. Now the **synchronizations**!
3555+
3556+Batch Importer
3557+''''''''''''''
3558+
3559+The first Synchronizer, which get the full list of ids to import is
3560+usually a subclass of
3561+:py:class:`magentoerpconnect.unit.import_synchronizer.BatchImportSynchronizer`.
3562+
3563+The customer groups are simple enough to use a generic class::
3564+
3565+ @magento
3566+ class DelayedBatchImport(BatchImportSynchronizer):
3567+ """ Delay import of the records """
3568+ _model_name = [
3569+ 'magento.res.partner.category',
3570+ ]
3571+
3572+ def _import_record(self, record):
3573+ """ Delay the import of the records"""
3574+ job.import_record.delay(self.session,
3575+ self.model._name,
3576+ self.backend_record.id,
3577+ record)
3578+
3579+Observations:
3580+
3581+* Decorated by ``@magento``: this synchronizer will be available for all
3582+ versions of Magento. Decorated with ``@magento1700`` it would be only
3583+ available for Magento 1.7.
3584+* ``_model_name``: the list of models allowed to use this synchronizer
3585+* We just override the ``_import_record`` hook, the search has already
3586+ be done in
3587+ :py:class:`magentoerpconnect.unit.import_synchronizer.BatchImportSynchronizer`.
3588+* ``import_record`` is a job to import a record from its ID.
3589+* Delay the import of each record, a job will be created for each record id.
3590+* This synchronization does not need any Binder nor Mapper, but does
3591+ need a Backend Adapter to be able to speak with Magento.
3592+
3593+So, let's implement the **Backend Adapter**.
3594+
3595+Backend Adapter
3596+'''''''''''''''
3597+
3598+Most of the Magento objects can use the generic class
3599+:py:class`magentoerpconnect.unit.backend_adapter.GenericAdapter`.
3600+However, the ``search`` entry point is not implemented in the API for
3601+customer groups.
3602+
3603+We'll replace it using ``list`` and select only the ids::
3604+
3605+ @magento
3606+ class PartnerCategoryAdapter(GenericAdapter):
3607+ _model_name = 'magento.res.partner.category'
3608+ _magento_model = 'ol_customer_groups'
3609+
3610+ def search(self, filters=None):
3611+ """ Search records according to some criterias
3612+ and returns a list of ids
3613+
3614+ :rtype: list
3615+ """
3616+ with magentolib.API(self.magento.location,
3617+ self.magento.username,
3618+ self.magento.password) as api:
3619+ return [int(row['customer_group_id']) for row
3620+ in api.call('%s.list' % self._magento_model,
3621+ [filters] if filters else [{}])]
3622+ return []
3623+
3624+Observations:
3625+
3626+* ``_model_name`` is just ``magento.res.partner.category``, this adapter
3627+ is available only for this model.
3628+* ``_magento_model`` is the first part of the entry points in the API
3629+ (ie. ``ol_customer_groups.list``)
3630+* Only the ``search`` method is overriden.
3631+
3632+We have all the pieces for the first part of the synchronization, just
3633+need to...
3634+
3635+Delay execution of our Batch Import
3636+'''''''''''''''''''''''''''''''''''
3637+
3638+This import will be called from the **Magento Backend**, we modify it in
3639+``magentoerpconnect/magento_model.py`` and add a method (to add in the
3640+view as well, I won't write the view code here)::
3641+
3642+ def import_customer_groups(self, cr, uid, ids, context=None):
3643+ if not hasattr(ids, '__iter__'):
3644+ ids = [ids]
3645+ session = connector.ConnectorSession(cr, uid, context=context)
3646+ for backend_id in ids:
3647+ job.import_batch.delay(session, 'magento.res.partner.category',
3648+ backend_id)
3649+
3650+ return True
3651+
3652+Observations:
3653+
3654+* Declare a :py:class:`connector.connector.ConnectorSession`.
3655+* Delay the job ``import_batch`` when we click on the button.
3656+* if the arguments were given to ``import_batch`` directly, the import
3657+ would be done synchronously.
3658+
3659+Overview on the jobs
3660+''''''''''''''''''''
3661+
3662+We use 2 jobs: ``import_record`` and ``import_batch``. These jobs are
3663+already there so you don't need to write them, but we can have a look
3664+on them to understand what they do::
3665+
3666+ def _get_environment(session, model_name, backend_id):
3667+ model = session.pool.get('magento.backend')
3668+ backend_record = model.browse(session.cr,
3669+ session.uid,
3670+ backend_id,
3671+ session.context)
3672+ return connector.Environment(backend_record, session, model_name)
3673+
3674+
3675+ @connector.job
3676+ def import_batch(session, model_name, backend_id, filters=None):
3677+ """ Prepare a batch import of records from Magento """
3678+ env = _get_environment(session, model_name, backend_id)
3679+ importer = env.get_connector_unit(BatchImportSynchronizer)
3680+ importer.run(filters)
3681+
3682+
3683+ @connector.job
3684+ def import_record(session, model_name, backend_id, magento_id):
3685+ """ Import a record from Magento """
3686+ env = _get_environment(session, model_name, backend_id)
3687+ importer = env.get_connector_unit(MagentoImportSynchronizer)
3688+ importer.run(magento_id)
3689+
3690+Observations:
3691+
3692+* Decorated by :py:class:`connector.connector.queue.job.job`, allow to
3693+ ``delay`` the function.
3694+* We create a new environment and ask for the good importer, respectively
3695+ for batch imports and record imports. The environment returns an
3696+ instance of the importer to use.
3697+* The docstring of the job is its description for the user.
3698+
3699+At this point, if one click on the button to import the categories, the
3700+batch import would run, generate one job for each category to import,
3701+and then all these jobs would fail. We need to create the second
3702+synchronizer, the mapper and the binder.
3703+
3704+Record Importer
3705+'''''''''''''''
3706+
3707+The import of customer groups is so simple that it can use a generic
3708+class
3709+:py:class:`magentoerpconnect.unit.import_synchronizer.SimpleRecordImport`.
3710+We just need to add the model in the ``_model_name`` attribute::
3711+
3712+ @magento
3713+ class SimpleRecordImport(MagentoImportSynchronizer):
3714+ """ Import one Magento Website """
3715+ _model_name = [
3716+ 'magento.website',
3717+ 'magento.store',
3718+ 'magento.storeview',
3719+ 'magento.res.partner.category',
3720+ ]
3721+
3722+However, most of the imports will be more complicated than that. You
3723+will often need to create a new class for a model, where you will need
3724+to use some of the hooks to change the behavior
3725+(``_import_dependencies``, ``_after_import`` for example).
3726+Refers to the importers already created in the module and to the base
3727+class
3728+:py:class:`magentoerpconnect.unit.import_synchronizer.MagentoImportSynchronizer`.
3729+
3730+The synchronizer asks to the appropriate **Mapper** to transform the data
3731+(in ``_map_data``). Here is how we'll create the **Mapper**.
3732+
3733+Mapper
3734+''''''
3735+
3736+The mapper takes the record from Magento, and generates the OpenERP
3737+record. (or the reverse for the export Mappers)
3738+
3739+The mapper for the customer groups is as follows::
3740+
3741+ @magento
3742+ class PartnerCategoryImportMapper(connector.ImportMapper):
3743+ _model_name = 'magento.res.partner.category'
3744+
3745+ direct = [
3746+ ('customer_group_code', 'name'),
3747+ ('tax_class_id', 'tax_class_id'),
3748+ ]
3749+
3750+ @mapping
3751+ def magento_id(self, record):
3752+ return {'magento_id': record['customer_group_id']}
3753+
3754+ @mapping
3755+ def backend_id(self, record):
3756+ return {'backend_id': self.backend_record.id}
3757+
3758+
3759+Observations:
3760+
3761+* Some mappings are in ``direct`` and some use a method with a
3762+ ``@mapping`` decorator.
3763+* Methods allow to have more complex mappings.
3764+
3765+Binder
3766+''''''
3767+
3768+For the last piece of the construct, it will be an easy one, because
3769+normally all the Magento Models will use the same Binder, the so called
3770+:py:class:`magentoerpconnect.unit.binder.MagentoModelBinder`.
3771+
3772+We just need to add our model in the ``_model_name`` attribute::
3773+
3774+ @magento
3775+ class MagentoModelBinder(MagentoBinder):
3776+ """
3777+ Bindings are done directly on the model
3778+ """
3779+ _model_name = [
3780+ 'magento.website',
3781+ 'magento.store',
3782+ 'magento.storeview',
3783+ 'magento.res.partner.category',
3784+ ]
3785+
3786+ [...]
3787+
3788
3789=== added directory 'magentoerpconnect/doc/howto'
3790=== added file 'magentoerpconnect/doc/howto/configure_automatic_workflows.rst'
3791--- magentoerpconnect/doc/howto/configure_automatic_workflows.rst 1970-01-01 00:00:00 +0000
3792+++ magentoerpconnect/doc/howto/configure_automatic_workflows.rst 2013-08-13 17:30:12 +0000
3793@@ -0,0 +1,12 @@
3794+.. _configure-automatic-workflows:
3795+
3796+
3797+####################################
3798+Howto: configure automatic workflows
3799+####################################
3800+
3801+Find the configuration in the menu
3802+`Sales > Configuration > Sales > Automatic Workflow`.
3803+
3804+
3805+.. todo:: document the configuration
3806
3807=== added file 'magentoerpconnect/doc/howto/configure_emails.rst'
3808--- magentoerpconnect/doc/howto/configure_emails.rst 1970-01-01 00:00:00 +0000
3809+++ magentoerpconnect/doc/howto/configure_emails.rst 2013-08-13 17:30:12 +0000
3810@@ -0,0 +1,14 @@
3811+.. _configure-emails:
3812+
3813+#######################
3814+How to configure emails
3815+#######################
3816+
3817+On the Magento Stores, activate the options:
3818+
3819+* Send email notification on picking done
3820+* Send email notification on invoice paid
3821+
3822+If you want Magento to send email on thoses events.
3823+
3824+You can otherwise configure OpenERP to send e-mails.
3825
3826=== added file 'magentoerpconnect/doc/howto/configure_exception_rules.rst'
3827--- magentoerpconnect/doc/howto/configure_exception_rules.rst 1970-01-01 00:00:00 +0000
3828+++ magentoerpconnect/doc/howto/configure_exception_rules.rst 2013-08-13 17:30:12 +0000
3829@@ -0,0 +1,12 @@
3830+.. _configure-exception-rules:
3831+
3832+
3833+################################
3834+Howto: configure exception rules
3835+################################
3836+
3837+Find the configuration in the menu
3838+`Sales > Configuration > Sales > Exception Rules`.
3839+
3840+
3841+.. todo:: document the configuration
3842
3843=== added file 'magentoerpconnect/doc/howto/configure_payment_methods.rst'
3844--- magentoerpconnect/doc/howto/configure_payment_methods.rst 1970-01-01 00:00:00 +0000
3845+++ magentoerpconnect/doc/howto/configure_payment_methods.rst 2013-08-13 17:30:12 +0000
3846@@ -0,0 +1,14 @@
3847+.. _configure-payment-methods:
3848+
3849+
3850+################################
3851+Howto: configure payment methods
3852+################################
3853+
3854+Find the configuration in the menu
3855+`Sales > Configuration > Sales > E-Commerce Payment Methods`.
3856+
3857+The name of the payment method is the code of the payment in Magento,
3858+for instance: `checkmo`.
3859+
3860+.. todo:: document the configuration
3861
3862=== added file 'magentoerpconnect/doc/howto/configure_pricing.rst'
3863--- magentoerpconnect/doc/howto/configure_pricing.rst 1970-01-01 00:00:00 +0000
3864+++ magentoerpconnect/doc/howto/configure_pricing.rst 2013-08-13 17:30:12 +0000
3865@@ -0,0 +1,41 @@
3866+.. _configure-pricing:
3867+
3868+
3869+########################
3870+How to configure pricing
3871+########################
3872+
3873+Install the pricing extensions by going in: `Settings > Configuration >
3874+Connector` and by checking the `Price are managed in OpenERP with
3875+pricelists` option.
3876+
3877+**********************************
3878+Prices are shared accross websites
3879+**********************************
3880+
3881+The pricelist used for the prices sent to Magento is configured on the
3882+Magento Backend (`Connectors > Magento > Backends`).
3883+
3884+*************************************
3885+Prices are different accross websites
3886+*************************************
3887+
3888+.. note:: Verify that the option `Use pricelists to adapt your price per
3889+ customers` is active in the OpenERP `Settings > Configuration
3890+ > Sales`.
3891+
3892+The pricelist used for the prices sent to Magento is configured on the
3893+Magento Backend (`Connectors > Magento > Backends`). Magento will use
3894+theses prices as default prices.
3895+
3896+.. note:: In Magento, the default is to share the prices between websites.
3897+ If you want to have different prices per websites, go to
3898+ `System > Catalog > Catalog > Price` and set the `Catalog
3899+ Price Scope` to `Website` instead of `Global`.
3900+
3901+When you need different prices for a website, set the pricelist for this
3902+website in `Connectors > Magento > Websites`.
3903+
3904+.. warning:: The prices are actually updated on Magento when the price
3905+ is changed on the products, not when a pricelist is
3906+ modified.
3907
3908=== added file 'magentoerpconnect/doc/howto/configure_schedulers.rst'
3909--- magentoerpconnect/doc/howto/configure_schedulers.rst 1970-01-01 00:00:00 +0000
3910+++ magentoerpconnect/doc/howto/configure_schedulers.rst 2013-08-13 17:30:12 +0000
3911@@ -0,0 +1,25 @@
3912+.. _configure-schedulers:
3913+
3914+###########################
3915+How to configure schedulers
3916+###########################
3917+
3918+Once your configuration is fine,
3919+you will want to automate the import
3920+of the products, sales orders, ...
3921+
3922+Go to `Settings > Technical > Scheduler > Scheduled Actions`.
3923+
3924+Activate the wanted schedulers:
3925+
3926+* Magento - Import Customer Groups
3927+
3928+* Magento - Import Partners
3929+
3930+* Magento - Import Product Categories
3931+
3932+* Magento - Import Sales Orders
3933+
3934+* Magento - Update Stock Quantities
3935+
3936+You can change the `Interval Number` and `Interval Unit` as well.
3937
3938=== added file 'magentoerpconnect/doc/howto/configure_shipping_methods.rst'
3939--- magentoerpconnect/doc/howto/configure_shipping_methods.rst 1970-01-01 00:00:00 +0000
3940+++ magentoerpconnect/doc/howto/configure_shipping_methods.rst 2013-08-13 17:30:12 +0000
3941@@ -0,0 +1,36 @@
3942+.. _configure-shipping-methods:
3943+
3944+
3945+#################################
3946+How to configure shipping methods
3947+#################################
3948+
3949+Find the configuration in the menu
3950+`Warehouse > Configuration > Delivery Methods`.
3951+
3952+For each shipping method in Magento,
3953+you need to create a delivery method in OpenERP.
3954+
3955+The connector creates a product `[SHIP] Shipping costs`,
3956+you can use it for the Delivery Product.
3957+
3958+.. note:: If you import a sale order but the shipping method does not
3959+ exist, it will create it for you. But the configuration will
3960+ not be correct, so you better have to create them before
3961+ any import.
3962+
3963+The 'Magento Carrier Code' is the code of the shipping method in Magento,
3964+for instance: `flatrate_flatrate`.
3965+
3966+The 'Magento Tracking Title' is the text which will be displayed on
3967+Magento next to the tracking number.
3968+
3969+'Export tracking numbers' defines wether the tracking numbers should be
3970+sent to Magento.
3971+
3972+
3973+
3974+.. warning:: If you use the `flatrate` shipping method, you need to
3975+ deactivate the option `Export tracking numbers` because
3976+ this shipping method does not support to send tracking
3977+ numbers.
3978
3979=== added file 'magentoerpconnect/doc/howto/configure_translations.rst'
3980--- magentoerpconnect/doc/howto/configure_translations.rst 1970-01-01 00:00:00 +0000
3981+++ magentoerpconnect/doc/howto/configure_translations.rst 2013-08-13 17:30:12 +0000
3982@@ -0,0 +1,15 @@
3983+.. _configure-translations:
3984+
3985+
3986+#############################
3987+How to configure translations
3988+#############################
3989+
3990+If you have different translations on Magento,
3991+say one store view displayed in english and a second in french,
3992+you have to configure the languages to use in OpenERP.
3993+
3994+1. Set the default language in the Magento Backend (`Connectors > Magento > Backend`)
3995+ in the field `Default Language`.
3996+2. Then, for each storeview (`Connectors > Magento > Storeviews`),
3997+ change the language of the storeview.
3998
3999=== added file 'magentoerpconnect/doc/howto/configure_warehouse.rst'
4000--- magentoerpconnect/doc/howto/configure_warehouse.rst 1970-01-01 00:00:00 +0000
4001+++ magentoerpconnect/doc/howto/configure_warehouse.rst 2013-08-13 17:30:12 +0000
4002@@ -0,0 +1,19 @@
4003+.. _configure-warehouses:
4004+
4005+###########################
4006+How to configure warehouses
4007+###########################
4008+
4009+The warehouse defined on the Magento Backend
4010+(`Connectors > Magento > Backend`) is the
4011+warehouse used to update the stock quantities on Magento.
4012+
4013+On the backend, you can also change the field from which the
4014+stock quantity is read in the product.
4015+By default, the quantity send to Magento is the forecasted quantity,
4016+but you can use another standard or custom field by changing the field
4017+`Stock Field`.
4018+
4019+For each Magento Store, the connector has created an OpenERP Sale Shop.
4020+So you may want to check the Sales Shops to ensure they have the correct
4021+warehouses.
4022
4023=== added file 'magentoerpconnect/doc/howto/modify_an_order.rst'
4024--- magentoerpconnect/doc/howto/modify_an_order.rst 1970-01-01 00:00:00 +0000
4025+++ magentoerpconnect/doc/howto/modify_an_order.rst 2013-08-13 17:30:12 +0000
4026@@ -0,0 +1,45 @@
4027+.. _modify-an-order:
4028+
4029+
4030+###################################
4031+How to cancel / modify a sale order
4032+###################################
4033+
4034+****************************************
4035+Handle a sale order cancelled on Magento
4036+****************************************
4037+
4038+If a sales order has already been imported in OpenERP and is cancelled
4039+in Magento, the change won't be reflected in OpenERP. If a sales order
4040+is still waiting for a payment and is canceled, it won't be imported in
4041+OpenERP.
4042+
4043+*******************
4044+Modify a sale order
4045+*******************
4046+
4047+When you need to modify a product in a sale order,
4048+you should not modify it in the sale order directly.
4049+The sale order represents what the customer really ordered.
4050+
4051+You would be able to change the product in the delivery order.
4052+But Magento does not accept any change in the shipments,
4053+so it won't be modified on the Magento side
4054+(and you will have issues with partial deliveries).
4055+The changes would not be repercuted on the invoices neither.
4056+
4057+Instead, you can modify the sale order on the Magento backend.
4058+When Magento modifies a sale order,
4059+it cancels it and creates a new one.
4060+When the new order is imported in OpenERP,
4061+it flags the old one as 'Cancelled on Backend',
4062+then link the new order with the old one as a 'parent' order.
4063+
4064+If it can automatically cancel the parent order,
4065+it will do it.
4066+Otherwise, you'll have to handle it manually.
4067+You can search for them using the search filters.
4068+
4069+Until the old sale order is not cancelled or done,
4070+a rule prevents the new and the parent sales orders
4071+to be confirmed.
4072
4073=== added file 'magentoerpconnect/doc/index.rst'
4074--- magentoerpconnect/doc/index.rst 1970-01-01 00:00:00 +0000
4075+++ magentoerpconnect/doc/index.rst 2013-08-13 17:30:12 +0000
4076@@ -0,0 +1,154 @@
4077+.. Connectors documentation master file, created by
4078+ sphinx-quickstart on Mon Feb 4 11:35:44 2013.
4079+ You can adapt this file completely to your liking, but it should at least
4080+ contain the root `toctree` directive.
4081+
4082+#########################
4083+Magento OpenERP Connector
4084+#########################
4085+
4086+This is the new release of the Open-Source connector linking OpenERP and
4087+Magento also known under the name of **Magentoerpconnect**. It is
4088+build on top of the `connector`_ framework. It is is structured so that
4089+it can be extended or modified easily from separate addons, a factor of
4090+success when the implementations of Magento vary a lot.
4091+
4092+Magento OpenERP Connector is mainly developed by the Magentoerpconnect Core
4093+Editors, these being Camptocamp_ and Akretion_. The `source is on
4094+launchpad`_.
4095+
4096+This connector is designed to have a strong and efficient core, with the
4097+ability to extend it with extension modules or local customizations.
4098+
4099+.. _connector: https://code.launchpad.net/openerp-connector
4100+.. _Camptocamp: http://www.camptocamp.com
4101+.. _Akretion: http://www.akretion.com
4102+.. _`source is on launchpad`: https://launchpad.net/magentoerpconnect
4103+
4104+
4105+***********
4106+First steps
4107+***********
4108+
4109+.. toctree::
4110+ :maxdepth: 2
4111+
4112+ guides/installation_guide
4113+ guides/key_questions
4114+
4115+
4116+***********************************
4117+Using and configuring the connector
4118+***********************************
4119+
4120+Be efficient using and configuring the connector.
4121+
4122+.. toctree::
4123+ :maxdepth: 1
4124+
4125+ howto/configure_translations
4126+ howto/configure_warehouse
4127+ howto/configure_pricing
4128+ howto/configure_payment_methods
4129+ howto/configure_automatic_workflows
4130+ howto/configure_exception_rules
4131+ howto/configure_shipping_methods
4132+ howto/configure_emails
4133+ howto/configure_schedulers
4134+ guides/connector_checkpoint
4135+ guides/monitor_resolve_jobs
4136+ howto/modify_an_order
4137+
4138+
4139+***************************
4140+Developing on the connector
4141+***************************
4142+
4143+Learn about how you can contribute or use the connector as a developer.
4144+
4145+Develop
4146+=======
4147+
4148+.. toctree::
4149+ :maxdepth: 2
4150+
4151+ guides/tutorial_development
4152+ guides/tutorial_customize
4153+
4154+
4155+API
4156+===
4157+
4158+General API
4159+-----------
4160+
4161+.. toctree::
4162+ :maxdepth: 2
4163+
4164+ api/api_connector.rst
4165+ api/api_consumer.rst
4166+ api/api_backend.rst
4167+ api/api_binder.rst
4168+ api/api_synchronizer.rst
4169+ api/api_backend_adapter.rst
4170+ api/api_exception.rst
4171+
4172+Models API
4173+----------
4174+
4175+.. toctree::
4176+ :maxdepth: 2
4177+
4178+ api/api_delivery.rst
4179+ api/api_invoice.rst
4180+ api/api_magento_model.rst
4181+ api/api_partner.rst
4182+ api/api_partner_category.rst
4183+ api/api_product.rst
4184+ api/api_product_category.rst
4185+ api/api_sale.rst
4186+ api/api_stock_picking.rst
4187+ api/api_stock_tracking.rst
4188+
4189+
4190+Project
4191+=======
4192+
4193+.. toctree::
4194+ :maxdepth: 1
4195+
4196+ project/roadmap
4197+ project/contributors
4198+ project/contribute
4199+ project/changes
4200+
4201+
4202+Concepts
4203+========
4204+
4205+Glossary:
4206+
4207+.. glossary::
4208+
4209+ Job
4210+
4211+ A unit of work consisting of a single complete and atomic task.
4212+ Example: import of a product.
4213+
4214+ Backend
4215+
4216+ An external service on which we connect OpenERP. In the context
4217+ of the Magento connector, Magento is a backend.
4218+
4219+ Mapping
4220+
4221+ A mapping defines how the data is converted from Magento to
4222+ OpenERP and reversely.
4223+
4224+Indices and tables
4225+==================
4226+
4227+* :ref:`genindex`
4228+* :ref:`modindex`
4229+* :ref:`search`
4230+
4231
4232=== added file 'magentoerpconnect/doc/make.bat'
4233--- magentoerpconnect/doc/make.bat 1970-01-01 00:00:00 +0000
4234+++ magentoerpconnect/doc/make.bat 2013-08-13 17:30:12 +0000
4235@@ -0,0 +1,190 @@
4236+@ECHO OFF
4237+
4238+REM Command file for Sphinx documentation
4239+
4240+if "%SPHINXBUILD%" == "" (
4241+ set SPHINXBUILD=sphinx-build
4242+)
4243+set BUILDDIR=_build
4244+set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS% .
4245+set I18NSPHINXOPTS=%SPHINXOPTS% .
4246+if NOT "%PAPER%" == "" (
4247+ set ALLSPHINXOPTS=-D latex_paper_size=%PAPER% %ALLSPHINXOPTS%
4248+ set I18NSPHINXOPTS=-D latex_paper_size=%PAPER% %I18NSPHINXOPTS%
4249+)
4250+
4251+if "%1" == "" goto help
4252+
4253+if "%1" == "help" (
4254+ :help
4255+ echo.Please use `make ^<target^>` where ^<target^> is one of
4256+ echo. html to make standalone HTML files
4257+ echo. dirhtml to make HTML files named index.html in directories
4258+ echo. singlehtml to make a single large HTML file
4259+ echo. pickle to make pickle files
4260+ echo. json to make JSON files
4261+ echo. htmlhelp to make HTML files and a HTML help project
4262+ echo. qthelp to make HTML files and a qthelp project
4263+ echo. devhelp to make HTML files and a Devhelp project
4264+ echo. epub to make an epub
4265+ echo. latex to make LaTeX files, you can set PAPER=a4 or PAPER=letter
4266+ echo. text to make text files
4267+ echo. man to make manual pages
4268+ echo. texinfo to make Texinfo files
4269+ echo. gettext to make PO message catalogs
4270+ echo. changes to make an overview over all changed/added/deprecated items
4271+ echo. linkcheck to check all external links for integrity
4272+ echo. doctest to run all doctests embedded in the documentation if enabled
4273+ goto end
4274+)
4275+
4276+if "%1" == "clean" (
4277+ for /d %%i in (%BUILDDIR%\*) do rmdir /q /s %%i
4278+ del /q /s %BUILDDIR%\*
4279+ goto end
4280+)
4281+
4282+if "%1" == "html" (
4283+ %SPHINXBUILD% -b html %ALLSPHINXOPTS% %BUILDDIR%/html
4284+ if errorlevel 1 exit /b 1
4285+ echo.
4286+ echo.Build finished. The HTML pages are in %BUILDDIR%/html.
4287+ goto end
4288+)
4289+
4290+if "%1" == "dirhtml" (
4291+ %SPHINXBUILD% -b dirhtml %ALLSPHINXOPTS% %BUILDDIR%/dirhtml
4292+ if errorlevel 1 exit /b 1
4293+ echo.
4294+ echo.Build finished. The HTML pages are in %BUILDDIR%/dirhtml.
4295+ goto end
4296+)
4297+
4298+if "%1" == "singlehtml" (
4299+ %SPHINXBUILD% -b singlehtml %ALLSPHINXOPTS% %BUILDDIR%/singlehtml
4300+ if errorlevel 1 exit /b 1
4301+ echo.
4302+ echo.Build finished. The HTML pages are in %BUILDDIR%/singlehtml.
4303+ goto end
4304+)
4305+
4306+if "%1" == "pickle" (
4307+ %SPHINXBUILD% -b pickle %ALLSPHINXOPTS% %BUILDDIR%/pickle
4308+ if errorlevel 1 exit /b 1
4309+ echo.
4310+ echo.Build finished; now you can process the pickle files.
4311+ goto end
4312+)
4313+
4314+if "%1" == "json" (
4315+ %SPHINXBUILD% -b json %ALLSPHINXOPTS% %BUILDDIR%/json
4316+ if errorlevel 1 exit /b 1
4317+ echo.
4318+ echo.Build finished; now you can process the JSON files.
4319+ goto end
4320+)
4321+
4322+if "%1" == "htmlhelp" (
4323+ %SPHINXBUILD% -b htmlhelp %ALLSPHINXOPTS% %BUILDDIR%/htmlhelp
4324+ if errorlevel 1 exit /b 1
4325+ echo.
4326+ echo.Build finished; now you can run HTML Help Workshop with the ^
4327+.hhp project file in %BUILDDIR%/htmlhelp.
4328+ goto end
4329+)
4330+
4331+if "%1" == "qthelp" (
4332+ %SPHINXBUILD% -b qthelp %ALLSPHINXOPTS% %BUILDDIR%/qthelp
4333+ if errorlevel 1 exit /b 1
4334+ echo.
4335+ echo.Build finished; now you can run "qcollectiongenerator" with the ^
4336+.qhcp project file in %BUILDDIR%/qthelp, like this:
4337+ echo.^> qcollectiongenerator %BUILDDIR%\qthelp\Connectors.qhcp
4338+ echo.To view the help file:
4339+ echo.^> assistant -collectionFile %BUILDDIR%\qthelp\Connectors.ghc
4340+ goto end
4341+)
4342+
4343+if "%1" == "devhelp" (
4344+ %SPHINXBUILD% -b devhelp %ALLSPHINXOPTS% %BUILDDIR%/devhelp
4345+ if errorlevel 1 exit /b 1
4346+ echo.
4347+ echo.Build finished.
4348+ goto end
4349+)
4350+
4351+if "%1" == "epub" (
4352+ %SPHINXBUILD% -b epub %ALLSPHINXOPTS% %BUILDDIR%/epub
4353+ if errorlevel 1 exit /b 1
4354+ echo.
4355+ echo.Build finished. The epub file is in %BUILDDIR%/epub.
4356+ goto end
4357+)
4358+
4359+if "%1" == "latex" (
4360+ %SPHINXBUILD% -b latex %ALLSPHINXOPTS% %BUILDDIR%/latex
4361+ if errorlevel 1 exit /b 1
4362+ echo.
4363+ echo.Build finished; the LaTeX files are in %BUILDDIR%/latex.
4364+ goto end
4365+)
4366+
4367+if "%1" == "text" (
4368+ %SPHINXBUILD% -b text %ALLSPHINXOPTS% %BUILDDIR%/text
4369+ if errorlevel 1 exit /b 1
4370+ echo.
4371+ echo.Build finished. The text files are in %BUILDDIR%/text.
4372+ goto end
4373+)
4374+
4375+if "%1" == "man" (
4376+ %SPHINXBUILD% -b man %ALLSPHINXOPTS% %BUILDDIR%/man
4377+ if errorlevel 1 exit /b 1
4378+ echo.
4379+ echo.Build finished. The manual pages are in %BUILDDIR%/man.
4380+ goto end
4381+)
4382+
4383+if "%1" == "texinfo" (
4384+ %SPHINXBUILD% -b texinfo %ALLSPHINXOPTS% %BUILDDIR%/texinfo
4385+ if errorlevel 1 exit /b 1
4386+ echo.
4387+ echo.Build finished. The Texinfo files are in %BUILDDIR%/texinfo.
4388+ goto end
4389+)
4390+
4391+if "%1" == "gettext" (
4392+ %SPHINXBUILD% -b gettext %I18NSPHINXOPTS% %BUILDDIR%/locale
4393+ if errorlevel 1 exit /b 1
4394+ echo.
4395+ echo.Build finished. The message catalogs are in %BUILDDIR%/locale.
4396+ goto end
4397+)
4398+
4399+if "%1" == "changes" (
4400+ %SPHINXBUILD% -b changes %ALLSPHINXOPTS% %BUILDDIR%/changes
4401+ if errorlevel 1 exit /b 1
4402+ echo.
4403+ echo.The overview file is in %BUILDDIR%/changes.
4404+ goto end
4405+)
4406+
4407+if "%1" == "linkcheck" (
4408+ %SPHINXBUILD% -b linkcheck %ALLSPHINXOPTS% %BUILDDIR%/linkcheck
4409+ if errorlevel 1 exit /b 1
4410+ echo.
4411+ echo.Link check complete; look for any errors in the above output ^
4412+or in %BUILDDIR%/linkcheck/output.txt.
4413+ goto end
4414+)
4415+
4416+if "%1" == "doctest" (
4417+ %SPHINXBUILD% -b doctest %ALLSPHINXOPTS% %BUILDDIR%/doctest
4418+ if errorlevel 1 exit /b 1
4419+ echo.
4420+ echo.Testing of doctests in the sources finished, look at the ^
4421+results in %BUILDDIR%/doctest/output.txt.
4422+ goto end
4423+)
4424+
4425+:end
4426
4427=== added directory 'magentoerpconnect/doc/project'
4428=== added file 'magentoerpconnect/doc/project/changes.rst'
4429--- magentoerpconnect/doc/project/changes.rst 1970-01-01 00:00:00 +0000
4430+++ magentoerpconnect/doc/project/changes.rst 2013-08-13 17:30:12 +0000
4431@@ -0,0 +1,8 @@
4432+.. _changes:
4433+
4434+#######
4435+Changes
4436+#######
4437+
4438+.. include:: ../../CHANGES.rst
4439+ :start-line: 3
4440
4441=== added file 'magentoerpconnect/doc/project/contribute.rst'
4442--- magentoerpconnect/doc/project/contribute.rst 1970-01-01 00:00:00 +0000
4443+++ magentoerpconnect/doc/project/contribute.rst 2013-08-13 17:30:12 +0000
4444@@ -0,0 +1,19 @@
4445+.. _contribute:
4446+
4447+##########
4448+Contribute
4449+##########
4450+
4451+We do accept merge proposals!
4452+
4453+
4454+.. todo:: Complete this page.
4455+
4456+ Some topics to cover:
4457+
4458+ * mailing list (irc?)
4459+ * bug reports
4460+ * submit merge proposals for features or fixes
4461+ * use and write tests
4462+ * improve documentation
4463+ * translations
4464
4465=== added file 'magentoerpconnect/doc/project/contributors.rst'
4466--- magentoerpconnect/doc/project/contributors.rst 1970-01-01 00:00:00 +0000
4467+++ magentoerpconnect/doc/project/contributors.rst 2013-08-13 17:30:12 +0000
4468@@ -0,0 +1,10 @@
4469+############
4470+Contributors
4471+############
4472+
4473+Special thanks to:
4474+
4475+* Mohammed Nahhas for creating Maverick-Entity-Generator_ to help us in
4476+ our tests.
4477+
4478+.. _Maverick-Entity-Generator: https://github.com/maverick193/entity-generator
4479
4480=== added file 'magentoerpconnect/doc/project/roadmap.rst'
4481--- magentoerpconnect/doc/project/roadmap.rst 1970-01-01 00:00:00 +0000
4482+++ magentoerpconnect/doc/project/roadmap.rst 2013-08-13 17:30:12 +0000
4483@@ -0,0 +1,61 @@
4484+.. _roadmap:
4485+
4486+
4487+#######
4488+Roadmap
4489+#######
4490+
4491+This document lists the feature that we want to develop for the
4492+connector. They are not sorted by priority. Any contribution on theses
4493+points will be welcome.
4494+
4495+*******
4496+Catalog
4497+*******
4498+
4499+Types of products
4500+=================
4501+
4502+* Support of Bundles with a split in the sale order
4503+
4504+* Support of Bundles with a manufacturing order
4505+
4506+* Support of Configurables
4507+
4508+* Support of Grouped products
4509+
4510+* Support of Virtual products
4511+
4512+* Support of Downloadable products
4513+
4514+Product links
4515+=============
4516+
4517+* Import of links
4518+
4519+* Related, Upsell, Cross-sell, ...
4520+
4521+* Gifts
4522+
4523+Product images
4524+==============
4525+
4526+* Import product images
4527+
4528+* Management of several images on a product
4529+
4530+Export of the catalog
4531+=====================
4532+
4533+* Export products
4534+
4535+* Export product categories
4536+
4537+* Export product links
4538+
4539+* Export product images
4540+
4541+Pricing
4542+=======
4543+
4544+* Push the new prices to Magento when a pricelist is modified
4545
4546=== added file 'magentoerpconnect/exception.py'
4547--- magentoerpconnect/exception.py 1970-01-01 00:00:00 +0000
4548+++ magentoerpconnect/exception.py 2013-08-13 17:30:12 +0000
4549@@ -0,0 +1,26 @@
4550+# -*- coding: utf-8 -*-
4551+##############################################################################
4552+#
4553+# Author: Guewen Baconnier
4554+# Copyright 2013 Camptocamp SA
4555+#
4556+# This program is free software: you can redistribute it and/or modify
4557+# it under the terms of the GNU Affero General Public License as
4558+# published by the Free Software Foundation, either version 3 of the
4559+# License, or (at your option) any later version.
4560+#
4561+# This program is distributed in the hope that it will be useful,
4562+# but WITHOUT ANY WARRANTY; without even the implied warranty of
4563+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4564+# GNU Affero General Public License for more details.
4565+#
4566+# You should have received a copy of the GNU Affero General Public License
4567+# along with this program. If not, see <http://www.gnu.org/licenses/>.
4568+#
4569+##############################################################################
4570+
4571+from openerp.addons.connector.exception import RetryableJobError
4572+
4573+
4574+class OrderImportRuleRetry(RetryableJobError):
4575+ """ The sale order import will be retried later. """
4576
4577=== added directory 'magentoerpconnect/i18n'
4578=== added file 'magentoerpconnect/i18n/fr_FR.po'
4579--- magentoerpconnect/i18n/fr_FR.po 1970-01-01 00:00:00 +0000
4580+++ magentoerpconnect/i18n/fr_FR.po 2013-08-13 17:30:12 +0000
4581@@ -0,0 +1,1007 @@
4582+# Translation of OpenERP Server.
4583+# This file contains the translation of the following modules:
4584+# * magentoerpconnect
4585+#
4586+msgid ""
4587+msgstr ""
4588+"Project-Id-Version: OpenERP Server 7.0\n"
4589+"Report-Msgid-Bugs-To: \n"
4590+"POT-Creation-Date: 2013-05-01 12:45+0000\n"
4591+"PO-Revision-Date: 2013-05-01 12:45+0000\n"
4592+"Last-Translator: <>\n"
4593+"Language-Team: \n"
4594+"MIME-Version: 1.0\n"
4595+"Content-Type: text/plain; charset=UTF-8\n"
4596+"Content-Transfer-Encoding: \n"
4597+"Plural-Forms: \n"
4598+
4599+#. module: magentoerpconnect
4600+#: help:magento.backend,pricelist_id:0
4601+msgid "The price list used to define the prices of the products in Magento."
4602+msgstr "La liste de prix utilisée pour définir les prix des articles sur Magento."
4603+
4604+#. module: magentoerpconnect
4605+#: help:magento.store,send_invoice_paid_mail:0
4606+msgid "Does the invoice export/creation should send an email notification on Magento side?"
4607+msgstr "Définit si Magento doit envoyer un e-mail lors de l'export des factures."
4608+
4609+#. module: magentoerpconnect
4610+#: view:magento.backend:0
4611+msgid "Import sales orders from all store views"
4612+msgstr "Importer les commandes depuis toutes les vues magasin"
4613+
4614+#. module: magentoerpconnect
4615+#: model:sale.exception,description:magentoerpconnect.excep_wrong_total_amount_tax
4616+msgid "The tax amount computed in OpenERP doesn't match with the tax amount in Magento.\n"
4617+"\n"
4618+"Cause:\n"
4619+"The taxes are probably different between OpenERP and Magento. A fiscal position could have changed the final price.\n"
4620+"\n"
4621+"Resolution:\n"
4622+"Check your taxes and fiscal positions configuration and correct them if necessary."
4623+msgstr "Les taxes calculées par OpenERP ne correspondent pas aux tax calculées par Magento.\n"
4624+"\n"
4625+"Cause:\n"
4626+"La configuration des taxes est probablement différente entre OpenERP et Magento. Une position fiscale peut avoir modifié le prix final.\n"
4627+"\n"
4628+"Résolution:\n"
4629+"Contrôler la configuration des taxes et positions fiscales et les corriger si nécessaire."
4630+
4631+#. module: magentoerpconnect
4632+#: help:magento.backend,warehouse_id:0
4633+msgid "Warehouse used to compute the stock quantities."
4634+msgstr "Entrepôt utilisé pour calculer les quantités en stock."
4635+
4636+#. module: magentoerpconnect
4637+#: field:magento.account.invoice,sync_date:0
4638+#: field:magento.address,sync_date:0
4639+#: field:magento.binding,sync_date:0
4640+#: field:magento.product.category,sync_date:0
4641+#: field:magento.product.product,sync_date:0
4642+#: field:magento.res.partner,sync_date:0
4643+#: field:magento.res.partner.category,sync_date:0
4644+#: field:magento.sale.order,sync_date:0
4645+#: field:magento.sale.order.line,sync_date:0
4646+#: field:magento.stock.picking.out,sync_date:0
4647+#: field:magento.store,sync_date:0
4648+#: field:magento.storeview,sync_date:0
4649+#: field:magento.website,sync_date:0
4650+msgid "Last synchronization date"
4651+msgstr "Dernière date de synchronisation"
4652+
4653+#. module: magentoerpconnect
4654+#: help:magento.backend,default_category_id:0
4655+msgid "If a default category is selected, products imported without a category will be linked to it."
4656+msgstr "Si une catégorie par défaut est sélectionnée, les articles importés sans catégorie y seront liés."
4657+
4658+#. module: magentoerpconnect
4659+#: help:magento.storeview,import_orders_from_date:0
4660+msgid "do not consider non-imported sale orders before this date. Leave empty to import all sale orders"
4661+msgstr "Ignore les commandes non importées avant cette date. Laisser vide pour importer toutes les commandes."
4662+
4663+#. module: magentoerpconnect
4664+#: help:magento.store,send_picking_done_mail:0
4665+msgid "Does the picking export/creation should send an email notification on Magento side?"
4666+msgstr "Définit si Magento doit envoyer un e-mail lors de l'export des bons de livraisons."
4667+
4668+#. module: magentoerpconnect
4669+#: selection:magento.product.product,manage_stock:0
4670+msgid "Do Not Manage Stock"
4671+msgstr "Ne pas gérer les stock"
4672+
4673+#. module: magentoerpconnect
4674+#: field:connector.config.settings,module_magentoerpconnect_catalog:0
4675+msgid "Handle the product's catalog (not implemented)"
4676+msgstr "Gérer le catalogue d'articles depuis OpenERP (non supporté)"
4677+
4678+#. module: magentoerpconnect
4679+#: field:res.partner,company:0
4680+msgid "Company"
4681+msgstr "Société"
4682+
4683+#. module: magentoerpconnect
4684+#: sql_constraint:magento.website:0
4685+msgid "A website with the same ID on Magento already exists."
4686+msgstr "Un site web avec le même ID sur Magento existe déjà."
4687+
4688+#. module: magentoerpconnect
4689+#: field:magento.backend,import_categories_from_date:0
4690+msgid "Import categories from date"
4691+msgstr "Importer les catégories depuis la date"
4692+
4693+#. module: magentoerpconnect
4694+#: view:account.invoice:0
4695+#: field:account.invoice,magento_bind_ids:0
4696+#: view:product.category:0
4697+#: field:product.category,magento_bind_ids:0
4698+#: view:product.product:0
4699+#: field:product.product,magento_bind_ids:0
4700+#: view:res.partner:0
4701+#: field:res.partner,magento_bind_ids:0
4702+#: field:res.partner.category,magento_bind_ids:0
4703+#: field:sale.order,magento_bind_ids:0
4704+#: field:sale.order.line,magento_bind_ids:0
4705+#: field:sale.shop,magento_bind_ids:0
4706+#: field:stock.picking,magento_bind_ids:0
4707+#: view:stock.picking.out:0
4708+#: field:stock.picking.out,magento_bind_ids:0
4709+msgid "Magento Bindings"
4710+msgstr "Liens Magento"
4711+
4712+#. module: magentoerpconnect
4713+#: help:connector.config.settings,module_magentoerpconnect_catalog:0
4714+msgid "This installs the module magentoerpconnect_catalog."
4715+msgstr "Installe le module magentoerpconnect_catalog"
4716+
4717+#. module: magentoerpconnect
4718+#: field:magento.address,is_magento_order_address:0
4719+msgid "Address from a Magento Order"
4720+msgstr "Adresse d'une commande Magento"
4721+
4722+#. module: magentoerpconnect
4723+#: field:magento.sale.order,magento_order_id:0
4724+msgid "Magento Order ID"
4725+msgstr "ID de commande Magento"
4726+
4727+#. module: magentoerpconnect
4728+#: model:ir.model,name:magentoerpconnect.model_magentoerpconnect_installed
4729+msgid "magentoerpconnect.installed"
4730+msgstr "magentoerpconnect.installed"
4731+
4732+#. module: magentoerpconnect
4733+#: help:connector.config.settings,module_magentoerpconnect_export_partner:0
4734+msgid "This installs the module magentoerpconnect_export_partner."
4735+msgstr "Installe le module magentoerpconnect_export_partner."
4736+
4737+#. module: magentoerpconnect
4738+#: field:magento.sale.order.line,notes:0
4739+msgid "Notes"
4740+msgstr "Notes"
4741+
4742+#. module: magentoerpconnect
4743+#: field:magento.sale.order,openerp_id:0
4744+msgid "Sale Order"
4745+msgstr "Bons de Commande"
4746+
4747+#. module: magentoerpconnect
4748+#: field:magento.stock.picking.out,openerp_id:0
4749+msgid "Stock Picking"
4750+msgstr "Bon de livraison"
4751+
4752+#. module: magentoerpconnect
4753+#: view:connector.config.settings:0
4754+msgid "Extensions"
4755+msgstr "Extensions"
4756+
4757+#. module: magentoerpconnect
4758+#: view:magento.backend:0
4759+msgid "Advanced Configuration"
4760+msgstr "Configuration avancée"
4761+
4762+#. module: magentoerpconnect
4763+#: field:magento.res.partner,group_id:0
4764+msgid "Magento Group (Category)"
4765+msgstr "Groupe de client Magento (Catégorie)"
4766+
4767+#. module: magentoerpconnect
4768+#: model:ir.ui.menu,name:magentoerpconnect.menu_magento_store
4769+#: view:magento.website:0
4770+#: field:magento.website,store_ids:0
4771+msgid "Stores"
4772+msgstr "Magasins"
4773+
4774+#. module: magentoerpconnect
4775+#: field:magento.backend,product_stock_field_id:0
4776+msgid "Stock Field"
4777+msgstr "Champ de stock"
4778+
4779+#. module: magentoerpconnect
4780+#: field:magento.res.partner.category,openerp_id:0
4781+msgid "Partner Category"
4782+msgstr "Catégorie de partenaire"
4783+
4784+#. module: magentoerpconnect
4785+#: help:magento.product.product,magento_qty:0
4786+msgid "Last computed quantity to send on Magento."
4787+msgstr "Dernière quantité calculée à envoyer à Magento"
4788+
4789+#. module: magentoerpconnect
4790+#: model:ir.ui.menu,name:magentoerpconnect.menu_magento_root
4791+#: view:res.partner.category:0
4792+msgid "Magento"
4793+msgstr "Magento"
4794+
4795+#. module: magentoerpconnect
4796+#: model:ir.model,name:magentoerpconnect.model_connector_config_settings
4797+msgid "connector.config.settings"
4798+msgstr "connector.config.settings"
4799+
4800+#. module: magentoerpconnect
4801+#: field:magento.backend,import_products_from_date:0
4802+msgid "Import products from date"
4803+msgstr "Importer les articles depuis la date"
4804+
4805+#. module: magentoerpconnect
4806+#: model:ir.model,name:magentoerpconnect.model_res_partner
4807+#: field:magento.address,openerp_id:0
4808+#: field:magento.res.partner,openerp_id:0
4809+msgid "Partner"
4810+msgstr "Partenaire"
4811+
4812+#. module: magentoerpconnect
4813+#: model:ir.model,name:magentoerpconnect.model_sale_order
4814+msgid "Sales Order"
4815+msgstr "Bon de commande"
4816+
4817+#. module: magentoerpconnect
4818+#: model:ir.model,name:magentoerpconnect.model_stock_picking_out
4819+msgid "Delivery Orders"
4820+msgstr "Bons de livraisons"
4821+
4822+#. module: magentoerpconnect
4823+#: model:ir.model,name:magentoerpconnect.model_sale_order_line
4824+msgid "Sales Order Line"
4825+msgstr "Ligne de commande"
4826+
4827+#. module: magentoerpconnect
4828+#: field:connector.config.settings,module_magentoerpconnect_pricing:0
4829+msgid "Prices are managed in OpenERP with pricelists"
4830+msgstr "Les prix de vente sont gérés dans OpenERP avec des listes de prix"
4831+
4832+#. module: magentoerpconnect
4833+#: field:magento.address,is_default_shipping:0
4834+msgid "Default Shipping"
4835+msgstr "Adresse de livraison par défaut"
4836+
4837+#. module: magentoerpconnect
4838+#: sql_constraint:magento.stock.picking.out:0
4839+msgid "A stock picking with same ID on Magento already exists."
4840+msgstr "Un bon de livraison avec le même ID Magento existe déjà."
4841+
4842+#. module: magentoerpconnect
4843+#: view:magento.backend:0
4844+msgid "By clicking on the buttons,\n"
4845+" you will initiate the synchronizations\n"
4846+" with Magento.\n"
4847+" Note that the import or exports\n"
4848+" won't be done directly,\n"
4849+" they will create 'Jobs'\n"
4850+" executed as soon as possible."
4851+msgstr "En cliquant sur les boutons,\n"
4852+" Vous allez initier les synchronisations\n"
4853+" avec Magento.\n"
4854+" Important: les imports et exports\n"
4855+" ne sont pas exécutés immédiatement,\n"
4856+" ils vont créer des 'jobs',\n"
4857+" exécutés aussitôt que possible."
4858+
4859+#. module: magentoerpconnect
4860+#: help:magento.backend,product_stock_field_id:0
4861+msgid "Choose the field of the product which will be used for stock inventory updates.\n"
4862+"If empty, Quantity Available is used."
4863+msgstr "Choisir le champ de l'article qui doit être utilisé pour mettre à jour la quantité en stock."
4864+"Quand le champ est vide, la quantité en stock est utilisée."
4865+
4866+#. module: magentoerpconnect
4867+#: sql_constraint:magento.product.product:0
4868+msgid "A product with the same ID on Magento already exists"
4869+msgstr "Un article avec le même ID Magento existe déjà."
4870+
4871+#. module: magentoerpconnect
4872+#: model:ir.ui.menu,name:magentoerpconnect.menu_magento_backend
4873+msgid "Backends"
4874+msgstr "Backends"
4875+
4876+#. module: magentoerpconnect
4877+#: field:magento.backend,location:0
4878+msgid "Location"
4879+msgstr "Emplacement"
4880+
4881+#. module: magentoerpconnect
4882+#: model:ir.model,name:magentoerpconnect.model_stock_picking
4883+msgid "Picking List"
4884+msgstr "Liste de colisage"
4885+
4886+#. module: magentoerpconnect
4887+#: field:magento.backend,warehouse_id:0
4888+msgid "Warehouse"
4889+msgstr "Entrepôt"
4890+
4891+#. module: magentoerpconnect
4892+#: field:magento.backend,catalog_price_tax_included:0
4893+msgid "Prices include tax"
4894+msgstr "Prix taxes-incluses"
4895+
4896+#. module: magentoerpconnect
4897+#: view:magento.backend:0
4898+msgid "Import products categories since"
4899+msgstr "Importer les catégories d'articles depuis"
4900+
4901+#. module: magentoerpconnect
4902+#: field:magento.sale.order.line,openerp_id:0
4903+msgid "Sale Order Line"
4904+msgstr "Ligne de commande"
4905+
4906+#. module: magentoerpconnect
4907+#: field:magento.backend,username:0
4908+msgid "Username"
4909+msgstr "Utilisateur"
4910+
4911+#. module: magentoerpconnect
4912+#: model:ir.model,name:magentoerpconnect.model_product_category
4913+#: field:magento.product.category,openerp_id:0
4914+msgid "Product Category"
4915+msgstr "Catégorie d'articles"
4916+
4917+#. module: magentoerpconnect
4918+#: field:magento.res.partner,guest_customer:0
4919+msgid "Guest Customer"
4920+msgstr "Client invité"
4921+
4922+#. module: magentoerpconnect
4923+#: help:connector.config.settings,module_magentoerpconnect_pricing:0
4924+msgid "Prices are set in OpenERP and exported to Magento.\n"
4925+"\n"
4926+"This installs the module magentoerpconnect_pricing."
4927+msgstr "Les prix sont définis dans OpenERP et exportés vers Magento.\n"
4928+"\n"
4929+"Installe le module magentoerpconnect_pricing."
4930+
4931+#. module: magentoerpconnect
4932+#: field:delivery.carrier,magento_carrier_code:0
4933+msgid "Magento Base Carrier Code"
4934+msgstr "Code de base de transporteur sur Magento"
4935+
4936+#. module: magentoerpconnect
4937+#: view:magento.website:0
4938+msgid "Import partners since"
4939+msgstr "Importer les partenaires depuis"
4940+
4941+#. module: magentoerpconnect
4942+#: view:magento.backend:0
4943+#: view:magento.website:0
4944+msgid "Import in background"
4945+msgstr "Importer en arrière-plan"
4946+
4947+#. module: magentoerpconnect
4948+#: field:magento.account.invoice,magento_id:0
4949+#: field:magento.address,magento_id:0
4950+#: field:magento.binding,magento_id:0
4951+#: field:magento.product.category,magento_id:0
4952+#: field:magento.product.product,magento_id:0
4953+#: field:magento.res.partner,magento_id:0
4954+#: field:magento.res.partner.category,magento_id:0
4955+#: field:magento.sale.order,magento_id:0
4956+#: field:magento.sale.order.line,magento_id:0
4957+#: field:magento.stock.picking.out,magento_id:0
4958+#: field:magento.store,magento_id:0
4959+#: field:magento.storeview,magento_id:0
4960+#: field:magento.website,magento_id:0
4961+msgid "ID on Magento"
4962+msgstr "ID sur Magento"
4963+
4964+#. module: magentoerpconnect
4965+#: model:ir.actions.act_window,name:magentoerpconnect.action_magento_store
4966+msgid "Magento Stores"
4967+msgstr "Magasins Magento"
4968+
4969+#. module: magentoerpconnect
4970+#: field:magento.backend,pricelist_id:0
4971+#: field:magento.website,pricelist_id:0
4972+msgid "Pricelist"
4973+msgstr "Liste de prix"
4974+
4975+#. module: magentoerpconnect
4976+#: field:magento.sale.order,total_amount:0
4977+msgid "Total amount"
4978+msgstr "Montant total"
4979+
4980+#. module: magentoerpconnect
4981+#: model:ir.model,name:magentoerpconnect.model_magento_product_category
4982+#: view:magento.product.category:0
4983+msgid "Magento Product Category"
4984+msgstr "Catégorie d'articles Magento"
4985+
4986+#. module: magentoerpconnect
4987+#: view:magento.product.product:0
4988+msgid "(recompute)"
4989+msgstr "(recalculer)"
4990+
4991+#. module: magentoerpconnect
4992+#: field:magento.store,openerp_id:0
4993+msgid "Sale Shop"
4994+msgstr "Magasin"
4995+
4996+#. module: magentoerpconnect
4997+#: field:magento.product.product,manage_stock:0
4998+msgid "Manage Stock Level"
4999+msgstr "Gérer les stocks"
5000+
The diff has been truncated for viewing.