Skip to content

Commit

Permalink
merge release/0.4.2
Browse files Browse the repository at this point in the history
  • Loading branch information
CI committed Jan 9, 2019
2 parents 1903edf + e11fe35 commit 7638f2a
Show file tree
Hide file tree
Showing 9 changed files with 75 additions and 20 deletions.
29 changes: 19 additions & 10 deletions CHANGES
Original file line number Diff line number Diff line change
@@ -1,43 +1,52 @@
Release 0.4.2
-------------
* PDF renderer gracefully handles large blobs of text
* Remove support for Django < 2.0

Release 0.4.1
-------------
* Update CI deploy flow
* Update requirements, allow Django 2.1

Release 0.4
----------------
-----------
* added FriendlyRenderer
*

Release 0.3.4
----------------
-------------
* tweaked PDFExport


Release 0.3.3
----------------
-------------
* tweaked PDFExport


Release 0.3.2
----------------
-------------
* freeze requirements


Release 0.3.1
----------------
-------------
* fixed setup requirements


Release 0.3
----------------
-----------
* added PDFExport


Release 0.2.1
----------------
-------------
* updated requirements


Release 0.2
----------------
-----------
* added OpenXMLRenderer


Release 0.1
----------------
-----------
* Initial release
2 changes: 1 addition & 1 deletion src/unicef_rest_export/__init__.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
NAME = 'unicef_rest_export'
VERSION = __version__ = "0.4.1"
VERSION = __version__ = "0.4.2"
__author__ = 'UNICEF'
38 changes: 33 additions & 5 deletions src/unicef_rest_export/renderers.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
from reportlab.lib.pagesizes import landscape, letter
from reportlab.lib.styles import getSampleStyleSheet
from reportlab.platypus import PageBreak, Paragraph, SimpleDocTemplate, Table, TableStyle
from reportlab.platypus.doctemplate import LayoutError
from rest_framework import status
from rest_framework.renderers import BaseRenderer, TemplateHTMLRenderer
from rest_framework_csv.renderers import CSVRenderer
Expand All @@ -15,6 +16,7 @@
"Response data is a %s, not a Dataset! "
"Did you extend ExportMixin?"
)
PDF_COLUMNS_PER_PAGE = 9


class ExportBaseRenderer(BaseRenderer):
Expand Down Expand Up @@ -167,16 +169,14 @@ class ExportPDFRenderer(ExportFileRenderer):
media_type = "application/pdf"
format = "pdf"

def export_set(self, dataset):
def export_set(self, dataset, columns_per_page):
stream = BytesIO()
doc = SimpleDocTemplate(stream, pagesize=landscape(letter))
styles = getSampleStyleSheet()
styleCell = styles["Normal"]
styleCell.fontSize = 7
elements = []

columns_per_page = 9

if dataset.headers:
# slice the data into a set number of columns
# in order to fit on the page
Expand Down Expand Up @@ -210,13 +210,41 @@ def export_set(self, dataset):
doc.build(elements)
return stream.getvalue()

def export_failure(self):
stream = BytesIO()
doc = SimpleDocTemplate(stream, pagesize=landscape(letter))
styles = getSampleStyleSheet()
styleCell = styles["Normal"]
styleCell.fontSize = 7
elements = [
Paragraph(
(
"Data not able to be formatted for PDF, "
"please try another format."
),
styleCell
)
]
doc.build(elements)
return stream.getvalue()

def render_dataset(self, data, *args, **kwargs):
with open(self.filename, "wb") as fp:
fp.write(self.export_set(data))
columns_per_page = PDF_COLUMNS_PER_PAGE
success = False
while columns_per_page > 1:
try:
fp.write(self.export_set(data, columns_per_page))
except LayoutError:
columns_per_page -= 1
else:
success = True
break
if not success:
fp.write(self.export_failure())


class FriendlyCSVRenderer(CSVRenderer):

def flatten_item(self, item):
if isinstance(item, bool):
return {'': {True: 'Yes', False: ''}[item]}
Expand Down
8 changes: 8 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,11 @@ def author():
@pytest.fixture
def book():
return factories.BookFactory()


@pytest.fixture
def books():
class BookFactory:
def get(self):
return factories.BookFactory()
return BookFactory()
1 change: 1 addition & 0 deletions tests/demoproject/demo/sample/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ class Book(models.Model):
on_delete=models.CASCADE,
)
name = models.CharField(max_length=150)
description = models.TextField()
best_seller = models.BooleanField(default=False)

def __str__(self):
Expand Down
2 changes: 1 addition & 1 deletion tests/demoproject/demo/sample/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
from rest_framework.renderers import JSONRenderer

from unicef_rest_export.renderers import FriendlyCSVRenderer
from unicef_rest_export.views import ExportMixin, ExportView, ExportViewSet, ExportModelView
from unicef_rest_export.views import ExportMixin, ExportModelView, ExportView, ExportViewSet


class AuthorNormalView(ExportMixin, ListAPIView):
Expand Down
1 change: 1 addition & 0 deletions tests/factories.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class Meta:
class BookFactory(factory.django.DjangoModelFactory):
name = factory.Faker("name")
author = factory.SubFactory(AuthorFactory)
description = factory.Faker("sentence", nb_words=200)

class Meta:
model = Book
10 changes: 10 additions & 0 deletions tests/test_views.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import factory
import pytest
from django.urls import reverse
from rest_framework.test import APIClient
Expand Down Expand Up @@ -140,6 +141,15 @@ def test_export_view_foreignkey_csv(api_client, book):


def test_export_view_foreignkey_pdf(api_client, book):
url = "{}?format=pdf".format(reverse("sample:book-view"))
response = api_client.get(url)
with open("/tmp/file.pdf", "wb") as fp:
fp.write(response.content)
assert response.status_code == 200


def test_export_view_foreignkey_pdf_invalid(api_client):
BookFactory(description=factory.Faker("sentence", nb_words=800))
url = "{}?format=pdf".format(reverse("sample:book-view"))
response = api_client.get(url)
assert response.status_code == 200
Expand Down
4 changes: 1 addition & 3 deletions tox.ini
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
[tox]
envlist = py{36}-d{110,111,20,21}
envlist = py{36}-d{20,21}
envtmpdir={toxinidir}/build/{envname}/tmp
envlogdir={toxinidir}/build/{envname}/log

Expand Down Expand Up @@ -29,8 +29,6 @@ setenv =
PYTHONPATH={toxinidir}/src
deps =
pipenv
d110: django>=1.10,<1.11
d111: django>=1.11,<1.12
d20: django>=2.0,<2.1
d21: django>=2.1,<2.2
dev: git+git://github.com/django/django.git#egg=django
Expand Down

0 comments on commit 7638f2a

Please sign in to comment.