Давно не писал в блог, а тут такое событие. Решил внести свой вклад в развитие OpenSource сообщества.
ПредысторияНе так давно понадобился опрос на сайт. Обычный опрос с одиночным и мульти-выбором + пункт с пользовательским вводом. Симпатичный вид, анимация и возможность голосования без редиректа на другую страницу, так же было не последним требованием к "моему опросу".
Все что нашел в сети было либо малофункционально, либо из коробки выглядело как то не презентабельно, на мой субъективный взгляд. Короче говоря решил сделать свой собственный application. Даже на данном этапе, грубо говоря в версии
django-poll-system 0.1 :) моя система опросов, вполне себе конкурентно способна и выглядит достаточно не плохо. А требует для этого только
Django 1.3 и
JQuery. Вот небольшой скриншот:
Пример можно посмотреть на сайте: http://polltest.pythonism.ru
Прошу обратить внимание что КГБ время от времени лидирует в данном опросе :)
Вся система
django-poll-system (так я назвал application) состоит из нескольких моделей, и как мне кажется, клиентская часть получилась даже гораздо более жирной чем серверная и все из-за того что сервер практически ничего не делает, кроме как принимает ответы на опросы и хранит их в базе, все же остальное делается у клиента, вот так то.
Кстати о коде, сразу скажу что мне не нравится моя реализация отправки "пользовательского опроса" по
GET, я сделал ее на скорую руку, т.к. при использовании метода отправки
POST надо было бы писать дополнительные функции для корректного прохождения
Django защиты, а это как многие знают, кто работал с формами, пресловутый
CSRF protection. Это конечно же не большая проблема и я исправлю этот недочет в самое ближайшее время. Кстати в одном из конкурирующих, если можно так сказать систем опросов (сторонних проектов) я видел, как автор попросил своих пользователей отключать
Django CSRF Middleware, для того чтобы опрос мог отсылать на сервер ответы минуя
CSRF protection, что очень сильно снижало защиту сайта от взломов. Ха-ха. Чтобы ради какого то "дурацкого" опроса была такая огромная дыра в безопасности, НУ УЖ НЕТ УВОЛЬТЕ.
Так вот. Система состоит из следующих классов:- PollType - здесь хранятся типы опросов. Естественно предусмотренно дальнейшее расширение типов и функциональности в целом и через создание новыех типов.
- Poll - это непосредственно сам опрос, из важных для описания параметров для нас важен "startdate". Этот параметр должен быть уникальным и сделано это специально для корректного движения очередей (Queue см. ниже) ведь активный опрос в очереди может быть только один.
- Item - этот класс описывает один пункт опроса. Собственно опрос и состоит из "вопроса" на который просят ответить посетителя и непосредственно из пунктов ответов (Item), мужду которыми пользователь должен сделать выбир.
- Queue - несмотря на то, что я не хотел заморачиваться с очередями в 0.1 версии своего приложения, я посчитал, что без этой функциональности мой опрос не нужен ни мне, ни кому-либо другому. Очередь (Queue) - это логическая единица определяющая целую линию опросов. Это позволяет администратору сформировывать структурированную очередь из опросов и настроив Queue лишь однажды, очередь будет автоматически сменять один опрос на другой. Очередь может быть как для анонимных посетителей, так и только для зарегистрированных пользователей.
- Choice - данный класс представляет из себя одну сущность выбранного пользователем Item.
- Vote - один экземпляр содержит одну единицу голосования (один голос). Который состоит и информации о пользователе (ip, и user пользователь вошел), а так же время и выбранные пользователем пункты (Choice).
Вот собственно и все. Я думаю что этой информации будет достаточно для понимания основной функциональности django-poll-system. И конечно же, по мере того как проект будет развиваться, а он будет уж я то позабочусь :) он будет "обрастать" все новыми и новыми возможностями. Для этого просто необходимы отзывы со стороны. Так что если будут замечания, всегда пожалуйста.
Вот пример использования: http://polltest.pythonism.ru
Вот ссылка на скачивание с ведра: https://bitbucket.org/RafRaf/django-poll-system
Вот на PyPi: http://pypi.python.org/pypi-poll-system/django-poll-system
Можно установить прямо через pip/easy_install, примеры:
>> pip install django-poll-system>> easy_install django-poll-system