20
20
from zope.interface import alsoProvides, implementer, implements
21
21
from zope.publisher.interfaces import NotFound
22
22
from zope.publisher.interfaces.browser import IBrowserRequest
23
from zope.schema.interfaces import IBytes
23
from zope.schema.interfaces import IBytes, IObject
24
24
from zope.security.checker import ProxyFactory
26
26
from lazr.uri import URI
28
from lazr.restful import (
29
CollectionResource, EntryField, EntryFieldResource, EntryResource,
28
31
from lazr.restful.interfaces import (
29
IByteStorage, ICollection, IEntry, IEntryField, IHTTPResource,
30
IWebBrowserInitiatedRequest, IWebServiceClientRequest,
31
IWebServiceConfiguration, ICollectionField)
32
from lazr.restful import (
33
CollectionResource, EntryField, EntryFieldResource,
34
EntryResource, ScopedCollection)
32
IByteStorage, ICollection, ICollectionField, IEntry, IEntryField,
33
IHTTPResource, IWebBrowserInitiatedRequest, IWebServiceClientRequest,
34
IWebServiceConfiguration)
37
37
class WebServicePublicationMixin:
38
38
"""A mixin for webservice publication.
40
40
This should usually be mixed-in with ZopePublication, or Browser,
44
44
def traverseName(self, request, ob, name):
45
45
"""See `zope.publisher.interfaces.IPublication`.
66
66
elif IBytes.providedBy(field):
67
67
return self._traverseToByteStorage(
68
68
request, entry, field, name)
69
elif IObject.providedBy(field):
70
sub_entry = getattr(entry, name, None)
72
raise NotFound(ob, name, request)
69
75
elif field is not None:
70
76
return EntryField(entry, field, name)