9 августа 2011 г.

Обновили сайт

Сегодня мы немного обновили сайт студии. На главной появилась ссылка на наши разработки с открытым исходным кодом на гитхабе. Сейчас там несколько форков приложений для django, плагин для анимации спрайтов на jquery и репозиторий для DjangoDash 2011. О двух последних подробнее в следующий раз. На всех наших новых проектах мы используем Django, верстаем как завещал великий БЭМ, применяя возможности современных браузеров, известные под термином HTML5. Теперь об этом свидетельствуют ссылочки в подвале главной. С большим опозданием, но всё же обновился раздел Команда, свои заслуженные места обрели Рома и Виталий.
Появился раздел вакансии, мы всегда ищем энергичных и опытных укротителей питонов. Приходите к нам, у нас интересно.

1 августа 2011 г.

Поиск в Django с помощью Sphinx

Для интеграции Sphinx (движка для полнотекстового поиска) и Django существует приложение django-sphinx.

Это приложение автоматически генерирует конфигурационный файл (на основе которого строятся поисковые индексы), позволяет делать полнотекстовый поиск по моделям или по нескольким индексам одновременно (получая queryset-подобные объекты).

Управление свойствами индексов, весами атрибутов и тому подобным ведётся прямо из модели:

class MyModel(models.Model):
   ...
   search = SphinxSearch(weights={ 'name': 100, 'description': 10, 'tags': 80}, mode='SPH_MATCH_ALL', rankmode='SPH_RANK_NONE')
   ...
 

На основе этих данных manage-команда ./manage.py generate_sphinx_config составляет конфигурацию индексов.

К сожалению, проект развивается автором не очень интенсивно, но на github.com существует некоторое количество форков, решающих ряд проблем, среди которых изменившиеся в Django 1.3 настройки баз данных (поддержка нескольких БД) и поиск по нескольким индексам.

Для того, чтобы поиск одновременно по нескольким индексам позволял оперировать с результатами как с ORM-объектами, а не идентификаторами записей, необходимо проследить, чтобы выполнялись следующие два условия:

  1. В запросах, на основе которых строятся индексы (sql_query в секциях source конфига), в секции SELECT должно присутствовать <число> AS content_type, то есть должна быть связь с типом контента (для того, чтобы django-sphinx смог понять, какой модели принадлежит результат).
  2. В той же секции должно присутствовать объявление sql_attr_uint = content_type.
После этого запросы SphinxQuerySet(index='индекс1 индекс2 индекс3').query('поисковая фраза') будут возвращать списки ORM-объектов.


Наш форк django-sphinx можно найти тут

6 июня 2011 г.

GeoIP в Django

UPD: Мы зарелизили более новую версию библиотеки для работы с ipgeobase: django-geoip

Мы начали публиковать свои наработки на гитхабе. Это первая ласточка, приложение форк django-ipgeobase.

На нашем последнем проекте для того, чтобы определять, из какого города посетитель сайта, мы использовали базу адресов от ipgeobase.ru. Она содержит достаточно подробную информацию по России и Украине (886 городов) и регулярно обновляется. Этого оказалось вполне достаточно, чтобы привязать контент сайта к разным регионам России, например.

Для геолокации в Django обнаружилось готовое приложение от Ивана Петухова, которое умело импортировать данные с ipgeobase и определять город и регион по ip. А также хорошй форк от mjr27, добавивший админку и поддержку адресов Украины.

В апреле поменялся формат базы данных на ipgeobase, теперь, чтобы получать актуальные ежедневные обновления, нам пришлось изменить процедуру импорта. Так появился наш собственный форк django-ipgeobase.

Пример использования:
from django_ipgeobase.models import IPGeoBase

  ip = "212.49.98.48"

  ipgeobases = IPGeoBase.objects.by_ip(ip)
  if ipgeobases.exists():
      ipgeobase = ipgeobases[0]
      print ipgeobase.city # Населенный пункт (Екатеринбург)
      print ipgeobase.region # Регион (Свердловская область)
      print ipgeobase.country # Страна (Россия)
Очень удобно вынести определение города или региона в отдельную middleware и записать в request значение region, таким образом оно станет сразу доступно во всех видах и шаблонах.

3 июня 2011 г.

Зеркалирование репозиториев Eclipse

Мы не по наслышке знакомы с проблемой медленных и очень медленных зеркал репозиториев Eclipse. И это касается не только основного репозитория текущего Eclipse Helios, но и популярных плагинов к нему, которые мы используем в нашей повседневной работе: PyDev, Aptana, FileSync и некоторые другие. Их установка для каждого члена нашей команды однажды заняла неприлично много времени и мы все единодушно решили, что необходимо найти решение для создания локальных зеркал всех необходимых нам репозиториев. В любом случае хорошо уменьшить зависимость своей работы от причуд сторонних сервисов. Да, эти плагины тянутся не так уж и часто, но удобно, когда они под рукой и наверняка доступны в любое время.

25 мая 2011 г.

Вакансия python- & django-разработчика 2

Мы продолжаем расширяться, нам в студии по-прежнему нужны активные, умные и энергичные питонисты, готовые делать с нами различные веб-проекты на Django.

За условиями под кат.

4 мая 2011 г.

Предновогодняя фотосессия

The FuturecolorS
The FuturecolorSТёмаИльяИлья и ТёмаПотому что мы бандаНаш талисман
Future ColorsНе православно!Табы против пробеловПерерыв

Декабрь 2010, a set on Flickr.
Состав Future Colors образца 2011 года

29 апреля 2011 г.

Eclipse и SSH passphrase

Короткий пост-полезняшка, который, надеемся, кому-то сэкономит пару часов на поиск обхода неприятного бага.

О чём речь

Многие используют passphrase для защиты своих ssh-ключей, а кто-то оставляет свой id_rsa без пароля. Мы вам рекомендуем в целях безопасности всё-таки использовать passphrase, а иначе можно считать что вы храните доступ ко всем ssh в plain-тексте. Если данный абзац поставил вас в тупик, на гитхабе есть хороший ликбез «Working with SSH key passphrases».

Проблема

Последний на данный момент Eclipse Helios плохо дружит с id_rsa с паролем и реагирует на ввод корректной passphrase выдаёт «Auth failed»

Решение

Есть очень простой workaround: удалить passphrase, вручную добавить ключ в Eclipse, а потом средствами того же эклипса установить passphrase обратно.

Сбрасываем passphrase:
user@futurecolors:~/.ssh$ ssh-keygen -p

По этому пути в меню нужно импортировать id_rsa вручную:
Window → Preferences → General → Network connections → SSH2
Key Management → Load Existing Key…
Сразу же всё на заработает, надо рестартануть эклипс.
Там же импортированному ключу возвращаем passphrase.

Безопасных вам коннектов!

15 апреля 2011 г.

HTML5 и IE

Если вы считаете, что использовать HTML5 (что касается html'а) на своих сайтах ещё рано, то вы ошибаетесь. Современные браузеры отлично справляются с новыми тегами и поддерживают соответствующий доктайп. И несовременные, между прочим, тоже справляются!
Итак, давайте выбросим из головы предрассудки и пойдём в ногу со временем.

1. Доктайп

<!doctype html>
Да, и в IE это заработает, ибо режим будет интерпритирован как стандартный.

2. html5shiv

<!--[if lt IE 9]>
<script type="text/javascript" src="html5shiv.js"></script>
<![endif]-->
Симазнаетедлякого.
Заработало, теперь новые теги доступны для стайлинга.

3. innershiv

Не заработало, когда html пришёл аяксом(
Не грустим!
<!--[if lt IE 9]>
<script type="text/javascript" src="innershiv.js"></script>
<![endif]-->
А в js пишем:
if (typeof innerShiv === 'function') {
    $.ajaxSetup({
        dataFilter: function(data, dataType) {
            if (dataType === 'html') {
                return innerShiv(data, false);
            }
            else {
                return data;
            }
        }
    });
    $.fn.html5 = function(){
        return innerShiv(this.html(), false);
    };
} else {
    $.fn.html5 = function(){
        return this.html();
    };
}
ЗЫ
.html5() поможет вам работать с аяксовым ответом до вставки в DOM.

Вакансия python- & django-разработчика

Мы расширяемся, поэтому ищем в компанию опытного питоновода для наших текущих и будущих Django-проектов. Обещаем интересные и нескучные будни веб-разработки.

За условиями под кат.

1 апреля 2011 г.

Редизайн главной страницы Спокойно.ру

На сайте Спокойно.ру произошли важные изменения.

Было

spokoino.ru

Стало

spokoino.ru

Редизайн главной

Главная страница стала удобнее и функциональнее:
  • появились фильтры, чтобы подбор инструктора можно было начинать прямо с неё,
  • популярные инструкторы теперь видны без прокрутки,
  • на главной выводятся последние статьи,
  • наш контактный телефон теперь показывается в шапке.

Переработка статей

Новая версия статей о вождении оформлена в виде блога с тегами и возможностью комментировать записи.

Услуга подбора автоинструктора

В тестовом режиме запущена новая услуга для учеников - Спокойно.ру помогает искать инструктора. Достаточно оставить телефон, и мы вам перезвоним, уточним подробности и предложим подходящего инструктора.

Прогрессивная вёрстка:-))

Кроме того, с точки зрения вёрстки мы сделали шаг вперёд — применили HTML5. Также согласно принципу graceful degradation отказались от поддержки круглых уголков средствами картинок (только CSS3) и PNG в IE6. Чем и остались довольны, так как в старых браузерах это создавало ощутимую нагрузку на клиентской стороне.

25 марта 2011 г.

Ищем верстальщика с амбициями front-end разработчика

Мы ищем нового члена команды‚ готового взять на себя задачи по вёрстке разрабатываемых нами проектов и желающего профессионально расти в качестве front-end разработчика.

18 марта 2011 г.

Примечания к готовящемуся выпуску Django 1.3

Django 1.3 ещё не вышел пока, но должен скоро!

Прошло уже 2 недели с момента выпуска релиз-кандидата новой версии веб-фреймворка Django 1.3 (и 3 месяца с первой альфы). Мы с нетрпением ждём постоянно откладываемого релиза :) и решили подготовить полный список фич и изменений, чтобы освежить память, что же «вкусного» в новой Джанге.

Что нового

  • Появились виды, основанные на классах.
    Это новшество добавляет широкие возможности композиции видов путём наследования классов. Для встроенных видов прежняя форма считается устаревшей.
  • Добавилась поддержка питоновского модуля logging с возможностью настройки.
  • Улучшена обработка статики.
    В Джангу включили приложение ранее известное как django-staticfiles. Это помогает в связывании файлов статики с приложением, то есть теперь статика может включаться в приложение, а специальная команда manage.py collectstatic собирает их вместе.
  • Поддержка unittest2 в качестве основной библиотеки для тестов.
  • Транзакции теперь можно оформлять в виде менеджера контекста
  • Настройка каскадного удаления в моделях.
  • Маркеры контекста и комментарии для строк перевода.
  • Встроеные теги include, with и load получили дополнительные аргументы.
  • Класс TemplateResponse как динамичная замена статичному HttpResponse.
  • Новые фичи кеширования.
  • Права для неактивированных пользователей.
  • Набор тестов GeoDjango для пространственных БД (spatial dabases).
  • MEDIA_URL и STATIC_URL должны заканчиваться слешем.
  • и ещё по мелочи

Обратно не совместимые изменения в 1.3

  • Проверка на CSRF теперь и для аякс-запросов.
    Ранее аякс-запросы не проверялись на CSRF-токен, теперь это не так, необходимо для аяксовых запросов включать в заголовок X-CSRFTOKEN, либо использовать декоратор @csrf_exempt
  • Запрос к фильтрам в админском интерфейсе проверяет права на доступ к моделям.
  • Поле FileField больше не удаляет файлы при удалении записи из БД.
  • Поле PasswordInput по умолчанию очищает поле пароля при отрисовке формы.
  • Виджет ClearableFileInput для очистки input type=file.
  • Индекс по полю expire_date в таблице сессий.
  • Убраны фильтры брани в комментариях PROFANITIES_LIST.
  • FormSet больше не принимает пустой словарь в качестве аргумента.
  • При передаче в шаблон вызываемого объекта он будет вызываться автоматически (как раньше происходило для вызываемых атрибутов).
  • SQL инсерты, написанные вручную и выполняемы при синхронизации данных при тестировании больше не выполняются.
  • Изменен приоритет загрузки переводов.
  • Управление транзакциями.
  • Неактивированные пользователи теперь не могут сбросить себе пароль

Устаревшие фичи («deprecated» в 1.3)

  • Поддержка mod_python будет полностью убрана в 1.5 (не релизился с 2007 года)
  • Общие виды на основе функций заменили видами, основанные на классах
  • Устарел аргумент template у django.test.client.Client
  • DjangoTestRunner заменили на untitest2
  • Изменение тегов url и ssi. Ранее они не поддерживали передачу аргумента через переменую контекста.
  • Авторизация админов теперь не отличается от авторизации юзеров ( убран недокументированный django.contrib.admin.sites.AdminSite.display_login_form)
  • Устарели команды reset and sqlreset. Используйте flush и sqlflush или ручное удаление.
  • В GeoDjango не рекомендуют к использованию TEST_RUNNER, изменилось поведение метода transform()
  • Устарел метод CZBirthNumberField.clean
  • Устарел класс CompatCookie
  • Отказ от загрузки переводов из project path
  • Обработчик контекста PermWrapper переехал в django.contrib.auth.context_processors
  • Поле XMLField будет убрано полностью уже в 1.4

Кому не терпится воспользоваться всем новым функционалом, могут загрузить последний RC с сайта Джанги или воспользоваться командой

easy_install django http://media.djangoproject.com/releases/1.3/Django-1.3-rc-1.tar.gz
Либо чекаут транка из SVN:
svn co http://code.djangoproject.com/svn/django/trunk/

5 марта 2011 г.

Нескучные миниатюры в Django

Мы используем для создания миниатюр фотографий на своих проектах замечательный модуль sorl.thumbnail, который помимо всех своих основных фич умеет заменять все картинки на заглушки. Это бывает полезно, когда надо разрабатывать сайт на локальной машине, где фотки с продакшена отсутствуют.

По умолчанию для этого есть опция THUMBNAIL_DUMMY, вот что получается с её помощью:
before


Довольно уныло. Добавим позитива сайту, вместо унылых квадратов пусть у нас будут котята.

В urls.py проекта до строчки
(r'^', include('sorl.thumbnail.urls')),

прописываем
(r'^thumbnail-dummy/(?P<width>\d+)x(?P<height>\d+)/$',  'django.views.generic.simple.redirect_to',
{ 'url': 'http://placekitten.com/%(width)s/%(height)s' }),


В итоге получаем:

after