make job processing and export more informative
git-svn-id: svn://svn.cy55.de/Zope3/src/loops/trunk@3653 fd906abe-77d9-0310-91a1-e0d9ade77398
This commit is contained in:
parent
504092b268
commit
f9ac640529
6 changed files with 56 additions and 20 deletions
15
external/base.py
vendored
15
external/base.py
vendored
|
@ -92,6 +92,8 @@ class Extractor(Base):
|
||||||
|
|
||||||
implements(IExtractor)
|
implements(IExtractor)
|
||||||
|
|
||||||
|
count = 0
|
||||||
|
|
||||||
def extract(self):
|
def extract(self):
|
||||||
return itertools.chain(self.extractTypes(),
|
return itertools.chain(self.extractTypes(),
|
||||||
self.extractConcepts(),
|
self.extractConcepts(),
|
||||||
|
@ -107,25 +109,30 @@ class Extractor(Base):
|
||||||
data = self.getObjectData(obj)
|
data = self.getObjectData(obj)
|
||||||
element = typeElement(getName(obj), obj.title, **data)
|
element = typeElement(getName(obj), obj.title, **data)
|
||||||
self.provideSubElements(obj, element)
|
self.provideSubElements(obj, element)
|
||||||
|
self.count += 1
|
||||||
yield element
|
yield element
|
||||||
|
|
||||||
def extractConcepts(self):
|
def extractConcepts(self):
|
||||||
for name, obj in self.concepts.items():
|
for name, obj in self.concepts.items():
|
||||||
if obj.conceptType != self.typeConcept:
|
if obj.conceptType != self.typeConcept:
|
||||||
|
self.count += 1
|
||||||
yield self.getConceptElement(name, obj)
|
yield self.getConceptElement(name, obj)
|
||||||
|
|
||||||
def extractResources(self):
|
def extractResources(self):
|
||||||
for name, obj in self.resources.items():
|
for name, obj in self.resources.items():
|
||||||
|
self.count += 1
|
||||||
yield self.getResourceElement(name, obj)
|
yield self.getResourceElement(name, obj)
|
||||||
|
|
||||||
def extractChildren(self):
|
def extractChildren(self):
|
||||||
for c in self.concepts.values():
|
for c in self.concepts.values():
|
||||||
for r in self.getChildRelations(c):
|
for r in self.getChildRelations(c):
|
||||||
|
self.count += 1
|
||||||
yield r
|
yield r
|
||||||
|
|
||||||
def extractResourceRelations(self):
|
def extractResourceRelations(self):
|
||||||
for c in self.concepts.values():
|
for c in self.concepts.values():
|
||||||
for r in self.getResourceRelations(c):
|
for r in self.getResourceRelations(c):
|
||||||
|
self.count += 1
|
||||||
yield r
|
yield r
|
||||||
|
|
||||||
def extractNodes(self, parent=None, path=''):
|
def extractNodes(self, parent=None, path=''):
|
||||||
|
@ -144,10 +151,12 @@ class Extractor(Base):
|
||||||
or elementTypes['node'])
|
or elementTypes['node'])
|
||||||
elem = elementClass(name, obj.title, path, obj.nodeType, **data)
|
elem = elementClass(name, obj.title, path, obj.nodeType, **data)
|
||||||
self.provideSubElements(obj, elem)
|
self.provideSubElements(obj, elem)
|
||||||
|
self.count += 1
|
||||||
yield elem
|
yield elem
|
||||||
childPath = path and '/'.join((path, name)) or name
|
childPath = path and '/'.join((path, name)) or name
|
||||||
for elem in self.extractNodes(obj, childPath):
|
for elem in self.extractNodes(obj, childPath):
|
||||||
#self.provideSubElements(obj, elem)
|
#self.provideSubElements(obj, elem)
|
||||||
|
self.count += 1
|
||||||
yield elem
|
yield elem
|
||||||
|
|
||||||
def extractForParents(self, parents, predicates=None,
|
def extractForParents(self, parents, predicates=None,
|
||||||
|
@ -158,10 +167,12 @@ class Extractor(Base):
|
||||||
conceptList = sorted(concepts, key=lambda x:
|
conceptList = sorted(concepts, key=lambda x:
|
||||||
(x.conceptType != self.typeConcept, getName(x)))
|
(x.conceptType != self.typeConcept, getName(x)))
|
||||||
for c in conceptList:
|
for c in conceptList:
|
||||||
|
self.count += 1
|
||||||
yield self.getConceptElement(getName(c), c)
|
yield self.getConceptElement(getName(c), c)
|
||||||
for c in conceptList:
|
for c in conceptList:
|
||||||
for r in c.getChildRelations(predicates):
|
for r in c.getChildRelations(predicates):
|
||||||
if r.predicate != self.typePredicate and r.second in concepts:
|
if r.predicate != self.typePredicate and r.second in concepts:
|
||||||
|
self.count += 1
|
||||||
yield self.getChildElement(r)
|
yield self.getChildElement(r)
|
||||||
if includeResources:
|
if includeResources:
|
||||||
resources = set()
|
resources = set()
|
||||||
|
@ -169,10 +180,12 @@ class Extractor(Base):
|
||||||
for obj in c.getResources(predicates):
|
for obj in c.getResources(predicates):
|
||||||
if obj not in resources:
|
if obj not in resources:
|
||||||
resources.add(obj)
|
resources.add(obj)
|
||||||
|
self.count += 1
|
||||||
yield self.getResourceElement(getName(obj), obj)
|
yield self.getResourceElement(getName(obj), obj)
|
||||||
for c in conceptList:
|
for c in conceptList:
|
||||||
for r in c.getResourceRelations(predicates):
|
for r in c.getResourceRelations(predicates):
|
||||||
if r.predicate != self.typePredicate and r.second in resources:
|
if r.predicate != self.typePredicate and r.second in resources:
|
||||||
|
self.count += 1
|
||||||
yield self.getResourceRelationElement(r)
|
yield self.getResourceRelationElement(r)
|
||||||
|
|
||||||
def collectConcepts(self, concept, predicates, includeSubconcepts, concepts):
|
def collectConcepts(self, concept, predicates, includeSubconcepts, concepts):
|
||||||
|
@ -216,6 +229,7 @@ class Extractor(Base):
|
||||||
def getChildRelations(self, c, predicates=None):
|
def getChildRelations(self, c, predicates=None):
|
||||||
for r in c.getChildRelations(predicates):
|
for r in c.getChildRelations(predicates):
|
||||||
if r.predicate != self.typePredicate:
|
if r.predicate != self.typePredicate:
|
||||||
|
self.count += 1
|
||||||
yield self.getChildElement(r)
|
yield self.getChildElement(r)
|
||||||
|
|
||||||
def getChildElement(self, r):
|
def getChildElement(self, r):
|
||||||
|
@ -229,6 +243,7 @@ class Extractor(Base):
|
||||||
def getResourceRelations(self, c, predicates=None):
|
def getResourceRelations(self, c, predicates=None):
|
||||||
for r in c.getResourceRelations(predicates):
|
for r in c.getResourceRelations(predicates):
|
||||||
if r.predicate != self.typePredicate:
|
if r.predicate != self.typePredicate:
|
||||||
|
self.count += 1
|
||||||
yield self.getResourceRelationElement(r)
|
yield self.getResourceRelationElement(r)
|
||||||
|
|
||||||
def getResourceRelationElement(self, r):
|
def getResourceRelationElement(self, r):
|
||||||
|
|
|
@ -40,6 +40,7 @@ method. As we haven't yet defined any job managers nothing happens.
|
||||||
|
|
||||||
>>> executor = Executor(loopsRoot, TestRequest())
|
>>> executor = Executor(loopsRoot, TestRequest())
|
||||||
>>> executor.processJobs()
|
>>> executor.processJobs()
|
||||||
|
'No job managers available.'
|
||||||
|
|
||||||
We now register a job manager via an options setting on the loops root object.
|
We now register a job manager via an options setting on the loops root object.
|
||||||
As the corresponding job manager is not yet defined an registered a
|
As the corresponding job manager is not yet defined an registered a
|
||||||
|
@ -47,7 +48,7 @@ warning is issued.
|
||||||
|
|
||||||
>>> loopsRoot.options = ['organize.job.managers:loops_notifier']
|
>>> loopsRoot.options = ['organize.job.managers:loops_notifier']
|
||||||
>>> executor = Executor(loopsRoot, TestRequest())
|
>>> executor = Executor(loopsRoot, TestRequest())
|
||||||
>>> executor.processJobs()
|
>>> r = executor.processJobs()
|
||||||
Job manager 'loops_notifier' not found.
|
Job manager 'loops_notifier' not found.
|
||||||
|
|
||||||
So let's now define a job manager class and register it as an adapter for
|
So let's now define a job manager class and register it as an adapter for
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
|
# Copyright (c) 2009 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
|
||||||
|
@ -48,9 +48,18 @@ class Executor(object):
|
||||||
return getLogger('loops.organize.job')
|
return getLogger('loops.organize.job')
|
||||||
|
|
||||||
def processJobs(self):
|
def processJobs(self):
|
||||||
for name in self.options('organize.job.managers', []):
|
output = []
|
||||||
|
names = [n for n in self.request.get('job_managers', '').split(',') if n]
|
||||||
|
if not names:
|
||||||
|
names = self.options('organize.job.managers', [])
|
||||||
|
for name in names:
|
||||||
manager = component.queryAdapter(self.context, IJobManager, name=name)
|
manager = component.queryAdapter(self.context, IJobManager, name=name)
|
||||||
if manager is None:
|
if manager is None:
|
||||||
self.logger.warn("Job manager '%s' not found." % name)
|
msg = "Job manager '%s' not found." % name
|
||||||
|
self.logger.warn(msg)
|
||||||
|
output.append(msg)
|
||||||
else:
|
else:
|
||||||
manager.process()
|
output.append(manager.process())
|
||||||
|
if not output:
|
||||||
|
return 'No job managers available.'
|
||||||
|
return '\n'.join(m for m in output if m)
|
||||||
|
|
|
@ -126,6 +126,7 @@ of job control.
|
||||||
>>> rm = AccessRecordManager(loopsRoot)
|
>>> rm = AccessRecordManager(loopsRoot)
|
||||||
>>> rm.baseDir = testDir
|
>>> rm.baseDir = testDir
|
||||||
>>> rm.loadRecordsFromLog()
|
>>> rm.loadRecordsFromLog()
|
||||||
|
'AccessRecordManager: 2 records loaded.'
|
||||||
>>> len(access)
|
>>> len(access)
|
||||||
2
|
2
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
#
|
#
|
||||||
# Copyright (c) 2008 Helmut Merz helmutm@cy55.de
|
# Copyright (c) 2009 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
|
||||||
|
@ -105,7 +105,7 @@ class AccessRecordManager(BaseRecordManager, JobManager):
|
||||||
self.baseDir = util.getVarDirectory()
|
self.baseDir = util.getVarDirectory()
|
||||||
|
|
||||||
def process(self):
|
def process(self):
|
||||||
self.loadRecordsFromLog()
|
return self.loadRecordsFromLog()
|
||||||
|
|
||||||
@Lazy
|
@Lazy
|
||||||
def logfile(self):
|
def logfile(self):
|
||||||
|
@ -116,9 +116,14 @@ class AccessRecordManager(BaseRecordManager, JobManager):
|
||||||
def valid(self):
|
def valid(self):
|
||||||
return self.storage is not None and self.logfile
|
return self.storage is not None and self.logfile
|
||||||
|
|
||||||
|
@Lazy
|
||||||
|
def log(self):
|
||||||
|
return logging.getLogger('AccessRecordManager')
|
||||||
|
|
||||||
def loadRecordsFromLog(self):
|
def loadRecordsFromLog(self):
|
||||||
if not self.valid:
|
if not self.valid:
|
||||||
return
|
return 'AccessRecordManager: Feature not available.'
|
||||||
|
count = 0
|
||||||
fn = self.logfile
|
fn = self.logfile
|
||||||
path = os.path.join(self.baseDir, fn)
|
path = os.path.join(self.baseDir, fn)
|
||||||
logger = loggers.get(fn)
|
logger = loggers.get(fn)
|
||||||
|
@ -128,27 +133,28 @@ class AccessRecordManager(BaseRecordManager, JobManager):
|
||||||
return
|
return
|
||||||
lf = open(path, 'r')
|
lf = open(path, 'r')
|
||||||
for idx, line in enumerate(lf):
|
for idx, line in enumerate(lf):
|
||||||
self.processLogRecord(idx, line)
|
if self.processLogRecord(idx, line):
|
||||||
|
count += 1
|
||||||
lf.close()
|
lf.close()
|
||||||
transaction.commit()
|
transaction.commit()
|
||||||
logger.doRollover()
|
logger.doRollover()
|
||||||
|
self.log.info('%i records loaded.' % count)
|
||||||
|
return 'AccessRecordManager: %i records loaded.' % count
|
||||||
|
|
||||||
def processLogRecord(self, idx, line):
|
def processLogRecord(self, idx, line):
|
||||||
if not line:
|
if not line:
|
||||||
return
|
return False
|
||||||
values = line.split(';')
|
values = line.split(';')
|
||||||
timeString = values.pop(0)
|
timeString = values.pop(0)
|
||||||
version = values.pop(0)
|
version = values.pop(0)
|
||||||
if version not in fields:
|
if version not in fields:
|
||||||
logging.getLogger('AccessRecordManager').warn(
|
self.log.warn('Undefined logging record version %r on record %i.'
|
||||||
'Undefined logging record version %r on record %i.'
|
|
||||||
% (version, idx))
|
% (version, idx))
|
||||||
return
|
return False
|
||||||
if len(values) != len(fields[version]):
|
if len(values) != len(fields[version]):
|
||||||
logging.getLogger('AccessRecordManager').warn(
|
self.log.warn('Length of record %i does not match version %r.'
|
||||||
'Length of record %i does not match version %r.'
|
|
||||||
% (idx, version))
|
% (idx, version))
|
||||||
return
|
return False
|
||||||
data = {}
|
data = {}
|
||||||
for idx, field in enumerate(fields[version]):
|
for idx, field in enumerate(fields[version]):
|
||||||
data[field] = values[idx]
|
data[field] = values[idx]
|
||||||
|
@ -159,9 +165,10 @@ class AccessRecordManager(BaseRecordManager, JobManager):
|
||||||
timeStamp=timeStamp)
|
timeStamp=timeStamp)
|
||||||
for track in existing:
|
for track in existing:
|
||||||
if track.data == data: # has been recorded already
|
if track.data == data: # has been recorded already
|
||||||
return
|
return False
|
||||||
self.storage.saveUserTrack(taskId, 0, personId, data,
|
self.storage.saveUserTrack(taskId, 0, personId, data,
|
||||||
timeStamp=timeStamp)
|
timeStamp=timeStamp)
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
class AccessRecordManagerView(AccessRecordManager):
|
class AccessRecordManagerView(AccessRecordManager):
|
||||||
|
|
|
@ -35,6 +35,7 @@ from cybertools.composer.schema.field import FieldInstance, NumberFieldInstance
|
||||||
from cybertools.composer.schema.field import DateFieldInstance, BooleanFieldInstance
|
from cybertools.composer.schema.field import DateFieldInstance, BooleanFieldInstance
|
||||||
from cybertools.composer.schema.field import EmailFieldInstance, ListFieldInstance
|
from cybertools.composer.schema.field import EmailFieldInstance, ListFieldInstance
|
||||||
from cybertools.composer.schema.field import FileUploadFieldInstance
|
from cybertools.composer.schema.field import FileUploadFieldInstance
|
||||||
|
from cybertools.composer.schema.grid.field import RecordsFieldInstance
|
||||||
from cybertools.composer.schema.instance import Instance, Editor
|
from cybertools.composer.schema.instance import Instance, Editor
|
||||||
from cybertools.relation.tests import IntIdsStub
|
from cybertools.relation.tests import IntIdsStub
|
||||||
from cybertools.relation.registry import RelationRegistry, IIndexableRelation
|
from cybertools.relation.registry import RelationRegistry, IIndexableRelation
|
||||||
|
@ -70,7 +71,7 @@ from loops.resource import Document, MediaAsset
|
||||||
from loops.resource import IndexAttributes as ResourceIndexAttributes
|
from loops.resource import IndexAttributes as ResourceIndexAttributes
|
||||||
from loops.schema.factory import ResourceSchemaFactory, FileSchemaFactory, \
|
from loops.schema.factory import ResourceSchemaFactory, FileSchemaFactory, \
|
||||||
NoteSchemaFactory
|
NoteSchemaFactory
|
||||||
from loops.schema.field import RelationSetFieldInstance
|
from loops.schema.field import RelationFieldInstance, RelationSetFieldInstance
|
||||||
from loops.security.common import grantAcquiredSecurity, revokeAcquiredSecurity
|
from loops.security.common import grantAcquiredSecurity, revokeAcquiredSecurity
|
||||||
from loops.security.policy import LoopsSecurityPolicy
|
from loops.security.policy import LoopsSecurityPolicy
|
||||||
from loops.security.setter import BaseSecuritySetter
|
from loops.security.setter import BaseSecuritySetter
|
||||||
|
@ -152,6 +153,8 @@ class TestSite(object):
|
||||||
component.provideAdapter(BooleanFieldInstance, name='boolean')
|
component.provideAdapter(BooleanFieldInstance, name='boolean')
|
||||||
component.provideAdapter(ListFieldInstance, name='list')
|
component.provideAdapter(ListFieldInstance, name='list')
|
||||||
component.provideAdapter(FileUploadFieldInstance, name='fileupload')
|
component.provideAdapter(FileUploadFieldInstance, name='fileupload')
|
||||||
|
component.provideAdapter(RecordsFieldInstance, name='records')
|
||||||
|
component.provideAdapter(RelationFieldInstance, name='relation')
|
||||||
component.provideAdapter(RelationSetFieldInstance, name='relationset')
|
component.provideAdapter(RelationSetFieldInstance, name='relationset')
|
||||||
component.provideAdapter(SchemaFactory)
|
component.provideAdapter(SchemaFactory)
|
||||||
component.provideAdapter(ResourceSchemaFactory)
|
component.provideAdapter(ResourceSchemaFactory)
|
||||||
|
|
Loading…
Add table
Reference in a new issue