merge branch master
This commit is contained in:
commit
7f95a66c99
5 changed files with 49 additions and 16 deletions
|
@ -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):
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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
17
type.py
|
@ -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):
|
||||||
|
|
Loading…
Add table
Reference in a new issue