Tuesday, April 8, 2014

django: Show form validation error with AJAX and jQuery

I once had a situation when I submited form with AJAX and if there were validation errors I had to put them at the same place as form was normally submited.

Assume that we have edit_user_data method in the views.py. If edit_form is valid we do some really useful things. If it's not, we should show user form validation errors (btw, I use uni_forms in that example).

Here is our code:

def edit_user_data(request):
# ...
if edit_form.is_valid():
# ...
else:
error_message = dict([(key, [unicode(error) for error in value]) for key, value in edit_form.errors.items()])
return HttpResponse(simplejson.dumps({"result": error_message, }), mimetype='application/json')


error_message is a dictionary which contains all form errors. We use JSON so we could have access to the data like server_response.result[key]. Key is the name of the field.

Here is our javascript code:

$("#edit_form").ajaxSubmit({
url: save_url,
type: 'post',
success: function (server_response) {
// Inform about successfull save
if (server_response.result_success) {
// ...
}
// Remove form errors
$("#edit_form").find(".errorField").remove();
for (var key in server_response.result) {
// Check for proper key in dictionary
if (key in {first_name: 1, last_name: 1, gender: 1, sex: 1, phone: 1, }) {
// Get error message
error = server_response.result[key][0];
// Find related field
field = $("#edit_form").find("#div_id_" + key)
// Attach error message before it
field.before('<p class="errorField"><em></em>' + error + '</p>');
}
}
},
});


#edit_form - id of the submited form, url - where we submit the data to. If AJAX request successfuly was proceed by server (it doesn't matter if user submited valid data or not. It means he does submited something) we now could show user if his form is valid or not. If it is not valid, we remove old errors from form (or we will have multiple errors under the fields, probably duplicates). Let also assume that our form contains 5 fields: first_name, last_name, gender, sex, phone. Here you can see nice trick how to check if a key is related to one of our fields:
if (key in {first_name: 1, second_name: 1, gender: 1, sex: 1, phone: 1, }) {}

We also want to show user only one error per field (If there are more, he will be able to see them next time):
error = server_response.result[key][0];

To show error message above the field itself we need to find that field:
field = $("#edit_form").find("#div_id_" + key)

Luckly our key names are the same as field names :) And then attach a message before it:
field.before('

' + error + '

');

Where error is description of error, for example, "This field is required". Done. Errors looks nice and native ")

Wednesday, April 2, 2014

Как пользоваться vim (очень краткое руководство)

Наверняка многие слышали о редакторе vim. Говорят, что настоящие программисты пользуются именно им. Или Emacs. Не могу удержаться и не поменстить эту картинку:

Честно признаюсь: первый раз когда я запустил vim, я с него даже выйти не смог! :/

Vim(или vi) есть на практически каждом компьютере работающем под linux. Именно поэтому надо уметь выполнять хотя бы базовые действия с ним. В этом посте будет рассказано как открывать, редактировать и сохранять файлы.

Итак, приступим. К примеру у нас есть файл simpleblogger.py. Открыть его с vim проще простого. Запускаем из консоли:
vim simpleblogger.py


Как видно в комплекте сразу подсветка синтаксиса для Python. Главное особенность vim в том, что у него есть два режима: режим просмотра и режим редактирования. По умолчанию файл открывается в режиме просмотра. Ничего набрать в этом режиме не получится (только удалить). Чтобы перейти в режим редактирования, надо нажать кнопку "i". Выйти из него - Esc. Vim сообщает вам, что вы находитесь в режиме редактирования показывая слово INSERT в конце файла.

Файл просматривать надо в обычном режиме (не редактирования). Навигация с помощью стрелочек и Page Up, Page Down. На самом деле, в vim для навигации лучше использовать h, j, k, l. Но к ним еще надо привыкнуть... При просмотре логов (длинных логов) удобно перейти сразу в конец файла. Сделать это можно нажав Shift + G. Поиск по файлу осуществляется так: нажимаете "/", вводите искомые символы и нажимаете Enter. Vim подсветит все места где встречается искомый набор символов. К следующему месту можно перейти нажав "n".

Итак, предположим вы отредактировали файл. Его надо сохранить. Для этого нажимаем Esc (выход из режима редактирования), потом ":" (означает что мы собираемся ввести команду) и затем "!qw". ! знак означает, что вы вкурсе изменений, q - выйти, w - сохранить изменения. В итоге:
Esc : ! w q

Команды можно комбинировать. Например, Esc : ! q - выйти без сохранения изменений.

Thursday, March 27, 2014

fedora 20: Восстановление базы данных PostgreSQL из файла

В предыдущем посте было написано как установить postgresql. В этом - восстановим базу данных. Для начала создадим пользователя:
sudo su postgres

psql

\password postgres;

Теперь выставим права пользователей. Для этого отредактируем файл:
su -

cd /var/lib/pgsql/data/

vim pg_hba.conf

Находим незакомменченные строчки:

local all all md5
host all all 127.0.0.1/32 md5
host all all ::1/128 md5

И меняем md5 на trust. Сохраняем изменения и рестартуем сервис:
sudo service postgresql restart

Создаем пользователя владельца базы данных - bongo
createuser -U postgres --superuser -E -P bongo

Создаем базу данных от пользователя bongo, владельца bongo с кодировкой UTF-8 под названием bongo30:
createdb -U bongo -O bongo -E UTF8 bongo30

Заполняем ее из файла bongo30.sql:
psql -U bongo bongo30 < bongo30.sql &> dumpresults

Лог операции в файле dumpresults.

fedora 20: Как установить PostgreSQL

Находил в интернете руководства по установке PostgreSQL, в которых рекомендовали отключить стандартный репозиторий fedora. Но я решил попробовать установить из него. Для этого выполняем команду:
sudo yum install postgresql-server

Готово. Теперь надо выполнить конфигурацию, которую из-за лицензионных соглашений надо выполнять вручную:
service postgresql initdb

Если хотите, чтобы postgresql стартовал автоматически, выполните команду (не проверено):
chkconfig postgresql on

или
systemctl enable postgresql.service

Postgresql запускается командой:
sudo service postgresql start

Одно из преимуществ установки postgresql из официального репозитория - это то, что не надо будет в командах таскать его версию.

Friday, March 21, 2014

python: Как отобразить прогресс задачи

В python есть очень хорошая встроенная библиотека для отображения прогресса задачи. Называется она progressbar. Установим ее с помощью pip:
sudo pip install progressbar

Для симуляции задачи будем использовать модуль time.
import progressbar
import time

pbar = progressbar.ProgressBar(widgets=[progressbar.Bar(), progressbar.Percentage(), ' ', progressbar.ETA()])
for i in pbar(range(50)):
time.sleep(0.2)

Вот так все просто. Наслаждаемся результатом:

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

Saturday, March 8, 2014

fedora 20: установка на ноутбук TOSHIBA Satellite L50-A. Версия 2. Более подробная и изощренная

Итак, мой ноутбук побывал в сервисе. После этого пришлось все переустанавливать заново :(

Итак, имеем в начале установленную Windows 8.1. Сразу выделим место, в которое установим fedora. Для этого нажимаем клавишу Win и попадаем в "усовершенствованный Пуск". Начинаем набирать disk partitions и запускаем программу:

Производим разбивку дисков в открывшейся программе в соответствие со своими потребностями.

Последний шаг, который надо осуществить в Windows - это отключить Fastboot, а то никогда grub не увидим.

Открываем Панелб управления (Control panel). Можно из Пуска. И переходим в Hardware and Sound >> Power Option

Выбираем пункт Choose what the Power button does:

Нажимаем Change Settings that are currently unavailable и убираем галочку с Turn on Fast startup.

Все подготовки с Windows завершены (предполагается, что fedora уже записан на флешку, например, этой программой )

К сожалению, fedora не является подписанной системой и чтобы получить возможность загрузиться с флешки, надо отключить в BIOS Secure boot. При включение ноутбука начинайте нажимать F2. В результате должно появится окно BIOS. Найдите пункт Secure Boot и отключите его. Также найдите параметр Fast boot и замените его на Normal Boot.

Готово. Наконец-то можно переходить к установке fedora! Здесь все как обычно, кроме пункта в котором указываются разделы куда что монтировать. Все разделы можно оставить такими, какими их предложит создать Anaconda, кроме раздела, который предлагается монтировать на /boot/efi. В нашем ноутбуке поумолчанию загрузочным разделом с efi является раздел sda2. Ваша задача - удалить предложенный fedora раздел под /boot/efi и указать разделу sda2 точку монтирования /boot/efi.

Если после завершения установки перегружаетесь и grub игнорируется, а грузится сразу Windows, то впереди еще есть над чем поработать.

Снова грузимся с загрузочной флешки с fedora. Открываем файловый менеджер и ищем диск sda2 (тот на который монтировали в /boot/efi). Не удается найти? Откройте программу Disk. Она поможет.

На этом диске ищем папку EFI, открываем ее и внутри должны быть папки fedora, Microsoft, Toshiba. Нам нужно переименовать папку Microsoft (а то похоже что оно как только находит папку Microsoft больше смотреть ни на что не хочет..), например, в Microsoft.orig.

Перегружаемся (не забываем извлечь флешку) и видим стремное сообщение:
>>Checking media presense....
No media present...

Ждем дальше - будет предупреждение о том, что Secure boot отключен и - о чудо - видим grub!

Загружаемся в fedora. Все работает отлично, кроме Windows. :(

Исправим и это :\ . В fedora открываем для редактирования файл:
sudo gedit /etc/grub.d/40_custom

И в конец файла добавляем строки:

menuentry 'Windows Boot Manager' {
chainloader /EFI/Microsoft.orig/Boot/bootmgfw.efi
boot
}

Сгенерируем grub.cfg:
sudo grub2-mkconfig -o /boot/efi/EFI/fedora/grub.cfg


Все! Готово. Имеем работающий fedora 20 и windows 8.1 *happy*

P.S. После обновления Windows, grub может слететь. Тогда придется проделать операцию с переименованием папки Microsoft еще раз.

fedora 20: Как копировать файлы между компьютерами по ssh

Для того, чтобы скопировать файлы с одного компьютера на другой, надо будет на том, с которого копировать файлы, запустить ssh server. В fedora 20 для этих целей используется OpenSSH server. Он должен быть поумолчанию установлен в fedora, но на всякий случай устанавливать его так:
sudo yum install openssh-server

Запускаем сервер командой:
sudo service sshd start

Проверить его статус можно командой:
sudo service sshd status

Компьютер готов отдавать файлы. Подключимся к нему с машины-клиент:
ssh username@192.168.1.2

Этой командой получаем полный доступ к удаленному компьюеру. В качестве имени пользователя и пароля используйте уже существующий аккаунт на том компьютере.

А теперь приступим к копированию:
scp username@192.168.1.2:/home/1.txt /home/1.txt

Данная команда скопирует файл 1.txt с удаленного компьютера на ваш.

Надо копирнуть папку? Не проблема:
scp -r username@192.168.1.2:/home /home

Хотите скопировать файлы в текущую папку на клиенте? Тогда вместо полного пути достаточно поставить точку:
scp -r username@192.168.1.2:/home .