Форум сайта python.su
Зарегил утилиту intids, регистрирую объект. Вроде всё нормально.
def createAndAdd(self, data):
shopcatalog = Shopcatalog()
shopcatalog.name = data['name']
self.context[shopcatalog.name] = shopcatalog
sm = getSiteManager()
ii = sm.queryUtility(IIntIds)
ii.register(shopcatalog)
self.request.response.redirect('.')
Офлайн
Это лишнее:
sm = getSiteManager()
ii = sm.queryUtility(IIntIds)
ii.register(shopcatalog)
ii = sm.queryUtility(interface=IIntIds, context = self.context)
Офлайн
Контекст не пишу, потому что утилита находится в корне (root).
IntIds - в единственном экземпляре.
Shopcatalog наследуется от BTreeContainer.
Вот код, которым создана IntIds:
sm = getSiteManager()
if sm.queryUtility(IIntIds) is None:
intids = IntIds()
sm[u'intids'] = intids
sm.registerUtility(intids, IIntIds)
return 'done'
else: return 'already exists'
ii.register(shopcatalog)
Офлайн
Вот как сама утилита регистрирует обьект (и есле хочеш вручную делать это то что-то подобное нужно писать).
Это код хендлера который зарегистрировант на IObjectAddedEvent:
@adapter(ILocation, IObjectAddedEvent)
def addIntIdSubscriber(ob, event):
"""A subscriber to ObjectAddedEvent
Registers the object added in all unique id utilities and fires
an event for the catalogs.
"""
utilities = tuple(getAllUtilitiesRegisteredFor(IIntIds))
if utilities: # assert that there are any utilites
key = IKeyReference(ob, None)
# Register only objects that adapt to key reference
if key is not None:
idmap = {}
for utility in utilities:
idmap[utility] = utility.register(key)
# Notify the catalogs that this object was added.
notify(IntIdAddedEvent(ob, event, idmap))
Офлайн
from zope.component import getSiteManager
from zope.site import LocalSiteManager
from zope.intid import IntIds, IIntIds
from zope.lifecycleevent import notify, ObjectAddedEvent
from zope.component.interfaces import IPossibleSite
from zope.interface import implements
from zope.site.folder import Folder
import transaction
obj = root[u'folder']
sm = obj.getSiteManager()
intids=IntIds()
sm[u'intids']=intids
sm.registerUtility(intids, IIntIds)
obj[u'f1']=Folder()
ii = sm.getUtility(IIntIds)
ii.register(obj[u'f1'])
transaction.commit()
sm = getSiteManager()
if sm.queryUtility(IIntIds) is None:
intids = IntIds()
sm[u'intids'] = intids
sm.registerUtility(intids, IIntIds)
sm = getSiteManager()
intids = IntIds()
sm[u'intids'] = intids
Офлайн
Переписал немного код добавления intids:
sm = getSiteManager(self.context)
if sm.queryUtility(IIntIds, u'intids') is None:
intids = IntIds()
sm[u'intids'] = intids
sm.registerUtility(intids, IIntIds, u'intids')
self.request.form['result']=u'установлено'
else: self.request.form['result']=u'уже установлено'
добавление какого-либо объекта (Object)
...
object = Object()
self.context[name] = object
sm = getSiteManager(self.context)
ii = sm.getUtility(IIntIds, u'intids')
ii.register(self.context[name])
Отредактировано (Окт. 2, 2010 23:39:05)
Офлайн
Вопрос по предыдущему посту:
Как сделать чтобы оно работало автоматически?
Может, каких-то zcml директив не хватает?
Ещё вопрос.
Проверяю через shell:
>>> sm=getSiteManager(root)
>>> ii = sm.getUtility(IIntIds)
>>> ii
<zope.intid.Intids object at 0x033184F0>
>>> ii = sm.getUtility(IItnIds, u'intids')
<zope.intid.Intids object at 0x0340A830>
sm = getSiteManager()
if sm.queryUtility(IIntIds) is None:
intids = IntIds()
sm[u'intids'] = intids
sm.registerUtility(intids, IIntIds, u'intids')
sm = getSiteManager()
if sm.queryUtility(IIntIds) is None:
intids = IntIds()
sm[u'intids'] = intids
sm.registerUtility(sm[u'intids'], IIntIds, u'intids')
Отредактировано (Окт. 3, 2010 14:05:14)
Офлайн
Проблема решена, спасибо astoon :)
Добавил директиву включения intid в site.zcml
<include package="zope.intid" />
sm = getSiteManager(self.context)
if u'intids' not in sm:
intids = IntIds()
notify(ObjectCreatedEvent(intids))
sm[u'intids'] = intids
sm.registerUtility(intids, IIntIds)
self.request.form['result']=u'установлено'
else: self.request.form['result']=u'уже установлено'
Офлайн