summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ishtar_common/models.py4
-rw-r--r--ishtar_common/utils_secretary.py56
2 files changed, 58 insertions, 2 deletions
diff --git a/ishtar_common/models.py b/ishtar_common/models.py
index 7a10c3e9d..e78e18704 100644
--- a/ishtar_common/models.py
+++ b/ishtar_common/models.py
@@ -63,7 +63,7 @@ from django.utils.functional import lazy
from django.utils.safestring import SafeUnicode, mark_safe
from django.utils.translation import ugettext_lazy as _, ugettext, \
pgettext_lazy, activate, deactivate
-from secretary import Renderer as SecretaryRenderer
+from ishtar_common.utils_secretary import IshtarSecretaryRenderer
from simple_history.models import HistoricalRecords as BaseHistoricalRecords
from unidecode import unidecode
@@ -2986,7 +2986,7 @@ class DocumentTemplate(models.Model):
datetime.date.today().strftime('%Y-%m-%d') + \
u"." + self.template.name.split('.')[-1]
values = c_object.get_values()
- engine = SecretaryRenderer()
+ engine = IshtarSecretaryRenderer()
try:
result = engine.render(self.template, **values)
except TemplateSyntaxError as e:
diff --git a/ishtar_common/utils_secretary.py b/ishtar_common/utils_secretary.py
new file mode 100644
index 000000000..6f605590e
--- /dev/null
+++ b/ishtar_common/utils_secretary.py
@@ -0,0 +1,56 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+from secretary import Renderer
+from PIL import Image
+import re
+
+
+RE_UNITS = re.compile("([.0-9]+)([a-z]+)")
+
+
+def parse_value_unit(value):
+ m = RE_UNITS.match(value)
+ if not m:
+ return None, None
+ value, unit = m.groups()
+ value = float(value)
+ return value, unit
+
+
+class IshtarSecretaryRenderer(Renderer):
+ def __init__(self, *args, **kwargs):
+ super(IshtarSecretaryRenderer, self).__init__(*args, **kwargs)
+ self.media_callback = self.ishtar_media_loader
+ # self.environment.filters['pad'] = pad_string
+
+ def ishtar_media_loader(self, media, *args, **kwargs):
+ """Loads a file from the file system.
+ :param media: A file object or a relative or absolute path of a file.
+ :type media: unicode
+ """
+ image_file, mime = self.fs_loader(media, *args, **kwargs)
+ if "width" in kwargs:
+ kwargs['frame_attrs']['svg:width'] = kwargs["width"]
+ if "height" in kwargs:
+ kwargs['frame_attrs']['svg:height'] = kwargs["height"]
+ if "keep_ratio" in args:
+ image = Image.open(image_file.name)
+ width, width_unit = parse_value_unit(
+ kwargs['frame_attrs']['svg:width'])
+ height, height_unit = parse_value_unit(
+ kwargs['frame_attrs']['svg:height'])
+ if "height" not in kwargs and width:
+ new_height = width * image.height / image.width
+ kwargs['frame_attrs']['svg:height'] = "{}{}".format(
+ new_height, width_unit
+ )
+ if "width" not in kwargs and height:
+ new_width = height * image.width / image.height
+ kwargs['frame_attrs']['svg:width'] = "{}{}".format(
+ new_width, height_unit
+ )
+ return image_file, mime
+
+
+