diff --git a/addons/survey/report/survey_browse_response.py b/addons/survey/report/survey_browse_response.py index 7c4a5e98aa1..4cc4b6aef9a 100644 --- a/addons/survey/report/survey_browse_response.py +++ b/addons/survey/report/survey_browse_response.py @@ -21,6 +21,8 @@ ############################################################################## import time +import pytz +from datetime import datetime import openerp from openerp import tools @@ -31,6 +33,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') @@ -207,7 +211,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 37a0c6ed773..6372acf8262 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 @@ -667,10 +668,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 5b9bbb5de7e..98ca022d884 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 @@ -173,7 +174,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"}) diff --git a/openerp/addons/base/res/res_partner.py b/openerp/addons/base/res/res_partner.py index 860d0e9ce6c..0af4e88a07c 100644 --- a/openerp/addons/base/res/res_partner.py +++ b/openerp/addons/base/res/res_partner.py @@ -449,17 +449,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) diff --git a/openerp/addons/base/tests/test_base.py b/openerp/addons/base/tests/test_base.py index 85bf9fdfde2..dd46b86bcdb 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')