[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
This commit is contained in:
Jeremy Kersten
2016-08-19 18:31:01 +02:00
parent d7939282e9
commit 54e4f3f96b
3 changed files with 16 additions and 16 deletions
+1 -5
View File
@@ -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,
+2 -11
View File
@@ -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
+13
View File
@@ -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
#----------------------------------------------------------