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
- 7.0-next-release-related-actions
- Merge into 7.0-next-release
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 |
Related bugs: |
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:/
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!
- 985. By Guewen Baconnier @ Camptocamp
-
test method name duplicated
- 986. By Guewen Baconnier @ Camptocamp
-
rename unwrap_record to unwrap_binding
David BEAL (ak) (davidbeal) wrote : | # |
Preview Diff
1 | === modified file 'magentoerpconnect/CHANGES.rst' | |||
2 | --- magentoerpconnect/CHANGES.rst 2014-05-06 15:46:57 +0000 | |||
3 | +++ magentoerpconnect/CHANGES.rst 2014-05-19 11:42:35 +0000 | |||
4 | @@ -16,6 +16,8 @@ | |||
5 | 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) |
6 | 17 | * Possibility to exclude products from stock synchronizations | 17 | * Possibility to exclude products from stock synchronizations |
7 | 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. |
8 | 19 | * Related Actions: open the form view on the record concerned by an export job, or open the Magento's admin page | ||
9 | 20 | on importing jobs | ||
10 | 19 | 21 | ||
11 | 20 | 22 | ||
12 | 21 | 2.3.1 (2014-01-23) | 23 | 2.3.1 (2014-01-23) |
13 | 22 | 24 | ||
14 | === modified file 'magentoerpconnect/invoice.py' | |||
15 | --- magentoerpconnect/invoice.py 2014-04-29 14:11:59 +0000 | |||
16 | +++ magentoerpconnect/invoice.py 2014-05-19 11:42:35 +0000 | |||
17 | @@ -23,7 +23,7 @@ | |||
18 | 23 | import xmlrpclib | 23 | import xmlrpclib |
19 | 24 | from openerp.osv import fields, orm | 24 | from openerp.osv import fields, orm |
20 | 25 | from openerp.tools.translate import _ | 25 | from openerp.tools.translate import _ |
22 | 26 | from openerp.addons.connector.queue.job import job | 26 | from openerp.addons.connector.queue.job import job, related_action |
23 | 27 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer | 27 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer |
24 | 28 | from openerp.addons.connector.event import on_record_create | 28 | from openerp.addons.connector.event import on_record_create |
25 | 29 | from openerp.addons.connector_ecommerce.event import (on_invoice_paid, | 29 | from openerp.addons.connector_ecommerce.event import (on_invoice_paid, |
26 | @@ -32,6 +32,7 @@ | |||
27 | 32 | from .unit.backend_adapter import GenericAdapter | 32 | from .unit.backend_adapter import GenericAdapter |
28 | 33 | from .connector import get_environment | 33 | from .connector import get_environment |
29 | 34 | from .backend import magento | 34 | from .backend import magento |
30 | 35 | from .related_action import unwrap_binding | ||
31 | 35 | 36 | ||
32 | 36 | _logger = logging.getLogger(__name__) | 37 | _logger = logging.getLogger(__name__) |
33 | 37 | 38 | ||
34 | @@ -84,6 +85,7 @@ | |||
35 | 84 | """ Backend Adapter for the Magento Invoice """ | 85 | """ Backend Adapter for the Magento Invoice """ |
36 | 85 | _model_name = 'magento.account.invoice' | 86 | _model_name = 'magento.account.invoice' |
37 | 86 | _magento_model = 'sales_order_invoice' | 87 | _magento_model = 'sales_order_invoice' |
38 | 88 | _admin_path = 'sales_invoice/view/invoice_id/{id}' | ||
39 | 87 | 89 | ||
40 | 88 | def _call(self, method, arguments): | 90 | def _call(self, method, arguments): |
41 | 89 | try: | 91 | try: |
42 | @@ -248,6 +250,7 @@ | |||
43 | 248 | 250 | ||
44 | 249 | 251 | ||
45 | 250 | @job | 252 | @job |
46 | 253 | @related_action(action=unwrap_binding) | ||
47 | 251 | def export_invoice_paid(session, model_name, record_id): | 254 | def export_invoice_paid(session, model_name, record_id): |
48 | 252 | """ Deprecated in 2.1.0.dev0. """ | 255 | """ Deprecated in 2.1.0.dev0. """ |
49 | 253 | _logger.warning('Deprecated: the export_invoice_paid() job is deprecated ' | 256 | _logger.warning('Deprecated: the export_invoice_paid() job is deprecated ' |
50 | @@ -256,6 +259,7 @@ | |||
51 | 256 | 259 | ||
52 | 257 | 260 | ||
53 | 258 | @job | 261 | @job |
54 | 262 | @related_action(action=unwrap_binding) | ||
55 | 259 | def export_invoice(session, model_name, record_id): | 263 | def export_invoice(session, model_name, record_id): |
56 | 260 | """ Export a validated or paid invoice. """ | 264 | """ Export a validated or paid invoice. """ |
57 | 261 | invoice = session.browse(model_name, record_id) | 265 | invoice = session.browse(model_name, record_id) |
58 | 262 | 266 | ||
59 | === modified file 'magentoerpconnect/magento_model.py' | |||
60 | --- magentoerpconnect/magento_model.py 2014-05-06 09:33:40 +0000 | |||
61 | +++ magentoerpconnect/magento_model.py 2014-05-19 11:42:35 +0000 | |||
62 | @@ -86,6 +86,7 @@ | |||
63 | 86 | 'Location', | 86 | 'Location', |
64 | 87 | required=True, | 87 | required=True, |
65 | 88 | help="Url to magento application"), | 88 | help="Url to magento application"), |
66 | 89 | 'admin_location': fields.char('Admin Location'), | ||
67 | 89 | 'use_custom_api_path': fields.boolean( | 90 | 'use_custom_api_path': fields.boolean( |
68 | 90 | 'Custom Api Path', | 91 | 'Custom Api Path', |
69 | 91 | help="The default API path is '/index.php/api/xmlrpc'. " | 92 | help="The default API path is '/index.php/api/xmlrpc'. " |
70 | @@ -517,18 +518,21 @@ | |||
71 | 517 | class WebsiteAdapter(GenericAdapter): | 518 | class WebsiteAdapter(GenericAdapter): |
72 | 518 | _model_name = 'magento.website' | 519 | _model_name = 'magento.website' |
73 | 519 | _magento_model = 'ol_websites' | 520 | _magento_model = 'ol_websites' |
74 | 521 | _admin_path = 'system_store/editWebsite/website_id/{id}' | ||
75 | 520 | 522 | ||
76 | 521 | 523 | ||
77 | 522 | @magento | 524 | @magento |
78 | 523 | class StoreAdapter(GenericAdapter): | 525 | class StoreAdapter(GenericAdapter): |
79 | 524 | _model_name = 'magento.store' | 526 | _model_name = 'magento.store' |
80 | 525 | _magento_model = 'ol_groups' | 527 | _magento_model = 'ol_groups' |
81 | 528 | _admin_path = 'system_store/editGroup/group_id/{id}' | ||
82 | 526 | 529 | ||
83 | 527 | 530 | ||
84 | 528 | @magento | 531 | @magento |
85 | 529 | class StoreviewAdapter(GenericAdapter): | 532 | class StoreviewAdapter(GenericAdapter): |
86 | 530 | _model_name = 'magento.storeview' | 533 | _model_name = 'magento.storeview' |
87 | 531 | _magento_model = 'ol_storeviews' | 534 | _magento_model = 'ol_storeviews' |
88 | 535 | _admin_path = 'system_store/editStore/store_id/{id}' | ||
89 | 532 | 536 | ||
90 | 533 | 537 | ||
91 | 534 | @magento | 538 | @magento |
92 | 535 | 539 | ||
93 | === modified file 'magentoerpconnect/magento_model_view.xml' | |||
94 | --- magentoerpconnect/magento_model_view.xml 2014-04-04 08:46:16 +0000 | |||
95 | +++ magentoerpconnect/magento_model_view.xml 2014-05-19 11:42:35 +0000 | |||
96 | @@ -123,6 +123,7 @@ | |||
97 | 123 | 123 | ||
98 | 124 | <page name="advanced_configuration" string="Advanced Configuration"> | 124 | <page name="advanced_configuration" string="Advanced Configuration"> |
99 | 125 | <group> | 125 | <group> |
100 | 126 | <field name="admin_location" placeholder="e.g. http://my.magento.com/admin"/> | ||
101 | 126 | <field name="default_lang_id" widget="selection"/> | 127 | <field name="default_lang_id" widget="selection"/> |
102 | 127 | <field name="default_category_id"/> | 128 | <field name="default_category_id"/> |
103 | 128 | <field name="sale_prefix" placeholder="mag-" /> | 129 | <field name="sale_prefix" placeholder="mag-" /> |
104 | 129 | 130 | ||
105 | === modified file 'magentoerpconnect/partner.py' | |||
106 | --- magentoerpconnect/partner.py 2014-04-17 08:40:19 +0000 | |||
107 | +++ magentoerpconnect/partner.py 2014-05-19 11:42:35 +0000 | |||
108 | @@ -206,6 +206,7 @@ | |||
109 | 206 | class PartnerAdapter(GenericAdapter): | 206 | class PartnerAdapter(GenericAdapter): |
110 | 207 | _model_name = 'magento.res.partner' | 207 | _model_name = 'magento.res.partner' |
111 | 208 | _magento_model = 'customer' | 208 | _magento_model = 'customer' |
112 | 209 | _admin_path = '/{model}/edit/id/{id}' | ||
113 | 209 | 210 | ||
114 | 210 | def _call(self, method, arguments): | 211 | def _call(self, method, arguments): |
115 | 211 | try: | 212 | try: |
116 | 212 | 213 | ||
117 | === modified file 'magentoerpconnect/partner_category.py' | |||
118 | --- magentoerpconnect/partner_category.py 2013-07-26 09:06:53 +0000 | |||
119 | +++ magentoerpconnect/partner_category.py 2014-05-19 11:42:35 +0000 | |||
120 | @@ -73,6 +73,7 @@ | |||
121 | 73 | class PartnerCategoryAdapter(GenericAdapter): | 73 | class PartnerCategoryAdapter(GenericAdapter): |
122 | 74 | _model_name = 'magento.res.partner.category' | 74 | _model_name = 'magento.res.partner.category' |
123 | 75 | _magento_model = 'ol_customer_groups' | 75 | _magento_model = 'ol_customer_groups' |
124 | 76 | _admin_path = '/customer_group/edit/id/{id}' | ||
125 | 76 | 77 | ||
126 | 77 | def search(self, filters=None): | 78 | def search(self, filters=None): |
127 | 78 | """ Search records according to some criterias | 79 | """ Search records according to some criterias |
128 | 79 | 80 | ||
129 | === modified file 'magentoerpconnect/product.py' | |||
130 | --- magentoerpconnect/product.py 2014-05-06 16:20:16 +0000 | |||
131 | +++ magentoerpconnect/product.py 2014-05-19 11:42:35 +0000 | |||
132 | @@ -27,7 +27,7 @@ | |||
133 | 27 | import sys | 27 | import sys |
134 | 28 | from openerp.osv import orm, fields | 28 | from openerp.osv import orm, fields |
135 | 29 | from openerp.tools.translate import _ | 29 | from openerp.tools.translate import _ |
137 | 30 | from openerp.addons.connector.queue.job import job | 30 | from openerp.addons.connector.queue.job import job, related_action |
138 | 31 | from openerp.addons.connector.event import on_record_write | 31 | from openerp.addons.connector.event import on_record_write |
139 | 32 | from openerp.addons.connector.unit.synchronizer import (ImportSynchronizer, | 32 | from openerp.addons.connector.unit.synchronizer import (ImportSynchronizer, |
140 | 33 | ExportSynchronizer | 33 | ExportSynchronizer |
141 | @@ -49,6 +49,7 @@ | |||
142 | 49 | ) | 49 | ) |
143 | 50 | from .connector import get_environment | 50 | from .connector import get_environment |
144 | 51 | from .backend import magento | 51 | from .backend import magento |
145 | 52 | from .related_action import unwrap_binding | ||
146 | 52 | 53 | ||
147 | 53 | _logger = logging.getLogger(__name__) | 54 | _logger = logging.getLogger(__name__) |
148 | 54 | 55 | ||
149 | @@ -176,6 +177,7 @@ | |||
150 | 176 | class ProductProductAdapter(GenericAdapter): | 177 | class ProductProductAdapter(GenericAdapter): |
151 | 177 | _model_name = 'magento.product.product' | 178 | _model_name = 'magento.product.product' |
152 | 178 | _magento_model = 'catalog_product' | 179 | _magento_model = 'catalog_product' |
153 | 180 | _admin_path = '/{model}/edit/id/{id}' | ||
154 | 179 | 181 | ||
155 | 180 | def _call(self, method, arguments): | 182 | def _call(self, method, arguments): |
156 | 181 | try: | 183 | try: |
157 | @@ -557,6 +559,7 @@ | |||
158 | 557 | 559 | ||
159 | 558 | 560 | ||
160 | 559 | @job | 561 | @job |
161 | 562 | @related_action(action=unwrap_binding) | ||
162 | 560 | def export_product_inventory(session, model_name, record_id, fields=None): | 563 | def export_product_inventory(session, model_name, record_id, fields=None): |
163 | 561 | """ Export the inventory configuration and quantity of a product. """ | 564 | """ Export the inventory configuration and quantity of a product. """ |
164 | 562 | product = session.browse(model_name, record_id) | 565 | product = session.browse(model_name, record_id) |
165 | 563 | 566 | ||
166 | === modified file 'magentoerpconnect/product_category.py' | |||
167 | --- magentoerpconnect/product_category.py 2013-07-26 09:06:53 +0000 | |||
168 | +++ magentoerpconnect/product_category.py 2014-05-19 11:42:35 +0000 | |||
169 | @@ -87,6 +87,7 @@ | |||
170 | 87 | class ProductCategoryAdapter(GenericAdapter): | 87 | class ProductCategoryAdapter(GenericAdapter): |
171 | 88 | _model_name = 'magento.product.category' | 88 | _model_name = 'magento.product.category' |
172 | 89 | _magento_model = 'catalog_category' | 89 | _magento_model = 'catalog_category' |
173 | 90 | _admin_path = '/{model}/index/' | ||
174 | 90 | 91 | ||
175 | 91 | def _call(self, method, arguments): | 92 | def _call(self, method, arguments): |
176 | 92 | try: | 93 | try: |
177 | 93 | 94 | ||
178 | === added file 'magentoerpconnect/related_action.py' | |||
179 | --- magentoerpconnect/related_action.py 1970-01-01 00:00:00 +0000 | |||
180 | +++ magentoerpconnect/related_action.py 2014-05-19 11:42:35 +0000 | |||
181 | @@ -0,0 +1,65 @@ | |||
182 | 1 | # -*- coding: utf-8 -*- | ||
183 | 2 | ############################################################################## | ||
184 | 3 | # | ||
185 | 4 | # Author: Guewen Baconnier | ||
186 | 5 | # Copyright 2014 Camptocamp SA | ||
187 | 6 | # | ||
188 | 7 | # This program is free software: you can redistribute it and/or modify | ||
189 | 8 | # it under the terms of the GNU Affero General Public License as | ||
190 | 9 | # published by the Free Software Foundation, either version 3 of the | ||
191 | 10 | # License, or (at your option) any later version. | ||
192 | 11 | # | ||
193 | 12 | # This program is distributed in the hope that it will be useful, | ||
194 | 13 | # but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
195 | 14 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
196 | 15 | # GNU Affero General Public License for more details. | ||
197 | 16 | # | ||
198 | 17 | # You should have received a copy of the GNU Affero General Public License | ||
199 | 18 | # along with this program. If not, see <http://www.gnu.org/licenses/>. | ||
200 | 19 | # | ||
201 | 20 | ############################################################################## | ||
202 | 21 | |||
203 | 22 | """ | ||
204 | 23 | Related Actions for Magento: | ||
205 | 24 | |||
206 | 25 | Related actions are associated with jobs. | ||
207 | 26 | When called on a job, they will return an action to the client. | ||
208 | 27 | |||
209 | 28 | """ | ||
210 | 29 | |||
211 | 30 | import functools | ||
212 | 31 | from openerp.osv import orm | ||
213 | 32 | from openerp.tools.translate import _ | ||
214 | 33 | from openerp.addons.connector import related_action | ||
215 | 34 | from .connector import get_environment | ||
216 | 35 | from .unit.backend_adapter import GenericAdapter | ||
217 | 36 | from .unit.binder import MagentoBinder | ||
218 | 37 | |||
219 | 38 | unwrap_binding = functools.partial(related_action.unwrap_binding, | ||
220 | 39 | binder_class=MagentoBinder) | ||
221 | 40 | |||
222 | 41 | |||
223 | 42 | def link(session, job, backend_id_pos=2, magento_id_pos=3): | ||
224 | 43 | """ Open a Magento URL on the admin page to view/edit the record | ||
225 | 44 | related to the job. | ||
226 | 45 | """ | ||
227 | 46 | binding_model = job.args[0] | ||
228 | 47 | # shift one to the left because session is not in job.args | ||
229 | 48 | backend_id = job.args[backend_id_pos - 1] | ||
230 | 49 | magento_id = job.args[magento_id_pos - 1] | ||
231 | 50 | env = get_environment(session, binding_model, backend_id) | ||
232 | 51 | adapter = env.get_connector_unit(GenericAdapter) | ||
233 | 52 | try: | ||
234 | 53 | url = adapter.admin_url(magento_id) | ||
235 | 54 | except ValueError: | ||
236 | 55 | raise orm.except_orm( | ||
237 | 56 | _('Error'), | ||
238 | 57 | _('No admin URL configured on the backend or ' | ||
239 | 58 | 'no admin path is defined for this record.')) | ||
240 | 59 | |||
241 | 60 | action = { | ||
242 | 61 | 'type': 'ir.actions.act_url', | ||
243 | 62 | 'target': 'new', | ||
244 | 63 | 'url': url, | ||
245 | 64 | } | ||
246 | 65 | return action | ||
247 | 0 | 66 | ||
248 | === modified file 'magentoerpconnect/sale.py' | |||
249 | --- magentoerpconnect/sale.py 2014-05-06 08:36:26 +0000 | |||
250 | +++ magentoerpconnect/sale.py 2014-05-19 11:42:35 +0000 | |||
251 | @@ -211,6 +211,7 @@ | |||
252 | 211 | class SaleOrderAdapter(GenericAdapter): | 211 | class SaleOrderAdapter(GenericAdapter): |
253 | 212 | _model_name = 'magento.sale.order' | 212 | _model_name = 'magento.sale.order' |
254 | 213 | _magento_model = 'sales_order' | 213 | _magento_model = 'sales_order' |
255 | 214 | _admin_path = '{model}/view/order_id/{id}' | ||
256 | 214 | 215 | ||
257 | 215 | def _call(self, method, arguments): | 216 | def _call(self, method, arguments): |
258 | 216 | try: | 217 | try: |
259 | 217 | 218 | ||
260 | === modified file 'magentoerpconnect/stock_picking.py' | |||
261 | --- magentoerpconnect/stock_picking.py 2014-01-14 10:38:32 +0000 | |||
262 | +++ magentoerpconnect/stock_picking.py 2014-05-19 11:42:35 +0000 | |||
263 | @@ -23,7 +23,7 @@ | |||
264 | 23 | import xmlrpclib | 23 | import xmlrpclib |
265 | 24 | from openerp.osv import orm, fields | 24 | from openerp.osv import orm, fields |
266 | 25 | from openerp.tools.translate import _ | 25 | from openerp.tools.translate import _ |
268 | 26 | from openerp.addons.connector.queue.job import job | 26 | from openerp.addons.connector.queue.job import job, related_action |
269 | 27 | from openerp.addons.connector.event import on_record_create | 27 | from openerp.addons.connector.event import on_record_create |
270 | 28 | from openerp.addons.connector.exception import NothingToDoJob | 28 | from openerp.addons.connector.exception import NothingToDoJob |
271 | 29 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer | 29 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer |
272 | @@ -33,6 +33,7 @@ | |||
273 | 33 | from .connector import get_environment | 33 | from .connector import get_environment |
274 | 34 | from .backend import magento | 34 | from .backend import magento |
275 | 35 | from .stock_tracking import export_tracking_number | 35 | from .stock_tracking import export_tracking_number |
276 | 36 | from .related_action import unwrap_binding | ||
277 | 36 | 37 | ||
278 | 37 | _logger = logging.getLogger(__name__) | 38 | _logger = logging.getLogger(__name__) |
279 | 38 | 39 | ||
280 | @@ -99,6 +100,7 @@ | |||
281 | 99 | class StockPickingAdapter(GenericAdapter): | 100 | class StockPickingAdapter(GenericAdapter): |
282 | 100 | _model_name = 'magento.stock.picking.out' | 101 | _model_name = 'magento.stock.picking.out' |
283 | 101 | _magento_model = 'sales_order_shipment' | 102 | _magento_model = 'sales_order_shipment' |
284 | 103 | _admin_path = 'sales_shipment/view/shipment_id/{id}' | ||
285 | 102 | 104 | ||
286 | 103 | def _call(self, method, arguments): | 105 | def _call(self, method, arguments): |
287 | 104 | try: | 106 | try: |
288 | @@ -248,6 +250,7 @@ | |||
289 | 248 | 250 | ||
290 | 249 | 251 | ||
291 | 250 | @job | 252 | @job |
292 | 253 | @related_action(action=unwrap_binding) | ||
293 | 251 | def export_picking_done(session, model_name, record_id): | 254 | def export_picking_done(session, model_name, record_id): |
294 | 252 | """ Export a complete or partial delivery order. """ | 255 | """ Export a complete or partial delivery order. """ |
295 | 253 | picking = session.browse(model_name, record_id) | 256 | picking = session.browse(model_name, record_id) |
296 | 254 | 257 | ||
297 | === modified file 'magentoerpconnect/stock_tracking.py' | |||
298 | --- magentoerpconnect/stock_tracking.py 2013-10-12 19:50:31 +0000 | |||
299 | +++ magentoerpconnect/stock_tracking.py 2014-05-19 11:42:35 +0000 | |||
300 | @@ -21,12 +21,13 @@ | |||
301 | 21 | 21 | ||
302 | 22 | import logging | 22 | import logging |
303 | 23 | from openerp.tools.translate import _ | 23 | from openerp.tools.translate import _ |
305 | 24 | from openerp.addons.connector.queue.job import job | 24 | from openerp.addons.connector.queue.job import job, related_action |
306 | 25 | from openerp.addons.connector.exception import FailedJobError, NoExternalId | 25 | from openerp.addons.connector.exception import FailedJobError, NoExternalId |
307 | 26 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer | 26 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer |
308 | 27 | from openerp.addons.connector_ecommerce.event import on_tracking_number_added | 27 | from openerp.addons.connector_ecommerce.event import on_tracking_number_added |
309 | 28 | from .connector import get_environment | 28 | from .connector import get_environment |
310 | 29 | from .backend import magento | 29 | from .backend import magento |
311 | 30 | from .related_action import unwrap_binding | ||
312 | 30 | 31 | ||
313 | 31 | _logger = logging.getLogger(__name__) | 32 | _logger = logging.getLogger(__name__) |
314 | 32 | 33 | ||
315 | @@ -117,6 +118,7 @@ | |||
316 | 117 | 118 | ||
317 | 118 | 119 | ||
318 | 119 | @job | 120 | @job |
319 | 121 | @related_action(action=unwrap_binding) | ||
320 | 120 | def export_tracking_number(session, model_name, record_id): | 122 | def export_tracking_number(session, model_name, record_id): |
321 | 121 | """ Export the tracking number of a delivery order. """ | 123 | """ Export the tracking number of a delivery order. """ |
322 | 122 | picking = session.browse(model_name, record_id) | 124 | picking = session.browse(model_name, record_id) |
323 | 123 | 125 | ||
324 | === modified file 'magentoerpconnect/tests/__init__.py' | |||
325 | --- magentoerpconnect/tests/__init__.py 2014-03-19 10:34:00 +0000 | |||
326 | +++ magentoerpconnect/tests/__init__.py 2014-05-19 11:42:35 +0000 | |||
327 | @@ -23,6 +23,9 @@ | |||
328 | 23 | import test_address_book | 23 | import test_address_book |
329 | 24 | import test_export_invoice | 24 | import test_export_invoice |
330 | 25 | import test_import_product_image | 25 | import test_import_product_image |
331 | 26 | import test_related_action | ||
332 | 27 | |||
333 | 28 | |||
334 | 26 | fast_suite = [ | 29 | fast_suite = [ |
335 | 27 | ] | 30 | ] |
336 | 28 | 31 | ||
337 | @@ -31,4 +34,5 @@ | |||
338 | 31 | test_address_book, | 34 | test_address_book, |
339 | 32 | test_export_invoice, | 35 | test_export_invoice, |
340 | 33 | test_import_product_image, | 36 | test_import_product_image, |
341 | 37 | test_related_action, | ||
342 | 34 | ] | 38 | ] |
343 | 35 | 39 | ||
344 | === added file 'magentoerpconnect/tests/test_related_action.py' | |||
345 | --- magentoerpconnect/tests/test_related_action.py 1970-01-01 00:00:00 +0000 | |||
346 | +++ magentoerpconnect/tests/test_related_action.py 2014-05-19 11:42:35 +0000 | |||
347 | @@ -0,0 +1,98 @@ | |||
348 | 1 | # -*- coding: utf-8 -*- | ||
349 | 2 | import mock | ||
350 | 3 | import unittest2 | ||
351 | 4 | |||
352 | 5 | import openerp | ||
353 | 6 | import openerp.tests.common as common | ||
354 | 7 | from openerp.addons.connector.queue.job import ( | ||
355 | 8 | Job, | ||
356 | 9 | OpenERPJobStorage, | ||
357 | 10 | related_action) | ||
358 | 11 | from openerp.addons.connector.session import ( | ||
359 | 12 | ConnectorSession) | ||
360 | 13 | from .common import (mock_api, | ||
361 | 14 | mock_urlopen_image) | ||
362 | 15 | from .test_data import magento_base_responses | ||
363 | 16 | from ..unit.import_synchronizer import import_batch, import_record | ||
364 | 17 | from ..unit.export_synchronizer import export_record | ||
365 | 18 | from ..related_action import unwrap_binding, link | ||
366 | 19 | |||
367 | 20 | |||
368 | 21 | class test_related_action_storage(common.TransactionCase): | ||
369 | 22 | """ Test related actions on stored jobs """ | ||
370 | 23 | |||
371 | 24 | def setUp(self): | ||
372 | 25 | super(test_related_action_storage, self).setUp() | ||
373 | 26 | cr, uid = self.cr, self.uid | ||
374 | 27 | backend_model = self.registry('magento.backend') | ||
375 | 28 | self.session = ConnectorSession(cr, uid) | ||
376 | 29 | warehouse_id = self.ref('stock.warehouse0') | ||
377 | 30 | backend_id = backend_model.create( | ||
378 | 31 | cr, | ||
379 | 32 | uid, | ||
380 | 33 | {'name': 'Test Magento', | ||
381 | 34 | 'version': '1.7', | ||
382 | 35 | 'location': 'http://anyurl', | ||
383 | 36 | 'username': 'username', | ||
384 | 37 | 'warehouse_id': warehouse_id, | ||
385 | 38 | 'password': '42'}) | ||
386 | 39 | self.backend = backend_model.browse(cr, uid, backend_id) | ||
387 | 40 | # import the base informations | ||
388 | 41 | with mock_api(magento_base_responses): | ||
389 | 42 | import_batch(self.session, 'magento.website', backend_id) | ||
390 | 43 | import_batch(self.session, 'magento.store', backend_id) | ||
391 | 44 | import_batch(self.session, 'magento.storeview', backend_id) | ||
392 | 45 | self.MagentoProduct = self.registry('magento.product.product') | ||
393 | 46 | self.QueueJob = self.registry('queue.job') | ||
394 | 47 | |||
395 | 48 | def test_unwrap_binding(self): | ||
396 | 49 | """ Open a related action opening an unwrapped binding """ | ||
397 | 50 | cr, uid = self.cr, self.uid | ||
398 | 51 | product_id = self.ref('product.product_product_7') | ||
399 | 52 | magento_product_id = self.MagentoProduct.create( | ||
400 | 53 | cr, uid, | ||
401 | 54 | {'openerp_id': product_id, | ||
402 | 55 | 'backend_id': self.backend.id}) | ||
403 | 56 | stored = self._create_job(export_record, 'magento.product.product', | ||
404 | 57 | magento_product_id) | ||
405 | 58 | expected = { | ||
406 | 59 | 'name': mock.ANY, | ||
407 | 60 | 'type': 'ir.actions.act_window', | ||
408 | 61 | 'view_type': 'form', | ||
409 | 62 | 'view_mode': 'form', | ||
410 | 63 | 'res_id': product_id, | ||
411 | 64 | 'res_model': 'product.product', | ||
412 | 65 | } | ||
413 | 66 | self.assertEquals(stored.open_related_action(), expected) | ||
414 | 67 | |||
415 | 68 | def _create_job(self, func, *args): | ||
416 | 69 | cr, uid = self.cr, self.uid | ||
417 | 70 | job = Job(func=func, args=args) | ||
418 | 71 | storage = OpenERPJobStorage(self.session) | ||
419 | 72 | storage.store(job) | ||
420 | 73 | stored_ids = self.QueueJob.search(self.cr, self.uid, | ||
421 | 74 | [('uuid', '=', job.uuid)]) | ||
422 | 75 | self.assertEqual(len(stored_ids), 1) | ||
423 | 76 | return self.QueueJob.browse(cr, uid, stored_ids[0]) | ||
424 | 77 | |||
425 | 78 | def test_link(self): | ||
426 | 79 | """ Open a related action opening an url on Magento """ | ||
427 | 80 | self.backend.write({'admin_location': 'http://www.example.com/admin'}) | ||
428 | 81 | self.backend.refresh() | ||
429 | 82 | stored = self._create_job(import_record, 'magento.product.product', | ||
430 | 83 | self.backend.id, 123456) | ||
431 | 84 | expected = { | ||
432 | 85 | 'type': 'ir.actions.act_url', | ||
433 | 86 | 'target': 'new', | ||
434 | 87 | 'url': 'http://www.example.com/admin/catalog_product/edit/id/123456', | ||
435 | 88 | } | ||
436 | 89 | self.assertEquals(stored.open_related_action(), expected) | ||
437 | 90 | |||
438 | 91 | def test_link_no_location(self): | ||
439 | 92 | """ Open a related action opening an url but admin location is not configured """ | ||
440 | 93 | self.backend.write({'admin_location': False}) | ||
441 | 94 | self.backend.refresh() | ||
442 | 95 | stored = self._create_job(import_record, 'magento.product.product', | ||
443 | 96 | self.backend.id, 123456) | ||
444 | 97 | with self.assertRaises(openerp.osv.orm.except_orm): | ||
445 | 98 | stored.open_related_action() | ||
446 | 0 | 99 | ||
447 | === modified file 'magentoerpconnect/unit/backend_adapter.py' | |||
448 | --- magentoerpconnect/unit/backend_adapter.py 2014-05-06 09:33:40 +0000 | |||
449 | +++ magentoerpconnect/unit/backend_adapter.py 2014-05-19 11:42:35 +0000 | |||
450 | @@ -182,6 +182,7 @@ | |||
451 | 182 | 182 | ||
452 | 183 | _model_name = None | 183 | _model_name = None |
453 | 184 | _magento_model = None | 184 | _magento_model = None |
454 | 185 | _admin_path = None | ||
455 | 185 | 186 | ||
456 | 186 | def search(self, filters=None): | 187 | def search(self, filters=None): |
457 | 187 | """ Search records according to some criterias | 188 | """ Search records according to some criterias |
458 | @@ -228,3 +229,18 @@ | |||
459 | 228 | def delete(self, id): | 229 | def delete(self, id): |
460 | 229 | """ Delete a record on the external system """ | 230 | """ Delete a record on the external system """ |
461 | 230 | return self._call('%s.delete' % self._magento_model, [int(id)]) | 231 | return self._call('%s.delete' % self._magento_model, [int(id)]) |
462 | 232 | |||
463 | 233 | def admin_url(self, id): | ||
464 | 234 | """ Return the URL in the Magento admin for a record """ | ||
465 | 235 | if self._admin_path is None: | ||
466 | 236 | raise ValueError('No admin path is defined for this record') | ||
467 | 237 | backend = self.backend_record | ||
468 | 238 | url = backend.admin_location | ||
469 | 239 | if not url: | ||
470 | 240 | raise ValueError('No admin URL configured on the backend.') | ||
471 | 241 | path = self._admin_path.format(model=self._magento_model, | ||
472 | 242 | id=id) | ||
473 | 243 | url = url.rstrip('/') | ||
474 | 244 | path = path.lstrip('/') | ||
475 | 245 | url = '/'.join((url, path)) | ||
476 | 246 | return url | ||
477 | 231 | 247 | ||
478 | === modified file 'magentoerpconnect/unit/binder.py' | |||
479 | --- magentoerpconnect/unit/binder.py 2013-11-21 09:34:17 +0000 | |||
480 | +++ magentoerpconnect/unit/binder.py 2014-05-19 11:42:35 +0000 | |||
481 | @@ -124,3 +124,36 @@ | |||
482 | 124 | {'magento_id': str(external_id), | 124 | {'magento_id': str(external_id), |
483 | 125 | 'sync_date': now_fmt}, | 125 | 'sync_date': now_fmt}, |
484 | 126 | context=context) | 126 | context=context) |
485 | 127 | |||
486 | 128 | def unwrap_binding(self, binding_id, browse=False): | ||
487 | 129 | """ For a binding record, gives the normal record. | ||
488 | 130 | |||
489 | 131 | Example: when called with a ``magento.product.product`` id, | ||
490 | 132 | it will return the corresponding ``product.product`` id. | ||
491 | 133 | |||
492 | 134 | :param browse: when True, returns a browse_record instance | ||
493 | 135 | rather than an ID | ||
494 | 136 | """ | ||
495 | 137 | binding = self.session.read(self.model._name, binding_id, | ||
496 | 138 | ['openerp_id']) | ||
497 | 139 | openerp_id = binding['openerp_id'][0] | ||
498 | 140 | if browse: | ||
499 | 141 | return self.session.browse(self.unwrap_model(), | ||
500 | 142 | openerp_id) | ||
501 | 143 | return openerp_id | ||
502 | 144 | |||
503 | 145 | def unwrap_model(self): | ||
504 | 146 | """ For a binding model, gives the name of the normal model. | ||
505 | 147 | |||
506 | 148 | Example: when called on a binder for ``magento.product.product``, | ||
507 | 149 | it will return ``product.product``. | ||
508 | 150 | |||
509 | 151 | This binder assumes that the normal model lays in ``openerp_id`` since | ||
510 | 152 | this is the field we use in the ``_inherits`` bindings. | ||
511 | 153 | """ | ||
512 | 154 | try: | ||
513 | 155 | column = self.model._columns['openerp_id'] | ||
514 | 156 | except KeyError: | ||
515 | 157 | raise ValueError('Cannot unwrap model %s, because it has ' | ||
516 | 158 | 'no openerp_id field' % self.model._name) | ||
517 | 159 | return column._obj | ||
518 | 127 | 160 | ||
519 | === modified file 'magentoerpconnect/unit/delete_synchronizer.py' | |||
520 | --- magentoerpconnect/unit/delete_synchronizer.py 2013-03-19 16:53:26 +0000 | |||
521 | +++ magentoerpconnect/unit/delete_synchronizer.py 2014-05-19 11:42:35 +0000 | |||
522 | @@ -20,9 +20,10 @@ | |||
523 | 20 | ############################################################################## | 20 | ############################################################################## |
524 | 21 | 21 | ||
525 | 22 | from openerp.tools.translate import _ | 22 | from openerp.tools.translate import _ |
527 | 23 | from openerp.addons.connector.queue.job import job | 23 | from openerp.addons.connector.queue.job import job, related_action |
528 | 24 | from openerp.addons.connector.unit.synchronizer import DeleteSynchronizer | 24 | from openerp.addons.connector.unit.synchronizer import DeleteSynchronizer |
529 | 25 | from ..connector import get_environment | 25 | from ..connector import get_environment |
530 | 26 | from ..related_action import link | ||
531 | 26 | 27 | ||
532 | 27 | 28 | ||
533 | 28 | class MagentoDeleteSynchronizer(DeleteSynchronizer): | 29 | class MagentoDeleteSynchronizer(DeleteSynchronizer): |
534 | @@ -38,6 +39,7 @@ | |||
535 | 38 | 39 | ||
536 | 39 | 40 | ||
537 | 40 | @job | 41 | @job |
538 | 42 | @related_action(action=link) | ||
539 | 41 | def export_delete_record(session, model_name, backend_id, magento_id): | 43 | def export_delete_record(session, model_name, backend_id, magento_id): |
540 | 42 | """ Delete a record on Magento """ | 44 | """ Delete a record on Magento """ |
541 | 43 | env = get_environment(session, model_name, backend_id) | 45 | env = get_environment(session, model_name, backend_id) |
542 | 44 | 46 | ||
543 | === modified file 'magentoerpconnect/unit/export_synchronizer.py' | |||
544 | --- magentoerpconnect/unit/export_synchronizer.py 2014-04-02 14:32:31 +0000 | |||
545 | +++ magentoerpconnect/unit/export_synchronizer.py 2014-05-19 11:42:35 +0000 | |||
546 | @@ -23,11 +23,12 @@ | |||
547 | 23 | from datetime import datetime | 23 | from datetime import datetime |
548 | 24 | from openerp.tools.translate import _ | 24 | from openerp.tools.translate import _ |
549 | 25 | from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT | 25 | from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT |
551 | 26 | from openerp.addons.connector.queue.job import job | 26 | from openerp.addons.connector.queue.job import job, related_action |
552 | 27 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer | 27 | from openerp.addons.connector.unit.synchronizer import ExportSynchronizer |
553 | 28 | from openerp.addons.connector.exception import IDMissingInBackend | 28 | from openerp.addons.connector.exception import IDMissingInBackend |
554 | 29 | from .import_synchronizer import import_record | 29 | from .import_synchronizer import import_record |
555 | 30 | from ..connector import get_environment | 30 | from ..connector import get_environment |
556 | 31 | from ..related_action import unwrap_binding | ||
557 | 31 | 32 | ||
558 | 32 | _logger = logging.getLogger(__name__) | 33 | _logger = logging.getLogger(__name__) |
559 | 33 | 34 | ||
560 | @@ -209,6 +210,7 @@ | |||
561 | 209 | 210 | ||
562 | 210 | 211 | ||
563 | 211 | @job | 212 | @job |
564 | 213 | @related_action(action=unwrap_binding) | ||
565 | 212 | def export_record(session, model_name, binding_id, fields=None): | 214 | def export_record(session, model_name, binding_id, fields=None): |
566 | 213 | """ Export a record on Magento """ | 215 | """ Export a record on Magento """ |
567 | 214 | record = session.browse(model_name, binding_id) | 216 | record = session.browse(model_name, binding_id) |
568 | 215 | 217 | ||
569 | === modified file 'magentoerpconnect/unit/import_synchronizer.py' | |||
570 | --- magentoerpconnect/unit/import_synchronizer.py 2014-03-19 07:31:29 +0000 | |||
571 | +++ magentoerpconnect/unit/import_synchronizer.py 2014-05-19 11:42:35 +0000 | |||
572 | @@ -23,12 +23,13 @@ | |||
573 | 23 | from datetime import datetime | 23 | from datetime import datetime |
574 | 24 | from openerp.tools.translate import _ | 24 | from openerp.tools.translate import _ |
575 | 25 | from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT | 25 | from openerp.tools import DEFAULT_SERVER_DATETIME_FORMAT |
577 | 26 | from openerp.addons.connector.queue.job import job | 26 | from openerp.addons.connector.queue.job import job, related_action |
578 | 27 | from openerp.addons.connector.connector import ConnectorUnit | 27 | from openerp.addons.connector.connector import ConnectorUnit |
579 | 28 | from openerp.addons.connector.unit.synchronizer import ImportSynchronizer | 28 | from openerp.addons.connector.unit.synchronizer import ImportSynchronizer |
580 | 29 | from openerp.addons.connector.exception import IDMissingInBackend | 29 | from openerp.addons.connector.exception import IDMissingInBackend |
581 | 30 | from ..backend import magento | 30 | from ..backend import magento |
582 | 31 | from ..connector import get_environment, add_checkpoint | 31 | from ..connector import get_environment, add_checkpoint |
583 | 32 | from ..related_action import link | ||
584 | 32 | 33 | ||
585 | 33 | _logger = logging.getLogger(__name__) | 34 | _logger = logging.getLogger(__name__) |
586 | 34 | 35 | ||
587 | @@ -359,6 +360,7 @@ | |||
588 | 359 | 360 | ||
589 | 360 | 361 | ||
590 | 361 | @job | 362 | @job |
591 | 363 | @related_action(action=link) | ||
592 | 362 | def import_record(session, model_name, backend_id, magento_id, force=False): | 364 | def import_record(session, model_name, backend_id, magento_id, force=False): |
593 | 363 | """ Import a record from Magento """ | 365 | """ Import a record from Magento """ |
594 | 364 | env = get_environment(session, model_name, backend_id) | 366 | env = get_environment(session, model_name, backend_id) |
595 | 365 | 367 | ||
596 | === modified file 'magentoerpconnect_pricing/product.py' | |||
597 | --- magentoerpconnect_pricing/product.py 2013-07-01 11:20:54 +0000 | |||
598 | +++ magentoerpconnect_pricing/product.py 2014-05-19 11:42:35 +0000 | |||
599 | @@ -21,7 +21,7 @@ | |||
600 | 21 | 21 | ||
601 | 22 | 22 | ||
602 | 23 | from openerp.tools.translate import _ | 23 | from openerp.tools.translate import _ |
604 | 24 | from openerp.addons.connector.queue.job import job | 24 | from openerp.addons.connector.queue.job import job, related_action |
605 | 25 | from openerp.addons.connector.exception import FailedJobError | 25 | from openerp.addons.connector.exception import FailedJobError |
606 | 26 | from openerp.addons.connector.unit.mapper import (mapping, | 26 | from openerp.addons.connector.unit.mapper import (mapping, |
607 | 27 | only_create | 27 | only_create |
608 | @@ -32,8 +32,12 @@ | |||
609 | 32 | from openerp.addons.magentoerpconnect.backend import magento | 32 | from openerp.addons.magentoerpconnect.backend import magento |
610 | 33 | from openerp.addons.magentoerpconnect import product | 33 | from openerp.addons.magentoerpconnect import product |
611 | 34 | from openerp.addons.magentoerpconnect.connector import get_environment | 34 | from openerp.addons.magentoerpconnect.connector import get_environment |
614 | 35 | 35 | from openerp.addons.magentoerpconnect.related_action import ( | |
615 | 36 | 36 | unwrap_binding, | |
616 | 37 | ) | ||
617 | 38 | |||
618 | 39 | |||
619 | 40 | # TODO: replace a price mapper only, not the full mapper | ||
620 | 37 | @magento(replacing=product.ProductImportMapper) | 41 | @magento(replacing=product.ProductImportMapper) |
621 | 38 | class ProductImportMapper(product.ProductImportMapper): | 42 | class ProductImportMapper(product.ProductImportMapper): |
622 | 39 | _model_name = 'magento.product.product' | 43 | _model_name = 'magento.product.product' |
623 | @@ -142,6 +146,7 @@ | |||
624 | 142 | 146 | ||
625 | 143 | 147 | ||
626 | 144 | @job | 148 | @job |
627 | 149 | @related_action(action=unwrap_binding) | ||
628 | 145 | def export_product_price(session, model_name, record_id, website_id=None): | 150 | def export_product_price(session, model_name, record_id, website_id=None): |
629 | 146 | """ Export the price of a product. """ | 151 | """ Export the price of a product. """ |
630 | 147 | product_bind = session.browse(model_name, record_id) | 152 | product_bind = session.browse(model_name, record_id) |
Really, really usefull feature
Nice Guewen
Thank you