diff --git a/composer/report/field.py b/composer/report/field.py index 010013b..cf9bf41 100644 --- a/composer/report/field.py +++ b/composer/report/field.py @@ -121,9 +121,8 @@ class Field(Component): return self.getValue(row) def getSortValue(self, row): - # TODO: consider 'descending' flag (?use raw value instead of formatted one?) + # TODO: consider 'descending' flag return self.getValue(row) - #return getattr(row, self.name, None) class CalculatedField(Field): diff --git a/composer/report/result.py b/composer/report/result.py index ba39a70..5d5bcbc 100644 --- a/composer/report/result.py +++ b/composer/report/result.py @@ -121,8 +121,17 @@ class ResultSet(object): row.sequenceNumber = idx + 1 return result + @Lazy + def result(self): + return self.getResult() + def __iter__(self): - return iter(self.getResult()) + return iter(self.result) + + def first(self): + if len(self.result) > 0: + return self.result[0] + return self.rowFactory(None, self) @Lazy def displayedColumns(self): diff --git a/organize/work.py b/organize/work.py index ba4bcb7..7168006 100644 --- a/organize/work.py +++ b/organize/work.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2011 Helmut Merz helmutm@cy55.de +# 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 @@ -18,8 +18,6 @@ """ Planning and recording activities (work items). - -$Id$ """ from zope import component @@ -42,7 +40,8 @@ _not_found = object() def workItemStates(): return StatesDefinition('workItemStates', State('new', 'new', - ('plan', 'accept', 'start', 'work', 'finish', 'delegate', 'cancel'), + ('plan', 'accept', 'start', 'work', 'finish', 'delegate', + 'cancel'), color='red'), State('planned', 'planned', ('plan', 'accept', 'start', 'work', 'finish', 'delegate', @@ -67,13 +66,13 @@ def workItemStates(): State('closed', 'closed', (), color='lightblue'), # not directly reachable states: State('delegated', 'delegated', - ('plan', 'accept', 'start', 'work', 'finish', 'close', 'delegate', - 'move', 'cancel', 'modify'), + ('plan', 'accept', 'start', 'work', 'finish', 'close', + 'delegate', 'move', 'cancel', 'modify'), color='purple'), State('delegated_x', 'delegated', (), color='purple'), State('moved', 'moved', - ('plan', 'accept', 'start', 'work', 'finish', 'close', 'delegate', - 'move', 'cancel', 'modify'), + ('plan', 'accept', 'start', 'work', 'finish', 'close', + 'delegate', 'move', 'cancel', 'modify'), color='grey'), State('moved_x', 'moved', (), color='grey'), State('replaced', 'replaced', (), color='grey'), @@ -95,7 +94,7 @@ def workItemStates(): fieldNames = ['title', 'description', 'start', 'end', 'duration', 'effort', - 'comment', 'party'] + 'comment', 'party'] # for use in editingRules # meaning: - not editable, value=default # / not editable, value=None @@ -125,11 +124,11 @@ class WorkItem(Stateful, Track): implements(IWorkItem) - statesDefinition = 'organize.workItemStates' - metadata_attributes = Track.metadata_attributes + ('state',) index_attributes = metadata_attributes typeName = 'WorkItem' + typeInterface = IWorkItem + statesDefinition = 'organize.workItemStates' initAttributes = set(['party', 'title', 'description', 'start', 'end', 'duration', 'effort']) @@ -141,7 +140,8 @@ class WorkItem(Stateful, Track): self.data['created'] = self.timeStamp def getStatesDefinition(self): - return component.getUtility(IStatesDefinition, name=self.statesDefinition) + return component.getUtility(IStatesDefinition, + name=self.statesDefinition) @property def party(self): @@ -165,7 +165,7 @@ class WorkItem(Stateful, Track): return self.data.get('effort') or self.duration def __getattr__(self, attr): - if attr not in IWorkItem: + if attr not in self.typeInterface: raise AttributeError(attr) return self.data.get(attr) @@ -231,8 +231,10 @@ class WorkItem(Stateful, Track): def move(self, userName, **kw): moved = self.createNew('move', userName, **kw) + moved.userName = self.userName moved.state = 'moved' - moved.reindex('state') + #moved.reindex('state') + moved.reindex() task = kw.pop('task', None) new = moved.createNew(None, userName, taskId=task, runId=0, **kw) new.userName = self.userName diff --git a/util/html.py b/util/html.py index 51b15df..69aade7 100644 --- a/util/html.py +++ b/util/html.py @@ -79,6 +79,7 @@ def checkStyle(k): def stripAll(value): + value = sanitize(value) def collectText(tags): for tag in tags: if type(tag) is NavigableString: