diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index 076c622d3f3..7c3a05dad98 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -1029,7 +1029,7 @@ class purchase_order_line(osv.osv): def unlink(self, cr, uid, ids, context=None): for line in self.browse(cr, uid, ids, context=context): - if line.state not in ['draft', 'cancel']: + if line.order_id.state in ['approved', 'done'] and line.state not in ['draft', 'cancel']: raise osv.except_osv(_('Invalid Action!'), _('Cannot delete a purchase order line which is in state \'%s\'.') %(line.state,)) procurement_obj = self.pool.get('procurement.order') procurement_ids_to_except = procurement_obj.search(cr, uid, [('purchase_line_id', 'in', ids)], context=context) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 774b9cda712..3ebbfb02af6 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -35,6 +35,7 @@ from openerp.addons.base.ir.ir_qweb import AssetsBundle, QWebTemplateNotFound from openerp.modules import get_module_resource from openerp.tools import topological_sort from openerp.tools.translate import _ +from openerp.tools import ustr from openerp import http from openerp.http import request, serialize_exception as _serialize_exception @@ -443,14 +444,14 @@ def xml2json_from_elementtree(el, preserve_whitespaces=False): return res def content_disposition(filename): - filename = filename.encode('utf8') - escaped = urllib2.quote(filename) + filename = 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': - return "attachment; filename=\"%s\"" % filename + return u"attachment; filename=%s" % filename else: return "attachment; filename*=UTF-8''%s" % escaped