more Python3 fixes: basic imports OK, starting with doctests

This commit is contained in:
Helmut Merz 2024-09-24 15:30:46 +02:00
parent 7a9be5d79b
commit ca70050bec
16 changed files with 397 additions and 283 deletions

20
config.py Normal file
View file

@ -0,0 +1,20 @@
# py-scopes/demo/config.py
from dotenv import load_dotenv
from os import getenv
from scopes.server.app import zope_app_factory
load_dotenv()
server_port = getenv('SERVER_PORT', '8099')
app_factory = zope_app_factory
# storage settings
from scopes.storage.db.postgres import StorageFactory
dbengine = 'postgresql+psycopg'
dbname = getenv('DBNAME', 'demo')
dbuser = getenv('DBUSER', 'demo')
dbpassword = getenv('DBPASSWORD', 'secret')
dbschema = getenv('DBSCHEMA', 'demo')

View file

@ -1,23 +1,6 @@
# # loops.config.base
# Copyright (c) 2016 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Adapters and others classes for analyzing resources.
Adapters and others classes for analyzing resources.
""" """
import os import os
@ -50,13 +33,14 @@ class LoopsOptions(Options):
adapts(ILoopsObject) adapts(ILoopsObject)
builtins = Options.builtins + ('True', 'False') builtins = Options.builtins + ('True', 'False')
True, False = True, False #True, False = True, False
_initialized = False _initialized = False
def __init__(self, context, *args, **kw): def __init__(self, context, *args, **kw):
self.context = context self.context = context
self['True'] = True
self['False'] = False
super(LoopsOptions, self).__init__(*args, **kw) super(LoopsOptions, self).__init__(*args, **kw)
#self.loadContextOptions()
def __getitem__(self, key): def __getitem__(self, key):
if not self._initialized: if not self._initialized:

View file

@ -1,31 +1,14 @@
# # loops.expert.concept
# Copyright (c) 2013 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Query concepts management stuff.
Query concepts management stuff.
""" """
from BTrees.IOBTree import IOBTree from BTrees.IOBTree import IOBTree
from BTrees.IFBTree import weightedIntersection, weightedUnion, IFBucket from BTrees.IFBTree import weightedIntersection, weightedUnion, IFBucket
from zope import schema, component from zope import schema, component
from zope.interface import Interface, Attribute, implements from zope.interface import Interface, Attribute, implementer
from zope.app.catalog.interfaces import ICatalog
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.catalog.interfaces import ICatalog
from zope.intid.interfaces import IIntIds from zope.intid.interfaces import IIntIds
from zope.traversing.api import traverse from zope.traversing.api import traverse
@ -209,10 +192,9 @@ class IQueryConcept(ILoopsAdapter):
required=False) required=False)
@implementer(IQueryConcept)
class QueryConcept(AdapterBase): class QueryConcept(AdapterBase):
implements(IQueryConcept)
_contextAttributes = AdapterBase._contextAttributes + ['viewName'] _contextAttributes = AdapterBase._contextAttributes + ['viewName']
_adapterAttributes = AdapterBase._adapterAttributes + ('options',) _adapterAttributes = AdapterBase._adapterAttributes + ('options',)

View file

@ -1,29 +1,12 @@
# # loops.i18n.browser
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ View extension for support of i18n content.
View extension for support of i18n content.
""" """
from datetime import date, datetime from datetime import date, datetime
from zope import interface, component from zope import interface, component
from zope.app.pagetemplate import ViewPageTemplateFile from zope.browserpage import ViewPageTemplateFile
from zope.app.session.interfaces import ISession from zope.session.interfaces import ISession
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.i18n.interfaces import IUserPreferredLanguages from zope.i18n.interfaces import IUserPreferredLanguages
from zope.i18n.negotiator import negotiator from zope.i18n.negotiator import negotiator

View file

@ -1,29 +1,12 @@
# # loops.organize.interfaces
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Interfaces for organizational stuff like persons and addresses.
Interfaces for organizational stuff like persons and addresses.
""" """
from zope.interface import Interface, Attribute from zope.interface import Interface, Attribute
from zope import interface, component, schema from zope import interface, component, schema
from zope.app.principalannotation import annotations from zope.authentication.interfaces import IAuthentication, PrincipalLookupError
from zope.app.security.interfaces import IAuthentication, PrincipalLookupError from zope.principalannotation.utility import annotations
from zope.security.proxy import removeSecurityProxy from zope.security.proxy import removeSecurityProxy
from zope.traversing.api import getName from zope.traversing.api import getName

View file

@ -1,23 +1,6 @@
# # loops.organize.job.base
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Base class(es) for job management.
Base class(es) for job management.
""" """
from zope import component, interface from zope import component, interface
@ -26,9 +9,9 @@ from cybertools.organize.interfaces import IJobManager
from loops.interfaces import ILoops from loops.interfaces import ILoops
@interface.implementer(IJobManager)
class JobManager(object): class JobManager(object):
interface.implements(IJobManager)
component.adapts(ILoops) component.adapts(ILoops)
view = None # may be set by calling view view = None # may be set by calling view

View file

@ -1,35 +1,18 @@
# # loops.organize.party
# Copyright (c) 2015 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Adapters for IConcept providing interfaces from the cybertools.organize package.
Adapters for IConcept providing interfaces from the cybertools.organize package.
""" """
from persistent.mapping import PersistentMapping from persistent.mapping import PersistentMapping
from zope import interface, component from zope import interface, component
from zope.app.principalannotation import annotations from zope.principalannotation.utility import annotations
from zope.app.security.interfaces import IAuthentication, PrincipalLookupError from zope.authentication.interfaces import IAuthentication, PrincipalLookupError
from zope.app.security.interfaces import IUnauthenticatedPrincipal from zope.authentication.interfaces import IUnauthenticatedPrincipal
from zope.component import adapts
from zope.interface import implements
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope.component import adapts
from zope.formlib.interfaces import WidgetInputError
from zope.interface import implementer
from zope.schema.interfaces import ValidationError from zope.schema.interfaces import ValidationError
from zope.app.form.interfaces import WidgetInputError
from zope.security.proxy import removeSecurityProxy from zope.security.proxy import removeSecurityProxy
from zope.traversing.api import getName from zope.traversing.api import getName
@ -88,12 +71,11 @@ def getPrincipal(context):
return None return None
@implementer(IPerson)
class Person(AdapterBase, BasePerson): class Person(AdapterBase, BasePerson):
""" typeInterface adapter for concepts of type 'person'. """ typeInterface adapter for concepts of type 'person'.
""" """
implements(IPerson)
_adapterAttributes = ('context', '__parent__', 'userId', 'phoneNumbers') _adapterAttributes = ('context', '__parent__', 'userId', 'phoneNumbers')
_contextAttributes = list(IPerson) + list(IConcept) _contextAttributes = list(IPerson) + list(IConcept)
@ -185,12 +167,11 @@ def removePersonReferenceFromPrincipal(context, event):
person.removeReferenceFromPrincipal(person.userId) person.removeReferenceFromPrincipal(person.userId)
@implementer(IAddress)
class Address(AdapterBase): class Address(AdapterBase):
""" typeInterface adapter for concepts of type 'address'. """ typeInterface adapter for concepts of type 'address'.
""" """
implements(IAddress)
_adapterAttributes = ('context', '__parent__', 'lines') _adapterAttributes = ('context', '__parent__', 'lines')
_contextAttributes = list(IAddress) + list(IConcept) _contextAttributes = list(IAddress) + list(IConcept)
@ -201,10 +182,9 @@ class Address(AdapterBase):
lines = property(getLines, setLines) lines = property(getLines, setLines)
@implementer(IHasRole)
class HasRole(RelationAdapter): class HasRole(RelationAdapter):
""" Allows specification of a role for a relation. """ Allows specification of a role for a relation.
""" """
implements(IHasRole)
_contextAttributes = list(IHasRole) _contextAttributes = list(IHasRole)

View file

@ -1,25 +1,6 @@
# # loops.organize.tracking.access
# Copyright (c) 2011 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Recording changes to loops objects.
Recording changes to loops objects.
$Id$
""" """
import logging import logging
@ -27,12 +8,12 @@ import os
import time import time
import transaction import transaction
from zope.app.session.interfaces import ISession
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from zope import component from zope import component
from zope.component import adapter from zope.component import adapter
from zope.interface import Interface, implements from zope.interface import Interface, implementer
from zope.security.proxy import removeSecurityProxy from zope.security.proxy import removeSecurityProxy
from zope.session.interfaces import ISession
from cybertools.browser.view import IBodyRenderedEvent from cybertools.browser.view import IBodyRenderedEvent
from cybertools.meta.interfaces import IOptions from cybertools.meta.interfaces import IOptions
@ -200,10 +181,9 @@ class IAccessRecord(ITrack):
pass pass
@implementer(IAccessRecord)
class AccessRecord(Track): class AccessRecord(Track):
implements(IAccessRecord)
typeName = 'AccessRecord' typeName = 'AccessRecord'

View file

@ -1,26 +1,9 @@
# # loops.organize.tracking.base
# Copyright (c) 2013 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Base class(es) for track/record managers.
Base class(es) for track/record managers.
""" """
from zope.app.security.interfaces import IUnauthenticatedPrincipal from zope.authentication.interfaces import IUnauthenticatedPrincipal
from zope.cachedescriptors.property import Lazy from zope.cachedescriptors.property import Lazy
from cybertools.meta.interfaces import IOptions from cybertools.meta.interfaces import IOptions

View file

@ -1,33 +1,16 @@
# # loops.organize.util
# Copyright (c) 2017 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Utilities for the loops.organize package.
Utilities for the loops.organize package.
""" """
from zope import interface, component, schema from zope import interface, component, schema
from zope.app.authentication.interfaces import IPluggableAuthentication from zope.authentication.interfaces import IAuthentication, PrincipalLookupError
from zope.app.authentication.interfaces import IAuthenticatorPlugin
from zope.app.authentication.groupfolder import GroupFolder
from zope.app.security.interfaces import IAuthentication, PrincipalLookupError
from zope.app.security.settings import Allow, Deny, Unset
from zope.component import queryNextUtility from zope.component import queryNextUtility
from zope.pluggableauth.interfaces import IPluggableAuthentication
from zope.pluggableauth.interfaces import IAuthenticatorPlugin
from zope.pluggableauth.plugins.groupfolder import GroupFolder
from zope.securitypolicy.interfaces import IPrincipalRoleManager from zope.securitypolicy.interfaces import IPrincipalRoleManager
from zope.securitypolicy.settings import Allow, Deny, Unset
from zope.traversing.api import getParents from zope.traversing.api import getParents
from loops.common import adapted from loops.common import adapted
from loops.security.common import getCurrentPrincipal from loops.security.common import getCurrentPrincipal

View file

@ -1,28 +1,11 @@
# # loops.predicate
# Copyright (c) 2012 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Definition and management of special predicates and corresponding relations.
Definition and management of special predicates and corresponding relations.
""" """
from zope import component, schema from zope import component, schema
from zope.component import adapts from zope.component import adapts
from zope.interface import implements from zope.interface import implementer
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
@ -39,12 +22,11 @@ from loops.type import TypeInterfaceSourceList
TypeInterfaceSourceList.typeInterfaces += (IPredicate,) TypeInterfaceSourceList.typeInterfaces += (IPredicate,)
@implementer(IPredicate)
class Predicate(AdapterBase): class Predicate(AdapterBase):
""" typeInterface adapter for concepts of type 'predicate'. """ typeInterface adapter for concepts of type 'predicate'.
""" """
implements(IPredicate)
_contextAttributes = list(IPredicate) # + list(IConcept) _contextAttributes = list(IPredicate) # + list(IConcept)
def getOptions(self): def getOptions(self):
@ -66,12 +48,12 @@ class PredicateInterfaceSourceList(TypeInterfaceSourceList):
return self.predicateInterfaces return self.predicateInterfaces
@implementer(IRelationAdapter)
class RelationAdapter(AdapterBase): class RelationAdapter(AdapterBase):
""" Base class for adapters to relations that may be used for """ Base class for adapters to relations that may be used for
specifying additional attributes for relations. specifying additional attributes for relations.
""" """
implements(IRelationAdapter)
adapts(IConceptRelation) adapts(IConceptRelation)
@ -91,20 +73,18 @@ def adaptedRelation(relation):
PredicateInterfaceSourceList.predicateInterfaces += ( PredicateInterfaceSourceList.predicateInterfaces += (
IIsSubtype,) IIsSubtype,)
@implementer(IIsSubtype)
class IsSubtype(RelationAdapter): class IsSubtype(RelationAdapter):
""" Allows specification of a predicate for relations between concepts """ Allows specification of a predicate for relations between concepts
of certain types. of certain types.
""" """
implements(IIsSubtype)
_contextAttributes = list(IIsSubtype) _contextAttributes = list(IIsSubtype)
#PredicateInterfaceSourceList.predicateInterfaces += (IMappingAttributeRelation,) #PredicateInterfaceSourceList.predicateInterfaces += (IMappingAttributeRelation,)
#@implementer(IMappingAttributeRelation)
#class MappingAttributeRelation(AdapterBase): #class MappingAttributeRelation(AdapterBase):
#implements(IMappingAttributeRelation)
#_contextAttributes = list(IMappingAttributeRelation) #_contextAttributes = list(IMappingAttributeRelation)

View file

@ -1,29 +1,10 @@
# # loops.record
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Definition of the RecordManager class.
Definition of the View and related classses.
$Id$
""" """
from zope.app.container.btree import BTreeContainer from zope.container.btree import BTreeContainer
from zope.interface import implements from zope.interface import implementer
from zope.traversing.api import getParent from zope.traversing.api import getParent
from cybertools.util.jeep import Jeep from cybertools.util.jeep import Jeep
@ -31,10 +12,9 @@ from loops.interfaces import ILoopsContained
from loops.interfaces import IRecordManager from loops.interfaces import IRecordManager
@implementer(IRecordManager, ILoopsContained)
class RecordManager(BTreeContainer): class RecordManager(BTreeContainer):
implements(IRecordManager, ILoopsContained)
title = 'records' title = 'records'
def getLoopsRoot(self): def getLoopsRoot(self):

310
loops/setup.py Normal file
View file

@ -0,0 +1,310 @@
# loops.setup
""" Automatic setup of a loops site.
"""
import os
from zope.lifecycleevent import ObjectCreatedEvent, ObjectModifiedEvent
from zope.event import notify
from zope import component
from zope.cachedescriptors.property import Lazy
from zope.component import adapts
from zope.interface import implementer, Interface
from zope.traversing.api import getName, traverse
from cybertools.typology.interfaces import IType
from loops.common import adapted
from loops.concept import ConceptManager, Concept
from loops.interfaces import ILoops, ITypeConcept, IPredicate
from loops.interfaces import IFile, IImage, ITextDocument, INote
#from loops.query import IQueryConcept
from loops.record import RecordManager
from loops.resource import ResourceManager, Resource
from loops.view import ViewManager, Node
class ISetupManager(Interface):
""" An object that controls the setup of a loops site.
"""
def setup():
""" Set up a loops site: create all necessary objects and the
relations between them.
"""
@implementer(ISetupManager)
class SetupManager(object):
adapts(ILoops)
def __init__(self, context):
self.context = context
def setup(self):
concepts, resources, views = self.setupManagers()
self.setupCoreConcepts(concepts)
appSetups = dict(component.getAdapters((self.context,), ISetupManager))
for smName in appSetups:
if smName: # skip core (unnamed), i.e. this, adapter
appSetups[smName].setup()
return concepts, resources, views # just for convenience when testing
def setupManagers(self):
loopsRoot = self.context
concepts = self.addObject(loopsRoot, ConceptManager, 'concepts')
resources = self.addObject(loopsRoot, ResourceManager, 'resources')
views = self.addObject(loopsRoot, ViewManager, 'views')
records = self.addObject(loopsRoot, RecordManager, 'records')
return concepts, resources, views
def setupCoreConcepts(self, conceptManager):
typeConcept = self.addObject(conceptManager, Concept, 'type', title=u'Type')
hasType = self.addObject(conceptManager, Concept, 'hasType', title=u'has Type')
predicate = self.addObject(conceptManager, Concept, 'predicate',
title=u'Predicate')
standard = self.addObject(conceptManager, Concept, 'standard',
title=u'subobject')
domain = self.addObject(conceptManager, Concept, 'domain', title=u'Domain')
#query = self.addObject(conceptManager, Concept, 'query', title=u'Query')
file = self.addObject(conceptManager, Concept, 'file', title=u'File')
textdocument = self.addObject(conceptManager, Concept,
'textdocument', title=u'Text')
note = self.addObject(conceptManager, Concept, 'note', title=u'Note')
for c in (typeConcept, domain, note, file, textdocument, predicate):
c.conceptType = typeConcept
notify(ObjectModifiedEvent(c))
ITypeConcept(typeConcept).typeInterface = ITypeConcept
#ITypeConcept(query).typeInterface = IQueryConcept
ITypeConcept(file).typeInterface = IFile
ITypeConcept(textdocument).typeInterface = ITextDocument
ITypeConcept(note).typeInterface = INote
ITypeConcept(note).viewName = 'note.html'
ITypeConcept(predicate).typeInterface = IPredicate
hasType.conceptType = predicate
standard.conceptType = predicate
# standard properties and methods
@Lazy
def concepts(self):
return self.context.getConceptManager()
@Lazy
def resources(self):
return self.context.getResourceManager()
@Lazy
def views(self):
return self.context.getViewManager()
@Lazy
def typeConcept(self):
return self.concepts.getTypeConcept()
@Lazy
def predicateType(self):
return self.concepts.getPredicateType()
def addType(self, name, title, typeInterface=None, **kw):
c = self.addConcept(name, title, self.typeConcept,
typeInterface=typeInterface, **kw)
return c
def addPredicate(self, name, title, **kw):
c = self.addConcept(name, title, self.predicateType, **kw)
return c
def addConcept(self, name, title, conceptType, description=u'',
parentName=None, **kw):
if name in self.concepts:
self.log("Concept '%s' ('%s') already exists." % (name, title))
c = self.concepts[name]
if c.conceptType != conceptType:
self.log("Wrong concept type for '%s': '%s' instead of '%s'." %
(name, getName(c.conceptType), getName(conceptType)))
else:
c = addAndConfigureObject(self.concepts, Concept, name, title=title,
description=description,
conceptType=conceptType, **kw)
self.log("Concept '%s' ('%s') created." % (name, title))
if parentName is not None:
self.assignChild(parentName, name)
return c
def setConceptAttribute(self, concept, attr, value):
setattr(adapted(concept), attr, value)
self.log("Setting Attribute '%s' of '%s' to '%s'." %
(attr, getName(concept), repr(value)))
def assignChild(self, conceptName, childName, predicate=None, **kw):
predicate = self.getPredicate(predicate)
concept = self.concepts[conceptName]
child = self.concepts[childName]
if child in concept.getChildren([predicate]):
self.log("Concept '%s' is already a child of '%s' with predicate '%s'." %
(childName, conceptName, getName(predicate)))
else:
concept.assignChild(child, predicate, **kw)
self.log("Concept '%s' assigned to '%s' with predicate '%s'." %
(childName, conceptName, getName(predicate)))
def deassignChild(self, conceptName, childName, predicate=None):
predicate = self.getPredicate(predicate)
concept = self.concepts[conceptName]
child = self.concepts[childName]
concept.deassignChild(child, [predicate])
self.log("Concept '%s' deassigned from '%s' for predicate '%s'." %
(childName, conceptName, getName(predicate)))
def addResource(self, name, title, resourceType, description=u'', **kw):
if name in self.resources:
self.log("Resource '%s' ('%s') already exists." % (name, title))
c = self.resources[name]
if c.resourceType != resourceType:
self.log("Wrong resource type for '%s': '%s' instead of '%s'." %
(name, getName(c.resourceType), getName(resourceType)))
else:
c = addAndConfigureObject(self.resources, Resource, name, title=title,
description=description,
resourceType=resourceType, **kw)
self.log("Resource '%s' ('%s') created." % (name, title))
return c
def assignResource(self, conceptName, resourceName, predicate=None, **kw):
predicate = self.getPredicate(predicate)
concept = self.concepts[conceptName]
resource = self.resources[resourceName]
if resource in concept.getResources([predicate]):
self.log("Resource '%s' is already assigned to '%s' with predicate '%s'.'" %
(resourceName, conceptName, getName(predicate)))
else:
concept.assignResource(resource, predicate, **kw)
self.log("Resource '%s' assigned to '%s' with predicate '%s'." %
(resourceName, conceptName, getName(predicate)))
def deassignResource(self, conceptName, resourceName, predicate=None):
predicate = self.getPredicate(predicate)
concept = self.concepts[conceptName]
resource = self.resources[resourceName]
concept.deassignResource(resource, [predicate])
self.log("Resource '%s' deassigned from '%s' for predicate '%s'." %
(resourceName, conceptName, getName(predicate)))
def addNode(self, name, title, container=None, nodeType='page',
description=u'', body=u'', target=None, factory=Node, **kw):
if container is None:
container = self.views
nodeType = 'menu'
if name in container:
self.log("Node '%s' ('%s') already exists in '%s'." %
(name, title, getName(container)))
n = container[name]
if n.nodeType != nodeType:
self.log("Wrong node type for '%s': '%s' instead of '%s'." %
(name, n.nodeType, nodeType))
else:
n = addAndConfigureObject(container, factory, name, title=title,
description=description, body=body,
nodeType=nodeType, **kw)
self.log("Node '%s' ('%s') created." % (name, title))
if target is not None:
targetObject = traverse(self, target, None)
if targetObject is not None:
if n.target == targetObject:
self.log("Target '%s' already assigned to node '%s'." %
(target, name))
else:
n.target = targetObject
self.log("Target '%s' assigned to node '%s'." %
(target, name))
else:
self.log("Target '%s' for '%s' does not exist." %
(target, name))
return n
def getPredicate(self, predicate):
if predicate is None:
return self.concepts.getDefaultPredicate()
if isinstance(predicate, basestring):
return self.concepts[predicate]
return predicate
def log(self, message):
if isinstance(message, unicode):
message = message.encode('UTF-8')
print >> self.logger, message
def addObject(self, container, class_, name, **kw):
return addObject(container, class_, name, **kw)
def addAndConfigureObject(self, container, class_, name, **kw):
return addAndConfigureObject(container, class_, name, **kw)
def addObject(container, class_, name, notifyModified=True, **kw):
created = False
if name in container:
obj = container[name]
#return obj
else:
obj = container[name] = class_()
created = True
for attr, value in kw.items():
if attr == 'type':
obj.setType(value)
else:
setattr(obj, attr, value)
if created:
notify(ObjectCreatedEvent(obj))
if notifyModified:
notify(ObjectModifiedEvent(obj))
return obj
def addAndConfigureObject(container, class_, name, notifyModified=True, **kw):
basicAttributes = ('title', 'description', 'conceptType', 'resourceType',
'nodeType', 'body')
basicKw = dict([(k, kw[k]) for k in kw if k in basicAttributes])
obj = addObject(container, class_, name, notifyModified=False, **basicKw)
adapted = obj
if class_ in (Concept, Resource):
ti = IType(obj).typeInterface
if ti is not None:
adapted = ti(obj)
adapterAttributes = [k for k in kw if k not in basicAttributes]
for attr in adapterAttributes:
setattr(adapted, attr, kw[attr])
if notifyModified:
notify(ObjectModifiedEvent(obj))
return obj
def importData(root, importPath, importFileName):
from loops.external.annotation import AnnotationsExtractor
from loops.external.base import Loader
from loops.external.pyfunc import PyReader
component.provideAdapter(AnnotationsExtractor)
dmpFile = open(os.path.join(importPath, importFileName))
data = dmpFile.read()
dmpFile.close()
reader = PyReader()
elements = reader.read(data)
loader = Loader(root, os.path.join(importPath, 'resources'))
loader.load(elements)
class SetupView(object):
""" Allows to carry out setup actions manually.
"""
def __init__(self, context, request):
self.context = context
self.request = request
self.manager = ISetupManager(context)
def setupLoopsSite(self):
self.manager.setup()
return 'Done'

View file

@ -45,7 +45,7 @@ def test_suite():
return unittest.TestSuite(( return unittest.TestSuite((
unittest.makeSuite(Test), unittest.makeSuite(Test),
doctest.DocFileSuite('../README.txt', optionflags=flags), doctest.DocFileSuite('../README.txt', optionflags=flags),
doctest.DocFileSuite('../helpers.txt', optionflags=flags), #doctest.DocFileSuite('../helpers.txt', optionflags=flags),
)) ))
if __name__ == '__main__': if __name__ == '__main__':

View file

@ -1,28 +1,11 @@
# # loops.type
# Copyright (c) 2013 Helmut Merz helmutm@cy55.de
#
# 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
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
#
""" """ Type management stuff.
Type management stuff.
""" """
from zope import component, schema from zope import component, schema
from zope.component import adapts from zope.component import adapts
from zope.interface import implements from zope.interface import implementer
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
@ -255,12 +238,11 @@ class LoopsTypeManager(TypeManager):
#for cls in (Document, MediaAsset)]) #for cls in (Document, MediaAsset)])
@implementer(ITypeConcept)
class TypeConcept(AdapterBase): class TypeConcept(AdapterBase):
""" typeInterface adapter for concepts of type 'type'. """ typeInterface adapter for concepts of type 'type'.
""" """
implements(ITypeConcept)
_contextAttributes = list(ITypeConcept) + list(IConcept) _contextAttributes = list(ITypeConcept) + list(IConcept)
def getTypeInterface(self): def getTypeInterface(self):
@ -286,10 +268,9 @@ class TypeConcept(AdapterBase):
return [adapted(c) for c in self.context.getChildren([tp])] return [adapted(c) for c in self.context.getChildren([tp])]
@implementer(schema.interfaces.IIterableSource)
class TypeInterfaceSourceList(object): class TypeInterfaceSourceList(object):
implements(schema.interfaces.IIterableSource)
typeInterfaces = (ITypeConcept, IFile, IExternalFile, ITextDocument, INote, typeInterfaces = (ITypeConcept, IFile, IExternalFile, ITextDocument, INote,
IOptions) IOptions)

View file

@ -19,6 +19,8 @@ dependencies = [
"zope.app.renderer", "zope.app.renderer",
"zope.browsermenu", "zope.browsermenu",
"zope.i18n", "zope.i18n",
"zope.pluggableauth",
"zope.principalannotation",
"zope.securitypolicy", "zope.securitypolicy",
"zope.site", "zope.site",
"zope.thread", "zope.thread",