From 24933959628d54bee713f3736b089bb3b16fbde8 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Sun, 3 Aug 2014 20:12:45 +0200 Subject: [PATCH 01/10] [FIX] product_visible_discount: no crash when no pricelist passed or product without company Fixes an error introduced in f6fb2b6 --- addons/product_visible_discount/product_visible_discount.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/addons/product_visible_discount/product_visible_discount.py b/addons/product_visible_discount/product_visible_discount.py index 275bfcd68b1..6ce35a741e2 100644 --- a/addons/product_visible_discount/product_visible_discount.py +++ b/addons/product_visible_discount/product_visible_discount.py @@ -74,7 +74,7 @@ class sale_order_line(osv.osv): result=res['value'] pricelist_obj=self.pool.get('product.pricelist') product_obj = self.pool.get('product.product') - if product: + if product and pricelist: if result.get('price_unit',False): price=result['price_unit'] else: @@ -88,7 +88,7 @@ class sale_order_line(osv.osv): new_list_price = get_real_price(list_price, product.id, qty, uom, pricelist) if so_pricelist.visible_discount and list_price[pricelist] != 0 and new_list_price != 0: - if so_pricelist.currency_id.id != product.company_id.currency_id.id: + if product.company_id and so_pricelist.currency_id.id != product.company_id.currency_id.id: # new_list_price is in company's currency while price in pricelist currency new_list_price = self.pool['res.currency'].compute(cr, uid, product.company_id.currency_id.id, so_pricelist.currency_id.id, @@ -101,4 +101,6 @@ class sale_order_line(osv.osv): result['discount'] = 0.0 else: result['discount'] = 0.0 + else: + result['discount'] = 0.0 return res From 98e9981d59c36ab47a4828aa11e9b0cf989c2b4b Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 4 Aug 2014 10:25:59 +0200 Subject: [PATCH 02/10] [FIX] payment_paypal: paypal IPN, receiver_id is not always passed The method _paypal_form_get_invalid_parameters checks that the params passed by the paypal feedback coroborate with the transaction requested by Odoo. It looks like the 'receiver_id' is not always passed by the paypal feedback. Therefore, we check this param only if it is available in the paypal feeback. This issue had as side-effect to not validate the paypal transaction, which remained 'draft' permanently. --- addons/payment_paypal/models/paypal.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/addons/payment_paypal/models/paypal.py b/addons/payment_paypal/models/paypal.py index ffa5de1bf7a..cd436118d29 100644 --- a/addons/payment_paypal/models/paypal.py +++ b/addons/payment_paypal/models/paypal.py @@ -221,7 +221,7 @@ class TxPaypal(osv.Model): # check seller if data.get('receiver_email') != tx.acquirer_id.paypal_email_account: invalid_parameters.append(('receiver_email', data.get('receiver_email'), tx.acquirer_id.paypal_email_account)) - if tx.acquirer_id.paypal_seller_account and data.get('receiver_id') != tx.acquirer_id.paypal_seller_account: + if data.get('receiver_id') and tx.acquirer_id.paypal_seller_account and data['receiver_id'] != tx.acquirer_id.paypal_seller_account: invalid_parameters.append(('receiver_id', data.get('receiver_id'), tx.acquirer_id.paypal_seller_account)) return invalid_parameters From 657e6fafe5e50f48824126e095fb0975fb003a5d Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 4 Aug 2014 11:05:01 +0200 Subject: [PATCH 03/10] [FIX] payment*: add the customer state to payment (paypal) transactions --- addons/payment/models/payment_acquirer.py | 2 ++ addons/payment_paypal/models/paypal.py | 1 + 2 files changed, 3 insertions(+) diff --git a/addons/payment/models/payment_acquirer.py b/addons/payment/models/payment_acquirer.py index 9ad77b3c4cf..c4e2670c43d 100644 --- a/addons/payment/models/payment_acquirer.py +++ b/addons/payment/models/payment_acquirer.py @@ -133,6 +133,7 @@ class PaymentAcquirer(osv.Model): 'country': tx.partner_country_id, 'phone': tx.partner_phone, 'reference': tx.partner_reference, + 'state': None, } else: if partner_id: @@ -147,6 +148,7 @@ class PaymentAcquirer(osv.Model): 'country_id': partner.country_id.id, 'country': partner.country_id, 'phone': partner.phone, + 'state': partner.state_id, } else: partner, partner_data = False, {} diff --git a/addons/payment_paypal/models/paypal.py b/addons/payment_paypal/models/paypal.py index cd436118d29..941f97f9aaf 100644 --- a/addons/payment_paypal/models/paypal.py +++ b/addons/payment_paypal/models/paypal.py @@ -113,6 +113,7 @@ class AcquirerPaypal(osv.Model): 'address1': partner_values['address'], 'city': partner_values['city'], 'country': partner_values['country'] and partner_values['country'].name or '', + 'state': partner_values['state'] and partner_values['state'].name or '', 'email': partner_values['email'], 'zip': partner_values['zip'], 'first_name': partner_values['first_name'], From 28e62e46b54612853b83c805c9a23bef1c2f8a43 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Mon, 4 Aug 2014 12:25:59 +0200 Subject: [PATCH 04/10] [FIX] website: use internal route for SEO suggest keyword, old server is down --- addons/website/controllers/main.py | 11 +++++++++++ addons/website/static/src/js/website.seo.js | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 092da529e6a..650fcae573a 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -3,12 +3,15 @@ import cStringIO import datetime from itertools import islice import json +import xml.etree.ElementTree as ET + import logging import re from sys import maxint import werkzeug.utils +import urllib2 import werkzeug.wrappers from PIL import Image @@ -355,6 +358,14 @@ class Website(openerp.addons.web.controllers.main.Home): obj = _object.browse(request.cr, request.uid, _id) return bool(obj.website_published) + @http.route(['/website/seo_suggest/'], type='http', auth="public", website=True) + def seo_suggest(self, keywords): + url = "http://google.com/complete/search?ie=utf8&oe=utf8&output=toolbar&q=" + req = urllib2.Request("%s?%s" % (url, keywords)) + request = urllib2.urlopen(req) + xmlroot = ET.fromstring(request.read()) + return json.dumps([sugg[0].attrib['data'] for sugg in xmlroot if len(sugg) and sugg[0].attrib['data']]) + #------------------------------------------------------ # Helpers #------------------------------------------------------ diff --git a/addons/website/static/src/js/website.seo.js b/addons/website/static/src/js/website.seo.js index 1c4bad90ffc..7714f7e1a0d 100644 --- a/addons/website/static/src/js/website.seo.js +++ b/addons/website/static/src/js/website.seo.js @@ -95,7 +95,7 @@ } }); } - $.getJSON("http://suggest.hp.af.cm/suggest/"+encodeURIComponent(this.root + " "), addSuggestions); + $.getJSON("/website/seo_suggest/" + encodeURIComponent(this.root + " "), addSuggestions); }, }); From 4a278809741d4e961ac13d3477a046d43b32cfa7 Mon Sep 17 00:00:00 2001 From: Denis Ledoux Date: Mon, 4 Aug 2014 14:34:08 +0200 Subject: [PATCH 05/10] [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 19a6e879f07dab75e41effc1284f766ad45b09b2 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Mon, 4 Aug 2014 14:41:55 +0200 Subject: [PATCH 06/10] [FIX] website: encode param for seo search, else multi words will not work. --- addons/website/controllers/main.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/addons/website/controllers/main.py b/addons/website/controllers/main.py index 650fcae573a..f2b6d7dd7b8 100644 --- a/addons/website/controllers/main.py +++ b/addons/website/controllers/main.py @@ -360,8 +360,14 @@ class Website(openerp.addons.web.controllers.main.Home): @http.route(['/website/seo_suggest/'], type='http', auth="public", website=True) def seo_suggest(self, keywords): - url = "http://google.com/complete/search?ie=utf8&oe=utf8&output=toolbar&q=" - req = urllib2.Request("%s?%s" % (url, keywords)) + url = "http://google.com/complete/search" + param = { + 'ie': 'utf8', + 'oe': 'utf8', + 'output': 'toolbar', + 'q': keywords + } + req = urllib2.Request("%s?%s" % (url, werkzeug.url_encode(param))) request = urllib2.urlopen(req) xmlroot = ET.fromstring(request.read()) return json.dumps([sugg[0].attrib['data'] for sugg in xmlroot if len(sugg) and sugg[0].attrib['data']]) From 834dfc00ebf046613f69221043e8bd5350b94322 Mon Sep 17 00:00:00 2001 From: Simon Lejeune Date: Mon, 4 Aug 2014 14:45:38 +0200 Subject: [PATCH 07/10] [FIX] sale/website_quote: inherit the sale order report to show the validity date --- addons/sale/views/report_saleorder.xml | 6 +----- addons/website_quote/__openerp__.py | 1 + addons/website_quote/views/report_saleorder.xml | 13 +++++++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 addons/website_quote/views/report_saleorder.xml diff --git a/addons/sale/views/report_saleorder.xml b/addons/sale/views/report_saleorder.xml index 243004869e3..a61120c4216 100644 --- a/addons/sale/views/report_saleorder.xml +++ b/addons/sale/views/report_saleorder.xml @@ -31,7 +31,7 @@ -
+
Your Reference:

@@ -45,10 +45,6 @@ Salesperson:

-
- Validity Date: -

-

Payment Term:

diff --git a/addons/website_quote/__openerp__.py b/addons/website_quote/__openerp__.py index 3991f6ac17e..79e2c818aef 100644 --- a/addons/website_quote/__openerp__.py +++ b/addons/website_quote/__openerp__.py @@ -13,6 +13,7 @@ OpenERP Sale Quote Roller 'data': [ 'views/website_quotation.xml', 'views/website_quotation_backend.xml', + 'views/report_saleorder.xml', 'data/website_quotation_data.xml', 'security/ir.model.access.csv', ], diff --git a/addons/website_quote/views/report_saleorder.xml b/addons/website_quote/views/report_saleorder.xml new file mode 100644 index 00000000000..a6f7b9879e8 --- /dev/null +++ b/addons/website_quote/views/report_saleorder.xml @@ -0,0 +1,13 @@ + + + + + + From 4b5015469d605def72e953dd6f98c5735f229f02 Mon Sep 17 00:00:00 2001 From: dhr-odoo Date: Tue, 10 Jun 2014 14:26:08 +0530 Subject: [PATCH 08/10] [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 e56635c3f1eee726f4e1c94be030d121e78d3112 Mon Sep 17 00:00:00 2001 From: Simon Lejeune Date: Mon, 4 Aug 2014 15:49:16 +0200 Subject: [PATCH 09/10] [REF] website_quote: displayed string of validity_date field changed from 'Validity Date' to 'Expiry Date' --- addons/website_quote/models/order.py | 2 +- addons/website_quote/views/report_saleorder.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/addons/website_quote/models/order.py b/addons/website_quote/models/order.py index c031baf7632..b19614410b5 100644 --- a/addons/website_quote/models/order.py +++ b/addons/website_quote/models/order.py @@ -114,7 +114,7 @@ class sale_order(osv.osv): 'template_id': fields.many2one('sale.quote.template', 'Quote Template'), 'website_description': fields.html('Description'), 'options' : fields.one2many('sale.order.option', 'order_id', 'Optional Products Lines'), - 'validity_date': fields.date('Validity Date'), + 'validity_date': fields.date('Expiry Date'), 'amount_undiscounted': fields.function(_get_total, string='Amount Before Discount', type="float", digits_compute=dp.get_precision('Account')) } diff --git a/addons/website_quote/views/report_saleorder.xml b/addons/website_quote/views/report_saleorder.xml index a6f7b9879e8..e85a48f9d22 100644 --- a/addons/website_quote/views/report_saleorder.xml +++ b/addons/website_quote/views/report_saleorder.xml @@ -4,7 +4,7 @@