Latest posts on BB IntIds topichttps://python.su/forum/topic/8671/2010-10-03T15:32:51+03:00Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-03T15:32:51+03:00LightOfMooN56946Проблема решена, спасибо astoon :)<br/><br/>Добавил директиву включения intid в site.zcml<br/><div class="code"><pre><include package="zope.intid" /></pre></div>И переписал код добавления утилиты на следующий:<br/><div class="code"><pre> sm = getSiteManager(self.context)<br/> if u'intids' not in sm:<br/> intids = IntIds()<br/> notify(ObjectCreatedEvent(intids))<br/> sm[u'intids'] = intids<br/> sm.registerUtility(intids, IIntIds)<br/> self.request.form['result']=u'установлено'<br/> else: self.request.form['result']=u'уже установлено'</pre></div>Всё работает, объекты регистрируются автоматически :)
Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-03T12:16:58+03:00LightOfMooN56932Вопрос по предыдущему посту:<br/>Как сделать чтобы оно работало автоматически?<br/>Может, каких-то zcml директив не хватает?<br/><br/>Ещё вопрос.<br/>Проверяю через shell:<br/><div class="code"><pre>>>> sm=getSiteManager(root)<br/>>>> ii = sm.getUtility(IIntIds)<br/>>>> ii<br/><zope.intid.Intids object at 0x033184F0><br/>>>> ii = sm.getUtility(IItnIds, u'intids')<br/><zope.intid.Intids object at 0x0340A830></pre></div>Итого 2 объекта IntIds, хотя регистрировал только один.<br/>Почему?<br/>И правильно ли произведена регистрация?<br/><div class="code"><pre> sm = getSiteManager()<br/> if sm.queryUtility(IIntIds) is None: <br/> intids = IntIds()<br/> sm[u'intids'] = intids<br/> sm.registerUtility(intids, IIntIds, u'intids')</pre></div>Может, правильнее вот так?<br/><div class="code"><pre> sm = getSiteManager()<br/> if sm.queryUtility(IIntIds) is None: <br/> intids = IntIds()<br/> sm[u'intids'] = intids<br/> sm.registerUtility(sm[u'intids'], IIntIds, u'intids')</pre></div>
Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-02T23:20:01+03:00LightOfMooN56906Переписал немного код добавления intids:<br/><div class="code"><pre> sm = getSiteManager(self.context)<br/> if sm.queryUtility(IIntIds, u'intids') is None: <br/> intids = IntIds()<br/> sm[u'intids'] = intids<br/> sm.registerUtility(intids, IIntIds, u'intids')<br/> self.request.form['result']=u'установлено'<br/> else: self.request.form['result']=u'уже установлено'</pre></div>Функция getSiteManager() работает аналогично getGlobalSiteManager() и возвращает ‘BaseGlobalComponents’. Что это, для меня пока загадка, ибо совсем новичок :). Но суть не в этом.<br/>Если указать любой контекст, то вернётся LocalSiteManager от того же root.<br/>В итоге, утилита работает. Значения сохраняются.<br/>Вот только не добавляются автоматически. Приходится явно писать:<br/><div class="code"><pre>добавление какого-либо объекта (Object)<br/>...<br/>object = Object()<br/>self.context[name] = object<br/>sm = getSiteManager(self.context)<br/>ii = sm.getUtility(IIntIds, u'intids')<br/>ii.register(self.context[name])</pre></div>что несколько печально
Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-02T22:16:41+03:00LightOfMooN56900<div class="code"><pre>from zope.component import getSiteManager<br/>from zope.site import LocalSiteManager<br/>from zope.intid import IntIds, IIntIds<br/>from zope.lifecycleevent import notify, ObjectAddedEvent<br/>from zope.component.interfaces import IPossibleSite<br/>from zope.interface import implements<br/>from zope.site.folder import Folder<br/>import transaction<br/><br/>obj = root[u'folder']<br/>sm = obj.getSiteManager()<br/>intids=IntIds()<br/>sm[u'intids']=intids<br/>sm.registerUtility(intids, IIntIds)<br/>obj[u'f1']=Folder()<br/>ii = sm.getUtility(IIntIds)<br/>ii.register(obj[u'f1'])<br/>transaction.commit()</pre></div>Перезапускаю, проверяю - всё работает как надо. IntIds сохраняет значения.<br/><br/>Но это в локальном сайт менеджере.<br/><br/>А если сделать в корне, то что-то не работает.<br/>Вопрос: что именно?<br/><br/>Вот так я добавлял IntIds в root:<br/><div class="code"><pre> sm = getSiteManager()<br/> if sm.queryUtility(IIntIds) is None: <br/> intids = IntIds()<br/> sm[u'intids'] = intids<br/> sm.registerUtility(intids, IIntIds)</pre></div>Но, похоже sm.queryUtility(IIntIds) не вернуло None, хотя IntIds добавлено не было.<br/>Ибо попробовав добавить его через shell следующим кодом:<br/><div class="code"><pre>sm = getSiteManager()<br/>intids = IntIds()<br/>sm[u'intids'] = intids</pre></div>я получил ошибку: ‘BaseGlobalComponents’ object does not support item assignment<br/><br/>Отсюда вопрос: как добавить IntIds в корень?
Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-02T20:23:51+03:00Sleepwalker56888Вот как сама утилита регистрирует обьект (и есле хочеш вручную делать это то что-то подобное нужно писать).<br/>Это код хендлера который зарегистрировант на IObjectAddedEvent:<br/><br/><div class="code"><pre>@adapter(ILocation, IObjectAddedEvent)<br/>def addIntIdSubscriber(ob, event):<br/> """A subscriber to ObjectAddedEvent<br/><br/> Registers the object added in all unique id utilities and fires<br/> an event for the catalogs.<br/> """<br/> utilities = tuple(getAllUtilitiesRegisteredFor(IIntIds))<br/> if utilities: # assert that there are any utilites<br/> key = IKeyReference(ob, None)<br/> # Register only objects that adapt to key reference<br/> if key is not None:<br/> idmap = {}<br/> for utility in utilities:<br/> idmap[utility] = utility.register(key)<br/> # Notify the catalogs that this object was added.<br/> notify(IntIdAddedEvent(ob, event, idmap))</pre></div>
Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-02T20:12:21+03:00LightOfMooN56886Контекст не пишу, потому что утилита находится в корне (root).<br/>IntIds - в единственном экземпляре.<br/>Shopcatalog наследуется от BTreeContainer.<br/><br/>Вот код, которым создана IntIds:<br/><div class="code"><pre> sm = getSiteManager()<br/> if sm.queryUtility(IIntIds) is None: <br/> intids = IntIds()<br/> sm[u'intids'] = intids<br/> sm.registerUtility(intids, IIntIds)<br/> return 'done'<br/> else: return 'already exists'</pre></div>Утилита создана, проверял через shell.<br/>Напрямую регистрировал объект<br/><div class="code"><pre>ii.register(shopcatalog)</pre></div>Выводил list(ii), объект был добавлен<br/>функции getObject() и getId() соответственно тоже работали.<br/>transaction.commit(), рестарт серва, и ii опустевает :(
Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-02T20:04:26+03:00Sleepwalker56883Это лишнее:<br/><div class="code"><pre>sm = getSiteManager()<br/>ii = sm.queryUtility(IIntIds)<br/>ii.register(shopcatalog)</pre></div>Утилита IntId сама регистрирует обьект (при условии что при добавлении обьекта идет нотификация ObjectAddedEvent).<br/><br/>Событие ObjectAddedEvent автоматически срабатывает когда вы добавляете обьект в контейнер (self.context = shopcatalog).<br/><br/>Так что правильнее писать без указанных выше строчек (возможно из-за этого и не сохраняет что идет два раза регистрация обьекта).<br/><br/>Еще возможные проблемы:<br/><br/>1. У вас может быть несколько утилит IntId<br/>2. Shopcatalog не контейнер (проверте или наследуется от класса контейнера).<br/><br/>Еще, ii = sm.queryUtility(IIntIds) не совсем корректно опять же в случае нескольких утилит. Правлим хорошего тона есть указание контекста при поиске утилиты:<br/><br/><div class="code"><pre>ii = sm.queryUtility(interface=IIntIds, context = self.context)</pre></div>Тогда будеть производиться поиск утилиты относительно конкретного сайта.
Веб-технологии :: Zope/Plone/Bluebream :: BB IntIds
2010-10-02T18:31:21+03:00LightOfMooN56881Зарегил утилиту intids, регистрирую объект. Вроде всё нормально.<br/><div class="code"><pre> def createAndAdd(self, data):<br/> shopcatalog = Shopcatalog()<br/> shopcatalog.name = data['name']<br/> self.context[shopcatalog.name] = shopcatalog<br/> sm = getSiteManager()<br/> ii = sm.queryUtility(IIntIds)<br/> ii.register(shopcatalog)<br/> self.request.response.redirect('.')</pre></div>Перезапускаю сервак, и intids пустой. :(