IntIds не регистрирует объекты.

0 views
Skip to first unread message

Cykooz

unread,
Oct 1, 2008, 12:44:57 AM10/1/08
to Russian Zope3 group
Есть у меня код под Zope3, который создаёт контейнер для сайта,
создаёт и регистрирует в нём необходимые для сайта утилиты.
В первую очередь создаётся и регистрируется IntIds.
Затем создаю другие необходимые утилиты. Все операции создания и
добавления завершаю отправкой событий (event) примерно вот так:

....
from zope.app.container.contained import ObjectAddedEvent,
containedEvent
...
session = RAMSessionDataContainer()
notify(ObjectCreatedEvent(session))
sm['RAMSessionDataContainer'] = session
notify(ObjectAddedEvent(sm['RAMSessionDataContainer'], sm,
'RAMSessionDataContainer')

Судя по исходникам IntIds он подписывается на событие
IObjectAddedEvent и при вызове последней строчки приведённого примера
должен зарегистрировать добавленный объект. Но этого не происходит.
Пробовал заменить отправку события о добавлении объекта в контейнер на
следующий вариант.

notify(containedEvent(sm['RAMSessionDataContainer'], sm,
'RAMSessionDataContainer')[1])

но это ничего не изменило.

Если такие же утилиты добавлять потом вручную через стандартный скин
Zope3 то регистрация их в IntIds происходит без проблем. В чём
загвоздка?

PS: Создание объекта типа "Сайт" выполняется под моим скином
основанным на на Pagelet-ах, но вроде как скины не влияют на обработку
событий.

Ilshad

unread,
Oct 1, 2008, 2:29:50 AM10/1/08
to zope...@googlegroups.com
Стоит глянуть в сторону создания-добавления самой утилиты IntIds. Если ее создание идет (пусть даже первым), в один "клик" с остальными, это и есть проблема.

Я сейчас так делаю: при создании контейнера сайта - добавление IntIds и больше ничего.

Затем клик в форме для z3c.configurator чтобы все остальное добавить (заодно там формы есть, админам удобно).

Расставлять transaction.commit() в конфигураторах -  тоже надо. Но с указанной проблемой относительно IntIds это не поможет.

1 октября 2008 г. 10:44 пользователь Cykooz <cyk...@googlemail.com> написал:



--
Ilshad Habibullin
Gadoz, Inc (http://www.gadoz.com)

Yegor Shershnev

unread,
Oct 1, 2008, 2:43:41 AM10/1/08
to zope...@googlegroups.com
Приветствую.


Есть у меня код под Zope3, который создаёт контейнер для сайта,
создаёт и регистрирует в нём необходимые для сайта утилиты.

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

http://zope3.ru/produkty/rukovodstvo-po-rabote-s-produktom-installtool/

Удачи
--
Yegor Shershnev (corbeau)
+7 919 355 88 42

Cykooz

unread,
Oct 1, 2008, 5:25:26 AM10/1/08
to Russian Zope3 group
On 1 окт, 10:43, "Yegor Shershnev" <y.shersh...@gmail.com> wrote:

> Если я всё понял правильно, для выполнения этой задачи есть прекрасно
> работающий продукт ks.installtool, к которому есть хорошее русскоязычное
> пояснение.

Я его как раз в первую очередь посмотрел, но мне показалось, что этот
продукт использует свои формы для создания объектов, которые и
вызывают запуск скриптов инициализации. Я конечно детально не изучал
этот продукт, но формы создаваемые ks.installtool явно не используют
Pagelet-ы. Поэтому я решил его не использовать.
Поизучаю, что можно сделать с помощью z3c.configurator.
Хотя всётаки хотелось бы, что бы конфигурирование объектов проходило в
один клик.
В данном конкретном случае я конечно могу использовать непосредственую
регистрацию объектов в IntIds с помощью вызова его метода register.

Arvid

unread,
Oct 1, 2008, 7:03:41 AM10/1/08
to Russian Zope3 group
> session = RAMSessionDataContainer()
> notify(ObjectCreatedEvent(session))
> sm['RAMSessionDataContainer'] = session
> notify(ObjectAddedEvent(sm['RAMSessionDataContainer'], sm,
> 'RAMSessionDataContainer')

последнюю строку можно смело убрать, она лишняя. Это событие
возбуждается в zope.app.container.contained.setitem

Это мистика. Ничего придумывать не надо. Скорее всего Intid утилиты
пока нет. Проверьте регистрацию утилиты. вставьте в
zope.app.intid.__init__ трейсы.
Это скорее всего какя-то очепятка или недописка.

PS: можно и все одним кликом. тут не должно быть ровным счетом никаких
проблем. Главное - это порядок выполнения.

Cykooz

unread,
Oct 1, 2008, 9:52:03 AM10/1/08
to Russian Zope3 group
On 1 окт, 15:03, Arvid <Arv...@gmail.com> wrote:

> Это мистика. Ничего придумывать не надо. Скорее всего Intid утилиты
> пока нет. Проверьте регистрацию утилиты. вставьте в
> zope.app.intid.__init__ трейсы.
> Это скорее всего какя-то очепятка или недописка.

Вот полный код скрипта добавления сайта.

def add(self, site):
self.context[self._name] = site
notify(ObjectAddedEvent(site, self.context, self._name))
site = self.context[self._name]
# -- Установка и регистрация необходимых утилит --
sm = site.getSiteManager()
sm['IntIds'] = IntIds()
sm.registerUtility(sm['IntIds'], provided=IIntIds) # Вот тут
регистрация утилиты IntIds
sm['IntIds'].register(site)
notify(ObjectCreatedEvent(sm['IntIds']))
notify(containedEvent(sm['IntIds'], sm, 'IntIds'))
# Хранилище сессий в памяти
sm['RAMSessionDataContainer'] = RAMSessionDataContainer()
rs = sm['RAMSessionDataContainer']
sm.registerUtility(rs, provided=ISessionDataContainer,
name='RamSession')
notify(ObjectCreatedEvent(rs))
notify(containedEvent(rs, sm, 'RAMSessionDataContainer')[1])
sm['IntIds'].register(rs)

Как видно из кода сам сайт регистрируется в IntIds с помощью вызова
его метода register.
RAMSessionDataContainer я регистрирую так же, иначе он не
регистрируется сам и в результате в IntIds будет только 1
зарегистрированый объект (site).

Ilshad

unread,
Oct 1, 2008, 10:24:14 AM10/1/08
to zope...@googlegroups.com

1 октября 2008 г. 17:03 пользователь Arvid <Arv...@gmail.com> написал:


PS: можно и все одним кликом. тут не должно быть ровным счетом никаких
проблем. Главное - это порядок выполнения.
 
Я имею ввиду при использовании z3c.configurator.
 


Andrey Orlov

unread,
Oct 4, 2008, 4:32:09 PM10/4/08
to zope...@googlegroups.com
On Wednesday 01 October 2008 17:52:03 Cykooz wrote:
> On 1 окт, 15:03, Arvid <Arv...@gmail.com> wrote:
> > Это мистика. Ничего придумывать не надо. Скорее всего Intid утилиты
> > пока нет. Проверьте регистрацию утилиты. вставьте в
> > zope.app.intid.__init__ трейсы.
> > Это скорее всего какя-то очепятка или недописка.

Про добавлении intids мистика, к сожалению, есть. И даже ks.installtool от нее
не спасает, правда, в документации на него решение описано.

Итак, про мистику читаем тут:
http://eaglenest.ru/mirror/doc.orlov/Zope3/SiteManager/SiteManager.txt

Как видите, решение на само деле очень простое, сразу после создания
sitemanger надо зарегистрировать его также, как это делает траверсер. До этих
пор в ваш код не вызывает ваш SiteManager, и, соответственно, IntIds.

Об этом можно прочитать тут:
https://code.keysolutions.ru/svn/ks.installtool/trunk/src/ks/installtool/installtool_doc.txt,
приложение 1.

Впрочем фрагмент кода я процитирую, что бы долго не искали

from zope.app.component.hooks import setSite
from zope.app.component import site

def installSiteManager(context, **kw):
""" Преобразует папку контекста в сайт
"""
# Создаём локальный сайт-менеджер
sm = site.LocalSiteManager(context)
# Устанавливаем созданный менеджер сайта в контекст
context.setSiteManager(sm)
# Делаем контекст сайтом
setSite(context)
# Выполнено успешно
return "Success"

Собственно это код из реального проекта, в котором после этого много чего
отрабатывалось на основе IntIds, и делалается все одной кнопкой :).

> Вот полный код скрипта добавления сайта.

Посмотрел ваш код. Кажется это оно и есть, добавтье после

>> site = self.context[self._name]

вот это:

> > setSite(site)

--
Andrey Orlov aka "Cray", Инженер
+ 79262229963, http://eaglenest.ru

Cykooz

unread,
Oct 6, 2008, 2:59:04 AM10/6/08
to Russian Zope3 group
On 5 окт, 00:32, Andrey Orlov <c...@dreambot.ru> wrote:
> Посмотрел ваш код. Кажется это оно и есть, добавтье после
> >>    site = self.context[self._name]
>  вот это:
> > >  setSite(site)

Спасибо. Это помогло, теперь всё отлично регистрируется.
Reply all
Reply to author
Forward
0 new messages