merge branch master

This commit is contained in:
Helmut Merz 2013-07-26 09:42:05 +02:00
commit 7f95a66c99
5 changed files with 49 additions and 16 deletions

View file

@ -49,7 +49,7 @@ from zope.security import canAccess
from zope.security.interfaces import ForbiddenAttribute, Unauthorized from zope.security.interfaces import ForbiddenAttribute, Unauthorized
from zope.security.proxy import removeSecurityProxy from zope.security.proxy import removeSecurityProxy
from zope.traversing.browser import absoluteURL from zope.traversing.browser import absoluteURL
from zope.traversing.api import getName, getParent from zope.traversing.api import getName, getParent, traverse
from cybertools.ajax.dojo import dojoMacroTemplate from cybertools.ajax.dojo import dojoMacroTemplate
from cybertools.browser.view import GenericView from cybertools.browser.view import GenericView
@ -70,7 +70,7 @@ from loops.organize.tracking import access
from loops.resource import Resource from loops.resource import Resource
from loops.security.common import checkPermission from loops.security.common import checkPermission
from loops.security.common import canAccessObject, canListObject, canWriteObject from loops.security.common import canAccessObject, canListObject, canWriteObject
from loops.type import ITypeConcept from loops.type import ITypeConcept, LoopsTypeInfo
from loops import util from loops import util
from loops.util import _, saveRequest from loops.util import _, saveRequest
from loops import version from loops import version
@ -539,11 +539,29 @@ class BaseView(GenericView, I18NView):
def conceptTypes(self): def conceptTypes(self):
return util.KeywordVocabulary(self.listTypes(('concept',), ('hidden',))) return util.KeywordVocabulary(self.listTypes(('concept',), ('hidden',)))
def parentTypesFromOtherSites(self):
result = []
typeNames = self.typeOptions('foreign_parent_types') or []
for path in self.typeOptions('foreign_parent_sites') or []:
site = traverse(self.loopsRoot, path, None)
if site is None:
continue
cm = site.getConceptManager()
for tname in typeNames:
t = cm.get(tname)
if t is not None:
type = LoopsTypeInfo(t)
type.isForeignReference = True
result.append(type)
return result
def listTypesForSearch(self, include=None, exclude=None, sortOn='title'): def listTypesForSearch(self, include=None, exclude=None, sortOn='title'):
types = [dict(token=t.tokenForSearch, title=t.title) types = [dict(token=t.tokenForSearch, title=t.title)
for t in ITypeManager(self.context).listTypes(include, exclude)] for t in ITypeManager(self.context).listTypes(include, exclude)]
if sortOn: if sortOn:
types.sort(key=lambda x: x[sortOn]) types.sort(key=lambda x: x[sortOn])
for t in self.parentTypesFromOtherSites():
types.append(dict(token=t.tokenForSearch, title=t.title))
return types return types
def typesForSearch(self): def typesForSearch(self):

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de # Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -19,14 +19,12 @@
""" """
Definition of basic view classes and other browser related stuff for the Definition of basic view classes and other browser related stuff for the
loops.expert package. loops.expert package.
$Id$
""" """
from zope import interface, component from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile from zope.app.pagetemplate import ViewPageTemplateFile
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.traversing.api import getName, getParent from zope.traversing.api import getName, getParent, traverse
from cybertools.browser.form import FormController from cybertools.browser.form import FormController
from cybertools.stateful.interfaces import IStateful, IStatesDefinition from cybertools.stateful.interfaces import IStateful, IStatesDefinition
@ -150,12 +148,16 @@ class Search(ConceptView):
if not isinstance(types, (list, tuple)): if not isinstance(types, (list, tuple)):
types = [types] types = [types]
for type in types: for type in types:
site = self.loopsRoot
if type.startswith('/'):
parts = type.split(':')
site = traverse(self.loopsRoot, parts[0], site)
result = self.executeQuery(title=title or None, type=type, result = self.executeQuery(title=title or None, type=type,
exclude=('hidden',)) exclude=('hidden',))
fv = FilterView(self.context, self.request) fv = FilterView(self.context, self.request)
result = fv.apply(result) result = fv.apply(result)
for o in result: for o in result:
if o.getLoopsRoot() == self.loopsRoot: if o.getLoopsRoot() == site:
adObj = adapted(o, self.languageInfo) adObj = adapted(o, self.languageInfo)
if filterMethod is not None and not filterMethod(adObj): if filterMethod is not None and not filterMethod(adObj):
continue continue

View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de # Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -18,8 +18,6 @@
""" """
Query concepts management stuff. Query concepts management stuff.
$Id$
""" """
from BTrees.IOBTree import IOBTree from BTrees.IOBTree import IOBTree
@ -29,6 +27,7 @@ from zope.interface import Interface, Attribute, implements
from zope.app.catalog.interfaces import ICatalog from zope.app.catalog.interfaces import ICatalog
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.intid.interfaces import IIntIds from zope.intid.interfaces import IIntIds
from zope.traversing.api import traverse
from cybertools.typology.interfaces import IType from cybertools.typology.interfaces import IType
from loops.common import AdapterBase from loops.common import AdapterBase
@ -66,6 +65,11 @@ class BaseQuery(object):
return self.context.context.getLoopsRoot() return self.context.context.getLoopsRoot()
def queryConcepts(self, title=None, type=None, **kw): def queryConcepts(self, title=None, type=None, **kw):
site = self.loopsRoot
if type.startswith('/'):
parts = type.split(':')
site = traverse(self.loopsRoot, parts[0], site)
type = 'loops:' + ':'.join(parts[1:])
if type.endswith('*'): if type.endswith('*'):
start = type[:-1] start = type[:-1]
end = start + '\x7f' end = start + '\x7f'
@ -76,7 +80,7 @@ class BaseQuery(object):
result = cat.searchResults(loops_type=(start, end), loops_title=title) result = cat.searchResults(loops_type=(start, end), loops_title=title)
else: else:
result = cat.searchResults(loops_type=(start, end)) result = cat.searchResults(loops_type=(start, end))
result = set(r for r in result if r.getLoopsRoot() == self.loopsRoot result = set(r for r in result if r.getLoopsRoot() == site
and canListObject(r)) and canListObject(r))
if 'exclude' in kw: if 'exclude' in kw:
r1 = set() r1 = set()

View file

@ -151,7 +151,7 @@ class ChangeState(ChangeStateBase, EditObject):
def update(self): def update(self):
formData = self.request.form formData = self.request.form
# store data in context (unless field.nostore) # store data in target object (unless field.nostore)
self.object = self.target self.object = self.target
formState = self.instance.applyTemplate(data=formData) formState = self.instance.applyTemplate(data=formData)
# TODO: check formState # TODO: check formState

17
type.py
View file

@ -1,5 +1,5 @@
# #
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de # Copyright (c) 2013 Helmut Merz helmutm@cy55.de
# #
# This program is free software; you can redistribute it and/or modify # This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by # it under the terms of the GNU General Public License as published by
@ -26,7 +26,7 @@ from zope.interface import implements
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.dottedname.resolve import resolve from zope.dottedname.resolve import resolve
from zope.security.proxy import removeSecurityProxy from zope.security.proxy import removeSecurityProxy
from zope.traversing.api import getName from zope.traversing.api import getName, getPath
from cybertools.typology.type import BaseType, TypeManager from cybertools.typology.type import BaseType, TypeManager
from cybertools.typology.interfaces import ITypeManager from cybertools.typology.interfaces import ITypeManager
@ -49,10 +49,15 @@ class LoopsType(BaseType):
#document=Document) #document=Document)
containerMapping = dict(concept='concepts', resource='resources') containerMapping = dict(concept='concepts', resource='resources')
isForeignReference = False
@Lazy @Lazy
def title(self): def title(self):
tp = self.typeProvider tp = self.typeProvider
return tp is None and u'Unknown Type' or tp.title title = tp is None and u'Unknown Type' or tp.title
if self.isForeignReference:
title += (' (Site: %s)' % getName(self.root))
return title
@Lazy @Lazy
def token(self): def token(self):
@ -63,7 +68,11 @@ class LoopsType(BaseType):
def tokenForSearch(self): def tokenForSearch(self):
tp = self.typeProvider tp = self.typeProvider
typeName = tp is None and 'unknown' or str(getName(tp)) typeName = tp is None and 'unknown' or str(getName(tp))
return ':'.join(('loops', self.qualifiers[0], typeName,)) if self.isForeignReference:
root = getPath(self.root)
else:
root = 'loops'
return ':'.join((root, self.qualifiers[0], typeName,))
@Lazy @Lazy
def typeInterface(self): def typeInterface(self):