About Blog |

Archive for March, 2008

Визуальный” markdown

Для тех, кто временами путает синтаксис Markdown’а(для меня, например) - markItUp!. Работает на основе jQuery.

PS. Правда, пока еще в бета-версии. Буду следить за развитием проекта.

Просветление

Почитал про jQuery, прямо как будто прозрел. Оказывается, не всё так запущенно с клиентским программированием в 2008-м году.

Интересная ссылка

Статья “Типовые ошибки при создании интернет-стартапа” на ideablog. Надеюсь, что серия выпусков на эту тему продолжится, ведь хочется учиться всё-таки на чужих ошибках.

РИТ-2008

Оплатил “путёвку” на РИТ-2008. Это будет вообще моя первая конференция в жизни :)

Аватары для Django-проекта

Критикуйте :) Надеюсь, что кому-нибудь поможет. Данный пост показывает как добавить поддержку аватаров в блоговый движок Byteflow.

В settings.py (или settings_local.py) добавляем следующие настойки:

AVATAR_SIZE = (80, 80) #размеры аватара
AVATAR_UPLOAD_DIR="avsrc/" #директория для загрузки исходной картинки
AVATAR_DIR="avatars/" #директория хранения аватаров
AVATAR_DEFAULT="default.jpg" #файл аватара по умолчанию. находится в STATIC_URL/img

В /apps/accounts/models.py создаём модель аватара:

class UserAvatar(models.Model):
    """
    Avatar class for Amazon Byteflow blog engine
    """
    user=models.ForeignKey(User)
    original=models.ImageField("avatar", upload_to= settings.MEDIA_ROOT + "/" + settings.AVATAR_UPLOAD_DIR) 

    class Admin:
        pass

    def __unicode__(self):
        return self.user.username

    def create_avatar(self):  
        import Image
        im = Image.open(self.original)
        format = "JPEG"
        width, height = settings.AVATAR_SIZE
        im.thumbnail(settings.AVATAR_SIZE, Image.ANTIALIAS)
        im.save(self.user.get_avatar_filename(), "JPEG")

    def delete(self):
    if (self.user.get_avatar_path() <> ''):
        os.unlink(self.user.get_avatar_filename())
    super(UserAvatar, self).delete()       

    def save(self):
        if self.id:
            av = UserAvatar.objects.get(pk=self.id)
        if self.user.get_avatar_path() <> '':
            os.unlink(av.original)
        self.create_avatar()
        super(UserAvatar, self).save()

Затем создадим несколько функций:

def _avatar_url(self):
if (self.get_avatar_path() <> ''):
    return settings.MEDIA_URL + settings.AVATAR_DIR + str(self.id) + '.jpg'
else:
    return settings.STATIC_URL + 'img/'  settings.AVATAR_DIR + settings.AVATAR_DEFAULT

def _avatar_path(self):
    if os.path.exists(self.get_avatar_filename()):
        return self.get_avatar_filename()
    else:
        return ''

def _avatar_filename(self):
    return settings.MEDIA_ROOT + settings.AVATAR_DIR + str(self.id) + ".jpg"

def _new_delete_user(self):
    av = UserAvatar.objects.get(user=self)
    if not av is None:
        av.delete()    
    super(User, self).delete()

И навешиваем их на модель User:

User.get_avatar_url=_avatar_url
User.get_avatar_path=_avatar_path
User.get_avatar_filename=_avatar_filename
User.delete=_new_delete_user

Подмена метода delete связана с тем, что при удалении пользователя из базы данных необходимо удалять еще и аватары.

Теперь в шаблоне мы можем через object.author.get_avatar_url получить ссылку на аватар автора поста. По аналогии можно выводить аватары для пользователей, комментирующих пост. Остаётся всего лишь исправить шаблоны :)

PS. Это первая версия, написанная на коленке, поэтому не всё еще реализовано. Например, надо сделать в профиле пользователя форму для загрузки аватара.

Ценная цитата №1

Начинаю публиковать интересные-полезные-ценные цитаты из разных блогов. Делаю это для себя, в первую очередь. Если будет полезно кому-то еще - буду только рад. Цитата номер 1:

Так что, свобода не наступает в тот момент, когда бизнес стартуется. Свобода наступает в тот момент, когда бизнес ведется не для зарабатывания “на жизнь”, а для зарабатывания на новый уровень жизни. Причем даже в этот момент множество людей не ощущают свободу, так как все равно остаются чрезвычайно зависимыми от потери или заработка денег.”

Первый :)

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

PS. Дизайн и вёрстка ужасны, знаю. Но это не моё :)

Asus EEEPC

Поигрался вчера немного с Asus EEEPC. В принципе, нормальная машинка, которую не жалко (мне, по крайней мере) потерять/уронить :) В качестве “походного” ноутбука для веб-программиста очень даже. По умолчанию стоит Debian-based Linux с оболочкой KDE, можно установить Windows XP, Ubuntu. 4 гигабайта на “жестком” flash-диске вполне хватит для обычных задач. Из недостатков я вижу только немного страшноватый дизайн и низкое разрешение экрана - 800х480.

PS. Рекомендую ознакомиться вот с этим приятным обзором.

Маленький юбилей

Тихо и незаметно набралось уже 500 посещений данного блога(с 24.12.2008) :) Причём никакой особо полезной информации он пока еще не содержит. Основные переходы на блог идут с Byteflow.su, что, впрочем, не является чем-то удивительным :) Надеюсь, что к моменту посещения сайта тысячным посетителем хоть что-то да изменится.