Найти - Пользователи
Полная версия: BB ComponentLookupError
Начало » Zope/Plone/Bluebream » BB ComponentLookupError
1 2
LightOfMooN
Пишу в надежде, что данный раздел форума ещё жив.
Наткнулся на дурацкую ошибку, которую никак не получается исправить.

Пишем через shell:
>> from uralexpont.content.protected_document.protected_document import ProtectedDocument
>> document = ProtectedDocument()
>> dir = root['reports']['homereport']
>> dir['document'] = document
>> import transaction
>> transaction.commit()
Запускаем сервер, заходим, всё работает как надо. Даже редактируется через спец. вьюшку.

Если добавляем через класс:
class ProtectedDocumentAdd(object):

template = ViewPageTemplateFile('add_protected_document.pt')

def __call__(self):

form = self.request.form

if form.get('add', None) is not None:
document = ProtectedDocument()
namechooser = INameChooser(self.context)
number = namechooser.chooseName('document', document)
self.context[number] = document
return self.template()
Заходим и получаем
ComponentLookupError: (“Couldn't find default view name”, None, <zope.publisher.browser.BrowserRequest instance URL=http://127.0.0.1:8080/reports/homereport/document-2>)

Может кто знает, как такое можно исправить и где косяк?
LightOfMooN
На всякий случай приведу дополнительные данные

трейс:
http://pastebin.com/hbDgiS9G

класс:
class ProtectedDocument(BTreeContainer):

implements(IProtectedDocument)

def __init__(self):
super(ProtectedDocument, self).__init__()
self.index = 0
self.name = u''
self.perm = u''
self.data = u''
интерфейс:
class IProtectedDocument(IContainer):

index = Int(
title=u"index",
default=0,
required=False)
name = TextLine(
title=u"name",
default=u"",
required=False)
perm = TextLine(
title=u"perm",
default=u"",
required=False)
data = Text(
title=u"data",
default=u"",
required=False)
директива zcml:
<browser:defaultView
for="zope.container.interfaces.IContainer"
name="index"
/>
LightOfMooN
на 16й строке трейса вот такая картина:

context None
name None
object <uralexpont.content.protected_document.browser.protected_document.ProtectedDocument object at 0x0
399AD50>
request <zope.publisher.browser.BrowserRequest instance URL=http://127.0.0.1:8080/++skin++UENTAdminSkin/r
eports/homereport/document-2>
astoon
ComponentLookupError: (“Couldn't find default view name”, None, <zope.publisher.browser.BrowserRequest instance URL=http://127.0.0.1:8080/reports/homereport/document-2>)

None - это контекст. Т.е. контекст куда-то потерялся.
Информации для обнаружения почему так - здесь нету, надо копать по коду.
LightOfMooN
объект создаётся, но интерфейс на него почему-то не навешивается
>> IProtectedDocument.providedBy(document)
False

>> list(interface.providedBy(document))


Куда делся IProtectedDocument, или в конце концов IBTreeContainer?

Хотя
>> IProtectedDocument.implementedBy(ProtectedDocument)
True
LightOfMooN
Ещё дополнение:
>> type(document)
<class ‘zope.container.contained.ContainedProxy’>

хотя должен быть
<class ‘uralexpont.content.protected_document.protected_document.ProtectedDocument’>
LightOfMooN
Это кошмар какой-то.. Что за баги. 1в1 копирую рабочий код, только меняя название класса, и та же ошибка.
Уже банально хеловорлд не вывести.
Интерфейсы куда-то деваются..
LightOfMooN
каталог helloworld:

__init__.py

helloworld.py
from zope.interface import implements
from zope.container.btree import BTreeContainer
from interfaces import IHello

class Hello(BTreeContainer):

implements(IHello)

hello = u''
interfaces.py
from zope.container.interfaces import IContainer
from zope.schema import TextLine, Text, Int

class IHello(IContainer):

hello = TextLine(
title=u"name",
default=u"",
required=False)
configure.zcml
<configure xmlns="http://namespaces.zope.org/zope">

<interface
interface=".interfaces.IHello"
type="zope.app.content.interfaces.IContentType"/>

<class class=".helloworld.Hello">
<require
interface=".interfaces.IHello"
permission="zope.Public"
/>
<require
set_schema=".interfaces.IHello"
permission="zope.Public"
/>
</class>

<include package=".browser" />

</configure>
каталог browser:

__init__.py

helloworld.py:
from uralexpont.content.helloworld.helloworld import Hello
from zope.browserpage import ViewPageTemplateFile
from zope.container.interfaces import INameChooser

class Hello(object):

template = ViewPageTemplateFile('hello.pt')

def __call__(self):
return self.template()

class HelloAdd(object):

def __call__(self):

hello = Hello()
#подбираем имя
namechooser = INameChooser(self.context)
number = namechooser.chooseName('hello', hello)
self.context[number] = hello
return 'done'
hello.pt
<html metal:use-macro="context/@@macro_main/master">
<metal:fill fill-slot="body">
<h3>hello</h3>
</metal:fill>
</html>
configure.zcml:
<configure xmlns="http://namespaces.zope.org/zope"
xmlns:browser="http://namespaces.zope.org/browser">
<browser:page
for="..interfaces.IHello"
name="index"
permission="zope.Public"
class=".helloworld.Hello"
layer="uralexpont.skin.interfaces.IUENTLayer"
/>
<browser:page
for="*"
name="add_hello"
permission="zope.Public"
class=".helloworld.HelloAdd"
layer="uralexpont.skin.interfaces.IUENTLayer"
/>
</configure>
добавляем, заходим, получаем
ComponentLookupError: (“Couldn't find default view name”, None, <zope.publisher.browser.BrowserRequest instance URL=http://127.0.0.1:8080/++skin++UENTAdminSkin/legislation/hello>)

Нет интерфейсов на объекте.
И слов тоже больше нет. Одни эмоции..

Помогите, умные люди ;)
Может питон с ума сошёл?
ББ уже переустанавливал, безуспешно..
regall
Вы в виде HelloAdd используете self.context, которого в классе-то нет…
добавьте __init__ для вида:
...
def __init__(self, context, request):
self.context = context
self.request = request
Sleepwalker
Или отнаследоваться от BrowserView:

from zope.publisher.browser import BrowserView

class HelloAdd(BrowserView):
pass
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB