БетаЛаборатория - внеочередной IT-блог

Записки обычного программиста

 

Записи с тэгом python

Pisa XHTML2PDF и поддержка HTTP AUTH

В рамках Торговой Системы понадобилось мне сделать генератор этикеток и ценников. Мой старый, генерировавший jpg картинки по строгому шаблону не годится, потому что информация на разхных ценниках разная, сответсвтенно и размеры у них должны быть динамические. Наиболее быстрым и удобным решением, мне показалось генерировать pdf. В процессе размышлений и поиска, была найдена библиотека Pisa, конвертирующая html в pdf. Вот это совсем то что нужно. Само собой есть определенные ограничения в верстки, но главное она понимает большую часть html+css.
 
Все было неплохо, пока не наткнулся на 2 момента. Момент первый - если картинка вставляется в ячейку таблицы, у которой задан конкретный размер, то картинка эта отображается только в том случае, если у нее заданы аттрибуты width и height. То есть встраивать картинки с неопределенным размером в таблицу не получается. Поиски по комьюнити ничего не дали, поэтому полез в исходники. В итоге обнаружилось следующее - в методе определяющем парметры картинки, в случае отсутствия жестко прописаных размеров, основным источником размеров почему-то считался родительский объект. То есть, если у картинки не заданы размеры, то Pisa пытеатся взять эти размеры у контейнера в котором этак картинка лежит. Если размеры родительского контейнера не прописаны в стилях, то все проходит более-менее нормально - Pisa, не получив от родительского объяекта объявления стиля вычисляет размеры картинки исходя из самой кратинки. А вот, если у родительского контйнера в стиля присутствует width или height, то тогда размеры картинки вычисляются именно их этих параметров. Причем делается это без конвертации значений, из-за чего, собсвтенно и существует проблема. Поскольку, в стилях размеры пишутся с указанием единиц измерения (в моем случае ячейка имела ширину 7cm), заначение это строковое. И естественно, умножение его на 96 dpi (именно так происходит "вычисление" размера картинки), естественно дает на выходе 0. Патчить это я не стал - решил ограничиться вычислением размеров картинки при генерации html шаблона, и указанием их в аттрибутах тега <img> - ИМХО, это наиболее верное решение.
 
А вот вторую проблему без патча решить не удалось. Связана она опять-таки с картинками. Pisa поддерживает два варианта обращения к картинкам - либо по абсолютному пути на сервере (для локальных файлов, естественно), либо по http или https. Однако при этом не была учтена особенность, что урл может быть защищен http-авторизацией. У меня все dev-площадки всегда закрыты от внешнего доступа. Да и некоторые рабочие системы тоже. Поэтому, снова пришлось лезть в исходники, но на этот раз патчить все-таки пришлось. Патч обеспечивает обработку URL вида protocol://userid:passwd@host/path/to/file. То есть перед тем как запросить с сервера host файл /path/to/file система посылает Basic Auth заголовок с логином и паролем для доступа.
 
Патч сделан для версии XHTML2PDF / pisa 3.0.32
 
PS: Пока копался в коде пизы, понял что в ближайшем будущем буду от нее отказываться - не устраивает архитектра и перегруженость. Слишком много не нужного в рамках проекта ТС функционала.
Новый день, новый шаг

"Ну и вопрос! Это, знаешь, как у верблюда спросили:
«Почему у тебя шея кривая?» Так он ответил: «А что у меня прямое?»"
(с) Богдан Архипович Гайдай
(с) Волны гасят ветер
(с) А. и Б. Стругацкие

Сегодня добавил в блог базовую регистрацию. Зарегистрироваться в системе теперь можно, но вот редактирование профиля пока не работает. Параллельно с этим, добавил поддержку комментариев, тоже в самом простом варианте пока - без форматирования.
 
Никак не могу решить, нужна ли в комментариях поддержка ответов - построение древовидной структуры. В некоторых блогах это есть, а в некоторых нету. Количество плюсов-минусов для каждого варианта лично для меня представляется примерно одинаковым, хотя возможно я чего-то не понимаю. В любом случае комментирование подлежит капитально доработке, а начать ее надо, как мне кажется, с оформления комментариев. Уж больно убого сейчас они смотрятся.
Hello World!

"- Вылупился, - спокойно сказал Роман, глядя в потолок.
- Кто? - Мне было не по себе: крик был женский.
- Выбегаллов упырь, - сказал Роман. - Точнее, кадавр."
(с) А. и Б. Стругацкие

Итак, пришло время перейти от лабораторных изысканий к полевому тестированию. Тестировать мы будем разнообразные творения моего сомнительного гения, но начнем, собственно, с блогового движка AbendBlatt, создаваемого на базе фреймворка Django. О самом фреймворке, а вернее о моих впечатлениях от него мы поговорим позже, а пока я вкратце опишу что представляет из себя на данный момент AbendBlatt.
 
Итак, для начала несколько слов об архитектуре:
 
AbendBlatt это многопользовательский блог имеющий несколько уровней пользователей:
  • Администратор - пользовател обладающий абсолютно всеми правами. В данном случае это я.
  • Авторы - пользователи, имеющие возможность публиковать записи.
  • Читатели - могут читать все записи, комментировать их, участвовать в опросах ну и все такое прочее.
Записи блога подразделяются на Колонки aka Категории. Корме общих категорий, каждый Автор может вести собственную, Авторскую Колонку.
 
Единственное - на данный момент регистрация еще не работает. =)
 
Далее. Одна из особенностей блога это обработчики записей. Их есть два типа - PostPost и PreView.
PostPost-обработчики срабатывают при публикации записи. В первую очередь, они созданы для поддержки кросспостинга.
PreView-обработчики переваривают записи перед их выводом на экран. Конвертиры смайлов, контекстные анализаторы и так далее.
 
Блог снабжен системой тегов для сообщений. Она реализована благодаря приложению django-tagging.
 
Ну и все - что еще можно рассказать о системе в данный момент я не знаю, так что все остальное буду описывать в процессе. Вряд ли, конечно, кто-то в ближайшее время вообще найдет этот блог, но я пока и не очень хочу чтобы его активно находили, так что кросспостинг-обработчик (пока реализован только кросспостинг в LiveJournal) отключен. Сначала надо доделать интерфейсы регистрации, профиля пользователя и комментирования. После этого, думаю, кросспостинг уже можно будет включить, ну и ждать гостей.

Авторизация

Логин:

Пароль:


Регистрация | Забыли пароль?


Последние записи


Promo

Follow pyhoster on Twitter Subscribe

Реклама

A Django project.