28 окт. 2009 г.

Django: AutoComplete widget.

Год назад я писал о виджете авто дополнения ввода. Тогда я везде старался использовать YUI. Сегодня столкнулся с необходимостью снова прикручивать подобный виджет, но использовать YUI ещё раз мне ужасно не хочется. Нужно будет тащить за ним несколько js файлов, в которых я мало что понимаю (dependency configurator особо не добавляет понимания), кроме того, наверняка есть другие более изящные решения.

Ну во-первых, на djangosnippets.org есть примеры jQuery Autocomplete и YUI Autocomplete (о котором я ничего не знал, когда писал свой вариант), есть и другие: http://www.djangosnippets.org/tags/autocomplete/.

Во-вторых, есть wiki-страница на djangoproject.com AutoCompleteSolutions, на которой перечислено несколько решений данной проблемы. Особо радует дата появления последней ссылки - 2009-09-15. Здесь же есть ссылка на первый YUI-Django-AutoComplete 2006 года (я тогда про django в принципе ничего не слышал).

После просмотра большей части вариантов я остановился на http://bitbucket.org/tyrion/django-autocomplete/, так как виджет в данном случае останется сторонним приложением, которому не нужно будет прописывать отдельные view для получения каждой новой порции данных. Здесь используются конструкции вида:


...

from autocomplete.views import autocomplete





autocomplete.register('user', User.objects.all(), ('username''email'), 5)

autocomplete.register('name', User.objects.all(), ('username',), 5'username''username')



urlpatterns = patterns('',

    url('^autocomplete/(\w+)/$', autocomplete, name='autocomplete'),

    ...


Ещё плюс – в media папке приложения есть jquery и YUI, что как бы намекает на возможность использования и того и другого – мелочь, но приятно (вдруг решу что-то поменять в старых проектах).

По тем же критериям (кроме поддержки YUI), но более новый вариант решения http://code.google.com/p/django-autocomplete/.

27 окт. 2009 г.

Базовый инстинкт Иоанна Охлобыстина

Считаю своим моральным долгом поделиться ссылкой на статью “Базовый инстинкт” на сайте русской недели автора священника Иоанна Охлобыстина.

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

Напишу только, что с автором согласен, но практиковать подобные методы не пробовал. Мне мир, очевидно в виду бОльшей удаленности от Москвы, кажется дружелюбным. Но сына своего я на улице одно оставлять боюсь. Особенно, после того, как один не благополучный подросток ни за что, ни про что отлупил его во дворе нашего дома ногами по лицу, на глазах у многих соседей. Серьезных последствий у данного инцидента не было. Причем не только для сына, но и для подростка, на которого мы заявили в милицию.

LinkExchange и Django

Наверняка, баян, но не поделиться не могу – слишком уж вещь хорошая.

Итак, LinkExchange - инструмент для встраивания кода бирж обмена ссылками в сайты написанные с применением python’a. Главная ссылка на wiki данного инструмента http://linkexchange.org.ua/.

Имеется поддержка любимой django - http://linkexchange.org.ua/wiki/LinkExchangeИDjango, а также MoinMoin, Trac, TurboGears.

Подключается к django проекту, как  и другие хорошие pluggable-приложения, в 3 шага:

  1. Добавляем 'django.core.context_processors.request' в TEMPLATE_CONTEXT_PROCESSORS.
  2. Создаем файл linkexchange.cfg, делаем на него ссылку из settings.py
  3. Вставляем в шаблоны переменную linkexchange_blocks.

Можно ставить через easy_install, так как в списке пакетов на PyPI библиотека LinkExchange присутствует.

UPD. Использовал библиотеку в одном из своих проектов (поставил setuptool’ом), набрел на некоторые отступления от “3 этапного туториала”. Ниже публикую все изменения, которые пришлось внести в проект, чтоб он начал работать с sape библиотекой linkexchange:


# settings.py:



INSTALLED_APPS = (

    ...

    'linkexchange.django',

)



TEMPLATE_CONTEXT_PROCESSORS = (

    ...

    'django.core.context_processors.request',

    'linkexchange.django.context_processors.linkexchange',

)



LINKEXCHANGE_CONFIG = join(working_dir, 'linkexchange.cfg'# working_dir = os.path.dirname(__file__)









# linkexchange.cfg:



[options]

host = f.labwr.ru



[client-1]

type = sape

user = идмоегоюзерабезкавычек

db_driver.type = shelve

db_driver.filename = полныйпутьдокаталогапроекта/linksdb/linkexchange.db



[formatter-1]

type = list

count = 2

class_ = linx

prefix = "- "

suffix = ". "



[formatter-2]

type = inline

count = 2

class_ = linx

delimiter = " | "

prolog = "| "

epilog = " |"



[formatter-3]

type = list

count = none

class_ = linx

prefix = "+ "

suffix = ". "









# templates/base.html:



{% load linkexchange_tags %}

{{ linkexchange_blocks }}


У каталога linksdb выставлены разрешения на запись всем и владелец под которым работает apache - таким образом я решал проблему с блокировкой файла, но наверняка есть более правильный способ.

26 окт. 2009 г.

Вышла Satchmo 0.9

25-го октября (то есть вчера) вышла 0.9 версия Satchmo. Если кто не в курсе, Satchmo – это платформа для создания интернет магазина. Написана на джанго с применением огромного количества сторонних и собственных (для разработчиков) приложении.

“Большая” – не подходить для описания Satchmo, надо писать монстроузная система. Прошлый раз при попытке установить Satchmo я несколько часов убил только на то, чтоб собрать все зависимости, после чего она так и не заработала как нужно.

Наверное, теперь все изменилось, по крайней мере я на это надеюсь. Если у Вас сложилось впечатление о Satchmo, похожее на мое смотрите в сторону django-LFS.

Новое в Satchmo 0.9 - http://www.satchmoproject.com/docs/svn/release-notes-0-9.html - среди прочего включает

  • Improvement to the installation process to make it simpler

- ну-ну. Надеюсь, так оно и есть…

UPD: Кстати, на странице документации по быстрому старту, действительно, есть описание сборки с помощью pip, так что, наверное, скоро тролли в комментариях начнут заставлять меня извинятся.

Тест Лайтмана

На torrents.ru в ленте обсуждения сериала Lie To Me есть ссылка на тест Лайтмана на сайте fox: http://www.fox.com/lietome/lightmantests/.

Посмотреть самому пока не удалось – флэш плагин в Chrome виснет. В последнее время в хроме вообще как-то все не стабильно, но это похоже, только у меня – раздраконненная временем виста берет свое (требует больше внимания чем положено).

23 окт. 2009 г.

Block REQUEST_URI adresses

Вчера некто пытался подобрать адрес к phpmyadmin (а затем бы и пароль), видимо, на одном из моих сайтов.

Работал с 2 IP адресов, видимо, какой-то программой, так как за 1 минуту перебрал 26 предполагаемых URI.

Придется как-то реагировать на это событие. Как вариант заблокировать оба адреса. Ну для этого, видимо можно использовать снипет http://www.djangosnippets.org/snippets/744/ или настройку BANNED_IPS в самой django.

Можно ещё избавиться от трейсбэков по поводу не существующей страницы немного переработав указанный ранее снипет:


from django.conf import settings

from django import http



class BlockedUriMiddleware(object):



    def process_request(self, request):

        if request.META['REQUEST_URI'] in settings.BLOCKED_URIS:

            return http.HttpResponseForbidden('<h1>Forbidden</h1>')

        return None



# in settings.py:



MIDDLEWARE_CLASSES = (

    ...

    "myapp_with_middleware_module.BlockedUriMiddleware",

)



BLOCKED_URIS = (

    '/phpmyadmin/index.php',

    '/phpMyAdmin/index.php',

    '/PMA/index.php',

    '/pma/index.php',

    '/dbadmin/index.php',

    '/mysql/index.php',

    ...

)


Кстати в тест-сервере (это тот, что по runserver запускается) нет никакого REQUEST_URI, так что работать не будет – подробнее тут http://groups.google.com/group/django-users/browse_thread/thread/3261e7ece9ff3b33.

UPD: А можно ещё внимательней почитать документацию и обнаружить для себя два параметра настройки: IGNORABLE_404_ENDS и IGNORABLE_404_STARTS.

Со вторым, вместо BLOCKED_URIS можно написать IGNORABLE_404_STARTS со следующим контентом:


IGNORABLE_404_STARTS = (

    '/cgi-bin/'

    '/_vti_bin'

    '/_vti_inf'



    '/php',

    '/PMA',

    '/pma',

    '/dbadmin',

    '/mysql',

    '/myadmin',

    '/sql',

    '/p/m/a/',

    '/web',

    '/Tools',

    '/index.php',

    '/wp-login',

)


Первые три лежат в настройке по умолчанию.

22 окт. 2009 г.

TEMPLATE_CONTEXT_PROCESSORS наследование шаблонов для нескольких сайтов

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

У меня есть сетка сайтов одной и той же фирмы с разным дизайном, но примерно одинаковым контентом. Для каждого сайта есть базовый шаблон base.html в котором прописаны стили, индивидуальная верстка, общие блоки и пр.

В общем решаю проблему так: есть функция, генерирующая общие для всех сайтов переменные:


def listing_and_path(request):

    ...

    rhost = request.get_host().strip('w.')

    ...

    try:

        profile = SiteProfile.objects.get(site__domain=rhost)

    except:

        profile = False

    base_tamplate = u'%s/base.html'%rhost

    return {

            'pages': Page.objects.filter(sites__domain=rhost, state='published').order_by('position'),

             ...

            'profile': profile,

            'base_tamplate':base_tamplate,

    }


Как и все приличные контекстные процессоры, данная функция подключена в settings.py:


TEMPLATE_CONTEXT_PROCESSORS = (

    "django.core.context_processors.auth",

    "django.core.context_processors.debug",

    "django.core.context_processors.i18n",

    "django.core.context_processors.media",

    "django.core.context_processors.request",

    "realtor.views.listing_and_path",

)


В шаблоне наследнике или в общем шаблоне используется конструкция вида:


{% extends base_template %}


Вещи, вроде бы, очевидные, но у меня до недавнего времени были полные копии веток шаблонов, в которых отличались только


{% extends '72arenda.ru/base.thml' %}



# или 



{% extends 'realtor-tyumen.ru/base.thml' %}


- что, как вы понимаете, клиника.

Pygments в Windows Live Writer для подсветки кода

Заметили, наверное, что в моем блоге начали чаще появляться куски кода? Это связано с тем, что выглядят они теперь лучше, а все благодаря плагину Pygments for WL Writer, который можно взять тут:

http://cid-0d9bc809858885a4.skydrive.live.com/browse.aspx/DevHawk%20Content/Pygments%20for%20WL%20Writer

Django blog – обзор pluggable приложений для создания блога на django

Не помню кто, но кто-то точно :), утверждал, что джанго - платформа для создания собственного блога. Пишу на джанго уже 2 года, а про блоги на ней (на нем?) задумался только сейчас. Мой блог на blogger’е и это дает определенные преимущества в скорости индексации и pr блога.

Естественно, у платформы “специально для блогов” должно быть куча готовых решений. В принципе так и есть, но на все у меня, как всегда, не хватит ни сил, ни терпения, поэтому в обзор войдет только те, которые обновлялись не поздней чем месяц назад.

Итак, 3 pluggable приложения на django для создания блога:

UPD: честно признаюсь, я забыл про byteflow напрочь, когда садился это писать. Только по этому byteflow и нет в данном посте, но думаю, про него итак достаточно написано.

Смотрю на каждое из приложений впервые, потому претендовать на абсолютную достоверность обзора не планирую. Как всегда, обзор будет более эмоционален и субъективен, чем нужно :). Комментарии приветствуются. Дельных комментаторов буду поощрять ссылкой с 10 своих сайтов на их ресурс (кому не нужны 10 обратных ссылок?).

django-diario

Не смотря на растущую популярность github’а хоститься на code.google.com - http://code.google.com/p/django-diario/. Актуальная версия (на момент написания) - 0.2, выпущенная 13th December 2008, но кому нужен релиз? Берем транк, который обновлялся 20 октября 2009 (опять же на момент написания - далее нмн). И сразу первая радость – в репозитории рядом с приложением лежит каталог examples, а в нем basic_blog.

Идем в каталог с basic_blog примером, запускаем


manage.py syncdb


Запускаем тестовый сервер, радуемся.

image

Скрин 1 – главная страница basic_blog’а

image

Скрин 2 – Админка basic_blog’а

Идем в пункт админки Entries и добавляем новый пост – ссылка Add entry.

image

Скрин 3 – Пункт админки “Создание нового поста” в basic_blog’а

Не густо. Одна надежда на пунктик “Advanced options”, который по умолчанию свернут. Жмем.

image

Скрин 4 – Подпункт “Advanced options” в пункте админки “Создание нового поста” в basic_blog’а, в доме который построил Джек.

Оказывается, тут скрывалась опция разметки для поста. Кстати наличие тут textile, например, не связано с наличием  Python textile library у вас на компе. Теперь, кстати есть смысл ещё раз посмотреть на пункт админки “Entries”.

image

Скрин 5 – Пункт админки Entries в basic_blog’а

Комментарии излишни.

Главная страница блога теперь выглядит так:

image

Скрин 6 – снова главная страница в basic_blog’а, но теперь на ней есть пост.

Главная страница пока мало отличается от Weblog (ссылка вверху страницы) и страницы самого поста.

Так как я в принципе не владею ни одной из данных разметок (кроме HTML, который и есть Raw text в соответствии с подсказкой к полю Markup language), текст у меня получился без абзацев.

Придется лезть в документацию и исходники, т.к. увиденное не впечатляет. Из документации выясняется, что diary распространяется под LGPLv3 и сопровождена весьма не плохо документацией. Например, в файле install.txt описан процесс подключения RSS-фидов.

В urls.py нужно добавить:


    from diario.feeds.entries import RssEntriesFeed, AtomEntriesFeed

  

    entries_feeds = {

        'rss': RssEntriesFeed,

        'atom': AtomEntriesFeed,

    }



    urlpatterns = patterns(

        ...

        (r'^blog/(?P<url>(rss|atom))/$''django.contrib.syndication.views.feed', {'feed_dict': entries_feeds}),

    )


Попробуем. Идем в urls.py и обнаруживаем, что оно уже подключено!

image

Скрин 7 – RSS-фид basic_blog’а.

Ну тогда попробуем подключить фичу с тэгами в блоге (тоже описана в install.txt). Идем в urls.py и добавляем


    (r'^weblog/tag/', include('diario.urls.tagged'))


а заодно и подсмотренная чуть позже


    (r'^weblog/tag/(?P<url>.*)/$''django.contrib.syndication.views.feed', {'feed_dict': entries_by_tag_feeds}),


- дял рсс фидов по тэгам. Строки


entries_by_tag_feeds = {

    'rss': RssEntriesByTagFeed,

    'atom': AtomEntriesByTagFeed,

}


уже почему-то добавлены. Ах да, в basic_blog’е в настройках не подключено приложение 'tagging' (пункт INSTALLED_APPS), а потому придется после его подключения пересоздать базу. Почле чего, ниже поля Body в редактировании поста (в админке) появиться поле Tags.

После произведенных манипуляций должна заработать возможность отбора записей по тэгам и генерация рсс фидов по тэгаи, правда перед этим вам ещё нужно создать шаблон entry_list_tagged.html – лично я на этом спекся (итак ясно, что получится, так зачем время тратить).

Процесс подключения комментарием очень похож на процесс подключения тэгов.

  1. Добавляем ‘django.contrib.comments’ в INSTALLED_APPS
  2. Добавляем в url.py

    from diario.feeds.comments import RssCommentsFeed as RssWeblogCommentsFeed

    from diario.feeds.comments import AtomCommentsFeed as AtomWeblogCommentsFeed



    blog_comments_feeds = {

        'rss': RssWeblogCommentsFeed,

        'atom': AtomWeblogCommentsFeed,

    }



    urlpatterns = patterns(

        ...

        (r'^blog/comments/(?P<url>(rss|atom))/$''django.contrib.syndication.views.feed', {'feed_dict': blog_comments_feeds}),

    )


И наслаждаемся, если конечно не придется создавать шаблоны и пересоздавать базу :).

Так как diario использует django.contrib.sitemaps приводить тут процесс добавления карты сайта не уместно, пост все-таки не про контриб sitemaps.

Заключение

django-diario – прекрасная основа дял создания собственного блога. Берешь, изменяешь, добавляешь свое и радуешься жизни – минимум геморроя, максимум фана. При том, для моей задачи, к сожалению не подходит – мне нужно много пользователей во множестве блогов. Можно конечно, добавить профиль пользователю, а в админке фильтровать queryset по признаку “владелец блога”, но спрева хочется взглянуть на прочих кандидатов в блог-приложение-моего-сердца.

 

blogmaker

Тоже игнорирует моду и хостится на code.google.com - http://code.google.com/p/blogmaker/. На главной wiki-странице проекта пугающая надпись про совместимость с Django 0.96. Актуальная версия 0.6 (нмн). И первый неприятный сюрприз (не был бы сюрпризом, если б я был повнимательней) – последнее сообщение об ошибке датирется 6 августа 2009 (нмн), а транк менялся последний раз 10 января 2008. Если не ошибаюсь, то djnago 1.0 вышла в марте 2008, значит blogmaker об этом ничего не знает – жаль.

Заключение

Минус одын.

django-basic-apps.blog

Актуальная версия basic-apps- 0.6, но всем наплевать, так как хостится проект на модном github’е, а значит можно легко и просто забрать архив последней ревизией. Что мы и делаем.

Далее нужно установить basic-apps (setup.py install), создать новый проект, например “basicappsblog” и внести в код следующие изменения (опять же, не настаиваю на полном соответствии):


# settings.py

DATABASE_ENGINE = 'sqlite3'

DATABASE_NAME = 'database.db'



...



# Можно временно, для тестирования, подключить шаблоны прям из пакета

TEMPLATE_DIRS = (

    'C:/projects/not mine/django-basic-apps/basic/blog/templates'



...



INSTALLED_APPS = (

    ...

    'django.contrib.admin',

    'django.contrib.comments',

    'basic.blog',

    'basic.inlines',

    'tagging',

    'django.contrib.markup'

)



# urls.py:

...

from django.contrib import admin

admin.autodiscover()



urlpatterns = patterns('',

    (r'^blog/',     include('basic.blog.urls')), 

    (r'^admin/', include(admin.site.urls)),

)


Далее делаем syncdb и можно смотреть что получилось:

image

Скрин 8 – Админка django-basic-apps.blog

image image

Скрин 9 – Добавление поста django-basic-apps.blog

Теперь главная страница блога выглядит так:

image Скрин 10 – главная страница блога django-basic-apps.blog

Страница поста открываться отказывалась, пока я не прописал в шаблоне django-basic-apps\basic\blog\templates\blog

{% load markup %}

Однако, после добавления оной заработали комменты:

image

Скрин 11 – страница комментирования поста в блоге django-basic-apps.blog

Заключение

Честно говоря, на данном этапе продолжать изучать django-basic-apps.blog уже не хочется, слишком уж сильно он завязан на остальных basic-apps, а удовольствие от его использования получить можно только в том случае, если использовать его как компонент pinax’а. Писать про pinax хочется ещё меньше, так как это отдельная большая задача.

 

Полезные ссылки:

  1. Серия статей о создании блога Ross’а Poulton’а: часть 1, часть 2, часть 3.
  2. Patrick Altman I Want To Move My Blog To Django – перечисление сторонних pluggble приложений для создания блога на django.

20 окт. 2009 г.

Хронометрия

Глеб Архангельский советует заниматься этим почаще.

Вечером 11 октября 2009 года я поставил себе программу ManicTime, которая помогает собрать сведения о том, чем же я бываю занят сидя за компом (фактически все время пока бодрствую).

Так вот, выяснилось, что комп был включен почти 66 часов, причем меня за ним не присутствовало (?!) почти 12 часов (после 10 минут отсутствия активных действий со стороны пользователя комп. считается не используемым).

Программировал я, сидя в Komodo Edit, с тех пор 11 с небольшим часов, а вот в браузере я провел 33 часа (!!!). Почти 5 часов в pidgin’е и полтора часа в консоли.

На написание бездарных постов в блог я потратил 20 минут :).

 

Вот так-то, можно теперь смело удалять эту прогу – про себя я почти все знаю.

19 окт. 2009 г.

Центр иностранных языков “Весь мир” на django-cms 2

Вчера был опубликован мой djangp-cms 2 сайт на сайте http://www.django-cms.org/ - http://www.django-cms.org/en/sites/the-whole-world/detail/. Примечательно и удивительно что руководство сайта самостоятельно перевели название сайта (я отсылал русскоязычный вариант).

Это второй сайт, который я отсылаю в публичные джанго-сайто-агрегаторы (о как!). Первый - http://www.djangosites.org/s/animals-ecougra-ru/.

18 окт. 2009 г.

Подмена понятий в новостях нефтегаза

Для начала ссылка: http://old.tsogu.ru/Newsitems/University/Headline.2009-10-16.2109.

“На встрече с первокурсниками в этом году не поднимались проблемы благоустройства, а значит с этим все в порядке.”

Фразу успешно можно заменить на:

“На встрече врачей-педиаторов не поднималась проблема старческого склероза, а значит проблему старческого склероза удалось полностью решить.”

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

Если первокурсники не задают вопросы о трудоустройстве это может значить только одно – для них этот вопрос решен. Как? Видимо, у многие готовые контракты на обучение с последующим трудоустройством, или они отчаялись работать по специальности ещё до поступления. Любой другой студент, с не решенной проблемой трудоустройства этот вопрос бы задал. Или найдутся несогласные?

13 окт. 2009 г.

Django schedule

Всем, кто по какой-то непостижимой причине до сих пор не в курсе, срочно смотреть http://github.com/thauber/django-schedule и демку тут: http://www.geburt-und-leben.com/calendar/.

Аппликуха просто классная. Нужна, естественно, для создания всяких-там календарей и пр. Умеет очень многое. Сейчас, например, я разбираюсь с интервалами повторения.

8 окт. 2009 г.

Django CMS 2.0 – божественно

Поставил и использую django cms 2.0. Кайф. прям из коробки она умеет большую часть того, что нужно простой и удобной CMS.

Приятней всего для меня была возможность использования placeholder’ов. Суть в настройках прописываете “места размещения” кусков контента на страницах, прописываете их же в шаблоне (которые тоже можно выбирать для каждой страницы) и наслаждаетесь возможностью подставлять в страницу разные плагины (текст, видео, ссылка и пр.). Естественно, плагинов может быть несколько в одном плейсхолдере.

Про многосайтовость и разделение прав на уровне пользователей/групп/ролей я вообще молчу. Экземпляр django-cms 2 скоро буду использовать для всех своих поделок в Concepter’е

В общем, очень хочется написать об этой ЦМС по больше, но не знаю чего именно. Давайте так, пишите в комменты вопросы по ЦМСке, а я буду на них отвечать и апдейтить статью. Каждый 10 комментарий получит денежное вознаграждение по webmoney.

UPD1. Django-CMS 2.0, на сколько мне известно, форк с django-cms. Удивительный факт: форк этот - не единственный, и далеко не последний. feincms– новая CMS, использующая все теже требования, что и предыдущие 2. Лично я, не осилил понять как и зачем работать Feincms… Про сравнение разных django CMS я уже писал

UPD2. Конфиг-файл:


# -*- coding: utf8 -*-

import os

PROJECT_DIR= os.path.abspath(os.path.dirname(__file__))



DEBUG = True

TEMPLATE_DEBUG = DEBUG



ADMINS = (

    ('Ivan Markeyev''markeyev@concepter.ru'),

)



MANAGERS = ADMINS



TEST_DATABASE_CHARSET = "utf8"

TEST_DATABASE_COLLATION = "utf8_general_ci"

DATABASE_SUPPORTS_TRANSACTIONS = True

TIME_ZONE = 'Asia/Yekaterinburg'

SITE_ID = 1

USE_I18N = True

MEDIA_ROOT = os.path.join(PROJECT_DIR, 'media')

#ADMIN_MEDIA_ROOT = os.path.join(PROJECT_DIR, '../admin_media/')

MEDIA_URL = '/media/'

ADMIN_MEDIA_PREFIX = '/adminmedia/'

FIXTURE_DIRS = [os.path.join(PROJECT_DIR, 'fixtures')]

SECRET_KEY = '+++'

TEMPLATE_LOADERS = (

    'django.template.loaders.filesystem.load_template_source',

    'django.template.loaders.app_directories.load_template_source',

#     'django.template.loaders.eggs.load_template_source',

)



TEMPLATE_CONTEXT_PROCESSORS = (

    "django.core.context_processors.auth",

    "django.core.context_processors.i18n",

    "django.core.context_processors.debug",

    "django.core.context_processors.request",

    "django.core.context_processors.media",

    "cms.context_processors.media",

)



INTERNAL_IPS = ('127.0.0.1',)



MIDDLEWARE_CLASSES = (

    'django.contrib.sessions.middleware.SessionMiddleware',

    'django.middleware.locale.LocaleMiddleware',

    'django.middleware.common.CommonMiddleware',

    'django.contrib.auth.middleware.AuthenticationMiddleware',

    'django.middleware.doc.XViewMiddleware',



    #'django.contrib.csrf.middleware.CsrfMiddleware',

    'cms.middleware.user.CurrentUserMiddleware',

    'cms.middleware.page.CurrentPageMiddleware',

    'cms.middleware.multilingual.MultilingualURLMiddleware',

    #'debug_toolbar.middleware.DebugToolbarMiddleware',

    

)



ROOT_URLCONF = 'urls'



TEMPLATE_DIRS = (

    os.path.join(PROJECT_DIR, 'templates'),

)

LOCALE_PATHS = (

    os.path.join(PROJECT_DIR, 'i18n''locale'),

)

INSTALLED_APPS = (

    'django.contrib.auth',

    'django.contrib.contenttypes',

    'django.contrib.sessions',

    'django.contrib.admin',

    'django.contrib.sites',

    'tagging',



    'django.contrib.sitemaps',



    'cms',

    'publisher',



    'cms.plugins.text',

    'cms.plugins.picture',

    'cms.plugins.file',

    'cms.plugins.flash',

    'cms.plugins.link',

    'cms.plugins.snippet',

    'cms.plugins.googlemap',

    'cms.plugins.teaser',

    'cms.plugins.video',

    'cms.plugins.twitter',

    'mptt',

    'reversion',

    #'example.categories',

    #'debug_toolbar',

    'south',

    # sample application

    'sampleapp',

    #'store',

    'rosetta',

)



LANGUAGE_CODE = "ru"



gettext = lambda s: s



LANGUAGES = (

    ('ru', gettext('Russian')),

#    ('fr', gettext('French')),

#    ('de', gettext('German')),

    ('en', gettext('English')),

#    ('pt-br', gettext("Brazil")),

)



CMS_LANGUAGE_CONF = {

    'ru':['en'],

    'en':['ru'],

}



CMS_TEMPLATES = (

    ('index.html', gettext('default')),

    ('nice.html', gettext('nice one')),

    ('cool.html', gettext('cool one')),

    ('long-folder-long/long-template-name.html', gettext('long')),

    

)



CMS_SOFTROOT = True

CMS_MODERATOR = True

CMS_PERMISSION = True

CMS_REDIRECTS = True

CMS_SEO_FIELDS = True

CMS_MENU_TITLE_OVERWRITE = True

CMS_HIDE_UNTRANSLATED = True





try:

    from local_settings import *

except ImportError:

    pass


6 окт. 2009 г.

DMS часть 6: DocVision, LanDocs и Directum

DocVision

Live-demo пытается поставить activeX компонент. Причем, на моем IE 8 ему не удается это сделать…

Вообще, activeX – самое неприятное в данном продукте. Грузится он очень долго, ставится и того дольше. Я уже 30 минут пытаюсь посмотреть дему…

LanDocs

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

http://www.landocs.ru/system/cost/index.php#smb

Хотя, возможно, это и не много…

Directum

Лучше многих прочих подготовлен к быстрому ознакомлению. На сайте есть ролики “Демонстрация работы с системой DIRECTUM”: http://www.directum.ru/304378.shtml.

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

Цена для 20 рабочих мест и сервера (версия lite) порядка 70 т.р.

image

DMS часть 5: KnowledgeTree

Лого почему то сильно походе на Komodo’вское. Видимо, они как-то связаны (надо будет выяснить как?).

Live-demo на 5 языках English, Deutsch, French, Italiano, Japanese. Русского нет, что, к сожалению, сразу ставит крест на этом продукте.

К данной DMS есть плагин для быстрого добавления документов из Microsoft Office 2007. С помощью этого плагина можно сразу при добавлении накидать основную мета-информацию.

image

image

Вот например страница word-овского документа. Можно посмотрть мета-информацию, а сам документ придется качать:

image

DMS часть 4: NauDoc

Сайт: http://www.naudoc.ru/.

В википедии данная DMS представлена в графе “Бесплатные СЭД”.

С сайта:

Система электронного документооборота NauDoc - простое и удобное решение для автоматизации бизнес-процессов и электронного документооборота для средних и малых предприятий.

Открытый код, независимость от платформы и полноценный веб-интерфейс позволяют быстро и без лишних затрат интегрировать систему в уже существующую IT-инфраструктуру предприятия. Бесплатная версия NauDoc Free позволит минимизировать финансовые риски при внедрении СЭД. Бесплатное дистанционное обучение по электронному документообороту позволит легко и без затрат обучить персонал работе с системой.

    • низкая стоимость приобретения и внедрения системы

    • бесплатная версия NauDoc Free с открытым кодом

    • бесплатное дистанционное обучение пользователей
    • полноценный web-интерфейс

    • независимость от платформы (Windows, UNIX)

    • отсутствие затрат на дополнительные компоненты

    • значительный опыт реализованных проектов (более 200 внедрений СЭД)

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

    Система электронного документооборота NauDoc оптимальным образом подходит для автоматизации канцелярского документооборота предприятий среднего и малого бизнеса, управляющих компаний, проектных организаций, подразделений холдинговых структур, а также для решения конкретных задач по автоматизации документооборота, встающих перед подразделениями больших компаний (обеспечение работы с нормативной документацией в соответствие с требованиями ISO 9001:2000, взаимодействие между сотрудниками и службой персонала и др.).

    Ну что же, бесплатная версия действительно есть. Правда, в нее не входят:

    • Модуль "Журналы регистрации"
    • Модуль "Справочники"
    • Модуль "Оргструктура"
    • Модуль "Отчеты"
    • Конфигурация “ автоматизация делопроизводства ”
    • Модуль "Расширенное администрирование"
    • Модуль "Корпоративный портал"
    • Модуль "Tray Agent"
      Модуль "Планировщик"
    • Модуль "LDAP"
    • Модуль "ЭЦП"
    • Модуль "Графическое отображение процессов"
    • Модуль "СМК"

    Весь перечень представленных модулей входит только в NauDoc Pro Business.

    Подробное сравнение версии продукта: http://www.naudoc.ru/solutions/compare/.

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

    О нет, один из компонентов системы называется ZopeExternalEditor. Неужели оно написано на Zope? * Ну хоть на python’е – это несомненный плюс.

    Даже бесплатная версия сопровождается приличной документацией.

    Из описания продукта:

    Полнотекстовый поиск
    В NauDoc реализован расширенный поиск по ключевым словам. Поиск производится в реквизитах и содержании документов, а также во вложенных файлах следующих форматов doc, xls, pdf, rtf, ppt, html.

    Полнотекстовый поиск в данном случае сделан продуктом TextIndexNG2. С таким же успехом можно сделать полнотекстовый поиск по документам Plone.

    После установки и запуска процесса, заходим по адресу http://localhost:8080/docs, вводим admin/admin и видим:

    image

    Итог: DMS мне очень понравилась, т.к. состоит из Zope и нескольких продуктов для него, разобраться в которых (учитывая многолетний опыт работы с Plone будет не сложно).

    С ребятами из наумен я даже лично встречался, когда нефтегаз размышлял о покупной автоматизации. Они приезжали к нам, и у меня была возможность поболтать с ними. Так вот,  самое яркое впечатление от той встречи – рассказ одного из их менеджеров о том, что у их клиентов бывают Plone-сайты с базами по 50-100 Гб. Как они поддерживают этот зоопарк? - лично мне не ясно, но ясно что тех поддержка там вполне профессиональна.

    Google Blogger публикации в прок.

    Ура товарищи! Совершенно случайно обнаружил сегодня, что в blogger появилась возможность публикации записей впрок, т.е. с указанием ещё не наступившей даты.

    Раньше такие записи отображались на странице, ломая мозг посетителям…

    DMS часть 3: Globodox 5

    В отличии от предыдущих, эту DMS стараются продавать. Это хорошо заметно по tutorial’ам (который хоть и записаны с помощью автоматической говорилки, но смотрятся отлично. пример - http://www.itaz.com/globodox/tutorials/folder.htm).

    Цены это монстра: $399.00 баков за 1 одну лицензию.

    Похоже, что основным недостатком этой DMS будет её язык – он очень английский.

    Хоть выглядит он вполне прилично, но большую часть своего времени я лучше потрачу на что0нмбудь другое…

    DMS часть 2: GalaxyDMS

    Ну во первых, цена данного продукта всего 1695 EUR за неограниченной кол-во пользователей. Есть бесплатная ознакомительная версия, которая перестает работать через 45 дней. Чтоб заставить работать эту DMS нужен Microsoft SQL Server 2005/2008 (добавляем к цене решения тысячу долларов).

    Однако, я попытался обойтись бесплатной версией SQL Server (SQL Server 2005 Express) – не вышло.

    В общем, я так и не осилил установку этой DMS. Печально.

    DMS часть 1: OpenDocMan

    Ищу для конторы приличную DMS. Первой гугл предложил OpenDocMan (http://www.opendocman.com/), хотя последняя новость на их сайте от 27.02.2008.

    OpenDocMan – свободная система документооборота (GPL license), преимущества которой:

    Ну теперь собственно, к тому, почему мы не будем использовать эту систему:

    1. На сайте не работает live-demo.
    2. OpenDocMan написан на PHP (я не люблю PHP, потому что не знаю)

    Мне хотелось бы написать ещё про эту DMS, но информацию брать неоткуда – на сайте производителя все сдохло и воняет.

    UPD: Странно, но эту DMS продолжают качать: http://sourceforge.net/project/stats/?group_id=69505&ugn=opendocman&type=&mode=alltime, а вот разработчики перестали ей заниматься где-то в районе октября 2008-го.