#!/usr/bin/env python # -*- coding: utf-8 -*- from secretary import Renderer from datetime import datetime import locale from PIL import Image import re from django.conf import settings 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 def human_date_filter(value): try: value = datetime.strptime(value, "%Y-%m-%d") except ValueError: return "" language_code = settings.LANGUAGE_CODE.split('-') language_code = language_code[0] + "_" + language_code[1].upper() for language_suffix in (".utf8", ""): try: locale.setlocale(locale.LC_TIME, language_code + language_suffix) break except locale.Error: pass return value.strftime(settings.DATE_FORMAT).decode("utf-8") class IshtarSecretaryRenderer(Renderer): def __init__(self, *args, **kwargs): super(IshtarSecretaryRenderer, self).__init__(*args, **kwargs) self.media_callback = self.ishtar_media_loader self.environment.filters['human_date'] = human_date_filter def ishtar_media_loader(self, media, *args, **kwargs): 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