From 1cf5723835235c71df140938282420360116f0c5 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Thu, 21 May 2015 12:53:56 +0200 Subject: [PATCH] Revert "Revert "[FIX] fields: `digits()` computation"" Thamks to parent commit, `request.env` doesn't raise `AttributeError` anymore for requests without session bound to a database. This exception was bubbling up to `digits` property (and `__getattr__`) This reverts commit 49cb46fb78de4e7e88b054f2b5df21612778fd40. This reinstate commit eeedd2d9f52d46d8193059854e7430ca0c1fd6c0. --- openerp/fields.py | 3 ++- openerp/osv/fields.py | 24 ++++++++++++++++++------ 2 files changed, 20 insertions(+), 7 deletions(-) diff --git a/openerp/fields.py b/openerp/fields.py index d780bf5adb3..cd25295d8e6 100644 --- a/openerp/fields.py +++ b/openerp/fields.py @@ -1054,7 +1054,8 @@ class Float(Field): @property def digits(self): if callable(self._digits): - return self._digits(fields.get_cursor()) + with fields._get_cursor() as cr: + return self._digits(cr) else: return self._digits diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 02d24fdf47b..00eba168552 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -43,6 +43,7 @@ import pytz import re import xmlrpclib from operator import itemgetter +from contextlib import contextmanager from psycopg2 import Binary import openerp @@ -52,13 +53,22 @@ from openerp.tools import float_repr, float_round, frozendict, html_sanitize import simplejson from openerp import SUPERUSER_ID, registry -def get_cursor(): - # retrieve a valid cursor from any environment +@contextmanager +def _get_cursor(): + # yield a valid cursor from any environment or create a new one if none found from openerp.api import Environment + from openerp.http import request + try: + request.env # force request's env to be computed + except RuntimeError: + pass # ignore if not in a request for env in Environment.envs: if not env.cr.closed: - return env.cr - raise RuntimeError("No valid cursor found") + yield env.cr + break + else: + with registry().cursor() as cr: + yield cr EMPTY_DICT = frozendict() @@ -396,7 +406,8 @@ class float(_column): @property def digits(self): if self._digits_compute: - return self._digits_compute(get_cursor()) + with _get_cursor() as cr: + return self._digits_compute(cr) else: return self._digits @@ -1316,7 +1327,8 @@ class function(_column): @property def digits(self): if self._digits_compute: - return self._digits_compute(get_cursor()) + with _get_cursor() as cr: + return self._digits_compute(cr) else: return self._digits