[MERGE] forward port branch 9.0 up to 5f9f4f4d9d
This commit is contained in:
@@ -184,14 +184,17 @@ class AccountFrFec(models.TransientModel):
|
|||||||
unaffected_earnings_amount = float(unaffected_earnings_results[11].replace(',', '.')) - float(unaffected_earnings_results[12].replace(',', '.'))
|
unaffected_earnings_amount = float(unaffected_earnings_results[11].replace(',', '.')) - float(unaffected_earnings_results[12].replace(',', '.'))
|
||||||
listrow_amount = current_amount + unaffected_earnings_amount
|
listrow_amount = current_amount + unaffected_earnings_amount
|
||||||
if listrow_amount > 0:
|
if listrow_amount > 0:
|
||||||
listrow[11] = str(listrow_amount)
|
listrow[11] = str(listrow_amount).replace('.', ',')
|
||||||
listrow[12] = '0.00'
|
listrow[12] = '0,00'
|
||||||
else:
|
else:
|
||||||
listrow[11] = '0.00'
|
listrow[11] = '0,00'
|
||||||
listrow[12] = str(listrow_amount)
|
listrow[12] = str(-listrow_amount).replace('.', ',')
|
||||||
w.writerow([s.encode("utf-8") for s in listrow])
|
w.writerow([s.encode("utf-8") for s in listrow])
|
||||||
#if the unaffected earnings account wasn't in the selection yet: add it manually
|
#if the unaffected earnings account wasn't in the selection yet: add it manually
|
||||||
if not unaffected_earnings_line and unaffected_earnings_results and unaffected_earnings_results[11] != '0,00' and unaffected_earnings_results[12] != '0,00':
|
if (not unaffected_earnings_line
|
||||||
|
and unaffected_earnings_results
|
||||||
|
and (unaffected_earnings_results[11] != '0,00'
|
||||||
|
or unaffected_earnings_results[12] != '0,00')):
|
||||||
#search an unaffected earnings account
|
#search an unaffected earnings account
|
||||||
unaffected_earnings_account = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_unaffected_earnings').id)], limit=1)
|
unaffected_earnings_account = self.env['account.account'].search([('user_type_id', '=', self.env.ref('account.data_unaffected_earnings').id)], limit=1)
|
||||||
if unaffected_earnings_account:
|
if unaffected_earnings_account:
|
||||||
|
|||||||
+2
-1
@@ -783,7 +783,8 @@ class mrp_production(osv.osv):
|
|||||||
proc_obj = self.pool.get("procurement.order")
|
proc_obj = self.pool.get("procurement.order")
|
||||||
procs = proc_obj.search(cr, uid, [('production_id', 'in', ids)], context=context)
|
procs = proc_obj.search(cr, uid, [('production_id', 'in', ids)], context=context)
|
||||||
if procs:
|
if procs:
|
||||||
proc_obj.message_post(cr, uid, procs, body=_('Manufacturing order cancelled.'), context=context)
|
for proc in procs:
|
||||||
|
proc_obj.message_post(cr, uid, proc, body=_('Manufacturing order cancelled.'), context=context)
|
||||||
proc_obj.write(cr, uid, procs, {'state': 'exception'}, context=context)
|
proc_obj.write(cr, uid, procs, {'state': 'exception'}, context=context)
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|||||||
@@ -351,7 +351,12 @@ var FieldTextHtml = widget.extend({
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
render_value: function () {
|
render_value: function () {
|
||||||
if (this.lang !== this.view.dataset.context.lang || this.$iframe.attr('src').match(/[?&]edit_translations=1/)) {
|
if (this.$iframe.attr('src').match(/[?&]edit_translations=1/)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// ONLY HAVE THIS IN 9.0 AND SAAS-11
|
||||||
|
var is_editor_onchange = this.get('value') === '<p>on_change_model_and_list</p>';
|
||||||
|
if (this.lang !== this.view.dataset.context.lang && !is_editor_onchange) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var value = (this.get('value') || "").replace(/^<p[^>]*>(\s*|<br\/?>)<\/p>$/, '');
|
var value = (this.get('value') || "").replace(/^<p[^>]*>(\s*|<br\/?>)<\/p>$/, '');
|
||||||
|
|||||||
@@ -151,9 +151,12 @@ class Website(openerp.addons.web.controllers.main.Home):
|
|||||||
# rename the -id-page.xml => -id.xml
|
# rename the -id-page.xml => -id.xml
|
||||||
ira.write(cr, uid, last, dict(url="/sitemap-%d.xml" % current_website.id, name="/sitemap-%d.xml" % current_website.id), context=context)
|
ira.write(cr, uid, last, dict(url="/sitemap-%d.xml" % current_website.id, name="/sitemap-%d.xml" % current_website.id), context=context)
|
||||||
else:
|
else:
|
||||||
|
# TODO: in master/saas-15, move current_website_id in template directly
|
||||||
|
pages_with_website = map(lambda p: "%d-%d" % (current_website.id, p), range(1, pages + 1))
|
||||||
|
|
||||||
# Sitemaps must be split in several smaller files with a sitemap index
|
# Sitemaps must be split in several smaller files with a sitemap index
|
||||||
content = iuv.render_template(cr, uid, 'website.sitemap_index_xml', dict(
|
content = iuv.render_template(cr, uid, 'website.sitemap_index_xml', dict(
|
||||||
pages=range(1, pages + 1),
|
pages=pages_with_website,
|
||||||
url_root=request.httprequest.url_root,
|
url_root=request.httprequest.url_root,
|
||||||
), context=context)
|
), context=context)
|
||||||
create_sitemap('/sitemap-%d.xml' % current_website.id, content)
|
create_sitemap('/sitemap-%d.xml' % current_website.id, content)
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class website_account(website_account):
|
|||||||
])
|
])
|
||||||
invoices = res_invoices.search([
|
invoices = res_invoices.search([
|
||||||
('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]),
|
('message_partner_ids', 'child_of', [partner.commercial_partner_id.id]),
|
||||||
('state', 'in', ['open', 'paid', 'cancelled'])
|
('state', 'in', ['open', 'paid', 'cancel'])
|
||||||
])
|
])
|
||||||
|
|
||||||
response.qcontext.update({
|
response.qcontext.update({
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
Spain, 2017-02-27
|
||||||
|
|
||||||
|
I hereby agree to the terms of the Odoo Individual Contributor License
|
||||||
|
Agreement v1.0.
|
||||||
|
|
||||||
|
I declare that I am authorized and able to make this agreement and sign this
|
||||||
|
declaration.
|
||||||
|
|
||||||
|
Signed,
|
||||||
|
|
||||||
|
Isaac Gallart Bochons igallart@puntsistemes.es https://github.com/igallart
|
||||||
@@ -178,20 +178,20 @@ class ir_cron(models.Model):
|
|||||||
"""
|
"""
|
||||||
db = odoo.sql_db.db_connect(db_name)
|
db = odoo.sql_db.db_connect(db_name)
|
||||||
threading.current_thread().dbname = db_name
|
threading.current_thread().dbname = db_name
|
||||||
cr = db.cursor()
|
|
||||||
jobs = []
|
jobs = []
|
||||||
try:
|
try:
|
||||||
# Make sure the database we poll has the same version as the code of base
|
with db.cursor() as cr:
|
||||||
cr.execute("SELECT 1 FROM ir_module_module WHERE name=%s AND latest_version=%s", ('base', BASE_VERSION))
|
# Make sure the database we poll has the same version as the code of base
|
||||||
if cr.fetchone():
|
cr.execute("SELECT 1 FROM ir_module_module WHERE name=%s AND latest_version=%s", ('base', BASE_VERSION))
|
||||||
# Careful to compare timestamps with 'UTC' - everything is UTC as of v6.1.
|
if cr.fetchone():
|
||||||
cr.execute("""SELECT * FROM ir_cron
|
# Careful to compare timestamps with 'UTC' - everything is UTC as of v6.1.
|
||||||
WHERE numbercall != 0
|
cr.execute("""SELECT * FROM ir_cron
|
||||||
AND active AND nextcall <= (now() at time zone 'UTC')
|
WHERE numbercall != 0
|
||||||
ORDER BY priority""")
|
AND active AND nextcall <= (now() at time zone 'UTC')
|
||||||
jobs = cr.dictfetchall()
|
ORDER BY priority""")
|
||||||
else:
|
jobs = cr.dictfetchall()
|
||||||
_logger.warning('Skipping database %s as its base version is not %s.', db_name, BASE_VERSION)
|
else:
|
||||||
|
_logger.warning('Skipping database %s as its base version is not %s.', db_name, BASE_VERSION)
|
||||||
except psycopg2.ProgrammingError, e:
|
except psycopg2.ProgrammingError, e:
|
||||||
if e.pgcode == '42P01':
|
if e.pgcode == '42P01':
|
||||||
# Class 42 — Syntax Error or Access Rule Violation; 42P01: undefined_table
|
# Class 42 — Syntax Error or Access Rule Violation; 42P01: undefined_table
|
||||||
@@ -201,8 +201,6 @@ class ir_cron(models.Model):
|
|||||||
raise
|
raise
|
||||||
except Exception:
|
except Exception:
|
||||||
_logger.warning('Exception in cron:', exc_info=True)
|
_logger.warning('Exception in cron:', exc_info=True)
|
||||||
finally:
|
|
||||||
cr.close()
|
|
||||||
|
|
||||||
for job in jobs:
|
for job in jobs:
|
||||||
lock_cr = db.cursor()
|
lock_cr = db.cursor()
|
||||||
|
|||||||
@@ -3277,6 +3277,11 @@ class BaseModel(object):
|
|||||||
if field.compute:
|
if field.compute:
|
||||||
cls._field_computed[field] = group = groups[field.compute]
|
cls._field_computed[field] = group = groups[field.compute]
|
||||||
group.append(field)
|
group.append(field)
|
||||||
|
for fields in groups.itervalues():
|
||||||
|
compute_sudo = fields[0].compute_sudo
|
||||||
|
if not all(field.compute_sudo == compute_sudo for field in fields):
|
||||||
|
_logger.warning("%s: inconsistent 'compute_sudo' for computed fields: %s",
|
||||||
|
self._name, ", ".join(field.name for field in fields))
|
||||||
|
|
||||||
@api.model
|
@api.model
|
||||||
def _setup_complete(self):
|
def _setup_complete(self):
|
||||||
|
|||||||
@@ -217,8 +217,12 @@ class ThreadedServer(CommonServer):
|
|||||||
_logger.debug('cron%d polling for jobs', number)
|
_logger.debug('cron%d polling for jobs', number)
|
||||||
for db_name, registry in registries.iteritems():
|
for db_name, registry in registries.iteritems():
|
||||||
while registry.ready:
|
while registry.ready:
|
||||||
acquired = openerp.addons.base.ir.ir_cron.ir_cron._acquire_job(db_name)
|
try:
|
||||||
if not acquired:
|
acquired = openerp.addons.base.ir.ir_cron.ir_cron._acquire_job(db_name)
|
||||||
|
if not acquired:
|
||||||
|
break
|
||||||
|
except Exception:
|
||||||
|
_logger.warning('cron%d encountered an Exception:', number, exc_info=True)
|
||||||
break
|
break
|
||||||
|
|
||||||
def cron_spawn(self):
|
def cron_spawn(self):
|
||||||
|
|||||||
Reference in New Issue
Block a user