From 74eb054bc9e98b65063941e38517240bc5d7b617 Mon Sep 17 00:00:00 2001 From: Helmut Merz Date: Fri, 20 Mar 2015 08:03:14 +0100 Subject: [PATCH] filter qualification reports by contact state --- knowledge/qualification/report.py | 23 ++++++++++++++++++----- locales/de/LC_MESSAGES/loops.mo | Bin 26265 -> 26518 bytes locales/de/LC_MESSAGES/loops.po | 20 +++++++++++++++++++- organize/stateful/contact.py | 6 +++--- organize/work/report.py | 12 ++++++++++++ 5 files changed, 52 insertions(+), 9 deletions(-) diff --git a/knowledge/qualification/report.py b/knowledge/qualification/report.py index 494bb97..0bbc0b0 100644 --- a/knowledge/qualification/report.py +++ b/knowledge/qualification/report.py @@ -1,5 +1,5 @@ # -# Copyright (c) 2014 Helmut Merz helmutm@cy55.de +# 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 @@ -22,6 +22,7 @@ Qualification management report definitions. from zope.cachedescriptors.property import Lazy +from cybertools.composer.report.base import LeafQueryCriteria, CompoundQueryCriteria from cybertools.util.jeep import Jeep from loops.expert.report import ReportInstance from loops.organize.work.report import WorkRow @@ -39,13 +40,12 @@ class QualificationOverview(ReportInstance): rowFactory = WorkRow - fields = Jeep((task, party, workTitle, dayStart, dayEnd, state,)) - #partyState,)) # +deadline? + fields = Jeep((task, party, workTitle, dayStart, dayEnd, state, + partyState,)) # +deadline? - defaultOutputFields = fields + defaultOutputFields = Jeep(list(fields)[:-1]) defaultSortCriteria = (party, task,) - def getOptions(self, option): return self.view.options(option) @@ -53,6 +53,14 @@ class QualificationOverview(ReportInstance): def states(self): return self.getOptions('report_select_state' or ('planned',)) + @property + def queryCriteria(self): + crit = self.context.queryCriteria or [] + f = self.fields.partyState + crit.append( + LeafQueryCriteria(f.name, f.operator, 'active', f)) + return CompoundQueryCriteria(crit) + def selectObjects(self, parts): result = [] workItems = self.recordManager['work'] @@ -112,6 +120,11 @@ class PersonQualifications(QualificationOverview): def getOptions(self, option): return self.view.typeOptions(option) + @property + def queryCriteria(self): + crit = self.context.queryCriteria or [] + return CompoundQueryCriteria(crit) + def selectObjects(self, parts): workItems = self.recordManager['work'] person = self.view.context diff --git a/locales/de/LC_MESSAGES/loops.mo b/locales/de/LC_MESSAGES/loops.mo index 8067eef3cf1a1af1c730a4a8073b8781270d3692..0b5e42c40c4c84b9df3828c1a5628129e8302f72 100644 GIT binary patch delta 9723 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 SBkRnGF%#Wt1&cE(`TQ^M9~d(L delta 9487 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 Vy7=S;4}LH2\n" "Language-Team: loops developers \n" "MIME-Version: 1.0\n" @@ -1134,6 +1134,9 @@ msgstr "Bemerkung" msgid "desc_transition_comments" msgstr "Notizen zum Statusübergang." +msgid "contact_states" +msgstr "Kontaktstatus" + # state names msgid "accepted" @@ -1202,6 +1205,12 @@ msgstr "unklassifiziert" msgid "verified" msgstr "verifiziert" +msgid "prospective" +msgstr "künftig" + +msgid "inactive" +msgstr "inaktiv" + # transitions msgid "accept" @@ -1276,6 +1285,15 @@ msgstr "verifizieren" msgid "work" msgstr "bearbeiten" +msgid "activate" +msgstr "aktivieren" + +msgid "inactivate" +msgstr "inaktiv setzen" + +msgid "reset" +msgstr "zurücksetzen" + # calendar msgid "Monday" diff --git a/organize/stateful/contact.py b/organize/stateful/contact.py index 77f0ed8..d4db17b 100644 --- a/organize/stateful/contact.py +++ b/organize/stateful/contact.py @@ -40,12 +40,12 @@ def contactStates(): return StatesDefinition('contact_states', State('prospective', 'prospective', ('activate', 'inactivate',), color='blue'), - State('active', 'active', ('retract', 'inactivate',), + State('active', 'active', ('reset', 'inactivate',), color='green'), - State('inactive', 'inactive', ('activate',), + State('inactive', 'inactive', ('activate', 'reset'), color='x'), Transition('activate', 'activate', 'active'), - Transition('retract', 'retract', 'prospective'), + Transition('reset', 'reset', 'prospective'), Transition('inactivate', 'inactivate', 'inactive'), initialState='active') diff --git a/organize/work/report.py b/organize/work/report.py index 648a4af..65e77d7 100644 --- a/organize/work/report.py +++ b/organize/work/report.py @@ -81,6 +81,18 @@ class DurationField(Field): class PartyStateField(StateField): + def getValue(self, row): + context = row.context + if context is None: + return None + party = util.getObjectForUid(context.party) + ptype = adapted(party.conceptType) + stdefs = IOptions(ptype)('organize.stateful') or [] + if self.statesDefinition in stdefs: + stf = getAdapter(party, IStateful, + name=self.statesDefinition) + return stf.state + def getContext(self, row): if row.context is None: return None