From 54e4f3f96b0a93bbdee5cdffd6f671b812644a67 Mon Sep 17 00:00:00 2001 From: Jeremy Kersten Date: Fri, 19 Aug 2016 18:21:04 +0200 Subject: [PATCH] [FIX] web: allow to use content_disposable without registry When a user connect to /web/database/manager directly without the login page before, the request don't have registry. When the user click to backup a db, a traceback was raised: return request.registry['ir.http'].content_disposition(filename) TypeError: 'NoneType' object has no attribute 'getitem' Because it was impossible to call content_diposable from ir_http without registry. Now content disposable has been moved in http.py and is callable from anywhere. This commit closes #13192 This commit closes #11583 --- addons/web/controllers/main.py | 6 +----- openerp/addons/base/ir/ir_http.py | 13 ++----------- openerp/http.py | 13 +++++++++++++ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index c6b8015267b..d3be52ff75b 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -34,7 +34,7 @@ from openerp.tools.translate import _ from openerp.tools import ustr from openerp.tools.misc import str2bool, xlwt from openerp import http -from openerp.http import request, serialize_exception as _serialize_exception +from openerp.http import request, serialize_exception as _serialize_exception, content_disposition from openerp.exceptions import AccessError _logger = logging.getLogger(__name__) @@ -415,10 +415,6 @@ def xml2json_from_elementtree(el, preserve_whitespaces=False): res["children"] = kids return res -def content_disposition(filename): - return request.registry['ir.http'].content_disposition(filename) - - def binary_content(xmlid=None, model='ir.attachment', id=None, field='datas', unique=False, filename=None, filename_field='datas_fname', download=False, mimetype=None, default_mimetype='application/octet-stream', env=None): return request.registry['ir.http'].binary_content( xmlid=xmlid, model=model, id=id, field=field, unique=unique, filename=filename, filename_field=filename_field, diff --git a/openerp/addons/base/ir/ir_http.py b/openerp/addons/base/ir/ir_http.py index 34bb0035d1a..5a423a68624 100644 --- a/openerp/addons/base/ir/ir_http.py +++ b/openerp/addons/base/ir/ir_http.py @@ -22,7 +22,7 @@ import openerp import openerp.exceptions import openerp.models from openerp import http -from openerp.http import request, STATIC_CACHE +from openerp.http import request, STATIC_CACHE, content_disposition from openerp.modules.module import get_resource_path, get_module_path from openerp.osv import osv, orm @@ -209,16 +209,7 @@ class ir_http(osv.AbstractModel): return self._routing_map def content_disposition(self, filename): - filename = openerp.tools.ustr(filename) - escaped = urllib2.quote(filename.encode('utf8')) - browser = request.httprequest.user_agent.browser - version = int((request.httprequest.user_agent.version or '0').split('.')[0]) - if browser == 'msie' and version < 9: - return "attachment; filename=%s" % escaped - elif browser == 'safari' and version < 537: - return u"attachment; filename=%s" % filename.encode('ascii', 'replace') - else: - return "attachment; filename*=UTF-8''%s" % escaped + return content_disposition(filename) def binary_content(self, xmlid=None, model='ir.attachment', id=None, field='datas', unique=False, filename=None, filename_field='datas_fname', download=False, mimetype=None, default_mimetype='application/octet-stream', env=None): """ Get file, attachment or downloadable content diff --git a/openerp/http.py b/openerp/http.py index 03e6c50fc52..81aac530d1f 100644 --- a/openerp/http.py +++ b/openerp/http.py @@ -20,6 +20,7 @@ import sys import threading import time import traceback +import urllib2 import urlparse import warnings from zlib import adler32 @@ -1807,6 +1808,18 @@ def send_file(filepath_or_fp, mimetype=None, as_attachment=False, filename=None, rv.headers.pop('x-sendfile', None) return rv +def content_disposition(filename): + filename = openerp.tools.ustr(filename) + escaped = urllib2.quote(filename.encode('utf8')) + browser = request.httprequest.user_agent.browser + version = int((request.httprequest.user_agent.version or '0').split('.')[0]) + if browser == 'msie' and version < 9: + return "attachment; filename=%s" % escaped + elif browser == 'safari' and version < 537: + return u"attachment; filename=%s" % filename.encode('ascii', 'replace') + else: + return "attachment; filename*=UTF-8''%s" % escaped + #---------------------------------------------------------- # RPC controller #----------------------------------------------------------