Форум сайта python.su
Пишу в надежде, что данный раздел форума ещё жив.
Наткнулся на дурацкую ошибку, которую никак не получается исправить.
Пишем через 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()
Офлайн
На всякий случай приведу дополнительные данные
трейс:
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)
<browser:defaultView
for="zope.container.interfaces.IContainer"
name="index"
/>
Офлайн
на 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>
Офлайн
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 - это контекст. Т.е. контекст куда-то потерялся.
Информации для обнаружения почему так - здесь нету, надо копать по коду.
Офлайн
объект создаётся, но интерфейс на него почему-то не навешивается
>> IProtectedDocument.providedBy(document)
False
>> list(interface.providedBy(document))
Куда делся IProtectedDocument, или в конце концов IBTreeContainer?
Хотя
>> IProtectedDocument.implementedBy(ProtectedDocument)
True
Отредактировано (Янв. 12, 2011 22:30:25)
Офлайн
Ещё дополнение:
>> type(document)
<class ‘zope.container.contained.ContainedProxy’>
хотя должен быть
<class ‘uralexpont.content.protected_document.protected_document.ProtectedDocument’>
Офлайн
Это кошмар какой-то.. Что за баги. 1в1 копирую рабочий код, только меняя название класса, и та же ошибка.
Уже банально хеловорлд не вывести.
Интерфейсы куда-то деваются..
Офлайн
каталог 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''
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 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>
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'
<html metal:use-macro="context/@@macro_main/master">
<metal:fill fill-slot="body">
<h3>hello</h3>
</metal:fill>
</html>
<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>
Офлайн
Вы в виде HelloAdd используете self.context, которого в классе-то нет…
добавьте __init__ для вида:
...
def __init__(self, context, request):
self.context = context
self.request = request
Офлайн
Или отнаследоваться от BrowserView:
from zope.publisher.browser import BrowserView
class HelloAdd(BrowserView):
pass
Офлайн