diff --git a/addons/purchase/purchase.py b/addons/purchase/purchase.py index a5908cb78ec..22a033cd2f5 100644 --- a/addons/purchase/purchase.py +++ b/addons/purchase/purchase.py @@ -941,7 +941,7 @@ class purchase_order_line(osv.osv): def unlink(self, cr, uid, ids, context=None): procurement_ids_to_cancel = [] 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,)) if line.move_dest_id: procurement_ids_to_cancel.extend(procurement.id for procurement in line.move_dest_id.procurements) diff --git a/addons/web/controllers/main.py b/addons/web/controllers/main.py index 249257f1092..38fa76f509f 100644 --- a/addons/web/controllers/main.py +++ b/addons/web/controllers/main.py @@ -31,6 +31,7 @@ except ImportError: import openerp import openerp.modules.registry from openerp.tools.translate import _ +from openerp.tools import ustr from openerp import http from openerp.http import request, serialize_exception as _serialize_exception, LazyResponse @@ -567,14 +568,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