Posted by & filed under django, python.

Пример работы (делаем масштабирование картинки по ширине и высоте, но не превосходящее width_max, height_max):

from django.db import models
from django.forms.fields import CharField
from imagekit.models import ImageSpec
from imagekit.processors import resize, Adjust
from django.forms import ModelForm, forms

class FormatImage(object):
    def process(self, image):

        # масштабируем до width_max, height_max
        width_max=605
        height_max=475
        c=resize.Fit(width_max,height_max,True)
        image=c.process(image)
        return image

class Photo(models.Model):
    original_image = models.ImageField(upload_to='photos')
    formatted_image = ImageSpec([FormatImage()],image_field='original_image', format='JPEG',
            options={'quality': 90},cache_to='photos/formatted/')
    thumbnail = ImageSpec([Adjust(contrast=1.2, sharpness=1.1),
            resize.Crop(50, 50)], image_field='original_image',
            format='JPEG', options={'quality': 90},cache_to='photos/thumbnail/')
    info=models.TextField()


Posted by & filed under django, python.

Не очевидная для меня вещь с загрузкой файла и класса наследника ModelForm, нужно указать

files=request.FILES

Иначе появлялась ошибка

This field is required.

Хотя оно там было заполнено.

рабочий пример:

if request.POST:
        pcf=PhotoCandidateForm(request.POST,files=request.FILES)
        if pcf.is_valid():
            pcf.save()
            message='Data is saved. Thanks'

Сумбурно получилось, но так как пишу для себя, то должен сам себя понять

Posted by & filed under python, windows.

Настраивать Django под Windows XP тот ещё секс, в общем проблема была в точности как
http://victor-k-development.blogspot.com/2010/07/unicodedecodeerror-django.html
Резюмирую:
проблема

UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe0 in position 0: ordinal not in range(128)

Решение:

В моем случае проблема заключалась в том, что в реестре в разделе[HKEY_CLASSES_ROOT\CLSID\{4063BE15-3B08-470D-A0D5-B37161CFFD69}\EnableFullPage\MIME] содержались подразделы содержащие в названии кириллицу. При удалении этих разделов они автоматически пересоздавались. Поэтому помогло переименование, просто заменил кириллицу латиницей.

Так же удалить русские ключи из:
HKEY_CLASSES_ROOT\MIME\Database\Content Type

Posted by & filed under Linux.

Проброска портов.
Мое спасение от погружения в бездну iptables это rinetd.
Всё просто, ставим из репозитория:

sudo aptitude install rinetd

Правим конфиг перенаправления /etc/rinetd.conf, пример:

#откуда_ip откуда_port  куда_ip куда_port
192.168.1.2 80 192.168.1.59 80

Пример 2, переводит все входящие соединения (и внутренние и внешние) на нужным нам ip

0.0.0.0 80 192.168.1.59 80

И рестартуем сервис:

sudo /etc/init.d/rinetd restart

Posted by & filed under Linux.

Tmux — тайловый мультиплесор терминалов. Возможности те что в screen + ещё куча фич, + более стабильная работа.
Основное отличие:
у screen горячие главиши привязаня на Ctrl+a,
у tmux на Ctrl+b
Хорошая статья по теме:
http://www.xakep.ru/post/52156/

Список сессий:

tmux ls

Подключение к конкретной сессии:

tmux attach -t 1

Переименование сессии:

tmux rename-session -t 3 name_of_session

Где 3 — номер сессии из списка выведенной командой tmux ls
Подключение к переменованной сессии:

tmux attach-sesssion -t name_of_session

Posted by & filed under Linux.

Проблема: сложности при создании нескольких тайловых окон для SSH

Попытка1: пробывал Terminator но в отличии от локального использования при создании нового тайла приходилось пересоединяться по SSH

Правильное решение:
UNIX приложение screen

Плюсы, которые важны для меня:
1)можно делать тайлы
2) при закрытии терминала сессия screen не закрывается(!), достаточно сново присоединиться по SSH и выполнить

screen -x

и все окошки на месте

Полезная статья с горячими клавишами:
http://www.pixelbeat.org/lkdb/screen.html
Кеш

Posted by & filed under Articles.

Вообще-то всё должно быть банально просто:

./manage.py migrate myapp

Но так как приложение уже было, то нужно было игнорировать первую миграцию, которая создает базу,а запустить вторую, которая делала обновления. В моем случае такое решение:

./manage.py migrate myapp 0001 --fake
./manage.py migrate myapp 0002