“Визуальный” markdown
Для тех, кто временами путает синтаксис Markdown’а(для меня, например) - markItUp!. Работает на основе jQuery.
PS. Правда, пока еще в бета-версии. Буду следить за развитием проекта.
Для тех, кто временами путает синтаксис Markdown’а(для меня, например) - markItUp!. Работает на основе jQuery.
PS. Правда, пока еще в бета-версии. Буду следить за развитием проекта.
Почитал про jQuery, прямо как будто прозрел. Оказывается, не всё так запущенно с клиентским программированием в 2008-м году.
Критикуйте :) Надеюсь, что кому-нибудь поможет. Данный пост показывает как добавить поддержку аватаров в блоговый движок 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:
“Так что, свобода не наступает в тот момент, когда бизнес стартуется. Свобода наступает в тот момент, когда бизнес ведется не для зарабатывания “на жизнь”, а для зарабатывания на новый уровень жизни. Причем даже в этот момент множество людей не ощущают свободу, так как все равно остаются чрезвычайно зависимыми от потери или заработка денег.”
Первый мой Django-проект, выложенный в открытый доступ: сайт фотографа Татьяны. Простейший движок, одна модель. Особых сложностей при разработке замечено не было. Зато было замечено приятное ощущение от разработки на Django: быстро, удобно, логично. С почином меня. Дальше - больше.
PS. Дизайн и вёрстка ужасны, знаю. Но это не моё :)
Поигрался вчера немного с Asus EEEPC. В принципе, нормальная машинка, которую не жалко (мне, по крайней мере) потерять/уронить :) В качестве “походного” ноутбука для веб-программиста очень даже. По умолчанию стоит Debian-based Linux с оболочкой KDE, можно установить Windows XP, Ubuntu. 4 гигабайта на “жестком” flash-диске вполне хватит для обычных задач. Из недостатков я вижу только немного страшноватый дизайн и низкое разрешение экрана - 800х480.
PS. Рекомендую ознакомиться вот с этим приятным обзором.
Тихо и незаметно набралось уже 500 посещений данного блога(с 24.12.2008) :) Причём никакой особо полезной информации он пока еще не содержит. Основные переходы на блог идут с Byteflow.su, что, впрочем, не является чем-то удивительным :) Надеюсь, что к моменту посещения сайта тысячным посетителем хоть что-то да изменится.