[MERGE] forward port branch 10.0 up to 9001a75f23
This commit is contained in:
@@ -20,21 +20,24 @@ class AccountAnalyticAccount(models.Model):
|
||||
@api.multi
|
||||
def _compute_debit_credit_balance(self):
|
||||
analytic_line_obj = self.env['account.analytic.line']
|
||||
domain = [('account_id', 'in', self.mapped('id'))]
|
||||
domain = [('account_id', 'in', self.ids)]
|
||||
if self._context.get('from_date', False):
|
||||
domain.append(('date', '>=', self._context['from_date']))
|
||||
if self._context.get('to_date', False):
|
||||
domain.append(('date', '<=', self._context['to_date']))
|
||||
|
||||
account_amounts = analytic_line_obj.search_read(domain, ['account_id', 'amount'])
|
||||
account_ids = set([line['account_id'][0] for line in account_amounts])
|
||||
data_debit = {account_id: 0.0 for account_id in account_ids}
|
||||
data_credit = {account_id: 0.0 for account_id in account_ids}
|
||||
for account_amount in account_amounts:
|
||||
if account_amount['amount'] < 0.0:
|
||||
data_debit[account_amount['account_id'][0]] += account_amount['amount']
|
||||
else:
|
||||
data_credit[account_amount['account_id'][0]] += account_amount['amount']
|
||||
credit_groups = analytic_line_obj.read_group(
|
||||
domain=domain + [('amount', '>=', 0.0)],
|
||||
fields=['account_id', 'amount'],
|
||||
groupby=['account_id']
|
||||
)
|
||||
data_credit = {l['account_id'][0]: l['amount'] for l in credit_groups}
|
||||
debit_groups = analytic_line_obj.read_group(
|
||||
domain=domain + [('amount', '<', 0.0)],
|
||||
fields=['account_id', 'amount'],
|
||||
groupby=['account_id']
|
||||
)
|
||||
data_debit = {l['account_id'][0]: l['amount'] for l in debit_groups}
|
||||
|
||||
for account in self:
|
||||
account.debit = abs(data_debit.get(account.id, 0.0))
|
||||
|
||||
@@ -289,7 +289,9 @@ class AccountFrFec(models.TransientModel):
|
||||
END
|
||||
AS PieceRef,
|
||||
TO_CHAR(am.date, 'YYYYMMDD') AS PieceDate,
|
||||
CASE WHEN aml.name IS NULL THEN '/' ELSE replace(aml.name, '|', '/') END AS EcritureLib,
|
||||
CASE WHEN aml.name IS NULL THEN '/'
|
||||
WHEN aml.name SIMILAR TO '[\t|\s|\n]*' THEN '/'
|
||||
ELSE replace(aml.name, '|', '/') END AS EcritureLib,
|
||||
replace(CASE WHEN aml.debit = 0 THEN '0,00' ELSE to_char(aml.debit, '000000000000000D99') END, '.', ',') AS Debit,
|
||||
replace(CASE WHEN aml.credit = 0 THEN '0,00' ELSE to_char(aml.credit, '000000000000000D99') END, '.', ',') AS Credit,
|
||||
CASE WHEN rec.name IS NULL THEN '' ELSE rec.name END AS EcritureLet,
|
||||
|
||||
@@ -2103,6 +2103,11 @@ msgstr ""
|
||||
msgid "Quantity To Produce"
|
||||
msgstr ""
|
||||
|
||||
#. module: mrp
|
||||
#: model:ir.model.fields,field_description:mrp.field_stock_move_quantity_done_store
|
||||
msgid "Quantity done store"
|
||||
msgstr ""
|
||||
|
||||
#. module: mrp
|
||||
#: model:ir.model.fields,field_description:mrp.field_mrp_routing_workcenter_batch_size
|
||||
msgid "Quantity to Process"
|
||||
|
||||
@@ -91,7 +91,7 @@ class StockMove(models.Model):
|
||||
quantity_available = fields.Float(
|
||||
'Quantity Available', compute="_qty_available",
|
||||
digits=dp.get_precision('Product Unit of Measure'))
|
||||
quantity_done_store = fields.Float('Quantity', digits=0)
|
||||
quantity_done_store = fields.Float('Quantity done store', digits=0)
|
||||
quantity_done = fields.Float(
|
||||
'Quantity', compute='_qty_done_compute', inverse='_qty_done_set',
|
||||
digits=dp.get_precision('Product Unit of Measure'))
|
||||
|
||||
@@ -255,6 +255,7 @@ exports.PosModel = Backbone.Model.extend({
|
||||
// we attribute a role to the user, 'cashier' or 'manager', depending
|
||||
// on the group the user belongs.
|
||||
var pos_users = [];
|
||||
var current_cashier = self.get_cashier();
|
||||
for (var i = 0; i < users.length; i++) {
|
||||
var user = users[i];
|
||||
for (var j = 0; j < user.groups_id.length; j++) {
|
||||
@@ -272,6 +273,8 @@ exports.PosModel = Backbone.Model.extend({
|
||||
// replace the current user with its updated version
|
||||
if (user.id === self.user.id) {
|
||||
self.user = user;
|
||||
}
|
||||
if (user.id === current_cashier.id) {
|
||||
self.set_cashier(user);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,12 +252,20 @@ function get_file(options) {
|
||||
if (options.error) {
|
||||
var body = this.contentDocument.body;
|
||||
var nodes = body.children.length === 0 ? body.childNodes : body.children;
|
||||
options.error({
|
||||
message: nodes.length > 1 ? nodes[1].textContent : '',
|
||||
data: {
|
||||
title: nodes.length > 0 ? nodes[0].textContent : '',
|
||||
},
|
||||
});
|
||||
var errorParams = {};
|
||||
|
||||
try { // Case of a serialized Odoo Exception: It is Json Parsable
|
||||
var node = nodes[1] || nodes[0];
|
||||
errorParams = JSON.parse(node.textContent);
|
||||
} catch (e) { // Arbitrary uncaught python side exception
|
||||
errorParams = {
|
||||
message: nodes.length > 1 ? nodes[1].textContent : '',
|
||||
data: {
|
||||
title: nodes.length > 0 ? nodes[0].textContent : '',
|
||||
}
|
||||
}
|
||||
}
|
||||
options.error(errorParams);
|
||||
}
|
||||
} finally {
|
||||
complete();
|
||||
|
||||
@@ -163,6 +163,7 @@ def redirect_with_hash(url, code=303):
|
||||
# See extensive test page at http://greenbytes.de/tech/tc/httpredirects/
|
||||
if request.httprequest.user_agent.browser in ('firefox',):
|
||||
return werkzeug.utils.redirect(url, code)
|
||||
url = url.strip()
|
||||
if urlparse.urlparse(url, scheme='http').scheme not in ('http', 'https'):
|
||||
url = 'http://' + url
|
||||
url = url.replace("'", "%27").replace("<", "%3C")
|
||||
|
||||
@@ -127,7 +127,7 @@ class Registry(Mapping):
|
||||
# Indicates that the registry is
|
||||
self.ready = False
|
||||
|
||||
# Inter-process signaling (used only when odoo.multi_process is True):
|
||||
# Inter-process signaling:
|
||||
# The `base_registry_signaling` sequence indicates the whole registry
|
||||
# must be reloaded.
|
||||
# The `base_cache_signaling sequence` indicates all caches must be
|
||||
@@ -357,7 +357,7 @@ class Registry(Mapping):
|
||||
|
||||
def setup_signaling(self):
|
||||
""" Setup the inter-process signaling on this registry. """
|
||||
if not odoo.multi_process:
|
||||
if self.in_test_mode():
|
||||
return
|
||||
|
||||
with self.cursor() as cr:
|
||||
@@ -383,7 +383,7 @@ class Registry(Mapping):
|
||||
""" Check whether the registry has changed, and performs all necessary
|
||||
operations to update the registry. Return an up-to-date registry.
|
||||
"""
|
||||
if not odoo.multi_process:
|
||||
if self.in_test_mode():
|
||||
return self
|
||||
|
||||
with closing(self.cursor()) as cr:
|
||||
@@ -409,7 +409,7 @@ class Registry(Mapping):
|
||||
|
||||
def signal_registry_change(self):
|
||||
""" Notifies other processes that the registry has changed. """
|
||||
if odoo.multi_process:
|
||||
if not self.in_test_mode():
|
||||
_logger.info("Registry changed, signaling through the database")
|
||||
with closing(self.cursor()) as cr:
|
||||
cr.execute("select nextval('base_registry_signaling')")
|
||||
@@ -417,7 +417,7 @@ class Registry(Mapping):
|
||||
|
||||
def signal_caches_change(self):
|
||||
""" Notifies other processes if caches have been invalidated. """
|
||||
if odoo.multi_process and self.cache_cleared:
|
||||
if self.cache_cleared and not self.in_test_mode():
|
||||
# signal it through the database to other processes
|
||||
_logger.info("At least one model cache has been invalidated, signaling through the database.")
|
||||
with closing(self.cursor()) as cr:
|
||||
|
||||
@@ -91,9 +91,6 @@ class RequestHandler(werkzeug.serving.WSGIRequestHandler):
|
||||
me = threading.currentThread()
|
||||
me.name = 'odoo.service.http.request.%s' % (me.ident,)
|
||||
|
||||
# _reexec() should set LISTEN_* to avoid connection refused during reload time. It
|
||||
# should also work with systemd socket activation. This is currently untested
|
||||
# and not yet used.
|
||||
|
||||
class ThreadedWSGIServerReloadable(LoggingBaseWSGIServerMixIn, werkzeug.serving.ThreadedWSGIServer):
|
||||
""" werkzeug Threaded WSGI Server patched to allow reusing a listen socket
|
||||
@@ -105,14 +102,15 @@ class ThreadedWSGIServerReloadable(LoggingBaseWSGIServerMixIn, werkzeug.serving.
|
||||
handler=RequestHandler)
|
||||
|
||||
def server_bind(self):
|
||||
envfd = os.environ.get('LISTEN_FDS')
|
||||
if envfd and os.environ.get('LISTEN_PID') == str(os.getpid()):
|
||||
SD_LISTEN_FDS_START = 3
|
||||
if os.environ.get('LISTEN_FDS') == '1' and os.environ.get('LISTEN_PID') == str(os.getpid()):
|
||||
self.reload_socket = True
|
||||
self.socket = socket.fromfd(int(envfd), socket.AF_INET, socket.SOCK_STREAM)
|
||||
# should we os.close(int(envfd)) ? it seem python duplicate the fd.
|
||||
self.socket = socket.fromfd(SD_LISTEN_FDS_START, socket.AF_INET, socket.SOCK_STREAM)
|
||||
_logger.info('HTTP service (werkzeug) running through socket activation')
|
||||
else:
|
||||
self.reload_socket = False
|
||||
super(ThreadedWSGIServerReloadable, self).server_bind()
|
||||
_logger.info('HTTP service (werkzeug) running on %s:%s', self.server_name, self.server_port)
|
||||
|
||||
def server_activate(self):
|
||||
if not self.reload_socket:
|
||||
@@ -251,7 +249,6 @@ class ThreadedServer(CommonServer):
|
||||
t = threading.Thread(target=self.http_thread, name="odoo.service.httpd")
|
||||
t.setDaemon(True)
|
||||
t.start()
|
||||
_logger.info('HTTP service (werkzeug) running on %s:%s', self.interface, self.port)
|
||||
|
||||
def start(self, stop=False):
|
||||
_logger.debug("Setting signal handlers")
|
||||
@@ -867,7 +864,8 @@ def _reexec(updated_modules=None):
|
||||
args += ["-u", ','.join(updated_modules)]
|
||||
if not args or args[0] != exe:
|
||||
args.insert(0, exe)
|
||||
os.execv(sys.executable, args)
|
||||
# We should keep the LISTEN_* environment variabled in order to support socket activation on reexec
|
||||
os.execve(sys.executable, args, os.environ)
|
||||
|
||||
def load_test_file_yml(registry, test_file):
|
||||
with registry.cursor() as cr:
|
||||
|
||||
Reference in New Issue
Block a user