[MERGE] forward port of branch saas-4 up to b49755b
The forward port of the fix 3609ba10f2
will be done separately, as the mrp scheduler has been completely refactored from saas-5.
Conflicts:
addons/l10n_be_coda/wizard/account_coda_import.py
addons/point_of_sale/static/src/xml/pos.xml
addons/procurement/schedulers.py
This commit is contained in:
commit
fe83c11301
|
@ -1574,8 +1574,7 @@ class account_invoice_line(osv.osv):
|
|||
company_currency = self.pool['res.company'].browse(cr, uid, inv.company_id.id).currency_id.id
|
||||
for line in inv.invoice_line:
|
||||
mres = self.move_line_get_item(cr, uid, line, context)
|
||||
if not mres:
|
||||
continue
|
||||
mres['invl_id'] = line.id
|
||||
res.append(mres)
|
||||
tax_code_found= False
|
||||
for tax in tax_obj.compute_all(cr, uid, line.invoice_line_tax_id,
|
||||
|
|
|
@ -124,7 +124,7 @@ class account_invoice_line(osv.osv):
|
|||
account_prec = decimal_precision.precision_get(cr, uid, 'Account')
|
||||
# calculate and write down the possible price difference between invoice price and product price
|
||||
for line in res:
|
||||
if a == line['account_id'] and i_line.product_id.id == line['product_id']:
|
||||
if line.get('invl_id', 0) == i_line.id and a == line['account_id']:
|
||||
uom = i_line.product_id.uos_id or i_line.product_id.uom_id
|
||||
valuation_price_unit = self.pool.get('product.uom')._compute_price(cr, uid, uom.id, i_line.product_id.standard_price, i_line.uos_id.id)
|
||||
if inv.currency_id.id != company_currency:
|
||||
|
|
|
@ -54,7 +54,7 @@ class meeting_invitation(http.Controller):
|
|||
# Function used, in RPC to check every 5 minutes, if notification to do for an event or not
|
||||
@http.route('/calendar/notify', type='json', auth="none")
|
||||
def notify(self):
|
||||
registry = openerp.modules.registry.RegistryManager.get(request.session.db)
|
||||
registry = request.registry
|
||||
uid = request.session.uid
|
||||
context = request.session.context
|
||||
with registry.cursor() as cr:
|
||||
|
@ -63,7 +63,7 @@ class meeting_invitation(http.Controller):
|
|||
|
||||
@http.route('/calendar/notify_ack', type='json', auth="none")
|
||||
def notify_ack(self, type=''):
|
||||
registry = openerp.modules.registry.RegistryManager.get(request.session.db)
|
||||
registry = request.registry
|
||||
uid = request.session.uid
|
||||
context = request.session.context
|
||||
with registry.cursor() as cr:
|
||||
|
|
|
@ -468,7 +468,7 @@
|
|||
<field name="expiration_date" />
|
||||
</group>
|
||||
<group>
|
||||
<field name="insurer_id" />
|
||||
<field name="insurer_id" context="{'default_supplier': True}"/>
|
||||
<field name="purchaser_id" />
|
||||
<field name="ins_ref" />
|
||||
</group>
|
||||
|
@ -676,7 +676,7 @@
|
|||
<field name="date" />
|
||||
<field name="purchaser_id" />
|
||||
<field name="inv_ref" />
|
||||
<field name="vendor_id" />
|
||||
<field name="vendor_id" context="{'default_supplier': True}"/>
|
||||
</group>
|
||||
</group>
|
||||
<group string="Notes">
|
||||
|
@ -778,7 +778,7 @@
|
|||
<group string="Additional Details">
|
||||
<field name="date" />
|
||||
<field name="purchaser_id" />
|
||||
<field name="vendor_id" />
|
||||
<field name="vendor_id" context="{'default_supplier': True}"/>
|
||||
<field name="inv_ref" />
|
||||
</group>
|
||||
</group>
|
||||
|
|
|
@ -40,7 +40,7 @@ class account_coda_import(osv.osv_memory):
|
|||
}
|
||||
|
||||
_defaults = {
|
||||
'coda_fname': lambda *a: '',
|
||||
'coda_fname': 'coda.txt',
|
||||
}
|
||||
|
||||
def coda_parsing(self, cr, uid, ids, context=None, batch=False, codafile=None, codafilename=None):
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
import base64
|
||||
import logging
|
||||
import re
|
||||
from email.utils import formataddr
|
||||
from urllib import urlencode
|
||||
from urlparse import urljoin
|
||||
|
||||
|
@ -187,10 +188,9 @@ class mail_mail(osv.Model):
|
|||
- elif 'partner', no notificatoin or no doc: recipient specific (Partner Name <email>)
|
||||
- else fallback on mail.email_to splitting """
|
||||
if partner and mail.notification and mail.record_name:
|
||||
sanitized_record_name = re.sub(r'[^\w+.]+', '-', mail.record_name)
|
||||
email_to = [_('"Followers of %s" <%s>') % (sanitized_record_name, partner.email)]
|
||||
email_to = [formataddr((_('Followers of %s') % mail.record_name, partner.email))]
|
||||
elif partner:
|
||||
email_to = ['%s <%s>' % (partner.name, partner.email)]
|
||||
email_to = [formataddr((partner.name, partner.email))]
|
||||
else:
|
||||
email_to = tools.email_split(mail.email_to)
|
||||
return email_to
|
||||
|
|
|
@ -25,6 +25,7 @@ import re
|
|||
from openerp import tools
|
||||
|
||||
from email.header import decode_header
|
||||
from email.utils import formataddr
|
||||
from openerp import SUPERUSER_ID
|
||||
from openerp.osv import osv, orm, fields
|
||||
from openerp.tools import html_email_clean
|
||||
|
@ -175,9 +176,9 @@ class mail_message(osv.Model):
|
|||
def _get_default_from(self, cr, uid, context=None):
|
||||
this = self.pool.get('res.users').browse(cr, SUPERUSER_ID, uid, context=context)
|
||||
if this.alias_name and this.alias_domain:
|
||||
return '%s <%s@%s>' % (this.name, this.alias_name, this.alias_domain)
|
||||
return formataddr((this.name, '%s@%s' % (this.alias_name, this.alias_domain)))
|
||||
elif this.email:
|
||||
return '%s <%s>' % (this.name, this.email)
|
||||
return formataddr((this.name, this.email))
|
||||
raise osv.except_osv(_('Invalid Action!'), _("Unable to send email, please configure the sender's email address or alias."))
|
||||
|
||||
def _get_default_author(self, cr, uid, context=None):
|
||||
|
@ -794,10 +795,8 @@ class mail_message(osv.Model):
|
|||
email_reply_to = emails[0]
|
||||
document_name = self.pool[model].name_get(cr, SUPERUSER_ID, [res_id], context=context)[0]
|
||||
if document_name:
|
||||
# sanitize document name
|
||||
sanitized_doc_name = re.sub(r'[^\w+.]+', '-', document_name[1])
|
||||
# generate reply to
|
||||
email_reply_to = _('"Followers of %s" <%s>') % (sanitized_doc_name, email_reply_to)
|
||||
email_reply_to = formataddr((_('Followers of %s') % document_name[1], email_reply_to))
|
||||
|
||||
return email_reply_to
|
||||
|
||||
|
|
|
@ -450,7 +450,7 @@ class test_mail(TestMail):
|
|||
|
||||
# Test: notifications emails: to a and b, c is email only, r is author
|
||||
# test_emailto = ['Administrator <a@a>', 'Bert Tartopoils <b@b>']
|
||||
test_emailto = ['"Followers of -Pigs-" <a@a>', '"Followers of -Pigs-" <b@b>']
|
||||
test_emailto = [u'"Followers of \\"Pigs\\" !\xf9 $%-" <a@a>', u'"Followers of \\"Pigs\\" !\xf9 $%-" <b@b>']
|
||||
self.assertEqual(len(sent_emails), 2,
|
||||
'message_post: notification emails wrong number of send emails')
|
||||
self.assertEqual(set([m['email_to'][0] for m in sent_emails]), set(test_emailto),
|
||||
|
@ -462,7 +462,7 @@ class test_mail(TestMail):
|
|||
'message_post: notification email sent to more than one email address instead of a precise partner')
|
||||
self.assertIn(sent_email['email_to'][0], test_emailto,
|
||||
'message_post: notification email email_to incorrect')
|
||||
self.assertEqual(sent_email['reply_to'], '"Followers of -Pigs-" <group+pigs@schlouby.fr>',
|
||||
self.assertEqual(sent_email['reply_to'], u'"Followers of \\"Pigs\\" !\xf9 $%-" <group+pigs@schlouby.fr>',
|
||||
'message_post: notification email reply_to incorrect')
|
||||
self.assertEqual(_subject, sent_email['subject'],
|
||||
'message_post: notification email subject incorrect')
|
||||
|
@ -520,7 +520,7 @@ class test_mail(TestMail):
|
|||
|
||||
# Test: emails send by server (to a, b, c, d)
|
||||
# test_emailto = [u'Administrator <a@a>', u'Bert Tartopoils <b@b>', u'Carine Poilvache <c@c>', u'D\xe9d\xe9 Grosbedon <d@d>']
|
||||
test_emailto = [u'"Followers of Pigs" <a@a>', u'"Followers of Pigs" <b@b>', u'"Followers of Pigs" <c@c>', u'"Followers of Pigs" <d@d>']
|
||||
test_emailto = [u'Followers of Pigs <a@a>', u'Followers of Pigs <b@b>', u'Followers of Pigs <c@c>', u'Followers of Pigs <d@d>']
|
||||
# self.assertEqual(len(sent_emails), 3, 'sent_email number of sent emails incorrect')
|
||||
for sent_email in sent_emails:
|
||||
self.assertEqual(sent_email['email_from'], 'Raoul Grosbedon <r@r>',
|
||||
|
|
|
@ -81,8 +81,8 @@ class TestMailMessage(TestMail):
|
|||
alias_domain = 'schlouby.fr'
|
||||
raoul_from = 'Raoul Grosbedon <raoul@raoul.fr>'
|
||||
raoul_from_alias = 'Raoul Grosbedon <raoul@schlouby.fr>'
|
||||
raoul_reply = '"Followers of Pigs" <raoul@raoul.fr>'
|
||||
raoul_reply_alias = '"Followers of Pigs" <group+pigs@schlouby.fr>'
|
||||
raoul_reply = 'Followers of Pigs <raoul@raoul.fr>'
|
||||
raoul_reply_alias = 'Followers of Pigs <group+pigs@schlouby.fr>'
|
||||
|
||||
# --------------------------------------------------
|
||||
# Case1: without alias_domain
|
||||
|
|
|
@ -42,8 +42,8 @@ class AcquirerPaypal(osv.Model):
|
|||
_columns = {
|
||||
'paypal_email_account': fields.char('Paypal Email ID', required_if_provider='paypal'),
|
||||
'paypal_seller_account': fields.char(
|
||||
'Paypal Seller ID',
|
||||
help='The Seller ID is used to ensure communications coming from Paypal are valid and secured.'),
|
||||
'Paypal Merchant ID',
|
||||
help='The Merchant ID is used to ensure communications coming from Paypal are valid and secured.'),
|
||||
'paypal_use_ipn': fields.boolean('Use IPN', help='Paypal Instant Payment Notification'),
|
||||
# Server 2 server
|
||||
'paypal_api_enabled': fields.boolean('Use Rest API'),
|
||||
|
|
|
@ -777,7 +777,7 @@
|
|||
<br />
|
||||
<t t-esc="widget.pos.company.name"/><br />
|
||||
Phone: <t t-esc="widget.pos.company.phone || ''"/><br />
|
||||
User: <t t-esc="widget.pos.cashier.name"/><br />
|
||||
User: <t t-esc="widget.pos.cashier ? widget.pos.cashier.name : widget.pos.user.name"/><br />
|
||||
<br />
|
||||
<t t-if="widget.pos.config.receipt_header">
|
||||
<div style='text-align:center'>
|
||||
|
|
|
@ -474,6 +474,7 @@ instance.web.SearchView = instance.web.Widget.extend(/** @lends instance.web.Sea
|
|||
* Sets up search view's view-wide auto-completion widget
|
||||
*/
|
||||
setup_global_completion: function () {
|
||||
var self = this;
|
||||
var autocomplete = this.$el.autocomplete({
|
||||
source: this.proxy('complete_global_search'),
|
||||
select: this.proxy('select_completion'),
|
||||
|
|
|
@ -516,7 +516,7 @@ instance.web.ListView = instance.web.View.extend( /** @lends instance.web.ListVi
|
|||
self.dataset.index = 0;
|
||||
}
|
||||
} else if (self.dataset.index >= self.records.length) {
|
||||
self.dataset.index = 0;
|
||||
self.dataset.index = self.records.length ? 0 : null;
|
||||
}
|
||||
|
||||
self.compute_aggregates();
|
||||
|
|
|
@ -302,6 +302,8 @@ instance.web_kanban.KanbanView = instance.web.View.extend({
|
|||
var kgroup = new instance.web_kanban.KanbanGroup(self, records, null, self.dataset);
|
||||
if (!_.isEmpty(self.dataset.ids) && (self.dataset.index === null || self.dataset.index >= self.dataset.ids.length)) {
|
||||
self.dataset.index = 0;
|
||||
} else if (_.isEmpty(self.dataset.ids)){
|
||||
self.dataset.index = null;
|
||||
}
|
||||
self.do_add_groups([kgroup]).done(function() {
|
||||
if (_.isEmpty(records)) {
|
||||
|
|
|
@ -117,8 +117,8 @@
|
|||
<xpath expr="//ul[@id='reseller_countries']" position="after">
|
||||
<h3>World Map</h3>
|
||||
<ul class="nav">
|
||||
<iframe t-attf-src="/google_map/?width=260&height=240&partner_ids=#{ google_map_partner_ids }&partner_url=/partners/"
|
||||
style="width:260px; height:260px; border:0; padding:0; margin:0;"></iframe>
|
||||
<iframe t-attf-src="/google_map?width=260&height=240&partner_ids=#{ google_map_partner_ids }&partner_url=/partners/"
|
||||
style="width:260px; height:260px; border:0; padding:0; margin:0;" scrolling="no"></iframe>
|
||||
</ul>
|
||||
</xpath>
|
||||
</template>
|
||||
|
|
|
@ -59,8 +59,11 @@ class WebsiteCustomer(http.Controller):
|
|||
partner_count = partner_obj.search_count(cr, openerp.SUPERUSER_ID, domain, context=request.context)
|
||||
|
||||
# pager
|
||||
url = '/customers/'
|
||||
if country_id:
|
||||
url += 'country/%s' % country_id
|
||||
pager = request.website.pager(
|
||||
url="/customers", total=partner_count, page=page, step=self._references_per_page,
|
||||
url=url, total=partner_count, page=page, step=self._references_per_page,
|
||||
scope=7, url_args=post
|
||||
)
|
||||
|
||||
|
|
|
@ -68,9 +68,8 @@
|
|||
<!-- Option: left column: World Map -->
|
||||
<template id="opt_country" inherit_id="website_customer.index" optional="disabled" name="Show Map">
|
||||
<xpath expr="//div[@id='ref_left_column']" position="inside">
|
||||
|
||||
<iframe t-attf-src="/google_map/?partner_ids=#{ google_map_partner_ids }&partner_url=/customers/&output=embed"
|
||||
style="width:100%; border:0; padding:0; margin:0;"></iframe>
|
||||
<iframe t-attf-src="/google_map?partner_ids=#{ google_map_partner_ids }&partner_url=/customers/&output=embed"
|
||||
style="width:100%; border:0; padding:0; margin:0;" scrolling="no"></iframe>
|
||||
</xpath>
|
||||
</template>
|
||||
|
||||
|
|
|
@ -100,9 +100,12 @@ class website_event(http.Controller):
|
|||
if searches["type"] != 'all':
|
||||
current_type = type_obj.browse(cr, uid, int(searches['type']), context=context)
|
||||
domain_search["type"] = [("type", "=", int(searches["type"]))]
|
||||
if searches["country"] != 'all':
|
||||
|
||||
if searches["country"] != 'all' and searches["country"] != 'online':
|
||||
current_country = country_obj.browse(cr, uid, int(searches['country']), context=context)
|
||||
domain_search["country"] = [("country_id", "=", int(searches["country"]))]
|
||||
domain_search["country"] = ['|', ("country_id", "=", int(searches["country"])), ("country_id", "=", False)]
|
||||
elif searches["country"] == 'online':
|
||||
domain_search["country"] = [("country_id", "=", False)]
|
||||
|
||||
def dom_without(without):
|
||||
domain = [('state', "in", ['draft','confirm','done'])]
|
||||
|
|
|
@ -57,6 +57,7 @@
|
|||
<div itemscope="itemscope" itemtype="http://schema.org/Event" class="media-body">
|
||||
<h4 class="media-heading">
|
||||
<a itemprop="url" t-att-class="event.state == 'done' and 'text-success'" t-attf-href="/event/#{ slug(event) }/#{(not event.menu_id) and 'register' or ''}"><span itemprop="name" t-field="event.name"> </span></a>
|
||||
<small t-if="not event.address_id" class="label label-info">Online</small>
|
||||
<small t-if="not event.website_published" class="label label-danger">not published</small>
|
||||
</h4>
|
||||
<div>
|
||||
|
@ -178,7 +179,13 @@
|
|||
<ul class="nav nav-pills nav-stacked mt32">
|
||||
<t t-foreach="countries">
|
||||
<li t-if="country_id" t-att-class="searches.get('country') == str(country_id and country_id[0]) and 'active' or ''">
|
||||
<a t-attf-href="/event?{{ keep_query('type', 'data', country=country_id[0]) }}"><t t-esc="country_id[1]"/>
|
||||
<a t-attf-href="/event/?{{ keep_query('type', 'date', country=country_id[0]) }}"><t t-esc="country_id[1]"/>
|
||||
<span class="badge pull-right"><t t-esc="country_id_count"/></span>
|
||||
</a>
|
||||
</li>
|
||||
<li t-if="not country_id" t-att-class="searches.get('country') == 'online' and 'active' or ''">
|
||||
<a t-attf-href="/event/?{{ keep_query('type', 'date', country='online') }}">
|
||||
<span>Online Events</span>
|
||||
<span class="badge pull-right"><t t-esc="country_id_count"/></span>
|
||||
</a>
|
||||
</li>
|
||||
|
|
Loading…
Reference in New Issue