class InterfaceData(object): """returns all properties data """ implements(IDataCollector) logger = getLogger() security = ClassSecurityInformation() def __init__(self, object): self.object = object self.adapted = IMarkerInterfaces(self.object) security.declarePrivate('getData') def getData(self): """returns all important data""" return self.getInterfaceData() security.declarePrivate('getInterfaceData') def getInterfaceData(self): """ Returns a list of directlyProvided interfaces. Example Return: [ 'foo.bar.IDemoInterface', .... ] @return: list @rtype: list """ return self.adapted.getDirectlyProvidedNames() security.declarePrivate('setData') def setData(self, interfacedata, metadata): """ Sets a list of properties on a object. Warning: all currently set properties which are not in the properties-list wille be removed! @param object: Plone-Object to set the properties on @type object: Plone-Object @param properties: list of propertes. See ftw.publisher.sender.extractor for format details. @param type: list @return: None """ self.logger.info('Updating interface data (UID %s)' % (self.object.UID()) ) current_ifaces = set(self.adapted.getDirectlyProvidedNames()) desired_ifaces = set(interfacedata) for iface_dotted in current_ifaces - desired_ifaces: iface = resolve(iface_dotted) noLongerProvides(self.object, iface) for iface_dotted in desired_ifaces - current_ifaces: iface = resolve(iface_dotted) alsoProvides(self.object, iface)
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)
def __call__(self, context): self.context = context adapted = IMarkerInterfaces(context) terms = [ SimpleTerm(x, title=x) for x in adapted.getDirectlyProvidedNames()] return SimpleVocabulary(terms)
def _extractMarkers(self): fragment = self._doc.createDocumentFragment() adapted = IMarkerInterfaces(self.context) for marker_id in adapted.getDirectlyProvidedNames(): node = self._doc.createElement('marker') node.setAttribute('name', marker_id) fragment.appendChild(node) return fragment
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