From 945c158fc4fce0919c07278c2825e17899f24b7c Mon Sep 17 00:00:00 2001 From: Jean-Paul Smets <jp@nexedi.com> Date: Thu, 11 Jun 2009 06:37:10 +0000 Subject: [PATCH] Updated interface definition for business process related classes git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@27509 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5/Document/BusinessPath.py | 76 +++++++++---------- product/ERP5/Document/BusinessProcess.py | 14 +++- product/ERP5/Document/BusinessState.py | 17 +++-- product/ERP5/interfaces/arrow_base.py | 46 +++++++++++ product/ERP5/interfaces/business_buildable.py | 5 ++ product/ERP5/interfaces/business_state.py | 4 + 6 files changed, 114 insertions(+), 48 deletions(-) create mode 100644 product/ERP5/interfaces/arrow_base.py diff --git a/product/ERP5/Document/BusinessPath.py b/product/ERP5/Document/BusinessPath.py index aeb20d0f32..43b8f6cc0d 100644 --- a/product/ERP5/Document/BusinessPath.py +++ b/product/ERP5/Document/BusinessPath.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ############################################################################## # # Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. @@ -39,39 +40,27 @@ import zope.interface class BusinessPath(Path): """ The BusinessPath class embeds all information related to - lead times and parties involved at a give phase of a business + lead times and parties involved at a given phase of a business process. - BusinessPath are also used as helper to build buildable movements. - Here is the typical code of an alarm: - - Approach 1: explanation per explanation - builder = portal_deliveries.default_order_builder - for path in builder.getSpecialiseRelatedValueList() # or wharever category - for explanation in portal_catalog(buildable=1, portal_type='Order'): - path.build(explanation) - - Pros: easy explanation based approach - Cons: buildable column added in delivery table - reexpand of a finished order might generate remaining buildable + BusinessPath are also used as helper to build deliveries from + buildable movements. Here is the typical code of an alarm + in charge of the building process. - Approach 2: isBuildable is indexed for SimulationMovements - isBuildable() method is added to SimulationMovement + The idea is to invoke isBuildable() on the collected simulation + movements (which are orphan) during build "after select" process - Pros: global select is possible - Cons: reindex of simulation is required - slow indexing - - Approach 3: isBuildable is invoked during build "after select" process builder = portal_deliveries.default_order_builder for path in builder.getSpecialiseRelatedValueList() # or wharever category builder.build(causality_uid=path.getUid(),) # Select movemenents - Pros: global select is possible - Cons: global select retrieves long lists - slow build + Pros: global select is possible by not providing a causality_uid + Cons: global select retrieves long lists of orphan movements which + are not yet buildable + the build process could be rather slow or require activities - Method 3 is best + TODO: + - finish build process implementation """ meta_type = 'ERP5 Business Path' portal_type = 'Business Path' @@ -95,16 +84,20 @@ class BusinessPath(Path): # Declarative interfaces zope.interface.implements(interfaces.ICategoryAccessProvider, - interfaces.IArrow) + interfaces.IArrowBase, + interfaces.IBusinessPath, + interfaces.IBusinessBuildable, + interfaces.IBusinessCompletable + ) - # IBusinessPath Interface + # IArrowBase implementation security.declareProtected(Permissions.AccessContentsInformation, 'getSourceBaseCategoryList') def getSourceBaseCategoryList(self): """ Returns all categories which are used to define the source of this Arrow """ - # Naive implementation - we must use category groups instead + # Naive implementation - we must use category groups instead - XXX return ('source', 'source_section', 'source_payment', 'source_project', ) security.declareProtected(Permissions.AccessContentsInformation, 'getDestinationBaseCategoryList') @@ -113,7 +106,7 @@ class BusinessPath(Path): Returns all categories which are used to define the destination of this Arrow """ - # Naive implementation - we must use category groups instead + # Naive implementation - we must use category groups instead - XXX return ('destination', 'destination_section', 'destination_payment', 'destination_project', ) # ICategoryAccessProvider overriden methods @@ -172,7 +165,7 @@ class BusinessPath(Path): return method(context) return [] - # Core API + # IBusinessBuildable implementation def isBuildable(self, explanation): """ """ @@ -192,13 +185,24 @@ class BusinessPath(Path): Not sure if this will exist some day XXX """ - def _getRelatedSimulationMovementList(self, explanation): + def build(self, explanation): + """ + Build + """ + builder_list = self.getBuilderList() # Missing method + for builder in builder_list: + builder.build(causality_uid=self.getUid()) # This is one way of doing + builder.build(movement_relative_url_list= + self._getRelatedSimulationMovementList(explanation)) # Another way + + def _getRelatedSimulationMovementList(self, explanation): # XXX - What API ? """ """ return self.getCausalityRelatedValueList(portal_type='Simulation Movement', explanation_uid=explanation.getUid()) + # IBusinessCompletable implementation def isCompleted(self, explanation): """ Looks at all simulation related movements @@ -234,17 +238,7 @@ class BusinessPath(Path): return False return True - def build(self, explanation): - """ - Build - """ - builder_list = self.getBuilderList() # Missing method - for builder in builder_list: - builder.build(causality_uid=self.getUid()) # This is one way of doing - builder.build(movement_relative_url_list= - self._getRelatedSimulationMovementList(explanation)) # Another way - - # Date calculation + # IBusinessPath implementation def getExpectedStartDate(self, explanation, predecessor_date=None, *args, **kwargs): """ Returns the expected start date for this diff --git a/product/ERP5/Document/BusinessProcess.py b/product/ERP5/Document/BusinessProcess.py index bc06d2a63e..e0d4d93a4f 100644 --- a/product/ERP5/Document/BusinessProcess.py +++ b/product/ERP5/Document/BusinessProcess.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ############################################################################## # # Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. @@ -34,11 +35,16 @@ from Products.ERP5Type import Permissions, PropertySheet, Constraint, interfaces from Products.ERP5Type.XMLObject import XMLObject from Products.ERP5.Document.Path import Path +import zope.interface + class BusinessProcess(Path, XMLObject): """ The BusinessProcess class is a container class which is used to describe business processes in the area of trade, payroll and production. + + TODO: + - finish interface implementation """ meta_type = 'ERP5 Business Process' portal_type = 'Business Process' @@ -59,6 +65,10 @@ class BusinessProcess(Path, XMLObject): , PropertySheet.BusinessProcess ) + # Declarative interfaces + zope.interface.implements(interfaces.IBusinessProcess, + interfaces.IArrowBase) + # Access to path and states of the business process security.declareProtected(Permissions.AccessContentsInformation, 'getPathValueList') def getPathValueList(self, trade_phase, context=None, **kw): @@ -180,10 +190,10 @@ class BusinessProcess(Path, XMLObject): for path in self.getBuildablePathValueList(explanation): path.build(explanation) - def isStartDateReferential(self): + def isStartDateReferential(self): # XXX - not in interface return self.getReferentialDate() == 'start_date' - def isStopDateReferential(self): + def isStopDateReferential(self): # XXX - not in interface return self.getReferentialDate() == 'stop_date' def getTradePhaseList(self): diff --git a/product/ERP5/Document/BusinessState.py b/product/ERP5/Document/BusinessState.py index d3bcbaa14a..5ba7b8b011 100644 --- a/product/ERP5/Document/BusinessState.py +++ b/product/ERP5/Document/BusinessState.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ############################################################################## # # Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. @@ -33,11 +34,13 @@ from AccessControl import ClassSecurityInfo from Products.ERP5Type import Permissions, PropertySheet, Constraint, interfaces from Products.ERP5Type.XMLObject import XMLObject +import zope.interface + class BusinessState(XMLObject): """ - The BusinessProcess class is a container class which is used - to describe business processes in the area of trade, payroll - and production. + The BusinessState class defines the various states in + a Business Process. It defines the synchronisation milestones + between movements related to the trade phases of business. """ meta_type = 'ERP5 Business State' portal_type = 'Business State' @@ -55,7 +58,11 @@ class BusinessState(XMLObject): , PropertySheet.Comment ) - # Core API + # Declarative interfaces + zope.interface.implements(interfaces.IBusinessState + ) + + # IBusinessCompletable implementation def isCompleted(self, explanation): """ If all path which reach this state are completed @@ -77,7 +84,7 @@ class BusinessState(XMLObject): return False return True - # Duration calculation + # IBusinessCompletable - duration calculation def getExpectedCompletionDate(self, explanation, *args, **kwargs): """ Returns the expected completion date for this diff --git a/product/ERP5/interfaces/arrow_base.py b/product/ERP5/interfaces/arrow_base.py new file mode 100644 index 0000000000..8744e6727e --- /dev/null +++ b/product/ERP5/interfaces/arrow_base.py @@ -0,0 +1,46 @@ +# -*- coding: utf-8 -*- +############################################################################## +# +# Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. +# Jean-Paul Smets-Solanes <jp@nexedi.com> +# +# WARNING: This program as such is intended to be used by professional +# programmers who take the whole responsability of assessing all potential +# consequences resulting from its eventual inadequacies and bugs +# End users who are looking for a ready-to-use solution with commercial +# garantees and support are strongly adviced to contract a Free Software +# Service Company +# +# 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. +# +############################################################################## + +from zope.interface import Interface + +class IArrowBase(Interface): + """Arrow Base interface specification + + Defines methods to get the list of base categories + which define the source and destination of an Arrow + """ + def getSourceArrowBaseCategoryList(): + """Returns all categories which are used to define the source + of this Arrow + """ + + def getDestinationArrowBaseCategoryList(): + """Returns all categories which are used to define the destination + of this Arrow + """ \ No newline at end of file diff --git a/product/ERP5/interfaces/business_buildable.py b/product/ERP5/interfaces/business_buildable.py index a16247385d..20e0431581 100644 --- a/product/ERP5/interfaces/business_buildable.py +++ b/product/ERP5/interfaces/business_buildable.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ############################################################################## # # Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. @@ -30,6 +31,10 @@ from zope.interface import Interface class IBusinessBuildable(Interface): """Business Buildable interface specification + + TODO: + - is isFrozen useful ? is it the same as isCompleted ? + - why isFrozen is here and not in Completable """ def isBuildable(explanation): """Returns True if any of the related Simulation Movement diff --git a/product/ERP5/interfaces/business_state.py b/product/ERP5/interfaces/business_state.py index e30fd79d69..ffd9eb58b9 100644 --- a/product/ERP5/interfaces/business_state.py +++ b/product/ERP5/interfaces/business_state.py @@ -1,3 +1,4 @@ +# -*- coding: utf-8 -*- ############################################################################## # # Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. @@ -30,4 +31,7 @@ from Products.ERP5.interfaces.business_completable import IBusinessCompletable class IBusinessState(IBusinessCompletable): """Business State interface specification + + TODO: + - add methods if any or remove if nothing specific to Business State """ -- 2.30.9