algenon/pasty — pull request #5 by Mihkorz (2013-10-17 15:32:09+00:00)
Title: Test task by Mihkorz

Добрый день!

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

Итак краткое описание:

1. Использовал Class Based Views вместо generic views. Во-первых это удобнее, во-вторых сами разработчики настаивают на этом,
обещая сделать generic views deprecated.
2. Сократил количество view до одного, т.к. этого достаточно для рандомной подгрузки пирожков,
а обновление базы по расписанию вообще не требует view. К тому же зачем плодить сущности.
3. Вынес весь html в отдельный шаблон.
4. Появилась ajax-форма добавления пирожков (видна только зарегестрированным пользователям).
5. Реализовал алгоритм случайного показа пирожков, в зависимости от количества голосов. Причём повторное появление пирожка невозможно,
и его вес не учитывается при рандомном выборе следующего пирожка. Однако если в базе очень много пирожков (>100тыс) немного подтормаживает.
Это можно решить путём добавления нового столбца, хранящего относительный вес конкретной записи.
6. В моделях Pasty сделал source как ForeignKey от Source.
7. Поправил вёрстку - теперь во всех браузерах пирожки отображаются одинаково - по центру страницы
8. Для загрузки пирожков из источников по расписанию использовал систему асинхронного выполнения заданий Celery http://www.celeryproject.org/.
Она позволяет настраивать выполнение заданий по времени и следить за их исполнением с использованием стандартной админки Django.
Сами задания находятся в core.tasks
9. Немного подправил парсинг rss. Для обновления perashki.ru целесообразно использовать twitter - написал прототип того, как это может работать.
Использовал python-twitter https://code.google.com/p/python-twitter/.

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

Если захотите со мной связаться по любым вопросам, то вот контакты:
тел +7 916 625 37 78
email mihkorz@gmail.com

С уважением,
Михаил