class EditView(object): """Marker interface edit view. """ def __init__(self, context, request): self.context = context self.request = request self.adapted = IMarkerInterfaces(context) self.context_url = self.context.absolute_url() def __call__(self, SAVE=None, add=(), remove=()): if SAVE: self.update(add, remove) url = '%s?manage_tabs_message=Changes+applied.' self.request.response.redirect(url % self.request.ACTUAL_URL) return '' return self.index() def _getNameLinkDicts(self, interfaceNames): return [dict(name=name) for name in interfaceNames] def getAvailableInterfaceNames(self): return self._getNameLinkDicts( self.adapted.getAvailableInterfaceNames()) def getDirectlyProvidedNames(self): return self._getNameLinkDicts(self.adapted.getDirectlyProvidedNames()) def getInterfaceNames(self): return self._getNameLinkDicts(self.adapted.getInterfaceNames()) def update(self, add, remove): # this could return errors add = self.adapted.dottedToInterfaces(add) remove = self.adapted.dottedToInterfaces(remove) self.adapted.update(add=add, remove=remove)
class InterfacesView(ZMIView): """Marker interface view. """ def __init__(self, context, request): super(InterfacesView, self).__init__(context, request) self.adapted = IMarkerInterfaces(context) self.context_url = self.context.absolute_url() def __call__(self): return self.index() def _getLinkToInterfaceDetailsView(self, interfaceName): return ( self.context_url + '/views-details.html?iface=%s&type=zope.publisher.interfaces.browser.IBrowserRequest' % interfaceName) def _getNameLinkDicts(self, interfaceNames): return [ dict(name=name, link=self._getLinkToInterfaceDetailsView(name)) for name in interfaceNames ] def getInterfaceNames(self): return self._getNameLinkDicts(self.adapted.getInterfaceNames())
class EditView: """Marker interface edit view. """ def __init__(self, context, request): self.context = context self.request = request self.adapted = IMarkerInterfaces(context) self.context_url = self.context.absolute_url() def __call__(self, SAVE=None, add=(), remove=()): if SAVE: self.update(add, remove) self.request.response.redirect(self.request.ACTUAL_URL) return '' return self.index() def _getLinkToInterfaceDetailsView(self, interfaceName): return ( self.context_url + '/views-details.html?iface=%s&type=zope.publisher.interfaces.browser.IBrowserRequest' % interfaceName) def _getNameLinkDicts(self, interfaceNames): return [ dict(name=name, link=self._getLinkToInterfaceDetailsView(name)) for name in interfaceNames ] def getAvailableInterfaceNames(self): return self._getNameLinkDicts( self.adapted.getAvailableInterfaceNames()) def getDirectlyProvidedNames(self): return self._getNameLinkDicts(self.adapted.getDirectlyProvidedNames()) def getInterfaceNames(self): return self._getNameLinkDicts(self.adapted.getInterfaceNames()) def update(self, add, remove): # this could return errors add = self.adapted.dottedToInterfaces(add) remove = self.adapted.dottedToInterfaces(remove) self.adapted.update(add=add, remove=remove)
class EditView: """Marker interface edit view. """ def __init__(self, context, request): self.context = context self.request = request self.adapted = IMarkerInterfaces(context) self.context_url = self.context.absolute_url() def __call__(self, SAVE=None, add=(), remove=()): if SAVE: self.update(add, remove) self.request.response.redirect(self.request.ACTUAL_URL) return '' return self.index() def _getLinkToInterfaceDetailsView(self, interfaceName): return (self.context_url + '/views-details.html?iface=%s&type=zope.publisher.interfaces.browser.IBrowserRequest' % interfaceName) def _getNameLinkDicts(self, interfaceNames): return [dict(name=name, link=self._getLinkToInterfaceDetailsView(name)) for name in interfaceNames] def getAvailableInterfaceNames(self): return self._getNameLinkDicts( self.adapted.getAvailableInterfaceNames()) def getDirectlyProvidedNames(self): return self._getNameLinkDicts(self.adapted.getDirectlyProvidedNames()) def getInterfaceNames(self): return self._getNameLinkDicts(self.adapted.getInterfaceNames()) def update(self, add, remove): # this could return errors add = self.adapted.dottedToInterfaces(add) remove = self.adapted.dottedToInterfaces(remove) self.adapted.update(add=add, remove=remove)
class ContentTypeLookUp(object): """ Lookup for context in portal_relations content-types """ implements(IContentTypeLookUp) def __init__(self, context): self.context = context self.adapted = None self._ctypes = None self._types_and_interfaces = None @property def ctypes(self): """ Types """ if self._ctypes: return self._ctypes tool = queryAdapter(self.context, IToolAccessor) if not tool: return [] self._ctypes = [doc for doc in tool.types(proxy=False)] return self._ctypes @property def portal_type(self): """ Context portal_type """ return getattr(self.context, 'portal_type', '') @property def object_provides(self): """ Context object_provides """ if not self.adapted: self.adapted = IMarkerInterfaces(self.context) ifaces = self.adapted.getDirectlyProvidedNames() ifaces.extend(self.adapted.getInterfaceNames()) return ifaces @property def types_and_interfaces(self): """ Types and interfaces logic from every field """ if self._types_and_interfaces: return self._types_and_interfaces self._types_and_interfaces = [] for doc in self.ctypes: ct_type = doc.getField('ct_type').getAccessor(doc)() ct_interface = doc.getField('ct_interface').getAccessor(doc)() self._types_and_interfaces.append((ct_type, ct_interface, doc)) return self._types_and_interfaces @property def tuple_types(self): """ Types """ res = {} for ct_type, ct_interface, doc in self.types_and_interfaces: if not ct_type: continue if not ct_interface: continue res[(ct_interface, ct_type)] = doc return res @property def portal_types_only(self): """ Only portal_types """ res = {} for ct_type, ct_interface, doc in self.types_and_interfaces: if ct_interface: continue if not ct_type: continue res[ct_type] = doc return res @property def interfaces_only(self): """ Only interfaces """ res = {} for ct_type, ct_interface, doc in self.types_and_interfaces: if ct_type: continue if not ct_interface: continue res[ct_interface] = doc return res def __call__(self, inverse_interface_check=False): """ Return ContentType object from portal_relation or None """ object_provides = self.object_provides # Search for full mapping tuple_types = self.tuple_types ptype = self.portal_type if tuple_types: for iface in object_provides: if (iface, ptype) in tuple_types: return tuple_types[(iface, ptype)] # Fallback to portal_type only portal_types = self.portal_types_only if ptype in self.portal_types_only: return portal_types[ptype] # Fallback to interfaces only interfaces = self.interfaces_only if interfaces: if inverse_interface_check: object_provides.reverse() for iface in object_provides: if iface in interfaces: return interfaces[iface] return None
class ContentTypeLookUp(object): """ Lookup for context in portal_relations content-types """ implements(IContentTypeLookUp) def __init__(self, context): self.context = context self.adapted = None self._ctypes = None self._types_and_interfaces = None @property def ctypes(self): """ Types """ if self._ctypes: return self._ctypes tool = queryAdapter(self.context, IToolAccessor) if not tool: return [] self._ctypes = [doc for doc in tool.types(proxy=False)] return self._ctypes @property def portal_type(self): """ Context portal_type """ request = getRequest() if request: if '++add++' in request.URL: types_tool = getToolByName(getSite(), 'portal_types') add_view_url = request.steps[-1].split('++add++')[-1] portal_type = types_tool[add_view_url].factory return portal_type return getattr(self.context, 'portal_type', '') @property def object_provides(self): """ Context object_provides """ if not self.adapted: self.adapted = IMarkerInterfaces(self.context) ifaces = self.adapted.getDirectlyProvidedNames() ifaces.extend(self.adapted.getInterfaceNames()) return ifaces @property def types_and_interfaces(self): """ Types and interfaces logic from every field """ if self._types_and_interfaces: return self._types_and_interfaces self._types_and_interfaces = [] for doc in self.ctypes: ct_type = doc.getField('ct_type').getAccessor(doc)() ct_interface = doc.getField('ct_interface').getAccessor(doc)() self._types_and_interfaces.append((ct_type, ct_interface, doc)) return self._types_and_interfaces @property def tuple_types(self): """ Types """ res = {} for ct_type, ct_interface, doc in self.types_and_interfaces: if not ct_type: continue if not ct_interface: continue res[(ct_interface, ct_type)] = doc return res @property def portal_types_only(self): """ Only portal_types """ res = {} for ct_type, ct_interface, doc in self.types_and_interfaces: if ct_interface: continue if not ct_type: continue res[ct_type] = doc return res @property def interfaces_only(self): """ Only interfaces """ res = {} for ct_type, ct_interface, doc in self.types_and_interfaces: if ct_type: continue if not ct_interface: continue res[ct_interface] = doc return res def __call__(self, **kwargs): """ Return ContentType object from portal_relation or None """ object_provides = self.object_provides # Search for full mapping tuple_types = self.tuple_types ptype = self.portal_type if tuple_types: for iface in object_provides: if (iface, ptype) in tuple_types: return tuple_types[(iface, ptype)] # Fallback to portal_type only portal_types = self.portal_types_only if ptype in self.portal_types_only: return portal_types[ptype] # Fallback to interfaces only interfaces = self.interfaces_only if interfaces: for iface in object_provides: if iface in interfaces: return interfaces[iface] return None