[MERGE] forward port of branch saas-4 up to 8c0c743
This commit is contained in:
@@ -140,6 +140,7 @@ class PaymentAcquirer(osv.Model):
|
|||||||
'country': tx.partner_country_id,
|
'country': tx.partner_country_id,
|
||||||
'phone': tx.partner_phone,
|
'phone': tx.partner_phone,
|
||||||
'reference': tx.partner_reference,
|
'reference': tx.partner_reference,
|
||||||
|
'state': None,
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
if partner_id:
|
if partner_id:
|
||||||
@@ -154,6 +155,7 @@ class PaymentAcquirer(osv.Model):
|
|||||||
'country_id': partner.country_id.id,
|
'country_id': partner.country_id.id,
|
||||||
'country': partner.country_id,
|
'country': partner.country_id,
|
||||||
'phone': partner.phone,
|
'phone': partner.phone,
|
||||||
|
'state': partner.state_id,
|
||||||
}
|
}
|
||||||
else:
|
else:
|
||||||
partner, partner_data = False, {}
|
partner, partner_data = False, {}
|
||||||
|
|||||||
@@ -118,6 +118,7 @@ class AcquirerPaypal(osv.Model):
|
|||||||
'address1': partner_values['address'],
|
'address1': partner_values['address'],
|
||||||
'city': partner_values['city'],
|
'city': partner_values['city'],
|
||||||
'country': partner_values['country'] and partner_values['country'].name or '',
|
'country': partner_values['country'] and partner_values['country'].name or '',
|
||||||
|
'state': partner_values['state'] and partner_values['state'].name or '',
|
||||||
'email': partner_values['email'],
|
'email': partner_values['email'],
|
||||||
'zip': partner_values['zip'],
|
'zip': partner_values['zip'],
|
||||||
'first_name': partner_values['first_name'],
|
'first_name': partner_values['first_name'],
|
||||||
@@ -226,7 +227,7 @@ class TxPaypal(osv.Model):
|
|||||||
# check seller
|
# check seller
|
||||||
if data.get('receiver_email') != tx.acquirer_id.paypal_email_account:
|
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))
|
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))
|
invalid_parameters.append(('receiver_id', data.get('receiver_id'), tx.acquirer_id.paypal_seller_account))
|
||||||
|
|
||||||
return invalid_parameters
|
return invalid_parameters
|
||||||
|
|||||||
@@ -31,7 +31,7 @@
|
|||||||
<span t-field="o.name"/>
|
<span t-field="o.name"/>
|
||||||
</h2>
|
</h2>
|
||||||
|
|
||||||
<div class="row mt32 mb32">
|
<div class="row mt32 mb32" id="informations">
|
||||||
<div t-if="o.client_order_ref" class="col-xs-3">
|
<div t-if="o.client_order_ref" class="col-xs-3">
|
||||||
<strong>Your Reference:</strong>
|
<strong>Your Reference:</strong>
|
||||||
<p t-field="o.client_order_ref"/>
|
<p t-field="o.client_order_ref"/>
|
||||||
@@ -45,10 +45,6 @@
|
|||||||
<strong>Salesperson:</strong>
|
<strong>Salesperson:</strong>
|
||||||
<p t-field="o.user_id.name"/>
|
<p t-field="o.user_id.name"/>
|
||||||
</div>
|
</div>
|
||||||
<div t-if="o.validity_date" class="col-xs-3">
|
|
||||||
<strong>Validity Date:</strong>
|
|
||||||
<p t-field="o.validity_date"/>
|
|
||||||
</div>
|
|
||||||
<div t-if="o.payment_term" class="col-xs-3">
|
<div t-if="o.payment_term" class="col-xs-3">
|
||||||
<strong>Payment Term:</strong>
|
<strong>Payment Term:</strong>
|
||||||
<p t-field="o.payment_term"/>
|
<p t-field="o.payment_term"/>
|
||||||
|
|||||||
@@ -3,12 +3,15 @@ import cStringIO
|
|||||||
import datetime
|
import datetime
|
||||||
from itertools import islice
|
from itertools import islice
|
||||||
import json
|
import json
|
||||||
|
import xml.etree.ElementTree as ET
|
||||||
|
|
||||||
import logging
|
import logging
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from sys import maxint
|
from sys import maxint
|
||||||
|
|
||||||
import werkzeug.utils
|
import werkzeug.utils
|
||||||
|
import urllib2
|
||||||
import werkzeug.wrappers
|
import werkzeug.wrappers
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
|
|
||||||
@@ -353,6 +356,20 @@ class Website(openerp.addons.web.controllers.main.Home):
|
|||||||
obj = _object.browse(request.cr, request.uid, _id)
|
obj = _object.browse(request.cr, request.uid, _id)
|
||||||
return bool(obj.website_published)
|
return bool(obj.website_published)
|
||||||
|
|
||||||
|
@http.route(['/website/seo_suggest/<keywords>'], type='http', auth="public", website=True)
|
||||||
|
def seo_suggest(self, 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']])
|
||||||
|
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
# Helpers
|
# Helpers
|
||||||
#------------------------------------------------------
|
#------------------------------------------------------
|
||||||
|
|||||||
@@ -95,7 +95,7 @@
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
$.getJSON("http://suggest.hp.af.cm/suggest/"+encodeURIComponent(this.root + " "), addSuggestions);
|
$.getJSON("/website/seo_suggest/" + encodeURIComponent(this.root + " "), addSuggestions);
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ OpenERP Sale Quote Roller
|
|||||||
'data': [
|
'data': [
|
||||||
'views/website_quotation.xml',
|
'views/website_quotation.xml',
|
||||||
'views/website_quotation_backend.xml',
|
'views/website_quotation_backend.xml',
|
||||||
|
'views/report_saleorder.xml',
|
||||||
'data/website_quotation_data.xml',
|
'data/website_quotation_data.xml',
|
||||||
'security/ir.model.access.csv',
|
'security/ir.model.access.csv',
|
||||||
],
|
],
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ class sale_order(osv.osv):
|
|||||||
'template_id': fields.many2one('sale.quote.template', 'Quote Template'),
|
'template_id': fields.many2one('sale.quote.template', 'Quote Template'),
|
||||||
'website_description': fields.html('Description'),
|
'website_description': fields.html('Description'),
|
||||||
'options' : fields.one2many('sale.order.option', 'order_id', 'Optional Products Lines'),
|
'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",
|
'amount_undiscounted': fields.function(_get_total, string='Amount Before Discount', type="float",
|
||||||
digits_compute=dp.get_precision('Account'))
|
digits_compute=dp.get_precision('Account'))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<openerp>
|
||||||
|
<data>
|
||||||
|
<template id="report_saleorder_validity_date" inherit_id="sale.report_saleorder_document">
|
||||||
|
<xpath expr="//div[@class='page']/div[@id='informations']" position="inside">
|
||||||
|
<div t-if="o.validity_date" class="col-xs-3">
|
||||||
|
<strong>Expiry Date:</strong>
|
||||||
|
<p t-field="o.validity_date"/>
|
||||||
|
</div>
|
||||||
|
</xpath>
|
||||||
|
</template>
|
||||||
|
</data>
|
||||||
|
</openerp>
|
||||||
@@ -450,17 +450,31 @@ class res_partner(osv.osv, format_address):
|
|||||||
def _commercial_sync_from_company(self, cr, uid, partner, context=None):
|
def _commercial_sync_from_company(self, cr, uid, partner, context=None):
|
||||||
""" Handle sync of commercial fields when a new parent commercial entity is set,
|
""" Handle sync of commercial fields when a new parent commercial entity is set,
|
||||||
as if they were related fields """
|
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)
|
commercial_fields = self._commercial_fields(cr, uid, context=context)
|
||||||
sync_vals = self._update_fields_values(cr, uid, partner.commercial_partner_id,
|
sync_vals = self._update_fields_values(cr, uid, commercial_partner,
|
||||||
commercial_fields, context=context)
|
commercial_fields, context=context)
|
||||||
partner.write(sync_vals)
|
partner.write(sync_vals)
|
||||||
|
|
||||||
def _commercial_sync_to_children(self, cr, uid, partner, context=None):
|
def _commercial_sync_to_children(self, cr, uid, partner, context=None):
|
||||||
""" Handle sync of commercial fields to descendants """
|
""" Handle sync of commercial fields to descendants """
|
||||||
commercial_fields = self._commercial_fields(cr, uid, context=context)
|
commercial_fields = self._commercial_fields(cr, uid, context=context)
|
||||||
sync_vals = self._update_fields_values(cr, uid, partner.commercial_partner_id,
|
commercial_partner = partner.commercial_partner_id
|
||||||
commercial_fields, context=context)
|
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]
|
sync_children = [c for c in partner.child_ids if not c.is_company]
|
||||||
for child in sync_children:
|
for child in sync_children:
|
||||||
self._commercial_sync_to_children(cr, uid, child, context=context)
|
self._commercial_sync_to_children(cr, uid, child, context=context)
|
||||||
|
|||||||
@@ -250,20 +250,24 @@ class test_base(common.TransactionCase):
|
|||||||
'parent_id': p1.id}))
|
'parent_id': p1.id}))
|
||||||
p2 = self.res_partner.browse(cr, uid, self.res_partner.search(cr, uid,
|
p2 = self.res_partner.browse(cr, uid, self.res_partner.search(cr, uid,
|
||||||
[('email', '=', 'agr@sunhelm.com')])[0])
|
[('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()
|
p.refresh()
|
||||||
self.assertEquals(p.commercial_partner_id, sunhelm, 'Incorrect commercial entity resolution')
|
self.assertEquals(p.commercial_partner_id, sunhelm, 'Incorrect commercial entity resolution')
|
||||||
self.assertEquals(p.vat, sunhelm.vat, 'Commercial fields must be automatically synced')
|
self.assertEquals(p.vat, sunhelm.vat, 'Commercial fields must be automatically synced')
|
||||||
sunhelmvat = 'BE0123456789'
|
sunhelmvat = 'BE0123456789'
|
||||||
sunhelm.write({'vat': sunhelmvat})
|
sunhelm.write({'vat': sunhelmvat})
|
||||||
for p in (p0, p1, p11, p2):
|
for p in (p0, p1, p11, p2, p3):
|
||||||
p.refresh()
|
p.refresh()
|
||||||
self.assertEquals(p.vat, sunhelmvat, 'Commercial fields must be automatically and recursively synced')
|
self.assertEquals(p.vat, sunhelmvat, 'Commercial fields must be automatically and recursively synced')
|
||||||
|
|
||||||
p1vat = 'BE0987654321'
|
p1vat = 'BE0987654321'
|
||||||
p1.write({'vat': p1vat})
|
p1.write({'vat': p1vat})
|
||||||
for p in (sunhelm, p0, p11, p2):
|
for p in (sunhelm, p0, p11, p2, p3):
|
||||||
p.refresh()
|
p.refresh()
|
||||||
self.assertEquals(p.vat, sunhelmvat, 'Sync to children should only work downstream and on commercial entities')
|
self.assertEquals(p.vat, sunhelmvat, 'Sync to children should only work downstream and on commercial entities')
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user