Skip to content

Commit

Permalink
Add Python 3 support
Browse files Browse the repository at this point in the history
  • Loading branch information
vkurup committed Oct 27, 2017
1 parent 2670936 commit 3ffe5d6
Show file tree
Hide file tree
Showing 7 changed files with 72 additions and 61 deletions.
2 changes: 1 addition & 1 deletion README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@ Dependencies

Required
````````
* Python 2.7 (**note**: Python 3 is not yet supported)
* Python 2.7, 3.4, 3.5 and 3.6
* `Django 1.8 to 1.11 (inclusive) <http://www.djangoproject.com/>`_
* sorl-thumbnail==12.4a1
* `jQuery 1.4.x <http://www.jquery.com/>`_
Expand Down
2 changes: 1 addition & 1 deletion file_picker/forms.py
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ def save(self, *args, **kwargs):
filename = os.path.basename(self.cleaned_data['file'])
getattr(item, self.Meta.exclude[0]).save(
filename,
ContentFile(open(str(self.cleaned_data['file']), 'r').read())
ContentFile(open(str(self.cleaned_data['file']), 'rb').read())
)
item.save(*args, **kwargs)
return item
94 changes: 47 additions & 47 deletions file_picker/tests.py
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ class BasePickerTest(TestCase):
"""
def setUp(self):
self.path = os.path.abspath('%s' % os.path.dirname(__file__))
self.image_file = File(open(os.path.join(self.path, 'static/img/attach.png')), "test_file.png")
self.image_file = File(open(os.path.join(self.path, 'static/img/attach.png'), 'rb'), "test_file.png")
self.image = Image(
name='Test Image',
description_1='test desc 1',
Expand All @@ -74,11 +74,11 @@ def test_all_fields(self):
"""
image_picker = MockImagePicker('image_test', Image, None, None)
response = image_picker.list(self.request)
list_resp = json.loads(response.content)
self.assertEquals(response.status_code, 200)
self.assertEquals(self.field_names, list_resp['columns'])
self.assertEquals([capfirst(Image._meta.get_field(i).verbose_name)
for i in self.field_names], list_resp['extra_headers'])
list_resp = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(self.field_names, list_resp['columns'])
self.assertEqual([capfirst(Image._meta.get_field(i).verbose_name)
for i in self.field_names], list_resp['extra_headers'])

def test_columns(self):
"""
Expand All @@ -87,24 +87,24 @@ def test_columns(self):
columns = ['description_2', 'name']
image_picker = MockImagePicker('image_test', Image, columns, None)
response = image_picker.list(self.request)
list_resp = json.loads(response.content)
self.assertEquals(response.status_code, 200)
self.assertEquals(columns, list_resp['columns'])
list_resp = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(columns, list_resp['columns'])
extra_headers = [capfirst(Image._meta.get_field(i).verbose_name)
for i in columns]
self.assertEquals(extra_headers, list_resp['extra_headers'])
self.assertEqual(extra_headers, list_resp['extra_headers'])

def test_extra_headers(self):
"""
Test only extra headers defined. Should ignore it completely.
"""
image_picker = MockImagePicker('image_test', Image, None, ['Header'])
response = image_picker.list(self.request)
list_resp = json.loads(response.content)
self.assertEquals(response.status_code, 200)
self.assertEquals(self.field_names, list_resp['columns'])
self.assertEquals([capfirst(Image._meta.get_field(i).verbose_name)
for i in self.field_names], list_resp['extra_headers'])
list_resp = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(self.field_names, list_resp['columns'])
self.assertEqual([capfirst(Image._meta.get_field(i).verbose_name)
for i in self.field_names], list_resp['extra_headers'])

def test_columns_and_headers(self):
"""
Expand All @@ -114,22 +114,22 @@ def test_columns_and_headers(self):
extra_headers = ['Top Description', 'Image Name', 'Bottom Description']
image_picker = MockImagePicker('image_test', Image, columns, extra_headers)
response = image_picker.list(self.request)
list_resp = json.loads(response.content)
self.assertEquals(response.status_code, 200)
self.assertEquals(columns, list_resp['columns'])
self.assertEquals(extra_headers, list_resp['extra_headers'])
list_resp = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertEqual(columns, list_resp['columns'])
self.assertEqual(extra_headers, list_resp['extra_headers'])

def test_file_list(self):
"""
Make sure that the file list gives the correct url.
"""
image_picker = MockImagePicker('image_test', Image, None, None)
response = image_picker.list(self.request)
list_resp = json.loads(response.content)
list_resp = json.loads(response.content.decode('utf-8'))
results = list_resp['result']
self.assertEquals(len(results), 1)
self.assertEqual(len(results), 1)
result = results[0]
self.assertEquals(result['url'], self.image.file.url)
self.assertEqual(result['url'], self.image.file.url)

def test_extra_links(self):
"""
Expand All @@ -148,10 +148,10 @@ def append(self, obj):
if isinstance(value, (datetime.datetime, datetime.date)):
value = value.strftime('%b %d, %Y')
else:
value = unicode(value)
value = str(value)
extra[name] = value
return {
'name': unicode(obj),
'name': str(obj),
'url': getattr(obj, self.field).url,
'extra': extra,
'insert': [getattr(obj, self.field).url,
Expand All @@ -160,14 +160,14 @@ def append(self, obj):
}
image_picker = CustomPicker('image_test', Image, None, None, extra=extra)
response = image_picker.list(self.request)
self.assertEquals(response.status_code, 200)
resp = json.loads(response.content)
self.assertEquals(resp['link_headers'], extra['link_headers'])
self.assertEquals(resp['link_headers'], extra['link_headers'])
self.assertEqual(response.status_code, 200)
resp = json.loads(response.content.decode('utf-8'))
self.assertEqual(resp['link_headers'], extra['link_headers'])
self.assertEqual(resp['link_headers'], extra['link_headers'])
result = resp['result']
self.assertEquals(len(result), 1)
self.assertEquals(result[0]['insert'][0].upper(), result[0]['insert'][1])
self.assertEquals(result[0]['link_content'], link_content)
self.assertEqual(len(result), 1)
self.assertEqual(result[0]['insert'][0].upper(), result[0]['insert'][1])
self.assertEqual(result[0]['link_content'], link_content)

def test_search_page(self):
"""
Expand All @@ -185,7 +185,7 @@ def test_search_page(self):
image_picker = MockImagePicker('image_test', Image, None, None)
qs = image_picker.get_queryset('Test')
images = qs.all()
self.assertEquals(images.count(), 1)
self.assertEqual(images.count(), 1)
self.assertTrue(self.image in images)
self.assertFalse(image in images)

Expand All @@ -196,17 +196,17 @@ class TestUploadPage(TestCase):
"""
def setUp(self):
self.request = MockRequest()
self.path = os.path.abspath('%s' % os.path.dirname(__file__))
cwd = os.path.dirname(__file__)
self.image_picker = MockImagePicker('image_test', Image, None, None)
self.image_file = File(open(os.path.join(self.path, 'static/img/attach.png')), "test_file.png")
self.image_file = File(open(os.path.join(cwd, 'static/img/attach.png'), 'rb'), "test_file.png")

def test_upload_form_page(self):
"""
Test form generation.
"""
response = self.image_picker.upload_file(self.request)
resp = json.loads(response.content)
self.assertEquals(response.status_code, 200)
resp = json.loads(response.content.decode('utf-8'))
self.assertEqual(response.status_code, 200)
self.assertTrue('form' in resp)

def test_upload(self):
Expand All @@ -216,8 +216,8 @@ def test_upload(self):
request = self.request
request.FILES = {'userfile': self.image_file}
response = self.image_picker.upload_file(request)
self.assertEquals(response.status_code, 200)
resp = json.loads(response.content)
self.assertEqual(response.status_code, 200)
resp = json.loads(response.content.decode('utf-8'))
self.assertTrue('name' in resp)
tmp_file = resp['name']
request.FILES = {}
Expand All @@ -227,12 +227,12 @@ def test_upload(self):
'file': tmp_file,
}
response = self.image_picker.upload_file(request)
resp = json.loads(response.content)
resp = json.loads(response.content.decode('utf-8'))
url = resp['url']
images = Image.objects.all()
self.assertEquals(images.count(), 1)
self.assertEqual(images.count(), 1)
image = images[0]
self.assertEquals(url, image.file.url)
self.assertEqual(url, image.file.url)


class TestPickerSites(TestCase):
Expand All @@ -246,19 +246,19 @@ def setUp(self):

def test_site_index(self):
response = self.client.get(self.url, {'pickers': [self.picker_name]})
resp = json.loads(response.content)
resp = json.loads(response.content.decode('utf-8'))
for key, value in resp['pickers'].items():
self.assertEquals(key, self.picker_name)
self.assertEquals(value, '/file-picker/%s/' % self.picker_name)
self.assertEqual(key, self.picker_name)
self.assertEqual(value, '/file-picker/%s/' % self.picker_name)

def test_images_urls(self):
url = reverse('filepicker:%s:init' % self.picker_name)
response = self.client.get(url)
data = json.loads(response.content)
urls = [u.values()[0] for u in data['urls'].values()]
data = json.loads(response.content.decode('utf-8'))
urls = [list(u.values())[0] for u in list(data['urls'].values())]
for url in urls:
response = self.client.get(url)
self.assertEquals(response.status_code, 200)
self.assertEqual(response.status_code, 200)


class FilePickerUploadFormTests(TestCase):
Expand Down
4 changes: 3 additions & 1 deletion file_picker/uploads/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@
from django.db import models
from django.conf import settings
from django.utils import timezone
from django.utils.encoding import python_2_unicode_compatible


@python_2_unicode_compatible
class BaseFileModel(models.Model):
""" Base file model with meta fields """

Expand Down Expand Up @@ -38,7 +40,7 @@ def save(self, **kwargs):
self.file_type = ext.lstrip('.').upper()
return super(BaseFileModel, self).save(**kwargs)

def __unicode__(self):
def __str__(self):
return self.name


Expand Down
12 changes: 6 additions & 6 deletions file_picker/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -67,8 +67,8 @@ def wrapper(*args, **kwargs):
data = {}
try:
return view(*args, **kwargs)
except Exception, e:
logger.exception(e)
except Exception as e:
logger.exception()
data['errors'] = [traceback.format_exc(e)]
return HttpResponse(json.dumps(data), content_type='application/json')
wrapper.csrf_exempt = csrf_exempt
Expand Down Expand Up @@ -99,10 +99,10 @@ def append(self, obj):
if isinstance(value, (datetime.datetime, datetime.date)):
value = value.strftime('%b %d, %Y')
else:
value = unicode(value)
value = str(value)
extra[name] = value
return {
'name': unicode(obj),
'name': str(obj),
'url': getattr(obj, self.field).url,
'extra': extra,
'insert': [getattr(obj, self.field).url, ],
Expand Down Expand Up @@ -181,8 +181,8 @@ def append(self, obj):
img = '<img src="{0}" alt="{1}" width="{2}" height="{3}" />'
try:
thumb = get_thumbnail(obj.file.path, '150x150', crop='center', quality=99)
except ThumbnailError, e:
logger.exception(e)
except ThumbnailError:
logger.exception()
thumb = None
if thumb:
json['link_content'] = [img.format(thumb.url, 'image', thumb.width, thumb.height), ]
Expand Down
4 changes: 4 additions & 0 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@
'Programming Language :: Python',
'Programming Language :: Python :: 2',
'Programming Language :: Python :: 2.7',
'Programming Language :: Python :: 3',
'Programming Language :: Python :: 3.4',
'Programming Language :: Python :: 3.5',
'Programming Language :: Python :: 3.6',
'Topic :: Software Development :: Libraries :: Python Modules',
'Development Status :: 5 - Production/Stable',
'Operating System :: OS Independent',
Expand Down
15 changes: 10 additions & 5 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,10 +1,15 @@
[tox]
envlist = py27-django{1.8,1.9,1.10,1.11},flake8,coverage,docs
envlist = {py27,py34,py35,py36}-django{1.8,1.9,1.10,1.11}
flake8
coverage
docs

[testenv]
basepython =
py27: python2.7
py33: python3.3
py34: python3.4
py35: python3.5
py36: python3.6
deps =
django1.8: django<1.19
django1.9: django<1.10
Expand All @@ -16,12 +21,12 @@ setenv =
commands = {envpython} sample_project/manage.py test --keepdb

[testenv:flake8]
basepython = python2.7
basepython = python3.6
deps = flake8>=3.2.1
commands = flake8 .

[testenv:coverage]
basepython = python2.7
basepython = python3.6
commands =
coverage run sample_project/manage.py test
coverage report -m --fail-under 80
Expand All @@ -30,6 +35,6 @@ deps =
coverage>=3.7.1

[testenv:docs]
basepython = python2.7
basepython = python3.6
deps = Sphinx==1.2.2
commands = {envbindir}/sphinx-build -a -n -b html -d docs/_build/doctrees docs docs/_build/html

0 comments on commit 3ffe5d6

Please sign in to comment.