From 4a278809741d4e961ac13d3477a046d43b32cfa7 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 4 Aug 2014 14:34:08 +0200 Subject: [PATCH 1/3] [FIX] res_partner: commercial partner sync On child partner creation of a parent partner, the commercial_partner_id is not computed (and stored) in the create method. Therefore, we should compute the commercial_partner_id before trying to sync his data --- openerp/addons/base/res/res_partner.py | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 4d86c1cbf3f..2d52b980780 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -433,17 +433,31 @@ class res_partner(osv.osv, format_address): def _commercial_sync_from_company(self, cr, uid, partner, context=None): """ Handle sync of commercial fields when a new parent commercial entity is set, as if they were related fields """ - if partner.commercial_partner_id != partner: + commercial_partner = partner.commercial_partner_id + if not commercial_partner: + # On child partner creation of a parent partner, + # the commercial_partner_id is not yet computed + commercial_partner_id = self._commercial_partner_compute( + cr, uid, [partner.id], 'commercial_partner_id', [], context=context)[partner.id] + commercial_partner = self.browse(cr, uid, commercial_partner_id, context=context) + if commercial_partner != partner: commercial_fields = self._commercial_fields(cr, uid, context=context) - sync_vals = self._update_fields_values(cr, uid, partner.commercial_partner_id, - commercial_fields, context=context) + sync_vals = self._update_fields_values(cr, uid, commercial_partner, + commercial_fields, context=context) partner.write(sync_vals) def _commercial_sync_to_children(self, cr, uid, partner, context=None): """ Handle sync of commercial fields to descendants """ commercial_fields = self._commercial_fields(cr, uid, context=context) - sync_vals = self._update_fields_values(cr, uid, partner.commercial_partner_id, - commercial_fields, context=context) + commercial_partner = partner.commercial_partner_id + if not commercial_partner: + # On child partner creation of a parent partner, + # the commercial_partner_id is not yet computed + commercial_partner_id = self._commercial_partner_compute( + cr, uid, [partner.id], 'commercial_partner_id', [], context=context)[partner.id] + commercial_partner = self.browse(cr, uid, commercial_partner_id, context=context) + sync_vals = self._update_fields_values(cr, uid, commercial_partner, + commercial_fields, context=context) sync_children = [c for c in partner.child_ids if not c.is_company] for child in sync_children: self._commercial_sync_to_children(cr, uid, child, context=context) From 4b5015469d605def72e953dd6f98c5735f229f02 Mon Sep 17 00:00:00 2001 From: dhr-odoo Date: Tue, 10 Jun 2014 14:26:08 +0530 Subject: [PATCH 2/3] [FIX] survey: missing timezone conversions As the survey hardcode lot's of views and reports in python, we do not beneficiate from automatic timezone conversions in the webclient. Hopefully this is fixed in v8 after refactoring of the survey module. opw 608786 --- addons/survey/report/survey_browse_response.py | 8 +++++++- addons/survey/survey.py | 8 +++++++- addons/survey/wizard/survey_answer.py | 6 +++++- 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/addons/survey/report/survey_browse_response.py b/addons/survey/report/survey_browse_response.py index 91e534877e7..fc9f5e5496d 100644 --- a/addons/survey/report/survey_browse_response.py +++ b/addons/survey/report/survey_browse_response.py @@ -22,6 +22,8 @@ import time +import pytz +from datetime import datetime from openerp import pooler, tools from openerp.report import report_sxw from openerp.report.interface import report_rml @@ -30,6 +32,8 @@ from openerp.tools.translate import _ class survey_browse_response(report_rml): def create(self, cr, uid, ids, datas, context): + if context is None: + context = {} _divide_columns_for_matrix = 0.7 _display_ans_in_rows = 5 _pageSize = ('29.7cm','21.1cm') @@ -204,7 +208,9 @@ class survey_browse_response(report_rml): for survey in surv_obj.browse(cr, uid, [response.survey_id.id]): tbl_width = float(_tbl_widths.replace('cm', '')) colwidth = "2.5cm,4.8cm," + str(tbl_width - 15.0) +"cm,3.2cm,4.5cm" - resp_create = tools.ustr(time.strftime('%d-%m-%Y %I:%M:%S %p', time.strptime(response.date_create.split('.')[0], '%Y-%m-%d %H:%M:%S'))) + timezone = pytz.timezone(context.get('tz') or 'UTC') + create_date = pytz.UTC.localize(datetime.strptime(response.date_create.split('.')[0], tools.DEFAULT_SERVER_DATETIME_FORMAT)) + resp_create = create_date.astimezone(timezone).strftime("%Y-%m-%d %H:%M:%S") #Converting date to user's timezone rml += """ """ + _('Print Date : ') + """ diff --git a/addons/survey/survey.py b/addons/survey/survey.py index 6e7198ae591..e03962487ac 100644 --- a/addons/survey/survey.py +++ b/addons/survey/survey.py @@ -20,6 +20,7 @@ ############################################################################## import copy +import pytz from datetime import datetime from dateutil.relativedelta import relativedelta from time import strftime @@ -674,10 +675,15 @@ class survey_response(osv.osv): def name_get(self, cr, uid, ids, context=None): if not len(ids): return [] + if context is None: + context = {} reads = self.read(cr, uid, ids, ['user_id','date_create'], context=context) res = [] for record in reads: - name = (record['user_id'] and record['user_id'][1] or '' )+ ' (' + record['date_create'].split('.')[0] + ')' + timezone = pytz.timezone(context.get('tz') or 'UTC') + create_date = pytz.UTC.localize(datetime.strptime(record['date_create'].split('.')[0], tools.DEFAULT_SERVER_DATETIME_FORMAT)) + localized_create_date = create_date.astimezone(timezone) + name = (record['user_id'] and record['user_id'][1] or '' )+ ' (' + localized_create_date.strftime("%Y-%m-%d %H:%M:%S") + ')' res.append((record['id'], name)) return res diff --git a/addons/survey/wizard/survey_answer.py b/addons/survey/wizard/survey_answer.py index aa7f199367b..c87a87c3e77 100644 --- a/addons/survey/wizard/survey_answer.py +++ b/addons/survey/wizard/survey_answer.py @@ -20,6 +20,7 @@ ############################################################################## import base64 +import pytz import datetime from lxml import etree import os @@ -171,7 +172,10 @@ class survey_question_wiz(osv.osv_memory): # TODO: l10n, cleanup this code to make it readable. Or template? xml_group = etree.SubElement(xml_form, 'group', {'col': '40', 'colspan': '4'}) record = sur_response_obj.browse(cr, uid, context['response_id'][context['response_no']]) - etree.SubElement(xml_group, 'label', {'string': to_xml(tools.ustr(_('Answer Of :- ') + record.user_id.name + _(', Date :- ') + record.date_create.split('.')[0] )), 'align':"0.0"}) + timezone = pytz.timezone(context.get('tz') or 'UTC') + response_date = pytz.UTC.localize(datetime.datetime.strptime(record['date_create'].split('.')[0], tools.DEFAULT_SERVER_DATETIME_FORMAT)) + localized_response_date = response_date.astimezone(timezone) + etree.SubElement(xml_group, 'label', {'string': to_xml(tools.ustr(_('Answer Of :- ') + record.user_id.name + _(', Date :- ') + localized_response_date.strftime("%Y-%m-%d %H:%M:%S") )), 'align':"0.0"}) etree.SubElement(xml_group, 'label', {'string': to_xml(tools.ustr(_(" Answer :- ") + str(context.get('response_no',0) + 1) +"/" + str(len(context.get('response_id',0))) )), 'align':"0.0"}) if context.get('response_no',0) > 0: etree.SubElement(xml_group, 'button', {'colspan':"1",'icon':"gtk-go-back",'name':"action_forward_previous",'string': tools.ustr("Previous Answer"),'type':"object"}) From e07bc5d84540ff9cd6e1de15b097bc296c86cc1f Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 4 Aug 2014 15:54:56 +0200 Subject: [PATCH 3/3] [ADD] res_partner: test case for fix rev 4a278809741d4e961ac13d3477a046d43b32cfa7 --- openerp/addons/base/tests/test_base.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 42ba21a1228..4c70dab2ad1 100644 --- a/openerp/addons/base/tests/test_base.py +++ b/openerp/addons/base/tests/test_base.py @@ -250,20 +250,24 @@ class test_base(common.TransactionCase): 'parent_id': p1.id})) p2 = self.res_partner.browse(cr, uid, self.res_partner.search(cr, uid, [('email', '=', 'agr@sunhelm.com')])[0]) + self.res_partner.write(cr, uid, sunhelm.id, {'child_ids': [(0, 0, {'name': 'Ulrik Greenthorn', + 'email': 'ugr@sunhelm.com'})]}) + p3 = self.res_partner.browse(cr, uid, self.res_partner.search(cr, uid, + [('email', '=', 'ugr@sunhelm.com')])[0]) - for p in (p0, p1, p11, p2): + for p in (p0, p1, p11, p2, p3): p.refresh() self.assertEquals(p.commercial_partner_id, sunhelm, 'Incorrect commercial entity resolution') self.assertEquals(p.vat, sunhelm.vat, 'Commercial fields must be automatically synced') sunhelmvat = 'BE0123456789' sunhelm.write({'vat': sunhelmvat}) - for p in (p0, p1, p11, p2): + for p in (p0, p1, p11, p2, p3): p.refresh() self.assertEquals(p.vat, sunhelmvat, 'Commercial fields must be automatically and recursively synced') p1vat = 'BE0987654321' p1.write({'vat': p1vat}) - for p in (sunhelm, p0, p11, p2): + for p in (sunhelm, p0, p11, p2, p3): p.refresh() self.assertEquals(p.vat, sunhelmvat, 'Sync to children should only work downstream and on commercial entities')