Меня зовут — Анатолий Ларин

Блог о разработке и разработчике

RM

Интро

Случалось ли вам, работая в консоли, командой подобной этой “rm -rf ./*”, удалять все добро нажитое непосильным трудом? Случалось? ))) Вот и я на днях допустил такой промах. Не посмотрел в какой директории находился и вместо очистки временного каталога, очистил каталог с проектами.

Решение

Из сложившейся ситуации я вынес урок – при удалении всегда нужно указывать полный путь. Таким образом вариант с удалением нужных данным будет сведен к минимуму.

Но все мы люди. А большинство людей ленивы. Поэтому вариант с полным путем не всегда пригоден. А стандартная утилита rm не удаляет файлы в корзину.

Исправим это:

sudo aptitude install trash-cli

потом добавил алиас:

vim ~/.bashrc

и добавляем строчку:

alias rm='trash'

рестартимся и готово: rm – помещает файлы в корзину!

Django widget calendar

Интро

В одном проекте, мне понадобился визуальный календарик. Брать “сторонние” разработки не хотелось, т.к. хороший календарик уже есть в админке Django. Осталось только его достать )

Легко?

Достать календарик проще простого:

from django import forms
from django.contrib.admin.widgets import AdminDateWidget

class TestForm(forms.Form):
    datefrom = forms.DateTimeField(label='Дата',  widget=AdminDateWidget)

Выглядит все просто и логично. Но, к сожалению этого не достаточно. Данному виджету трубуются дополнительные JS & CSS файлы.

Вначале я попытался сделать свой виджет унаследовав его от AdminDateWidget и дополнив его Meta-класс необходимыми js & css файлами. Но ничего не получилось, файлы подключались не в той последовательности.

Немного кода

# -*- coding: utf-8 -*-
import settings
from django import forms

class CalendarWidget(forms.TextInput):
    '''
    Данный виджет является, практически, копией
    django.contrib.admin.widgets.AdminDateWidget
    Но наследование от AdminDateWidget не удалось из-за неверного
    порядка JS-файлов в результирующем html, при наследовании.

    Для работы необходимо в urls.py добавить:
    (r'^admin/jsi18n/', 'django.views.i18n.javascript_catalog'),
    '''
    class Media:
        js = ('/admin/jsi18n/',
              settings.ADMIN_MEDIA_PREFIX + 'js/core.js',
              settings.ADMIN_MEDIA_PREFIX + "js/calendar.js",
              settings.ADMIN_MEDIA_PREFIX + "js/admin/DateTimeShortcuts.js")
        css = {
            'all': (
                settings.ADMIN_MEDIA_PREFIX + 'css/forms.css',
                settings.ADMIN_MEDIA_PREFIX + 'css/base.css',
                settings.ADMIN_MEDIA_PREFIX + 'css/widgets.css',)
        }

    def __init__(self, attrs={}):
        super(CalendarWidget, self).__init__(attrs={'class': 'vDateField', 'size': '10'})

Вот и весь код, но для корректной работы требуется подключение jsi18nurl.py):

urlpatterns += patterns('',
    (r'^admin/jsi18n/', 'django.views.i18n.javascript_catalog'),
)

Результат

P.S.

Примеры кода с другими реализациями данной задачи приветствуются!

Разукрасим SVN

Интро

Новый год для меня начался хорошо – я сменил работу и переехал в столицу нашей родины. А вместе с работой решил сменить и основную рабочую систему – с Windows XP на Ubuntu 9.10 )

Теперь приходится использовать SVN в консоли, т.к. nautilussvn, мягко говоря очень ограничен в функциональности, либо у меня просто не хватило терпения с ним разбираться.

Установка

  1. sudo aptitude install colordiff
  2. nano ~/.subversion/config
  3. находим параметр diff-cmd и прописываем diff-cmd = colordiff

Все, теперь svn diff будет цветным.
При использовании less не забудьте параметр -R:

svn diff | less -R

иначе less удалит раскасску.

Django & WYSIWYG

Интро

Я по прежнему продолжаю изучать Django + Python. Пока этот тандем не перестает меня радовать. И все больше усилий мне приходится делать над собой, чтобы разрабатывать на работе на PHP с использованием самописного фреймворка.

И вот, на одном из сайтов понадобился WYSIWYG-редактор.
Read the rest of this entry »

Django & Cron

Интро

В предыдущей статье я описывал как выкладывать Django-проект на сервер и можно сказать попутно выкладывал. =) Но на этом мои “мучения” не закончились – оказалось, что я не знаю как прикрутить вызовы частей приложения по Cron.

Погуглив и почитав, решение нашлось… и оно оказалось намного приятнее решения на php ;)

Решение

В корневой директории проекта, в моем случае publishing, создаем фалик run.py:

# -*- coding: utf-8 -*-
import sys
import settings
from django.core.management import setup_environ
setup_environ(settings)
module_name = sys.argv[1]
exec('import %s' % module_name)
exec('%s.%s' % (module_name, ' '.join(sys.argv[2:])))

Update: Спасибо Александру Кошелеву за ценный комментарий.

И теперь при помощи этого скрипта мы можем вызывать функции наших “вьюшек” из командной строки и из cron:

# python /path/to/project/run.py report.views "send_emails()"

Таким образом у нас выполниться report.views.send_emails()
Все, остается вызвать crontab -e и добавть выше описанную команду.

Как всегда, все просто. =)

UPD (15 марта 2011):

Все больше переходов на данную статью из поисковиков. Коллеги, прошло уже 2 года с момента написания статьи, многое изменилось.
Данную задачу теперь можно решать стандартным способом: Custom management commands