Merge lp:~camptocamp/openerp-connector-magento/7.0-next-release-related-actions into lp:~openerp-connector-core-editors/openerp-connector-magento/7.0-next-release

Proposed by Guewen Baconnier @ Camptocamp
Status: Merged
Merged at revision: 989
Proposed branch: lp:~camptocamp/openerp-connector-magento/7.0-next-release-related-actions
Merge into: lp:~openerp-connector-core-editors/openerp-connector-magento/7.0-next-release
Diff against target: 630 lines (+260/-10)
20 files modified
magentoerpconnect/CHANGES.rst (+2/-0)
magentoerpconnect/invoice.py (+5/-1)
magentoerpconnect/magento_model.py (+4/-0)
magentoerpconnect/magento_model_view.xml (+1/-0)
magentoerpconnect/partner.py (+1/-0)
magentoerpconnect/partner_category.py (+1/-0)
magentoerpconnect/product.py (+4/-1)
magentoerpconnect/product_category.py (+1/-0)
magentoerpconnect/related_action.py (+65/-0)
magentoerpconnect/sale.py (+1/-0)
magentoerpconnect/stock_picking.py (+4/-1)
magentoerpconnect/stock_tracking.py (+3/-1)
magentoerpconnect/tests/__init__.py (+4/-0)
magentoerpconnect/tests/test_related_action.py (+98/-0)
magentoerpconnect/unit/backend_adapter.py (+16/-0)
magentoerpconnect/unit/binder.py (+33/-0)
magentoerpconnect/unit/delete_synchronizer.py (+3/-1)
magentoerpconnect/unit/export_synchronizer.py (+3/-1)
magentoerpconnect/unit/import_synchronizer.py (+3/-1)
magentoerpconnect_pricing/product.py (+8/-3)
To merge this branch: bzr merge lp:~camptocamp/openerp-connector-magento/7.0-next-release-related-actions
Reviewer Review Type Date Requested Status
OpenERP Connector Core Editors Pending
Review via email: mp+218945@code.launchpad.net

Commit message

Implements Related Actions

A related action can be attached to a job. It is shown to the user as a button on the form view of the jobs.
When the button is used, the related action is called and must return an OpenERP "client action".

Related action in this connector:
* Open the form view of the record that is concerned by the job on export jobs
* Open a browser on Magento's admin page in order to view/edit the record on import jobs

Description of the change

Implements Related Actions
==========================

Based on the new connector's feature: https://code.launchpad.net/~camptocamp/openerp-connector/7.0-next-release-related-action

A related action can be attached to a job. It is shown to the user as a button on the form view of the jobs.
When the button is used, the related action is called and must return an OpenERP "client action".

Related action in this connector:
* Open the form view of the record that is concerned by the job on export jobs
* Open a browser on Magento's admin page in order to view/edit the record on import jobs

I would like to include this branch in the upcoming release, please test and give me your feedback!

To post a comment you must log in.
985. By Guewen Baconnier @ Camptocamp

test method name duplicated

986. By Guewen Baconnier @ Camptocamp

rename unwrap_record to unwrap_binding

Revision history for this message
David BEAL (ak) (davidbeal) wrote :

Really, really usefull feature

Nice Guewen

Thank you

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'magentoerpconnect/CHANGES.rst'
--- magentoerpconnect/CHANGES.rst 2014-05-06 15:46:57 +0000
+++ magentoerpconnect/CHANGES.rst 2014-05-19 11:42:35 +0000
@@ -16,6 +16,8 @@
16* Fix: calculate correctly the discount ratio on sales order lines (lp:1201590)16* Fix: calculate correctly the discount ratio on sales order lines (lp:1201590)
17* Possibility to exclude products from stock synchronizations17* Possibility to exclude products from stock synchronizations
18* Products disabled on Magento are imported disabled on OpenERP. An additional module allows more options.18* Products disabled on Magento are imported disabled on OpenERP. An additional module allows more options.
19* Related Actions: open the form view on the record concerned by an export job, or open the Magento's admin page
20 on importing jobs
1921
2022
212.3.1 (2014-01-23)232.3.1 (2014-01-23)
2224
=== modified file 'magentoerpconnect/invoice.py'
--- magentoerpconnect/invoice.py 2014-04-29 14:11:59 +0000
+++ magentoerpconnect/invoice.py 2014-05-19 11:42:35 +0000
@@ -23,7 +23,7 @@
23import xmlrpclib23import xmlrpclib
24from openerp.osv import fields, orm24from openerp.osv import fields, orm
25from openerp.tools.translate import _25from openerp.tools.translate import _
26from openerp.addons.connector.queue.job import job26from openerp.addons.connector.queue.job import job, related_action
27from openerp.addons.connector.unit.synchronizer import ExportSynchronizer27from openerp.addons.connector.unit.synchronizer import ExportSynchronizer
28from openerp.addons.connector.event import on_record_create28from openerp.addons.connector.event import on_record_create
29from openerp.addons.connector_ecommerce.event import (on_invoice_paid,29from openerp.addons.connector_ecommerce.event import (on_invoice_paid,
@@ -32,6 +32,7 @@
32from .unit.backend_adapter import GenericAdapter32from .unit.backend_adapter import GenericAdapter
33from .connector import get_environment33from .connector import get_environment
34from .backend import magento34from .backend import magento
35from .related_action import unwrap_binding
3536
36_logger = logging.getLogger(__name__)37_logger = logging.getLogger(__name__)
3738
@@ -84,6 +85,7 @@
84 """ Backend Adapter for the Magento Invoice """85 """ Backend Adapter for the Magento Invoice """
85 _model_name = 'magento.account.invoice'86 _model_name = 'magento.account.invoice'
86 _magento_model = 'sales_order_invoice'87 _magento_model = 'sales_order_invoice'
88 _admin_path = 'sales_invoice/view/invoice_id/{id}'
8789
88 def _call(self, method, arguments):90 def _call(self, method, arguments):
89 try:91 try:
@@ -248,6 +250,7 @@
248250
249251
250@job252@job
253@related_action(action=unwrap_binding)
251def export_invoice_paid(session, model_name, record_id):254def export_invoice_paid(session, model_name, record_id):
252 """ Deprecated in 2.1.0.dev0. """255 """ Deprecated in 2.1.0.dev0. """
253 _logger.warning('Deprecated: the export_invoice_paid() job is deprecated '256 _logger.warning('Deprecated: the export_invoice_paid() job is deprecated '
@@ -256,6 +259,7 @@
256259
257260
258@job261@job
262@related_action(action=unwrap_binding)
259def export_invoice(session, model_name, record_id):263def export_invoice(session, model_name, record_id):
260 """ Export a validated or paid invoice. """264 """ Export a validated or paid invoice. """
261 invoice = session.browse(model_name, record_id)265 invoice = session.browse(model_name, record_id)
262266
=== modified file 'magentoerpconnect/magento_model.py'
--- magentoerpconnect/magento_model.py 2014-05-06 09:33:40 +0000
+++ magentoerpconnect/magento_model.py 2014-05-19 11:42:35 +0000
@@ -86,6 +86,7 @@
86 'Location',86 'Location',
87 required=True,87 required=True,
88 help="Url to magento application"),88 help="Url to magento application"),
89 'admin_location': fields.char('Admin Location'),
89 'use_custom_api_path': fields.boolean(90 'use_custom_api_path': fields.boolean(
90 'Custom Api Path',91 'Custom Api Path',
91 help="The default API path is '/index.php/api/xmlrpc'. "92 help="The default API path is '/index.php/api/xmlrpc'. "
@@ -517,18 +518,21 @@
517class WebsiteAdapter(GenericAdapter):518class WebsiteAdapter(GenericAdapter):
518 _model_name = 'magento.website'519 _model_name = 'magento.website'
519 _magento_model = 'ol_websites'520 _magento_model = 'ol_websites'
521 _admin_path = 'system_store/editWebsite/website_id/{id}'
520522
521523
522@magento524@magento
523class StoreAdapter(GenericAdapter):525class StoreAdapter(GenericAdapter):
524 _model_name = 'magento.store'526 _model_name = 'magento.store'
525 _magento_model = 'ol_groups'527 _magento_model = 'ol_groups'
528 _admin_path = 'system_store/editGroup/group_id/{id}'
526529
527530
528@magento531@magento
529class StoreviewAdapter(GenericAdapter):532class StoreviewAdapter(GenericAdapter):
530 _model_name = 'magento.storeview'533 _model_name = 'magento.storeview'
531 _magento_model = 'ol_storeviews'534 _magento_model = 'ol_storeviews'
535 _admin_path = 'system_store/editStore/store_id/{id}'
532536
533537
534@magento538@magento
535539
=== modified file 'magentoerpconnect/magento_model_view.xml'
--- magentoerpconnect/magento_model_view.xml 2014-04-04 08:46:16 +0000
+++ magentoerpconnect/magento_model_view.xml 2014-05-19 11:42:35 +0000
@@ -123,6 +123,7 @@
123123
124 <page name="advanced_configuration" string="Advanced Configuration">124 <page name="advanced_configuration" string="Advanced Configuration">
125 <group>125 <group>
126 <field name="admin_location" placeholder="e.g. http://my.magento.com/admin"/>
126 <field name="default_lang_id" widget="selection"/>127 <field name="default_lang_id" widget="selection"/>
127 <field name="default_category_id"/>128 <field name="default_category_id"/>
128 <field name="sale_prefix" placeholder="mag-" />129 <field name="sale_prefix" placeholder="mag-" />
129130
=== modified file 'magentoerpconnect/partner.py'
--- magentoerpconnect/partner.py 2014-04-17 08:40:19 +0000
+++ magentoerpconnect/partner.py 2014-05-19 11:42:35 +0000
@@ -206,6 +206,7 @@
206class PartnerAdapter(GenericAdapter):206class PartnerAdapter(GenericAdapter):
207 _model_name = 'magento.res.partner'207 _model_name = 'magento.res.partner'
208 _magento_model = 'customer'208 _magento_model = 'customer'
209 _admin_path = '/{model}/edit/id/{id}'
209210
210 def _call(self, method, arguments):211 def _call(self, method, arguments):
211 try:212 try:
212213
=== modified file 'magentoerpconnect/partner_category.py'
--- magentoerpconnect/partner_category.py 2013-07-26 09:06:53 +0000
+++ magentoerpconnect/partner_category.py 2014-05-19 11:42:35 +0000
@@ -73,6 +73,7 @@
73class PartnerCategoryAdapter(GenericAdapter):73class PartnerCategoryAdapter(GenericAdapter):
74 _model_name = 'magento.res.partner.category'74 _model_name = 'magento.res.partner.category'
75 _magento_model = 'ol_customer_groups'75 _magento_model = 'ol_customer_groups'
76 _admin_path = '/customer_group/edit/id/{id}'
7677
77 def search(self, filters=None):78 def search(self, filters=None):
78 """ Search records according to some criterias79 """ Search records according to some criterias
7980
=== modified file 'magentoerpconnect/product.py'
--- magentoerpconnect/product.py 2014-05-06 16:20:16 +0000
+++ magentoerpconnect/product.py 2014-05-19 11:42:35 +0000
@@ -27,7 +27,7 @@
27import sys27import sys
28from openerp.osv import orm, fields28from openerp.osv import orm, fields
29from openerp.tools.translate import _29from openerp.tools.translate import _
30from openerp.addons.connector.queue.job import job30from openerp.addons.connector.queue.job import job, related_action
31from openerp.addons.connector.event import on_record_write31from openerp.addons.connector.event import on_record_write
32from openerp.addons.connector.unit.synchronizer import (ImportSynchronizer,32from openerp.addons.connector.unit.synchronizer import (ImportSynchronizer,
33 ExportSynchronizer33 ExportSynchronizer
@@ -49,6 +49,7 @@
49 )49 )
50from .connector import get_environment50from .connector import get_environment
51from .backend import magento51from .backend import magento
52from .related_action import unwrap_binding
5253
53_logger = logging.getLogger(__name__)54_logger = logging.getLogger(__name__)
5455
@@ -176,6 +177,7 @@
176class ProductProductAdapter(GenericAdapter):177class ProductProductAdapter(GenericAdapter):
177 _model_name = 'magento.product.product'178 _model_name = 'magento.product.product'
178 _magento_model = 'catalog_product'179 _magento_model = 'catalog_product'
180 _admin_path = '/{model}/edit/id/{id}'
179181
180 def _call(self, method, arguments):182 def _call(self, method, arguments):
181 try:183 try:
@@ -557,6 +559,7 @@
557559
558560
559@job561@job
562@related_action(action=unwrap_binding)
560def export_product_inventory(session, model_name, record_id, fields=None):563def export_product_inventory(session, model_name, record_id, fields=None):
561 """ Export the inventory configuration and quantity of a product. """564 """ Export the inventory configuration and quantity of a product. """
562 product = session.browse(model_name, record_id)565 product = session.browse(model_name, record_id)
563566
=== modified file 'magentoerpconnect/product_category.py'
--- magentoerpconnect/product_category.py 2013-07-26 09:06:53 +0000
+++ magentoerpconnect/product_category.py 2014-05-19 11:42:35 +0000
@@ -87,6 +87,7 @@
87class ProductCategoryAdapter(GenericAdapter):87class ProductCategoryAdapter(GenericAdapter):
88 _model_name = 'magento.product.category'88 _model_name = 'magento.product.category'
89 _magento_model = 'catalog_category'89 _magento_model = 'catalog_category'
90 _admin_path = '/{model}/index/'
9091
91 def _call(self, method, arguments):92 def _call(self, method, arguments):
92 try:93 try:
9394
=== added file 'magentoerpconnect/related_action.py'
--- magentoerpconnect/related_action.py 1970-01-01 00:00:00 +0000
+++ magentoerpconnect/related_action.py 2014-05-19 11:42:35 +0000
@@ -0,0 +1,65 @@
1# -*- coding: utf-8 -*-
2##############################################################################
3#
4# Author: Guewen Baconnier
5# Copyright 2014 Camptocamp SA
6#
7# This program is free software: you can redistribute it and/or modify
8# it under the terms of the GNU Affero General Public License as
9# published by the Free Software Foundation, either version 3 of the
10# License, or (at your option) any later version.
11#
12# This program is distributed in the hope that it will be useful,
13# but WITHOUT ANY WARRANTY; without even the implied warranty of
14# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15# GNU Affero General Public License for more details.
16#
17# You should have received a copy of the GNU Affero General Public License
18# along with this program. If not, see <http://www.gnu.org/licenses/>.
19#
20##############################################################################
21
22"""
23Related Actions for Magento:
24
25Related actions are associated with jobs.
26When called on a job, they will return an action to the client.
27
28"""
29
30import functools
31from openerp.osv import orm
32from openerp.tools.translate import _
33from openerp.addons.connector import related_action
34from .connector import get_environment
35from .unit.backend_adapter import GenericAdapter
36from .unit.binder import MagentoBinder
37
38unwrap_binding = functools.partial(related_action.unwrap_binding,
39 binder_class=MagentoBinder)
40
41
42def link(session, job, backend_id_pos=2, magento_id_pos=3):
43 """ Open a Magento URL on the admin page to view/edit the record
44 related to the job.
45 """
46 binding_model = job.args[0]
47 # shift one to the left because session is not in job.args
48 backend_id = job.args[backend_id_pos - 1]
49 magento_id = job.args[magento_id_pos - 1]
50 env = get_environment(session, binding_model, backend_id)
51 adapter = env.get_connector_unit(GenericAdapter)
52 try:
53 url = adapter.admin_url(magento_id)
54 except ValueError:
55 raise orm.except_orm(
56 _('Error'),
57 _('No admin URL configured on the backend or '
58 'no admin path is defined for this record.'))
59
60 action = {
61 'type': 'ir.actions.act_url',
62 'target': 'new',
63 'url': url,
64 }
65 return action
066
=== modified file 'magentoerpconnect/sale.py'
--- magentoerpconnect/sale.py 2014-05-06 08:36:26 +0000
+++ magentoerpconnect/sale.py 2014-05-19 11:42:35 +0000
@@ -211,6 +211,7 @@
211class SaleOrderAdapter(GenericAdapter):211class SaleOrderAdapter(GenericAdapter):
212 _model_name = 'magento.sale.order'212 _model_name = 'magento.sale.order'
213 _magento_model = 'sales_order'213 _magento_model = 'sales_order'
214 _admin_path = '{model}/view/order_id/{id}'
214215
215 def _call(self, method, arguments):216 def _call(self, method, arguments):
216 try:217 try:
217218
=== modified file 'magentoerpconnect/stock_picking.py'
--- magentoerpconnect/stock_picking.py 2014-01-14 10:38:32 +0000
+++ magentoerpconnect/stock_picking.py 2014-05-19 11:42:35 +0000
@@ -23,7 +23,7 @@
23import xmlrpclib23import xmlrpclib
24from openerp.osv import orm, fields24from openerp.osv import orm, fields
25from openerp.tools.translate import _25from openerp.tools.translate import _
26from openerp.addons.connector.queue.job import job26from openerp.addons.connector.queue.job import job, related_action
27from openerp.addons.connector.event import on_record_create27from openerp.addons.connector.event import on_record_create
28from openerp.addons.connector.exception import NothingToDoJob28from openerp.addons.connector.exception import NothingToDoJob
29from openerp.addons.connector.unit.synchronizer import ExportSynchronizer29from openerp.addons.connector.unit.synchronizer import ExportSynchronizer
@@ -33,6 +33,7 @@
33from .connector import get_environment33from .connector import get_environment
34from .backend import magento34from .backend import magento
35from .stock_tracking import export_tracking_number35from .stock_tracking import export_tracking_number
36from .related_action import unwrap_binding
3637
37_logger = logging.getLogger(__name__)38_logger = logging.getLogger(__name__)
3839
@@ -99,6 +100,7 @@
99class StockPickingAdapter(GenericAdapter):100class StockPickingAdapter(GenericAdapter):
100 _model_name = 'magento.stock.picking.out'101 _model_name = 'magento.stock.picking.out'
101 _magento_model = 'sales_order_shipment'102 _magento_model = 'sales_order_shipment'
103 _admin_path = 'sales_shipment/view/shipment_id/{id}'
102104
103 def _call(self, method, arguments):105 def _call(self, method, arguments):
104 try:106 try:
@@ -248,6 +250,7 @@
248250
249251
250@job252@job
253@related_action(action=unwrap_binding)
251def export_picking_done(session, model_name, record_id):254def export_picking_done(session, model_name, record_id):
252 """ Export a complete or partial delivery order. """255 """ Export a complete or partial delivery order. """
253 picking = session.browse(model_name, record_id)256 picking = session.browse(model_name, record_id)
254257
=== modified file 'magentoerpconnect/stock_tracking.py'
--- magentoerpconnect/stock_tracking.py 2013-10-12 19:50:31 +0000
+++ magentoerpconnect/stock_tracking.py 2014-05-19 11:42:35 +0000
@@ -21,12 +21,13 @@
2121
22import logging22import logging
23from openerp.tools.translate import _23from openerp.tools.translate import _
24from openerp.addons.connector.queue.job import job24from openerp.addons.connector.queue.job import job, related_action
25from openerp.addons.connector.exception import FailedJobError, NoExternalId25from openerp.addons.connector.exception import FailedJobError, NoExternalId
26from openerp.addons.connector.unit.synchronizer import ExportSynchronizer26from openerp.addons.connector.unit.synchronizer import ExportSynchronizer
27from openerp.addons.connector_ecommerce.event import on_tracking_number_added27from openerp.addons.connector_ecommerce.event import on_tracking_number_added
28from .connector import get_environment28from .connector import get_environment
29from .backend import magento29from .backend import magento
30from .related_action import unwrap_binding
3031
31_logger = logging.getLogger(__name__)32_logger = logging.getLogger(__name__)
3233
@@ -117,6 +118,7 @@
117118
118119
119@job120@job
121@related_action(action=unwrap_binding)
120def export_tracking_number(session, model_name, record_id):122def export_tracking_number(session, model_name, record_id):
121 """ Export the tracking number of a delivery order. """123 """ Export the tracking number of a delivery order. """
122 picking = session.browse(model_name, record_id)124 picking = session.browse(model_name, record_id)
123125
=== modified file 'magentoerpconnect/tests/__init__.py'
--- magentoerpconnect/tests/__init__.py 2014-03-19 10:34:00 +0000
+++ magentoerpconnect/tests/__init__.py 2014-05-19 11:42:35 +0000
@@ -23,6 +23,9 @@
23import test_address_book23import test_address_book
24import test_export_invoice24import test_export_invoice
25import test_import_product_image25import test_import_product_image
26import test_related_action
27
28
26fast_suite = [29fast_suite = [
27]30]
2831
@@ -31,4 +34,5 @@
31 test_address_book,34 test_address_book,
32 test_export_invoice,35 test_export_invoice,
33 test_import_product_image,36 test_import_product_image,
37 test_related_action,
34]38]
3539
=== added file 'magentoerpconnect/tests/test_related_action.py'
--- magentoerpconnect/tests/test_related_action.py 1970-01-01 00:00:00 +0000
+++ magentoerpconnect/tests/test_related_action.py 2014-05-19 11:42:35 +0000
@@ -0,0 +1,98 @@
1# -*- coding: utf-8 -*-
2import mock
3import unittest2
4
5import openerp
6import openerp.tests.common as common
7from openerp.addons.connector.queue.job import (
8 Job,
9 OpenERPJobStorage,
10 related_action)
11from openerp.addons.connector.session import (
12 ConnectorSession)
13from .common import (mock_api,
14 mock_urlopen_image)
15from .test_data import magento_base_responses
16from ..unit.import_synchronizer import import_batch, import_record
17from ..unit.export_synchronizer import export_record
18from ..related_action import unwrap_binding, link
19
20
21class test_related_action_storage(common.TransactionCase):
22 """ Test related actions on stored jobs """
23
24 def setUp(self):
25 super(test_related_action_storage, self).setUp()
26 cr, uid = self.cr, self.uid
27 backend_model = self.registry('magento.backend')
28 self.session = ConnectorSession(cr, uid)
29 warehouse_id = self.ref('stock.warehouse0')
30 backend_id = backend_model.create(
31 cr,
32 uid,
33 {'name': 'Test Magento',
34 'version': '1.7',
35 'location': 'http://anyurl',
36 'username': 'username',
37 'warehouse_id': warehouse_id,
38 'password': '42'})
39 self.backend = backend_model.browse(cr, uid, backend_id)
40 # import the base informations
41 with mock_api(magento_base_responses):
42 import_batch(self.session, 'magento.website', backend_id)
43 import_batch(self.session, 'magento.store', backend_id)
44 import_batch(self.session, 'magento.storeview', backend_id)
45 self.MagentoProduct = self.registry('magento.product.product')
46 self.QueueJob = self.registry('queue.job')
47
48 def test_unwrap_binding(self):
49 """ Open a related action opening an unwrapped binding """
50 cr, uid = self.cr, self.uid
51 product_id = self.ref('product.product_product_7')
52 magento_product_id = self.MagentoProduct.create(
53 cr, uid,
54 {'openerp_id': product_id,
55 'backend_id': self.backend.id})
56 stored = self._create_job(export_record, 'magento.product.product',
57 magento_product_id)
58 expected = {
59 'name': mock.ANY,
60 'type': 'ir.actions.act_window',
61 'view_type': 'form',
62 'view_mode': 'form',
63 'res_id': product_id,
64 'res_model': 'product.product',
65 }
66 self.assertEquals(stored.open_related_action(), expected)
67
68 def _create_job(self, func, *args):
69 cr, uid = self.cr, self.uid
70 job = Job(func=func, args=args)
71 storage = OpenERPJobStorage(self.session)
72 storage.store(job)
73 stored_ids = self.QueueJob.search(self.cr, self.uid,
74 [('uuid', '=', job.uuid)])
75 self.assertEqual(len(stored_ids), 1)
76 return self.QueueJob.browse(cr, uid, stored_ids[0])
77
78 def test_link(self):
79 """ Open a related action opening an url on Magento """
80 self.backend.write({'admin_location': 'http://www.example.com/admin'})
81 self.backend.refresh()
82 stored = self._create_job(import_record, 'magento.product.product',
83 self.backend.id, 123456)
84 expected = {
85 'type': 'ir.actions.act_url',
86 'target': 'new',
87 'url': 'http://www.example.com/admin/catalog_product/edit/id/123456',
88 }
89 self.assertEquals(stored.open_related_action(), expected)
90
91 def test_link_no_location(self):
92 """ Open a related action opening an url but admin location is not configured """
93 self.backend.write({'admin_location': False})
94 self.backend.refresh()
95 stored = self._create_job(import_record, 'magento.product.product',
96 self.backend.id, 123456)
97 with self.assertRaises(openerp.osv.orm.except_orm):
98 stored.open_related_action()
099
=== modified file 'magentoerpconnect/unit/backend_adapter.py'
--- magentoerpconnect/unit/backend_adapter.py 2014-05-06 09:33:40 +0000
+++ magentoerpconnect/unit/backend_adapter.py 2014-05-19 11:42:35 +0000
@@ -182,6 +182,7 @@
182182
183 _model_name = None183 _model_name = None
184 _magento_model = None184 _magento_model = None
185 _admin_path = None
185186
186 def search(self, filters=None):187 def search(self, filters=None):
187 """ Search records according to some criterias188 """ Search records according to some criterias
@@ -228,3 +229,18 @@
228 def delete(self, id):229 def delete(self, id):
229 """ Delete a record on the external system """230 """ Delete a record on the external system """
230 return self._call('%s.delete' % self._magento_model, [int(id)])231 return self._call('%s.delete' % self._magento_model, [int(id)])
232
233 def admin_url(self, id):
234 """ Return the URL in the Magento admin for a record """
235 if self._admin_path is None:
236 raise ValueError('No admin path is defined for this record')
237 backend = self.backend_record
238 url = backend.admin_location
239 if not url:
240 raise ValueError('No admin URL configured on the backend.')
241 path = self._admin_path.format(model=self._magento_model,
242 id=id)
243 url = url.rstrip('/')
244 path = path.lstrip('/')
245 url = '/'.join((url, path))
246 return url
231247
=== modified file 'magentoerpconnect/unit/binder.py'
--- magentoerpconnect/unit/binder.py 2013-11-21 09:34:17 +0000
+++ magentoerpconnect/unit/binder.py 2014-05-19 11:42:35 +0000
@@ -124,3 +124,36 @@
124 {'magento_id': str(external_id),124 {'magento_id': str(external_id),
125 'sync_date': now_fmt},125 'sync_date': now_fmt},
126 context=context)126 context=context)
127
128 def unwrap_binding(self, binding_id, browse=False):
129 """ For a binding record, gives the normal record.
130
131 Example: when called with a ``magento.product.product`` id,
132 it will return the corresponding ``product.product`` id.
133
134 :param browse: when True, returns a browse_record instance
135 rather than an ID
136 """
137 binding = self.session.read(self.model._name, binding_id,
138 ['openerp_id'])
139 openerp_id = binding['openerp_id'][0]
140 if browse:
141 return self.session.browse(self.unwrap_model(),
142 openerp_id)
143 return openerp_id
144
145 def unwrap_model(self):
146 """ For a binding model, gives the name of the normal model.
147
148 Example: when called on a binder for ``magento.product.product``,
149 it will return ``product.product``.
150
151 This binder assumes that the normal model lays in ``openerp_id`` since
152 this is the field we use in the ``_inherits`` bindings.
153 """
154 try:
155 column = self.model._columns['openerp_id']
156 except KeyError:
157 raise ValueError('Cannot unwrap model %s, because it has '
158 'no openerp_id field' % self.model._name)
159 return column._obj
127160
=== modified file 'magentoerpconnect/unit/delete_synchronizer.py'
--- magentoerpconnect/unit/delete_synchronizer.py 2013-03-19 16:53:26 +0000
+++ magentoerpconnect/unit/delete_synchronizer.py 2014-05-19 11:42:35 +0000
@@ -20,9 +20,10 @@
20##############################################################################20##############################################################################
2121
22from openerp.tools.translate import _22from openerp.tools.translate import _
23from openerp.addons.connector.queue.job import job23from openerp.addons.connector.queue.job import job, related_action
24from openerp.addons.connector.unit.synchronizer import DeleteSynchronizer24from openerp.addons.connector.unit.synchronizer import DeleteSynchronizer
25from ..connector import get_environment25from ..connector import get_environment
26from ..related_action import link
2627
2728
28class MagentoDeleteSynchronizer(DeleteSynchronizer):29class MagentoDeleteSynchronizer(DeleteSynchronizer):
@@ -38,6 +39,7 @@
3839
3940
40@job41@job
42@related_action(action=link)
41def export_delete_record(session, model_name, backend_id, magento_id):43def export_delete_record(session, model_name, backend_id, magento_id):
42 """ Delete a record on Magento """44 """ Delete a record on Magento """
43 env = get_environment(session, model_name, backend_id)45 env = get_environment(session, model_name, backend_id)
4446
=== modified file 'magentoerpconnect/unit/export_synchronizer.py'
--- magentoerpconnect/unit/export_synchronizer.py 2014-04-02 14:32:31 +0000
+++ magentoerpconnect/unit/export_synchronizer.py 2014-05-19 11:42:35 +0000
@@ -23,11 +23,12 @@
23from datetime import datetime23from datetime import datetime
24from openerp.tools.translate import _24from openerp.tools.translate import _
25from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT25from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
26from openerp.addons.connector.queue.job import job26from openerp.addons.connector.queue.job import job, related_action
27from openerp.addons.connector.unit.synchronizer import ExportSynchronizer27from openerp.addons.connector.unit.synchronizer import ExportSynchronizer
28from openerp.addons.connector.exception import IDMissingInBackend28from openerp.addons.connector.exception import IDMissingInBackend
29from .import_synchronizer import import_record29from .import_synchronizer import import_record
30from ..connector import get_environment30from ..connector import get_environment
31from ..related_action import unwrap_binding
3132
32_logger = logging.getLogger(__name__)33_logger = logging.getLogger(__name__)
3334
@@ -209,6 +210,7 @@
209210
210211
211@job212@job
213@related_action(action=unwrap_binding)
212def export_record(session, model_name, binding_id, fields=None):214def export_record(session, model_name, binding_id, fields=None):
213 """ Export a record on Magento """215 """ Export a record on Magento """
214 record = session.browse(model_name, binding_id)216 record = session.browse(model_name, binding_id)
215217
=== modified file 'magentoerpconnect/unit/import_synchronizer.py'
--- magentoerpconnect/unit/import_synchronizer.py 2014-03-19 07:31:29 +0000
+++ magentoerpconnect/unit/import_synchronizer.py 2014-05-19 11:42:35 +0000
@@ -23,12 +23,13 @@
23from datetime import datetime23from datetime import datetime
24from openerp.tools.translate import _24from openerp.tools.translate import _
25from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT25from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT
26from openerp.addons.connector.queue.job import job26from openerp.addons.connector.queue.job import job, related_action
27from openerp.addons.connector.connector import ConnectorUnit27from openerp.addons.connector.connector import ConnectorUnit
28from openerp.addons.connector.unit.synchronizer import ImportSynchronizer28from openerp.addons.connector.unit.synchronizer import ImportSynchronizer
29from openerp.addons.connector.exception import IDMissingInBackend29from openerp.addons.connector.exception import IDMissingInBackend
30from ..backend import magento30from ..backend import magento
31from ..connector import get_environment, add_checkpoint31from ..connector import get_environment, add_checkpoint
32from ..related_action import link
3233
33_logger = logging.getLogger(__name__)34_logger = logging.getLogger(__name__)
3435
@@ -359,6 +360,7 @@
359360
360361
361@job362@job
363@related_action(action=link)
362def import_record(session, model_name, backend_id, magento_id, force=False):364def import_record(session, model_name, backend_id, magento_id, force=False):
363 """ Import a record from Magento """365 """ Import a record from Magento """
364 env = get_environment(session, model_name, backend_id)366 env = get_environment(session, model_name, backend_id)
365367
=== modified file 'magentoerpconnect_pricing/product.py'
--- magentoerpconnect_pricing/product.py 2013-07-01 11:20:54 +0000
+++ magentoerpconnect_pricing/product.py 2014-05-19 11:42:35 +0000
@@ -21,7 +21,7 @@
2121
2222
23from openerp.tools.translate import _23from openerp.tools.translate import _
24from openerp.addons.connector.queue.job import job24from openerp.addons.connector.queue.job import job, related_action
25from openerp.addons.connector.exception import FailedJobError25from openerp.addons.connector.exception import FailedJobError
26from openerp.addons.connector.unit.mapper import (mapping,26from openerp.addons.connector.unit.mapper import (mapping,
27 only_create27 only_create
@@ -32,8 +32,12 @@
32from openerp.addons.magentoerpconnect.backend import magento32from openerp.addons.magentoerpconnect.backend import magento
33from openerp.addons.magentoerpconnect import product33from openerp.addons.magentoerpconnect import product
34from openerp.addons.magentoerpconnect.connector import get_environment34from openerp.addons.magentoerpconnect.connector import get_environment
3535from openerp.addons.magentoerpconnect.related_action import (
3636 unwrap_binding,
37)
38
39
40# TODO: replace a price mapper only, not the full mapper
37@magento(replacing=product.ProductImportMapper)41@magento(replacing=product.ProductImportMapper)
38class ProductImportMapper(product.ProductImportMapper):42class ProductImportMapper(product.ProductImportMapper):
39 _model_name = 'magento.product.product'43 _model_name = 'magento.product.product'
@@ -142,6 +146,7 @@
142146
143147
144@job148@job
149@related_action(action=unwrap_binding)
145def export_product_price(session, model_name, record_id, website_id=None):150def export_product_price(session, model_name, record_id, website_id=None):
146 """ Export the price of a product. """151 """ Export the price of a product. """
147 product_bind = session.browse(model_name, record_id)152 product_bind = session.browse(model_name, record_id)

Subscribers

People subscribed via source and target branches

to all changes: