Merge lp:~red15/magentoerpconnect/fix-magentoerp-logging into lp:magentoerpconnect/oerp6.1-oldstable

Proposed by Niels Huylebroeck on 2012-05-25
Status: Merged
Merge reported by: Guewen Baconnier @ Camptocamp
Merged at revision: not available
Proposed branch: lp:~red15/magentoerpconnect/fix-magentoerp-logging
Merge into: lp:magentoerpconnect/oerp6.1-oldstable
Diff against target: 965 lines (+135/-137)
6 files modified
magentoerpconnect/magerp_core.py (+4/-5)
magentoerpconnect/magerp_osv.py (+30/-30)
magentoerpconnect/product.py (+53/-55)
magentoerpconnect/product_images.py (+14/-14)
magentoerpconnect/sale.py (+25/-24)
magentoerpconnect/stock.py (+9/-9)
To merge this branch: bzr merge lp:~red15/magentoerpconnect/fix-magentoerp-logging
Reviewer Review Type Date Requested Status
Guewen Baconnier @ Camptocamp 2012-05-25 Approve on 2012-05-25
Review via email: mp+107348@code.launchpad.net

Description of the change

Replaced all logging calls for modules contained in the magentoerp branch, there are more modules that need fixing but they would have to be pulled into this branch first I suppose?

To post a comment you must log in.

Thanks for your contribution !
It's merged

review: Approve
634. By Niels Huylebroeck on 2012-05-25

[MRG] Replaced all netsvc.Logger() calls with the appropriate logging.getLogger() and also adjusted the logging calls themselves.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'magentoerpconnect/magerp_core.py'
2--- magentoerpconnect/magerp_core.py 2012-05-15 11:49:38 +0000
3+++ magentoerpconnect/magerp_core.py 2012-05-25 09:04:23 +0000
4@@ -25,7 +25,7 @@
5 from osv import osv, fields
6 import magerp_osv
7 import pooler
8-import netsvc
9+import logging
10 import base64, urllib
11 from magerp_osv import Connection
12 import tools
13@@ -67,7 +67,7 @@
14 'magento_referential': fields.function(_is_magento_referential, type="boolean", method=True, string="Magento Referential"),
15 'last_imported_product_id': fields.integer('Last Imported Product Id', help="Product are imported one by one. This is the magento id of the last product imported. If you clear it all product will be imported"),
16 'last_imported_partner_id': fields.integer('Last Imported Partner Id', help="Partners are imported one by one. This is the magento id of the last partner imported. If you clear it all partners will be imported"),
17- 'import_all_attributs': fields.boolean('Import all attributs', help="If the option is uncheck only the attributs that doesn't exist in OpenERP will be imported"),
18+ 'import_all_attributs': fields.boolean('Import all attributs', help="If the option is uncheck only the attributs that doesn't exist in OpenERP will be imported"),
19 'import_image_with_product': fields.boolean('With image', help="If the option is check the product's image and the product will be imported at the same time and so the step '7-import images' is not needed"),
20 'import_links_with_product': fields.boolean('With links', help="If the option is check the product's links (Up-Sell, Cross-Sell, Related) and the product will be imported at the same time and so the step '8-import links' is not needed"),
21 }
22@@ -123,7 +123,7 @@
23 def sync_attribs(self, cr, uid, ids, context=None):
24 attr_obj = self.pool.get('magerp.product_attributes')
25 attr_set_obj = self.pool.get('magerp.product_attribute_set')
26- logger = netsvc.Logger()
27+ logger = logging.getLogger('ext synchro')
28 for referential in self.browse(cr, uid, ids, context=context):
29 attr_conn = referential.external_connection(DEBUG, context=context)
30 attrib_set_ids = attr_set_obj.search(cr, uid, [('referential_id', '=', referential.id)])
31@@ -146,7 +146,7 @@
32 attributes_imported.append(ext_id)
33 attr_obj.ext_import(import_cr, uid, [attribut], referential.id, defaults={'referential_id':referential.id}, context={'referential_id':referential.id})
34 import_cr.commit()
35- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "All attributs for the attributs set id %s was succesfully imported" %(attr_set_id))
36+ logger.info("All attributs for the attributs set id %s was succesfully imported", attr_set_id)
37 #Relate attribute sets & attributes
38 mage_inp = {}
39 #Pass in {attribute_set_id:{attributes},attribute_set_id2:{attributes}}
40@@ -263,7 +263,6 @@
41 return conn.call('catalog_product_link.types')
42
43 def sync_images(self, cr, uid, ids, context=None):
44- logger = netsvc.Logger()
45 product_obj = self.pool.get('product.product')
46 image_obj = self.pool.get('product.images')
47 import_cr = pooler.get_db(cr.dbname).cursor()
48
49=== modified file 'magentoerpconnect/magerp_osv.py'
50--- magentoerpconnect/magerp_osv.py 2012-05-24 06:57:34 +0000
51+++ magentoerpconnect/magerp_osv.py 2012-05-25 09:04:23 +0000
52@@ -24,7 +24,7 @@
53 import time
54 import datetime
55 import xmlrpclib
56-import netsvc
57+import logging
58 import urllib2
59 import base64
60 import pooler
61@@ -39,7 +39,7 @@
62 def __init__(self, location, username, password, debug=False):
63 #Append / if not there
64 if not location[-1] == '/':
65- location += '/'
66+ location += '/'
67 self.corelocation = location
68 #Please do not remove the str indeed xmlrpc lib require a string for the location
69 #if an unicode is send it will raise you an error
70@@ -48,33 +48,33 @@
71 self.password = password
72 self.debug = False
73 self.result = {}
74- self.logger = netsvc.Logger()
75-
76-
77+ self.logger = logging.getLogger('Connection(%s)' % self.location)
78+
79+
80 def connect(self):
81 if not self.location[-1] == '/':
82 self.location += '/'
83 if self.debug:
84- self.logger.notifyChannel(_("Magento Connection"), netsvc.LOG_INFO, _("Attempting connection with Settings:%s,%s,%s") % (self.location, self.username, self.password))
85+ self.logger.info(_("Attempting connection with Settings:%s,%s,%s"), self.location, self.username, self.password)
86 self.ser = xmlrpclib.ServerProxy(self.location)
87 for sleep_time in [1, 3, 6]:
88 try:
89 self.session = self.ser.login(self.username, self.password)
90 if self.debug:
91- self.logger.notifyChannel(_("Magento Connection"), netsvc.LOG_INFO, _("Login Successful"))
92+ self.logger.info(_("Login Successful"))
93 return True
94 except IOError, e:
95- self.logger.notifyChannel(_("Magento Connection"), netsvc.LOG_ERROR, _("Error in connecting:%s") % (e))
96- self.logger.notifyChannel(_("Magento Call"), netsvc.LOG_WARNING, _("Webservice Failure, sleeping %s second before next attempt") % (sleep_time))
97+ self.logger.error(_("Error in connecting:%s"), e, exc_info=True)
98+ self.logger.warn(_("Webservice Failure, sleeping %s second before next attempt"), sleep_time)
99 time.sleep(sleep_time)
100 except Exception,e:
101- self.logger.notifyChannel(_("Magento Connection"), netsvc.LOG_ERROR, _("Error in connecting:%s") % (e))
102- self.logger.notifyChannel(_("Magento Call"), netsvc.LOG_WARNING, _("Webservice Failure, sleeping %s second before next attempt") % (sleep_time))
103- time.sleep(sleep_time)
104- raise osv.except_osv(_('User Error'), _('Error when try to connect to magento, are your sure that your login is right? Did openerp can access to your magento?'))
105-
106-
107- def call(self, method, *arguments):
108+ self.logger.error(_("Error in connecting:%s"), e, exc_info=True)
109+ self.logger.warn(_("Webservice Failure, sleeping %s second before next attempt"), sleep_time)
110+ time.sleep(sleep_time)
111+ raise osv.except_osv(_('User Error'), _('Error connecting to magento, are your sure that your login is right? Did you configure API user in magento?'))
112+
113+
114+ def call(self, method, *arguments):
115 if arguments:
116 arguments = list(arguments)[0]
117 else:
118@@ -82,18 +82,18 @@
119 for sleep_time in [1, 3, 6]:
120 try:
121 if self.debug:
122- self.logger.notifyChannel(_("Magento Connection"), netsvc.LOG_INFO, _("Calling Method:%s,Arguments:%s") % (method, arguments))
123+ self.logger.info(_("Calling Method:%s,Arguments:%s"), method, arguments)
124 res = self.ser.call(self.session, method, arguments)
125 if self.debug:
126 if method=='catalog_product.list':
127 # the response of the method catalog_product.list can be very very long so it's better to see it only if debug log is activate
128- self.logger.notifyChannel(_("Magento Connection"), netsvc.LOG_DEBUG, _("Query Returned:%s") % (res))
129+ self.logger.debug(_("Query Returned:%s"), res)
130 else:
131- self.logger.notifyChannel(_("Magento Connection"), netsvc.LOG_INFO, _("Query Returned:%s") % (res))
132+ self.logger.info(_("Query Returned:%s"), res)
133 return res
134 except IOError, e:
135- self.logger.notifyChannel(_("Magento Call"), netsvc.LOG_ERROR, _("Method: %s\nArguments:%s\nError:%s") % (method, arguments, e))
136- self.logger.notifyChannel(_("Magento Call"), netsvc.LOG_WARNING, _("Webservice Failure, sleeping %s second before next attempt") % (sleep_time))
137+ self.logger.error(_("Method: %s\nArguments:%s\nError:%s"), method, arguments, e, exc_info=True)
138+ self.logger.warn(_("Webservice Failure, sleeping %s second before next attempt"), sleep_time)
139 time.sleep(sleep_time)
140 raise
141
142@@ -118,7 +118,7 @@
143 _DELETE_METHOD = False
144 _mapping = {}
145 DEBUG = False
146-
147+
148 #TODO deprecated, remove use
149 def mage_to_oe(self, cr, uid, mageid, instance, *arguments):
150 """given a record id in the Magento referential, returns a tuple (id, name) with the id in the OpenERP referential; Magento instance wise"""
151@@ -143,7 +143,7 @@
152 read = self.read(cr, uid, oeid, [self._rec_name])
153 return (read[0]['id'], read[0][self._rec_name])
154 return False
155-
156+
157 #TODO deprecated, remove use
158 def sync_import(self, cr, uid, magento_records, instance, debug=False, defaults=None, *attrs):
159
160@@ -178,7 +178,7 @@
161 'temp_vars':{},
162 'mage2oe_filters':mage2oe_filters
163 }
164-
165+
166 #now properly mapp known Magento attributes to OpenERP entity columns:
167 for each_valid_key in self._mapping:
168 if each_valid_key in magento_record.keys():
169@@ -216,7 +216,7 @@
170 self.record_save(cr, uid, rec_id, vals, defaults)
171 else:
172 self.record_save(cr, uid, rec_id, vals, defaults)
173-
174+
175 def record_save(self, cr, uid, rec_id, vals, defaults):
176 if defaults:
177 for key in defaults.keys():
178@@ -227,7 +227,7 @@
179 else:
180 #Record is not there, create it
181 self.create(cr, uid, vals,)
182-
183+
184 def cast_string(self, subject):
185 """This function will convert string objects to the data type required. Example "0"/"1" to boolean conversion"""
186 for key in subject.keys():
187@@ -237,7 +237,7 @@
188 else:
189 subject[key] = True
190 return subject
191-
192+
193 def mage_import_base(self,cr,uid,conn, external_referential_id, defaults=None, context=None):
194 if context is None:
195 context = {}
196@@ -259,7 +259,7 @@
197 list_method = self.pool.get('external.mapping').read(cr,uid,mapping_id[0],['external_list_method']).get('external_list_method',False)
198 if list_method:
199 data = conn.call(list_method, context['ids_or_filter'])
200-
201+
202 #it may happen that list method doesn't provide enough information, forcing us to use get_method on each record (case for sale orders)
203 if context.get('one_by_one', False):
204 self.mage_import_one_by_one(cr, uid, conn, external_referential_id, mapping_id[0], data, defaults, context)
205@@ -337,7 +337,7 @@
206 self.sync_import(cr, uid, magento_records, instance, debug, defaults)
207 else:
208 raise osv.except_osv(_('Undefined List method !'), _("list method is undefined for this object!"))
209-
210+
211 #TODO deprecated, remove use
212 def get_all_mage_ids(self, cr, uid, ids, instance=False):
213 search_param = []
214@@ -350,4 +350,4 @@
215 for each in reads:
216 mageids.append(each[self._MAGE_FIELD])
217 return mageids
218-
219+
220
221=== modified file 'magentoerpconnect/product.py'
222--- magentoerpconnect/product.py 2012-05-16 14:02:43 +0000
223+++ magentoerpconnect/product.py 2012-05-25 09:04:23 +0000
224@@ -28,7 +28,7 @@
225 import pooler
226 import magerp_osv
227 from tools.translate import _
228-import netsvc
229+import logging
230 import unicodedata
231 import base64, urllib
232 import os
233@@ -293,7 +293,7 @@
234
235 def init(self, cr):
236 """ Replace product_product by product.product
237- and product_template by product.template for
238+ and product_template by product.template for
239 consistency with model names"""
240 cr.execute("UPDATE magerp_product_attributes SET based_on = REPLACE(based_on, '_', '.')")
241 cr.execute("UPDATE magerp_product_attributes SET based_on = 'product.template' WHERE based_on IS NULL")
242@@ -561,12 +561,11 @@
243 " result = [('%(attribute_code)s', [option.value for option in options])]") % \
244 ({'field_name': field_name, 'attribute_code': attribute.attribute_code})
245 elif ttype in ['binary']:
246- logger = netsvc.Logger()
247- warning_text = "Binary mapping is actually not supported (attribute: %s)" % (attribute.attribute_code,)
248- logger.notifyChannel('ext synchro mapping', netsvc.LOG_WARNING, warning_text)
249- warning_msg = ("import netsvc\n"
250- "logger = netsvc.Logger()\n"
251- "logger.notifyChannel('ext synchro mapping', netsvc.LOG_WARNING, '%s')") % (warning_text,)
252+ logger = logging.getLogger('ext synchro mapping')
253+ logger.warn("Binary mapping is actually not supported (attribute: %s)", attribute.attribute_code)
254+ warning_msg = ("import logging\n"
255+ "logger = logging.getLogger('ext synchro mapping')\n"
256+ "logger.warn('Binary mapping is actually not supported (attribute: %%s)', %s)") % (attribute.attribute_code)
257 in_function = out_function = warning_msg
258 return in_function, out_function
259
260@@ -682,7 +681,7 @@
261 _name = "magerp.product_attribute_set"
262 _description = "Attribute sets in products"
263 _rec_name = 'attribute_set_name'
264-
265+
266 _columns = {
267 'sort_order':fields.integer('Sort Order'),
268 'attribute_set_name':fields.char('Set Name', size=100),
269@@ -731,7 +730,7 @@
270 cr.execute(query)
271
272 return True
273-
274+
275 magerp_product_attribute_set()
276
277 class magerp_product_attribute_groups(magerp_osv.magerp_osv):
278@@ -744,7 +743,7 @@
279 for attribute_group in self.browse(cr, uid, ids, context):
280 res[attribute_group.id] = self.pool.get('magerp.product_attribute_set').extid_to_oeid(cr, uid, attribute_group.attribute_set_id, attribute_group.referential_id.id)
281 return res
282-
283+
284 _columns = {
285 'attribute_set_id':fields.integer('Attribute Set ID'),
286 'attribute_set':fields.function(_get_set, type="many2one", relation="magerp.product_attribute_set", method=True, string="Attribute Set"),
287@@ -758,7 +757,7 @@
288 class product_tierprice(osv.osv):
289 _name = "product.tierprice"
290 _description = "Implements magento tier pricing"
291-
292+
293 _columns = {
294 'web_scope':fields.selection([
295 ('all', 'All Websites'),
296@@ -799,7 +798,7 @@
297
298 class product_mag_osv(magerp_osv.magerp_osv):
299 _register = False # Set to false if the model shouldn't be automatically discovered.
300-
301+
302 #remember one thing in life: Magento lies: it tells attributes are required while they are awkward to fill
303 #and will have a nice default vaule anyway, that's why we avoid making them mandatory in the product view
304 _magento_fake_mandatory_attrs = ['created_at', 'updated_at', 'has_options', 'required_options', 'model']
305@@ -880,7 +879,7 @@
306 cr, uid, oerp_group_id,
307 ['attribute_group_name'],
308 context=context)['attribute_group_name']
309-
310+
311 # Create a page for each attribute group
312 attr_group_fields_rel.setdefault(group_name, [])
313 while True:
314@@ -954,7 +953,7 @@
315 wf, fields_get['websites_ids'], context=context)
316
317 return notebook
318-
319+
320 def _filter_fields_to_return(self, cr, uid, field_names, context=None):
321 '''This function is a hook in order to filter the fields that appears on the view'''
322 return field_names
323@@ -1067,13 +1066,13 @@
324 #TODO base the import on the mapping and the function ext_import
325 def import_product_image(self, cr, uid, id, referential_id, conn, ext_id=None, context=None):
326 image_obj = self.pool.get('product.images')
327- logger = netsvc.Logger()
328+ logger = logging.getLogger('ext synchro')
329 if not ext_id:
330 ext_id = self.oeid_to_extid(cr, uid, id, referential_id, context=None)
331- # TODO everythere will should pass the params 'id' for magento api in order to force
332+ # TODO everythere will should pass the params 'id' for magento api in order to force
333 # to use the id as external key instead of mixed id/sku
334 img_list = conn.call('catalog_product_attribute_media.list', [ext_id, False, 'id'])
335- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Magento image for product ext_id %s: %s" %(ext_id, img_list))
336+ logger.info("Magento image for product ext_id %s: %s", ext_id, img_list)
337 images_name = []
338 for image in img_list:
339 img=False
340@@ -1083,13 +1082,13 @@
341 data = f.read()
342 f.close()
343 if "DOCTYPE html PUBLIC" in data:
344- logger.notifyChannel('ext synchro', netsvc.LOG_WARNING, "failed to open the image %s from Magento" % (image['url'],))
345+ logger.warn("Failed to open the image %s from Magento", image['url'])
346 continue
347 else:
348 img = base64.encodestring(data)
349 except Exception, e:
350 #TODO raise correctly the error
351- logger.notifyChannel('ext synchro', netsvc.LOG_WARNING, "failed to open the image %s from Magento, error : %s" % (image['url'],e))
352+ logger.error("Failed to open the image %s from Magento, error : %s", image['url'], e, exc_info=True)
353 continue
354 mag_filename, extention = os.path.splitext(os.path.basename(image['file']))
355 data = {'name': image['label'] and not image['label'] in images_name and image['label'] or mag_filename,
356@@ -1115,7 +1114,7 @@
357 new_image_id = image_obj.create(cr, uid, data, context=context)
358 image_obj.create_external_id_vals(cr, uid, new_image_id, image['file'], referential_id, context=context)
359 return True
360-
361+
362 def extid_to_existing_oeid(self, cr, uid, id, external_referential_id, context=None):
363 """Returns the OpenERP id of a resource by its external id.
364 Returns False if the resource does not exist."""
365@@ -1180,7 +1179,7 @@
366 else:
367 return False
368 tier_price = False
369- if 'x_magerp_tier_price' in vals.keys():
370+ if 'x_magerp_tier_price' in vals.keys():
371 tier_price = vals.pop('x_magerp_tier_price')
372 tp_obj = self.pool.get('product.tierprice')
373 #Delete existing tier prices
374@@ -1193,7 +1192,7 @@
375 stat = super(product_product, self).write(cr, uid, ids, vals, context)
376 #Perform other operation
377 return stat
378-
379+
380 def create_tier_price(self, cr, uid, tier_price, instance, product_id):
381 tp_obj = self.pool.get('product.tierprice')
382 for each in eval(tier_price):
383@@ -1215,13 +1214,13 @@
384 tier_vals['web_scope'] = 'specific'
385 tier_vals['website_id'] = self.pool.get('external.shop.group').mage_to_oe(cr, uid, int(each['website_id']), instance)
386 tp_obj.create(cr, uid, tier_vals)
387-
388+
389 def create(self, cr, uid, vals, context=None):
390 tier_price = False
391 if vals.get('referential_id', False):
392 instance = vals['referential_id']
393 #Filter keys to be changed
394- if 'x_magerp_tier_price' in vals.keys():
395+ if 'x_magerp_tier_price' in vals.keys():
396 tier_price = vals.pop('x_magerp_tier_price')
397
398 crid = super(product_product, self).create(cr, uid, vals, context)
399@@ -1262,7 +1261,7 @@
400 raise osv.except_osv(_('Warning!'), _('This product is related to Magento. It can not be deleted!\nYou can change it Magento status to "Disabled" and uncheck the active box to hide it from OpenERP.'))
401 else:
402 return super(product_product, self).unlink(cr, uid, ids, context)
403-
404+
405 #TODO move part of this to declarative mapping CSV template
406 def extdata_from_oevals(self, cr, uid, external_referential_id, data_record, mapping_lines, defaults, context=None):
407 product_data = super(product_product, self).extdata_from_oevals(cr, uid, external_referential_id, data_record, mapping_lines, defaults, context) #Aapply custom/attributes mappings
408@@ -1275,10 +1274,10 @@
409 if isinstance(pl_default_id, int):
410 pl_default_id = [pl_default_id]
411 product_data.update({'price': self.pool.get('product.pricelist').price_get(cr, uid, pl_default_id, product.id, 1.0)[pl_default_id[0]]})
412-
413+
414 if not product_data.get('tax_class_id', False):
415 product_data.update({'tax_class_id': 2}) #FIXME hugly!
416-
417+
418 if not product_data.get('status', False):
419 product_data.update({'status': product.active and 1 or 0})
420
421@@ -1292,7 +1291,7 @@
422 product_data.update({'meta_keyword': product.name})
423 if not product_data.get('meta_description', False):
424 product_data.update({'meta_description': product.description_sale and product.description_sale[:255]})
425-
426+
427 return product_data
428
429 def oevals_from_extdata(self, cr, uid, external_referential_id, data_record, mapping_lines, key_for_external_id=None, parent_data=None, previous_lines=None, defaults=None, context=None):
430@@ -1350,7 +1349,7 @@
431 return ext_id
432
433 def action_before_exporting_grouped_product(self, cr, uid, id, external_referential_ids=None, defaults=None, context=None):
434- logger = netsvc.Logger()
435+ logger = logging.getLogger('ext synchro')
436 if context.get('mrp_is_installed', False):
437 bom_ids = self.read(cr, uid, id, ['bom_ids'])['bom_ids']
438 if len(bom_ids): # it has or is part of a BoM
439@@ -1361,18 +1360,18 @@
440 for row in results:
441 child_ids.append(row['product_id'])
442 quantities.update({row['product_id']: row['product_qty']})
443- if child_ids: #it is an assembly and it contains the products child_ids:
444+ if child_ids: #it is an assembly and it contains the products child_ids:
445 self.ext_export(cr, uid, child_ids, external_referential_ids, defaults, context) #so we export them
446 else:
447 return False
448 else:
449- logger.notifyChannel('ext synchro', netsvc.LOG_ERROR, "OpenERP 'grouped' products will export to Magento as 'grouped products' only if they have a BOM and if the 'mrp' BOM module is installed")
450+ logger.error("OpenERP 'grouped' products will export to Magento as 'grouped products' only if they have a BOM and if the 'mrp' BOM module is installed")
451 return quantities, child_ids
452
453 def action_before_exporting(self, cr, uid, id, product_type, external_referential_ids=None, defaults=None, context=None):
454 '''Hook to allow your external module to execute some code before exporting a product'''
455 return True
456-
457+
458 #todo move this code to a generic module
459 def get_last_update_date(self, cr, uid, product_read, context=None):
460 """if a product have a depends on other object like bom for grouped product, or other product for configurable
461@@ -1389,10 +1388,10 @@
462 if last_updated_bom_date > last_updated_date:
463 last_updated_date=last_updated_bom_date
464 else:
465- conn.logger.notifyChannel('ext synchro', netsvc.LOG_ERROR, "OpenERP 'grouped' products will export to Magento as 'grouped products' only if they have a BOM and if the 'mrp' BOM module is installed")
466+ conn.logger.error("OpenERP 'grouped' products will export to Magento as 'grouped products' only if they have a BOM and if the 'mrp' BOM module is installed")
467 return last_updated_date
468-
469-
470+
471+
472 def get_ordered_ids(self, cr, uid, ids, external_referential_ids=None, defaults=None, context=None):
473 #TODO pass the shop better than the referentials
474 dates_2_ids = []
475@@ -1408,7 +1407,7 @@
476 read = cr.dictfetchall()
477 ids = []
478 context['force']=True
479-
480+
481 for product_read in read:
482 last_updated_date = self.get_last_update_date(cr, uid, product_read, context=context)
483 if last_exported_date and last_updated_date < last_exported_date:
484@@ -1474,7 +1473,7 @@
485 context['default_set_id'] = default_set_id
486
487 context_dic = [context.copy()]
488- context_dic[0]['export_url'] = True # for the magento version 1.3.2.4, only one url is autorized by product, so we only export with the MAPPING TEMPLATE the url of the default language
489+ context_dic[0]['export_url'] = True # for the magento version 1.3.2.4, only one url is autorized by product, so we only export with the MAPPING TEMPLATE the url of the default language
490 context_dic[0]['lang'] = shop.referential_id.default_lang_id.code
491
492 for storeview in shop.storeview_ids:
493@@ -1499,14 +1498,14 @@
494 result['create_ids'] += temp_result['create_ids']
495 result['write_ids'] += temp_result['write_ids']
496 return result
497-
498+
499 def try_ext_update(self, cr, uid, data, conn, method, oe_id, external_id, ir_model_data_id, create_method, context=None):
500 if context is None: context = {}
501 if context.get('storeview_code', False):
502 return conn.call(method, [external_id, data, context.get('storeview_code', False)])
503 else:
504 return conn.call(method, [external_id, data])
505-
506+
507 def ext_update(self, cr, uid, data, conn, method, oe_id, external_id, ir_model_data_id, create_method, context=None):
508 product = self.browse(cr, uid, oe_id)
509 sku = self.product_to_sku(cr, uid, product)
510@@ -1544,7 +1543,7 @@
511 :return: True
512 """
513 if context is None: context = {}
514- logger = netsvc.Logger()
515+ logger = logging.getLogger('ext synchro')
516
517 shop = self.pool.get('sale.shop').browse(
518 cr, uid, shop_id, context=context)
519@@ -1577,14 +1576,13 @@
520 connection.call('product_stock.update',
521 [mag_product_id, inventory_vals])
522
523- logger.notifyChannel(
524- 'ext synchro',
525- netsvc.LOG_INFO,
526- "Successfully updated stock level at %s for "
527- "product with SKU %s " %
528- (inventory_vals.get('qty', 'N/A'), product.magento_sku))
529+ logger.info(
530+ "Successfully updated stock level at %s for product with SKU %s",
531+ inventory_vals.get('qty', 'N/A'),
532+ product.magento_sku
533+ )
534 return True
535-
536+
537 def ext_assign_links(self, cr, uid, ids, external_referential_ids=None, defaults=None, context=None):
538 """ Assign links of type up-sell, cross-sell, related """
539 if isinstance(ids, (int, long)):
540@@ -1607,7 +1605,7 @@
541 position = position or {}
542 quantities = quantities or {}
543 external_referential_ids = external_referential_ids or []
544- logger = netsvc.Logger()
545+ logger = logging.getLogger('ext assign')
546 conn = context.get('conn_obj', False)
547
548 for ref_id in external_referential_ids:
549@@ -1662,7 +1660,7 @@
550 for c_ext_id in ext_id_to_remove:
551 # remove the product links that are no more setup on openerp
552 conn.call('product_link.remove', magento_args + [c_ext_id])
553- logger.notifyChannel('ext assign', netsvc.LOG_INFO, "Successfully removed assignment of type %s for product %s to product %s" % (type, skus[parent_id], c_ext_id))
554+ logger.info("Successfully removed assignment of type %s for product %s to product %s", type, skus[parent_id], c_ext_id)
555 for child_ext_id in ext_id_to_assign:
556 # assign new product links
557 product_id = new_child_ext_ids[child_ext_id]
558@@ -1671,7 +1669,7 @@
559 [child_ext_id,
560 {'position': position.get(product_id, 0),
561 'qty': quantities.get(product_id, 1)}])
562- logger.notifyChannel('ext assign', netsvc.LOG_INFO, "Successfully assigned product %s to product %s with type %s" %(skus[parent_id], skus[product_id], type))
563+ logger.info("Successfully assigned product %s to product %s with type %s", skus[parent_id], skus[product_id], type)
564 for child_ext_id in ext_id_to_update:
565 # update products links already assigned
566 product_id = new_child_ext_ids[child_ext_id]
567@@ -1680,7 +1678,7 @@
568 [child_ext_id,
569 {'position': position.get(product_id, 0),
570 'qty': quantities.get(product_id, 1)}])
571- logger.notifyChannel('ext assign', netsvc.LOG_INFO, "Successfully updated assignment of type %s of product %s to product %s" %(type, skus[parent_id], skus[product_id]))
572+ logger.info("Successfully updated assignment of type %s of product %s to product %s", type, skus[parent_id], skus[product_id])
573 return True
574
575 #TODO move this code (get exportable image) and also some code in product_image.py and sale.py in base_sale_multichannel or in a new module in order to be more generic
576@@ -1696,7 +1694,7 @@
577
578 def _mag_import_product_links_type(self, cr, uid, product, link_type, external_referential_id, conn, context=None):
579 if context is None: context = {}
580- logger = netsvc.Logger()
581+ logger = logging.getLogger('ext synchro')
582 product_link_obj = self.pool.get('product.link')
583 selection_link_types = product_link_obj._columns['type'].selection(cr, uid, context)
584 # This method could be completed to import grouped products too, you know, for Magento a product link is as
585@@ -1707,7 +1705,7 @@
586 product_links = conn.call('product_link.list', [link_type, product.magento_sku])
587 except Exception, e:
588 self.log(cr, uid, product.id, "Error when retrieving the list of links in Magento for product with sku %s and product id %s !" % (product.magento_sku, product.id,))
589- logger.notifyChannel('ext synchro', netsvc.LOG_DEBUG, "Error when retrieving the list of links in Magento for product with sku %s and product id %s !" % (product.magento_sku, product.id,))
590+ logger.debug("Error when retrieving the list of links in Magento for product with sku %s and product id %s !", product.magento_sku, product.id)
591
592 for product_link in product_links:
593 ctx = context.copy()
594@@ -1729,7 +1727,7 @@
595 product_link_obj.write(cr, uid, existing_link, link_data, context=context)
596 else:
597 product_link_obj.create(cr, uid, link_data, context=context)
598- logger.notifyChannel('Import Product Links', netsvc.LOG_INFO, "Successfully imported product link of type %s on product %s to product %s" %(link_type, product.id, linked_product_id))
599+ logger.info("Successfully imported product link of type %s on product %s to product %s", link_type, product.id, linked_product_id)
600 return True
601
602 def mag_import_product_links_types(self, cr, uid, ids, link_types, external_referential_id, conn, context=None):
603
604=== modified file 'magentoerpconnect/product_images.py'
605--- magentoerpconnect/product_images.py 2011-11-27 15:12:39 +0000
606+++ magentoerpconnect/product_images.py 2012-05-25 09:04:23 +0000
607@@ -23,7 +23,7 @@
608 from osv import osv, fields
609 import magerp_osv
610 import mimetypes
611-import netsvc
612+import logging
613 from tools.translate import _
614
615 #TODO the option small_image, thumbnail, exclude, base_image, should be store diferently indeed this is not compatible with mutli instance (maybe serialized will be a good solution)
616@@ -48,12 +48,12 @@
617 'thumbnail':lambda * a:True,
618 'exclude':lambda * a:False
619 }
620-
621+
622 def get_changed_ids(self, cr, uid, start_date=False):
623 proxy = self.pool.get('product.images')
624 domain = start_date and ['|', ('create_date', '>', start_date), ('write_date', '>', start_date)] or []
625 return proxy.search(cr, uid, domain)
626-
627+
628 def del_image_name(self, cr, uid, id, context=None):
629 if context is None: context = {}
630 image_ext_name_obj = self.pool.get('product.images.external.name')
631@@ -65,7 +65,7 @@
632 def update_remote_images(self, cr, uid, ids, context=None):
633 if context is None:
634 context = {}
635- logger = netsvc.Logger()
636+ logger = logging.getLogger('ext synchro')
637 conn = context.get('conn_obj', False)
638 if not conn:
639 return False
640@@ -112,7 +112,7 @@
641 image_2_date[image['id']] = image['write_date'] or image['create_date']
642 list_date = date_2_image.keys()
643 list_date.sort()
644-
645+
646 ids = [date_2_image[date] for date in list_date]
647
648 while ids:
649@@ -122,24 +122,24 @@
650 ext_file_name = each.oeid_to_extid(context['external_referential_id'])
651 if ext_file_name: #If update
652 try:
653- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Updating %s's image: %s" %(each.product_id.magento_sku, each.name))
654+ logger.info("Updating %s's image: %s", each.product_id.magento_sku, each.name)
655 result = update_image(ext_file_name, each)
656- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "%s's image updated with sucess: %s" %(each.product_id.magento_sku, each.name))
657+ logger.info("%s's image updated with sucess: %s", each.product_id.magento_sku, each.name)
658 need_to_be_created = False
659 except Exception, e:
660- logger.notifyChannel(_("Magento Connection"), netsvc.LOG_ERROR, _("Error in connecting:%s") % (e))
661+ logger.error(_("Error in connecting:%s"), e, exc_info=True)
662 if not "Fault 103" in str(e):
663- logger.notifyChannel(_("Magento Connection"), netsvc.LOG_ERROR, _("Unknow error stop export"))
664+ logger.error(_("Unknow error stop export"))
665 raise
666 else:
667 #If the image was deleded in magento, the external name is automatically deleded before trying to re-create the image in magento
668 model_data_ids = ir_model_data_obj.search(cr, uid, [('model', '=', self._name), ('res_id', '=', each.id), ('external_referential_id', '=', context['external_referential_id'])])
669 if model_data_ids and len(model_data_ids) > 0:
670 ir_model_data_obj.unlink(cr, uid, model_data_ids, context=context)
671- logger.notifyChannel(_("Magento Connection"), netsvc.LOG_ERROR, _("The image don't exist in magento, try to create it"))
672+ logger.error(_("The image don't exist in magento, try to create it"))
673 if need_to_be_created:
674 if each.product_id.magento_sku:
675- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Sending %s's image: %s" %(each.product_id.magento_sku, each.name))
676+ logger.info("Sending %s's image: %s", each.product_id.magento_sku, each.name)
677 result = conn.call('catalog_product_attribute_media.create',
678 [each.product_id.magento_sku,
679 {'file':{
680@@ -151,12 +151,12 @@
681 ])
682 self.create_external_id_vals(cr, uid, each.id, result, context['external_referential_id'], context=context)
683 result = update_image(result, each)
684- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "%s's image send with sucess: %s" %(each.product_id.magento_sku, each.name))
685+ logger.info("%s's image send with sucess: %s", each.product_id.magento_sku, each.name)
686 if image_2_date[each.id] > context['last_images_export_date']: #indeed if a product was created a long time ago and checked as exportable recently, the write date of the image can be far away in the past
687 self.pool.get('sale.shop').write(cr,uid,context['shop_id'],{'last_images_export_date':image_2_date[each.id]})
688 cr.commit()
689 ids = ids[1000:]
690- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "still %s image to export" %len(ids))
691+ logger.info("still %s image to export", len(ids))
692 return True
693-
694+
695 product_images()
696
697=== modified file 'magentoerpconnect/sale.py'
698--- magentoerpconnect/sale.py 2012-05-24 19:33:15 +0000
699+++ magentoerpconnect/sale.py 2012-05-25 09:04:23 +0000
700@@ -26,6 +26,7 @@
701 import pooler
702 import magerp_osv
703 import netsvc
704+import logging
705 from tools.translate import _
706 import string
707 #from datetime import datetime
708@@ -50,7 +51,7 @@
709
710 class sale_shop(magerp_osv.magerp_osv):
711 _inherit = "sale.shop"
712-
713+
714 def _get_exportable_product_ids(self, cr, uid, ids, name, args, context=None):
715 res = super(sale_shop, self)._get_exportable_product_ids(cr, uid, ids, name, args, context=None)
716 for shop_id in res:
717@@ -70,10 +71,10 @@
718 else:
719 res[shop.id] = False
720 return res
721-
722+
723 def export_images(self, cr, uid, ids, context=None):
724 if context is None: context = {}
725- logger = netsvc.Logger()
726+ logger = logging.getLogger('ext synchro')
727 start_date = time.strftime(DEFAULT_SERVER_DATETIME_FORMAT)
728 image_obj = self.pool.get('product.images')
729 for shop in self.browse(cr, uid, ids):
730@@ -84,13 +85,13 @@
731 exportable_product_ids = self.read(cr, uid, shop.id, ['exportable_product_ids'], context=context)['exportable_product_ids']
732 res = self.pool.get('product.product').get_exportable_images(cr, uid, exportable_product_ids, context=context)
733 if res:
734- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Creating %s images" %(len(res['to_create'])))
735- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Updating %s images" %(len(res['to_update'])))
736+ logger.info("Creating %s images", len(res['to_create']))
737+ logger.info("Updating %s images", len(res['to_update']))
738 image_obj.update_remote_images(cr, uid, res['to_update']+res['to_create'], context)
739 self.write(cr,uid,context['shop_id'],{'last_images_export_date': start_date})
740 return True
741-
742-
743+
744+
745 def _get_rootcategory(self, cr, uid, ids, prop, unknow_none, context=None):
746 res = {}
747 for shop in self.browse(cr, uid, ids, context):
748@@ -131,7 +132,7 @@
749 'magento_shop': fields.boolean('Magento Shop', readonly=True),
750 'allow_magento_order_status_push': fields.boolean('Allow Magento Order Status push', help='Allow to send back order status to Magento if order status changed in OpenERP first?'),
751 'allow_magento_notification': fields.boolean('Allow Magento Notification', help='Allow Magento to notify customer with an e-mail when OpenERP change an order status, create an invoice or a delivery order on Magento.'),
752- }
753+ }
754
755 _defaults = {
756 'allow_magento_order_status_push': lambda * a: False,
757@@ -174,7 +175,7 @@
758 conn = shop.referential_id.external_connection()
759 # Update the state of orders in OERP that are in "need_to_update":True
760 # from the Magento's corresponding orders
761-
762+
763 # Get all need_to_update orders in OERP
764 orders_to_update = so_obj.search(
765 cr, uid,
766@@ -239,7 +240,7 @@
767
768 def run_update_images_scheduler(self, cr, uid, context=None):
769 self._sale_shop(cr, uid, self.export_images, context=context)
770-
771+
772 def run_export_shipping_scheduler(self, cr, uid, context=None):
773 self._sale_shop(cr, uid, self.export_shipping, context=context)
774
775@@ -248,7 +249,7 @@
776
777 class sale_order(magerp_osv.magerp_osv):
778 _inherit = "sale.order"
779-
780+
781 _columns = {
782 'magento_incrementid': fields.char('Magento Increment ID', size=32),
783 'magento_storeview_id': fields.many2one('magerp.storeviews', 'Magento Store View'),
784@@ -257,14 +258,14 @@
785 type='boolean',
786 string='Is a Magento Sale Order')
787 }
788-
789+
790 def _auto_init(self, cr, context=None):
791 tools.drop_view_if_exists(cr, 'sale_report')
792 cr.execute("ALTER TABLE sale_order_line ALTER COLUMN discount TYPE numeric(16,6);")
793 cr.execute("ALTER TABLE account_invoice_line ALTER COLUMN discount TYPE numeric(16,6);")
794 self.pool.get('sale.report').init(cr)
795 super(sale_order, self)._auto_init(cr, context)
796-
797+
798 def get_order_addresses(self, cr, uid, referential_id, data_record, context=None):
799 partner_obj = self.pool.get('res.partner')
800 partner_address_obj = self.pool.get('res.partner.address')
801@@ -436,7 +437,7 @@
802 name = product.name
803 if ext_code_field and data_record.get(ext_code_field, False):
804 name = "%s [%s]" % (name, data_record[ext_code_field])
805-
806+
807 if is_tax_included:
808 price_unit = float(amount) + float(data_record[ext_tax_field])
809 else:
810@@ -464,7 +465,7 @@
811 res['order_line'].append((0, 0, extra_line))
812
813 return res
814-
815+
816 def add_order_shipping(self, cr, uid, res, external_referential_id, data_record, defaults, context=None):
817 if context is None: context = {}
818 if data_record.get('shipping_amount', False) and float(data_record.get('shipping_amount', False)) > 0:
819@@ -509,7 +510,7 @@
820 product_ref = ('magentoerpconnect', 'product_product_cash_on_delivery')
821 res = self.add_order_extra_line(cr, uid, res, data_record, 'cod_fee', product_ref, defaults, ctx)
822 return res
823-
824+
825 def convert_extdata_into_oedata(self, cr, uid, external_data, external_referential_id, parent_data=None, defaults=None, context=None):
826 res = super(sale_order, self).convert_extdata_into_oedata(cr, uid, external_data, external_referential_id, parent_data=parent_data, defaults=defaults, context=context)
827 res=res[0]
828@@ -566,7 +567,7 @@
829 all_items.extend(item_modified)
830 else:
831 all_items.append(top_item)
832-
833+
834 data_record['items'] = all_items
835 return data_record
836
837@@ -593,7 +594,7 @@
838 res = super(magerp_osv.magerp_osv, self).oevals_from_extdata(cr, uid, external_referential_id, data_record, key_field, mapping_lines, parent_data, previous_lines, defaults, context)
839
840 #Move me in a mapping
841- if not context.get('one_by_one', False):
842+ if not context.get('one_by_one', False):
843 if data_record.get('status_history', False) and len(data_record['status_history']) > 0:
844 res['date_order'] = data_record['status_history'][len(data_record['status_history'])-1]['created_at']
845 return res
846@@ -653,7 +654,7 @@
847 """
848 if context is None:
849 context = {}
850- logger = netsvc.Logger()
851+ logger = logging.getLogger('ext synchro')
852 conn = context.get('conn_obj', False)
853 parent_list = []
854 # get all parents orders (to cancel) of the sale orders
855@@ -669,7 +670,7 @@
856 try:
857 wf_service.trg_validate(uid, 'sale.order', canceled_order_id, 'cancel', cr)
858 self.log(cr, uid, canceled_order_id, "order %s canceled when updated from external system" % (canceled_order_id,))
859- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Order %s canceled when updated from external system because it has been replaced by a new one" % (canceled_order_id,))
860+ logger.info("Order %s canceled when updated from external system because it has been replaced by a new one", canceled_order_id)
861 except osv.except_osv, e:
862 #TODO: generic reporting of errors in magentoerpconnect
863 # except if the sale order has been confirmed for example, we cannot cancel the order
864@@ -744,10 +745,10 @@
865 def ext_set_order_imported(self, cr, uid, external_id, external_referential_id, context=None):
866 if context is None:
867 context = {}
868- logger = netsvc.Logger()
869+ logger = logging.getLogger('ext synchro')
870 conn = context.get('conn_obj', False)
871 conn.call('sales_order.done', [external_id])
872- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Successfully set the imported flag on Magento on sale order %s" % external_id)
873+ logger.info("Successfully set the imported flag on Magento on sale order %s", external_id)
874 return True
875
876 def mage_import_base(self, cr, uid, conn, external_referential_id, defaults=None, context=None):
877@@ -774,7 +775,7 @@
878 if context is None:
879 context = {}
880
881- logger = netsvc.Logger()
882+ logger = logging.getLogger('ext synchro')
883 mapping_id = self.pool.get('external.mapping').search(
884 cr, uid,
885 [('model', '=', self._name),
886@@ -792,7 +793,7 @@
887 existing_id = self.extid_to_existing_oeid(cr, uid, ext_order_id, referential_id, context=context)
888 if existing_id:
889 unchanged_ids.append(existing_id)
890- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "the order %s already exist in OpenERP" % (ext_order_id,))
891+ logger.info("the order %s already exist in OpenERP", ext_order_id)
892 self.ext_set_order_imported(cr, uid, ext_order_id, referential_id, context=context)
893 else:
894 order_ids_filtred.append({'increment_id' : ext_order_id})
895
896=== modified file 'magentoerpconnect/stock.py'
897--- magentoerpconnect/stock.py 2012-05-14 13:22:22 +0000
898+++ magentoerpconnect/stock.py 2012-05-25 09:04:23 +0000
899@@ -20,7 +20,7 @@
900 #########################################################################
901
902 import xmlrpclib
903-import netsvc
904+import logging
905
906 from osv import fields,osv
907 from tools.translate import _
908@@ -38,14 +38,14 @@
909 conn = context.get('conn_obj', False)
910 ext_shipping_id = conn.call('sales_order_shipment.create', [magento_incrementid, {}, _("Shipping Created"), mail_notification, True])
911 return ext_shipping_id
912-
913+
914 def add_picking_line(self, cr, uid, lines, picking_line, context=None):
915 """ A line to add in the shipping is a dict with : product_id and product_qty keys."""
916 line_info = {'product_id': picking_line.product_id.id,
917 'product_qty': picking_line.product_qty,
918 }
919 lines.append(line_info)
920- return lines
921+ return lines
922
923 def create_ext_partial_shipping(self, cr, uid, id, external_referential_id, magento_incrementid, mail_notification=True, context=None):
924 if context is None: context = {}
925@@ -57,7 +57,7 @@
926 product_2_item.update({self.pool.get('product.product').extid_to_oeid(cr, uid, item['product_id'], external_referential_id, context={}): item['item_id']})
927 picking = self.pool.get('stock.picking').browse(cr, uid, id, context)
928 item_qty = {}
929-
930+
931 lines = []
932 # get product and quantities to ship from the picking
933 for line in picking.move_lines:
934@@ -70,7 +70,7 @@
935 item_qty.update({product_2_item[line['product_id']]: line['product_qty']})
936
937 ext_shipping_id = conn.call('sales_order_shipment.create', [magento_incrementid, item_qty, _("Shipping Created"), mail_notification, True])
938- return ext_shipping_id
939+ return ext_shipping_id
940
941 def create_ext_shipping(self, cr, uid, id, picking_type, external_referential_id, context=None):
942 """
943@@ -112,18 +112,18 @@
944
945 def add_ext_tracking_reference(self, cr, uid, id, carrier_id, ext_shipping_id, context=None):
946 if context is None: context = {}
947- logger = netsvc.Logger()
948+ logger = logging.getLogger('ext synchro')
949 conn = context.get('conn_obj', False)
950 carrier = self.pool.get('delivery.carrier').read(cr, uid, carrier_id, ['magento_carrier_code', 'magento_tracking_title'], context)
951-
952+
953 if self.pool.get('ir.model.fields').search(cr, uid, [('name', '=', 'carrier_tracking_ref'), ('model', '=', 'stock.picking')]): #OpenERP v6 have the field carrier_tracking_ref on the stock_picking but v5 doesn't have it
954 carrier_tracking_ref = self.read(cr, uid, id, ['carrier_tracking_ref'], context)['carrier_tracking_ref']
955 else:
956 carrier_tracking_ref = ''
957-
958+
959 res = conn.call('sales_order_shipment.addTrack', [ext_shipping_id, carrier['magento_carrier_code'], carrier['magento_tracking_title'] or '', carrier_tracking_ref or ''])
960 if res:
961- logger.notifyChannel('ext synchro', netsvc.LOG_INFO, "Successfully adding a tracking reference to the shipping with OpenERP id %s and ext id %s in external sale system" % (id, ext_shipping_id))
962+ logger.info("Successfully adding a tracking reference to the shipping with OpenERP id %s and ext id %s in external sale system", id, ext_shipping_id)
963 return True
964
965 stock_picking()