![](https://habrastorage.org/storage/90691472/3d6099dc/40650d7c/2f6701b0.png)
Я хочу продолжить хорошую традицию:
и рассказать об удачных решениях, примененных в Django проекте PR-Hero.
Я призываю всех поступать так же и делиться своим опытом :) Объясню почему. В нашей команде каждое удачное решение или приложение из одного проекта обязательно использовалось в следующем. Проекты развивались и становились все лучше и лучше.
А что, если делиться опытом не внутри отдела, а целым сообществом российских джангистов?
Что внутри
Наш проект не назвать технически сложным. По сути, это интернет-магазин одной услуги и, внешне, самая сложная часть — оплата через Robokassa.
Внутри все немного интереснее: как в любом хорошем интернет-магазине, мы автоматизируем бизнес-процессы. Например, следим, чтобы каждый этап занимал не больше положенного ему времени, иначе руководитель проекта будет получать гневные робо-письма.
Небольшой пример — возможные примеры состояний заявки:
STATUSES_WORKFLOW = {
'new': ['owned', 'cancelled'],
'owned': ['bullshit', 'cancelled', 'wait_payment'],
'bullshit': [],
'wait_payment': ['unpayed', 'cancelled', 'write_release'],
'unpayed': [],
'write_release': ['wait_approval', 'cancelled',],
'wait_approval': ['sending_release', 'cancelled'],
'sending_release': ['feedback', 'cancelled'],
'feedback': ['finished', 'cancelled'],
'finished': [],
'cancelled': [],
}
К сожалению, мы еще только пробуем бизнес-модель и не все до конца автоматизировано. Поэтому сегодня я остановлюсь на внешней части. Немного требований к проекту:
- возможность быстро изменять тексты на сайте нескольким нетехническим людям;
- максимальное удобство для клиента;
- многоязычность.
dbtemplates
Считаю это приложение жемчужиной среди находок этого проекта :)
DBTemplates предоставляет простейший функционал — хранение и редактирование Django шаблонов в базе данных.
При этом он поддерживает замечательный HTML редактор CodeMirror и хранит всю историю изменений при помощи django-reversion.
Выглядит это примерно так:
![](https://habrastorage.org/storage/222a1933/4b34e3ff/c9ef6113/8b881577.png)
Это простое решение полностью удовлетворило наши потребности в изменении текстов на сайте. На другом проекте мы попробовали DjangoCMS, но это просто ад. Скажете, что это не подойдет для пользователей? Может быть, но девочки PR-щики после краткого экскурса успешно правят и создают страницы сайта.
Не обошлось без небольших доработок:
- команда sync_templates была поправлена для работы с unicode и для автоматического создания файлов при синхронизации с БД;
- и был написан простенький скрипт, который делает автоматический коммит шаблонов раз в час.
![counter customizable](https://habrastorage.org/getpro/habr/post_images/330/ed7/08a/330ed708a1aa493498f25de98a59cf09.gif)
Пока мы не доделали одну мелочь — редактирование меню и создание новых страниц, но думаю, django-treemenus вполне справится с этой задачей. После внедрения на e-legion расскажу подробнее.
autologin-token
Это приложение я создал в рамках проекта, оно маленькое и недописанное :) Но очень полезное.
Идея простая: разрешить пользователю входить на проект автоматически из электрописем.
Решение: создаем модельку и middleware и мы можем в любую ссылку добавить параметр
autotoken=ER2332FFF
, и пользователь аутентифицируется на сайте автоматически.Использовать приложение просто — генерируете токен для пользователя и вставляете в письмо:http://pr-hero.ru/manage_request/15/?autologin_token=ER2332FFF
data['autologin_token'] = AutologinToken.objects.generate(target_user)
Исходный код приложения (сильно не ругайте, не было времени причесать)django-robokassa
Название приложения говорит о его назначении. Здесь мне сказать практически нечего, кроме Большое спасибо kmike. Я и подумать не мог, что будет все так просто, за полчаса я подлючил сервис к Robokassa.
Платежи с Яндекс Денег, WebMoney, Терминалов и банковских карт без проблем для нас и клиентов падают на расчетный счет.
Есть идея в будущем создать приложения для экрана оплаты, как у Эльбы. Может кто-нибудь подскажет готовое?
![](https://habrastorage.org/storage/7902a88e/8548a9ba/23897d16/b117855b.png)
django-rosetta
Это приложение оказывает неоценимую помощь в переводе проектов на иностранные языки. Мы уже успешно опробовали в двух проектах: Goozy и PR-Hero.
Перевод нам часто приходится делегировать, например, Goozy был переведен на украинский, хорватский и даже финский. Приходилось пересылать po файлы по почте, давать ссылку на poedit, потом долго мержить и отсылать непереведенные части обратно, попутно давая комментарии что значит та или иная фраза.
Rosetta предоставляет удобный web-интерфейс для редактирования файлов переводов. После того, как мы дописали простенький скрипт, который компилирует po файлы и перезапускает веб-сервер.
![](https://habrastorage.org/storage/c97ab22f/f1086c6f/b8ba8afb/27ca470d.png)
Это решение работает идеально! Носители языков полностью самостоятельно переводят портал, сразу наблюдают результат и правят ошибки.
django-localeurl
И последнее на сегодня приложение django-localeurl. Оно решает простую задачу — язык сайта определяется исключительно из ссылки. Например, pr-hero.ru/en/medias или en.pr-hero.ru/medias однозначно указывает на английский сайт.
В предыдущих проектах языки у нас определялись автоматом и хранились в куках, это плохое решение по двум причинам:
– поисковики не смогут добраться до контента в другом языке;
– когда даешь ссылку на какую-то статью, велика вероятность что пользователь с неправильными настройками языка получит 404.
Поэтому мы решили, что URL однозначно определяет язык. localeurl прекрасно в этом помогает, он отвечает как за смену языка из ссылки, так и за модификацию ссылок на странице (переопределяет {% url %}).
Вот и все
Вместо заключения дам ответ на свой вопрос, если делиться опытом после выполненных проектов внутри сообщества, то все наши Django-проекты и приложения станут намного лучше.
Очень надеюсь вскоре увидеть ваши проекты изнутри :)