Архивы по Категориям: Open Source

Экспорт-импорт данных django-cms

Приводил сегодня в порядок базу данных одного проекта на django-cms и в ходе этого процесса решил перенести накопившиеся данные в новую БД, инициализированную с нуля и с успешно прогнанными миграциями. И, т.к в документации об этом не было ни слова, пришлось искать решение, и наткнуться на пару ошибок, после которых удалось создать готовый рецепт:

  • Первым делом переносим данные из таблицы auth_user, например, средствами БД;
  • Далее делаем два файла с данными. Так нужно, чтобы избежать проблемы с ключами в таблице cms_placeholder (IntegrityError: duplicate key value violates unique constraint «cms_placeholder_pkey»), которые например описаны в рассылке django-cms:

    ./manage.py dumpdata --indent=2 cms.placeholder > initial_data.cms.01.json

    ./manage.py dumpdata --indent=2 cms.cmsplugin cms.page cms.pagemoderatorstate cms.pageuser \
    cms.title picture snippet text (сюда-же впишем и остальные плагины) > initial_data.cms.02.json

  • И теперь загружаем полученные данные в новую БД:

    ./manage.py loaddata initial_data.cms.01.json
    ./manage.py loaddata initial_data.cms.02.json

К слову о многопоточности

Довелось по работе столкнуться с сервисом шифрования, который был написан по словам авторов, вроде бы очень просто и примитивно, но протокол был очень неприятный: обмен шёл 18-байтовыми блоками символов через TCP-порт. Решил сделать к нему небольшой проксирующий сервис на twisted, который бы вёл приём данных через HTTP POST запросы, выдавая результат в ответ. Стал проверять на скорость работы, и, этот «лёгкий простой» Java-сервис шифрования оказалось не выдержал и 100 единовременных запросов. Пришлось в тестах ограничиться 10-ю потоками, а заодно озадачиться вопросом как twisted переиспользует объекты протокола в многопоточном доступе (об этом другая история).

Мораль такова: как и бывший коллега в тестах обнаружил, что twisted выдерживает на удивление столько потоков, что падаёт то, что стоит за ним, так и здесь получилось, что то, что кажется кому-то простым и надёжным, на деле оказывается весьма падуче-тяжеловесным, когда речь идёт о высокой нагрузке. И спасибо разработчикам twisted за столь стремительный фреймворк :)

BCM4313 в Ubuntu 11.10

Вышла свежая Ubuntu Oneiric Ocelot и с ней появилась новая проблема с WiFi на моём Lenovo U165. Помимо того, что нужно было сделать для Ubuntu 11.04, теперь стоит поступить следующим образом:

  1. Снести, если установлены, драйвера broadcom-sta-common и файл /etc/modprobe.d/broadcom-sta-common.conf;
  2. Добавить в /etc/modprobe.d/blacklist.conf строку:

    blacklist bcma

После этого беспроводная связь будет беспроблемно подниматься при каждой загрузке.

Сборка debian пакета для дополнения к PHP из PECL

Я довольно часто использую удобный класс HTTPRequest из дополнения pecl_http, который описан в официальной документации по PHP. Но в очередной раз устанавливая его из PECL поразился тому сколько шагов нужно сделать для его сборки на чистой системе, после чего решил подсобить админам, собрав для него стандартный debian-пакет.

Читать далее »

Польза новых задач

По-настоящему мощь очередного фреймворка понимаешь, когда наконец-то сталкиваешься с задачей под которую он очевидно был заточен и вокруг базы под которую он обрастал. Как сейчас столкнулся на работе с необходимостью реализации немного извращённого соединения с обменом данными через TCP-сокеты сообщениями по ISO 8583. Быстрый любопытный взгляд в классы Twisted открыл что всё написано до нас, и всё, что остаётся – обернуть в красивую запускалку, дописать чуток логики и поработать над тестами, которые открыли несколько скрытых болезней. Ну и спасибо нашим админам, ещё поучиться засовывать получившийся модуль в красивый debian-пакет со скриптами и прочими свистелками :) .

об incrontab замолвите слово

Сегодня озадачился тем, как сделать так, чтобы при обновлении данных об остатках товаров (которые хранятся в 1С и выгружаются в виде .csv файла), происходило автоматическое обновление данных в Satchmo. Сам скрипт для чтения остатков из csv довольно простой, и на днях выложу его на github, хотя уверен, что подобное ищется в интернете легко и быстро. А вот проблему с тем, как угадать с моментом запуска, раньше решали просто — независимо от состояния файла, данные из него импортировались раз в 15 минут. Теперь же нашёл весьма изящное решение — incrontab, демон, работающий аналогично cron, но срабатывающий по событиям, связанным с созданием/удалением/изменением файлов и их атрибутов. Удобно и просто :)

django-cms, mptt и get_ancestors

Почему-то поисковики плохо выводят на решение проблемы с django-cms, когда, скажем, после обновления, попытка выполнить любую команду через manage.py приводит к ошибке:

File "/usr/local/lib/python2.6/dist-packages/publisher/mptt_support.py", line 142, in install_mptt
    attrs[method_name] = getattr(mptt_models, method_name)
AttributeError: 'module' object has no attribute 'get_ancestors'

Решение на самом деле простое: в django-cms есть уже встроенный модуль mptt. Но, если ставить через pip, то он устанавливает django-mptt, который естественно оказывается приоритетнее и несовместимым. Выход один: удалять django-mptt сразу после установки. Ну и использовать virtualenv, если есть необходимость в свежей версии django-mptt.

Дополнение: в django-cms версии 2.2 обещают прекратить эту порочную практику и нормально работать с django-mptt. Так-что ждём :)

Успел за трендом

Вот и я оказался среди прочих, кто завёл себе профиль на github. В качестве пробного шара выложил туда модуль доставки ЕМС России для Satchmo (интернет-магазин на Django). Модуль обкатан и используется в нашем велоодежном проекте и может пригодится тем, кто смотрит в сторону python для своего магазина в сети. Всё-таки пока для России Satchmo не слишком готов.

Как я настраивал gitweb

Методом проб и ошибок, наконец разобрался как настроить себе на одном домене gitweb и доступ к репозиториям через HTTP. Ошибкой было то, что я считал, что достаточно одного gitweb а на деле оказалось ещё и небольшое шаманство с Апачем. За основу взята инструкция с хабрахабр.

  • Первым делом установил сами пакеты:
    aptitude install git-core gitweb
    
  • Создал каталоги для репозиториев и веб-доступа:
    mkdir -p /web/git.domain.tld/{htdocs,logs} /web/git.domain.tld/htdocs/git
    
  • Активируем модули DAV в Апаче, для доступа с помощью git:
    a2enmod dav
    a2enmod dav_fs
    a2enmod rewrite
    a2enmod env
    
  • Создаем конфигурацию gitweb:
    vim /web/git.domain.tld/gitweb.conf
    

    Например:

    # адрес репозиториев
    $my_uri = "http://git.domain.tld";
    # название сайта, отображается в заголовке
    $site_name = "git.domain.tld";
    # путь к репозиториям git на жёстком диске
    $projectroot = "/web/git.domain.tld/htdocs/git/";
    
    $git_temp = "/tmp";
    # ссылка на «домашнюю страничку»
    $home_link = $my_uri;
    # текст, можно расскоментировать и вставить свой
    # $home_text = "indextext.html";
    $projects_list = $projectroot;
    $stylesheet = "/gitweb/gitweb.css";
    $logo = "/gitweb/git-logo.png";
    $favicon = "/gitweb/git-favicon.png";
    $projects_list_description_width = 40;
    
    $feature{'pathinfo'}{'default'} = [1];
    
  • И на закуску самое вкусное — настройки Апача:
    <VirtualHost *:80>
            ServerName git.domain.tld
            ServerSignature Off
    
            ServerAdmin admin@git.domain.tld
    
            DocumentRoot /web/git.domain.tld/htdocs/
            ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/
    
            SetEnv GITWEB_CONFIG /web/git.domain.tld/gitweb.conf
            Alias /gitweb /usr/share/gitweb/
    
            RewriteEngine on
            RewriteRule ^/([a-zA-Z0-9_\-]+\.git.*)$ /cgi-bin/gitweb.cgi/$1 [L,PT]
    
            <Directory /web/git.domain.tld/htdocs>
                    Options Indexes FollowSymLinks ExecCGI
                    AllowOverride None
                    Order allow,deny
                    allow from all
            </Directory>
    
            <Location /git>
                    DAV on
                    <LimitExcept GET HEAD PROPFIND OPTIONS REPORT>
                            Require valid-user
                    </LimitExcept>
            </Location>
    
            ErrorLog /var/log/apache2/error.log
    
            <Location />
                    DirectoryIndex /cgi-bin/gitweb.cgi
    
                    AuthType Basic
                    AuthName "Version Control Server"
                    AuthUserFile /web/git.domain.tld/htusers
                    Require valid-user
            </Location>
    </VirtualHost>
    

Остается только завести пользователей в web/git.domain.tld/htusers и создавать репозитории в /web/git.domain.tld/htdocs/git. Например, создав myrepo.git (с опцией --bare) мы увидим его в списке проектов, зайдя браузером на git.domain.tld, а чтобы работать с ним через git надо будет использовать url http://git.domain.tld/git/myrepo.git/,

Настройка админской панели в django

Интересная заметка на habrahabr про то как минимальными усилиями сделать из обычной админской панели django красивый и удобный интерфейс.