Django: GenericForeignKey — ограничить выбор типов

Django позволяет создавать очень гибкие связи между моделями посредством встроенного приложения contenttypes. Эта функциональность является надстройкой над иерархией приложение-модель и позволяет создавать связь модели с другими моделям разного типа.

Реализуется так:

class MyModel(models.Model):
    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    ...

По сути такая схема создает ключ из двух полей — тип модели и ID объекта этого типа.

А вот так можно ограничить возможность выбора типа модели:

class MyModel(models.Model):
    limit = models.Q(app_label='app1', model='model1') | models.Q(app_label='app2', model='model2')
    content_type = models.ForeignKey(ContentType, limit_choices_to=limit)
    object_id = models.PositiveIntegerField()
    content_object = GenericForeignKey('content_type', 'object_id')
    ...

Внимание! Аргументом model конструктора объекта Q должно быть имя модели, приведенное к нижнему регистру, т.е. ‘somemodel’ для модели SomeModel, соответственно.

Elementary OS: как добавить ярлык приложения из PlayOnLinux на Plank

  1. Нажать Создать ярлык для соответствующего приложения в PlayOnLinux. После этого ярлык появится в домашней директории (файл с расширением .desktop).
  2. Скопировать ярлык в /usr/share/applications/.

    sudo cp ~/mymsapp.desktop /usr/share/applications/
    
  3. Открыть меню «Приложения» на верхней панели, найти нужный ярлык.

  4. Перетащить ярлык на лаунчер Plank.

Elementary OS Freya: настройка шрифта в Терминале

Предустановленная программа Терминал в Elementary OS не имеет настроек доступных через меню. Как по мне, не плохо б было иметь возможность менять хотя бы шрифт.

В данный момент шрифт можно поменять так:

    gsettings set org.pantheon.terminal.settings font 'Droid Sans Mono 11'

или отредактировать соответствующую ветку с помощью dconf-editor (требует установки).

UPD: Увеличить и уменьшить размер шрифта можно с помощью горячих клавиш Shift + Ctrl + + и Ctrl + - соответственно.

Режим Vim в NetBeans

NetBeans — чудесная бесплатная IDE с поддержкой PHP. А вот чего мне не хватало в ней, так это режима Vim в редакторе. В большинстве современных IDE и редакторов такой режим доступен после установки соответствующего плагина, а разработчики JetBrains вообще считают, что это их киллер-фича. В NetBeans такой плагин тоже есть — jVi, но он на первый взгляд нерабочий. А суть в том, что нужно установить последовательно два плагина.

Сначала установить jVi for NB-7.0 Update Center. После чего нажать кнопку Проверить обновления. В результате станет доступен для установки сам плагин jVi for NetBeans. Vim-раскладка начнет работать после его установки и перезагрузки IDE.

Конвертация строки в объект datetime

Бывает так, что при импорте данных необходимо извлечь дату из текстового поля и преобразовать ее в формат datetime для последующей вставки в базу данных через ORM Django. В общем случае дата может быть в произвольном строковом формате.

Примеры:

Jun 3 2014 5:23PM 
Aug 28 1999 12:00AM

Для такой типовой задачи ожидаемо существует решение в стандартной библиотеке Python — метод strptime модуля datetime. В свою очередь вызов datetime.strptime(date_string, format) является эквивалентом вызова datetime(*(time.strptime(date_string, format)[0:6])).

В итоге задача решается так:

from datetime import datetime
date = datetime.strptime("Jun 3 2014 5:23PM", '%b %d %Y %I:%M%p')

Маска форматирования даты задается аналогично методу strftime(), который реализует обратную по смыслу функциональность.

Django: генерация SECRET_KEY

Частенько при настройке и запуске Django возникает подобная ошибка:

The SECRET_KEY setting must not be empty.

Это механизм проверки конфигурации Джанги ругается, что вы забыли указать SECRET_KEY в локальных настройках. А где взять это значение? Можно натарабанить по клаве самому, можно скопировать из базового модуля настроек, созданного в самом начале при startproject. Но правильно сгенерировать уникальное для данной инсталяции значение так, как это делается в startproject.

from django.utils.crypto import get_random_string

chars = 'abcdefghijklmnopqrstuvwxyz0123456789!@#$%^&*(-_=+)'
get_random_string(50, chars)

И следите, чтобы SECRET_KEY ваших активных инсталяций не утекал в публичные репозитории или листинги.

AngularJS и History API в Chrome приложениях

History API имеет ограниченную поддержку в приложениях Chrome. Однако, AngularJS пытается обратиться к методу history.pushState во время инициализации приложения. Это неминуемо приводит к ошибке: history.pushState is not available in packaged apps.

Лечится так:

angular
    .module('app', [], function($provide) {
        // Prevent Angular from sniffing for the history API
        // since it's not supported in packaged apps.
        $provide.decorator('$window', function($delegate) {
            $delegate.history = null;
            return $delegate;
        });
    });

Источник: github.com

Django: как получить значение по-умолчанию поля модели

Допустим, в Django приложение существует следующая модель:

class MyModel(models.Model):
    my_field = models.IntegerField(u"My field", default=0)

Тогда сослаться на значение по-умолчанию поля my_field можно так:

my_field_default_value = MyModel._meta.get_field('my_field').get_default()

UPD: Начиная с версии Django 1.8, устоявшаяся практика использования _meta стала абсолютно легальной. Теперь есть документированное API.

Vim: управление настройками при запуске из командной строки на примере выбора цветовой схемы

Если запустить Vim с опцией --cmd 'let ...', то такая директива выполнится до загрузки директив из vimrc. На этой фиче можно построить, например, выбор цветовой схемы редактора при запуске.

Я в светлое время суток предпочитаю работать в светлой Солярке (чаще), а ночью в Монокае (редко).

Для этого в vimrc пишем что-то типа:

" Default color scheme - Solarized (light)
colorscheme solarized
set background=light

" Setting colorscheme from command line
if exists("theme")
    if theme == "dark" 
        colorscheme monokai
    endif
    if theme == "solarizedlight" 
        colorscheme solarized
        set background=light
    endif
    if theme == "solarizeddark" 
        colorscheme solarized
        set background=dark
    endif
endif

Тогда выбрать тему можно так:

gvim . --cmd 'let theme="dark"'
gvim . --cmd 'let theme="solarizeddark"'

А по умолчанию будет светлая солярка.