Skip to content

Commit

Permalink
Added support RFC2047-encoded filename
Browse files Browse the repository at this point in the history
  • Loading branch information
kroman0 committed Feb 9, 2015
1 parent d3ee512 commit 464ff64
Show file tree
Hide file tree
Showing 3 changed files with 20 additions and 4 deletions.
5 changes: 3 additions & 2 deletions src/openprocurement/api/tests/document.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# -*- coding: utf-8 -*-
import unittest

from email.header import Header
from openprocurement.api.tests.base import BaseTenderWebTest


Expand Down Expand Up @@ -239,12 +239,13 @@ def test_put_tender_document(self):

def test_patch_tender_document(self):
response = self.app.post('/tenders/{}/documents'.format(
self.tender_id), upload_files=[('file', 'name.doc', 'content')])
self.tender_id), upload_files=[('file', str(Header(u'укр.doc', 'utf-8')), 'content')])
self.assertEqual(response.status, '201 Created')
self.assertEqual(response.content_type, 'application/json')
doc_id = response.json["data"]['id']
#dateModified = response.json["data"]['dateModified']
self.assertTrue(doc_id in response.headers['Location'])
self.assertEqual(u'укр.doc', response.json["data"]["title"])

response = self.app.patch_json('/tenders/{}/documents/{}'.format(self.tender_id, doc_id), {"data": {"description": "document description"}})
self.assertEqual(response.status, '200 OK')
Expand Down
17 changes: 16 additions & 1 deletion src/openprocurement/api/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
from cornice.util import json_error
from json import dumps
from urlparse import urlparse, parse_qs
from email.header import decode_header

try:
from systemd.journal import JournalHandler
Expand Down Expand Up @@ -45,11 +46,25 @@ def generate_tender_id(ctime, db):
return 'UA-{:04}-{:02}-{:02}-{:06}'.format(ctime.year, ctime.month, ctime.day, index)


def get_filename(data):
try:
pairs = decode_header(data.filename)
except Exception:
pairs = None
if not pairs:
return data.filename
header = pairs[0]
if header[1]:
return header[0].decode(header[1])
else:
return header[0]


def upload_file(request):
first_document = None
if request.content_type == 'multipart/form-data':
data = request.validated['file']
filename = data.filename
filename = get_filename(data)
content_type = data.type
in_file = data.file
else:
Expand Down
2 changes: 1 addition & 1 deletion src/openprocurement/api/validation.py
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ def validate_patch_contract_data(request):

def validate_file_upload(request):
update_journal_handler_params({'document_id': '__new__'})
if 'file' not in request.POST:
if 'file' not in request.POST or not hasattr(request.POST['file'], 'filename'):
request.errors.add('body', 'file', 'Not Found')
request.errors.status = 404
else:
Expand Down

0 comments on commit 464ff64

Please sign in to comment.