From ed3c6e09cbcf9be2f77478946f676a2fc9d5abdf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=C5=81ukasz=20Nowak?= <luke@nexedi.com> Date: Thu, 9 Jul 2009 11:31:13 +0000 Subject: [PATCH] Builder related implementation and small fixes: - updated copyrights - implement isBuildable, based on real system - add helper method to fetch explanation list - during build use proper method to find delivery builders, and let do builder its job to find movements (this is to be future proof) - fix method name from _getRelatedSimulationMovementList to _getRelatedSimulationMovementValueList, as it in reality return documents not urls and fix this method implementation git-svn-id: https://svn.erp5.org/repos/public/erp5/trunk@28040 20353a03-c40f-0410-a6d1-a30d3c3de9de --- product/ERP5/Document/BusinessPath.py | 62 +++++++++++++++++++-------- 1 file changed, 44 insertions(+), 18 deletions(-) diff --git a/product/ERP5/Document/BusinessPath.py b/product/ERP5/Document/BusinessPath.py index bd293fc443..84cc92fb5e 100644 --- a/product/ERP5/Document/BusinessPath.py +++ b/product/ERP5/Document/BusinessPath.py @@ -4,6 +4,7 @@ # Copyright (c) 2009 Nexedi SA and Contributors. All Rights Reserved. # Jean-Paul Smets-Solanes <jp@nexedi.com> # Yusuke Muraoka <yusuke@nexedi.com> +# 艁ukasz Nowak <luke@nexedi.com> # # WARNING: This program as such is intended to be used by professional # programmers who take the whole responsability of assessing all potential @@ -182,15 +183,20 @@ class BusinessPath(Path): def isBuildable(self, explanation): """ """ - if self.isCompleted(explanation): - return False # No need to build what was already built - if self.isFrozen(explanation): - return False # No need to build what is frozen + # check if there is at least one simulation movement which is not + # delivered + result = False + if self.isCompleted(explanation) or self.isFrozen(explanation): + return False # No need to build what was already built or frozen + for simulation_movement in self._getRelatedSimulationMovementValueList( + explanation): + if simulation_movement.getDeliveryValue() is None: + result = True predecessor = self.getPredecessorValue() if predecessor is None: - return True # No predecessor, let's build + return result if predecessor.isCompleted(explanation): - return True + return result return False def isPartiallyBuildable(self, explanation): @@ -198,22 +204,42 @@ class BusinessPath(Path): Not sure if this will exist some day XXX """ + def _getExplanationUidList(self, explanation): + """Helper method to fetch really explanation related movements + + As Business Path is related to movement by causality, thanks to + trade_phase during expand, it is correct to pass too much explanations + than not enough""" + explanation_uid_list = [explanation.getUid()] + for ex in explanation.getCausalityRelatedValueList( + portal_type=self.getPortalDeliveryTypeList()): + explanation_uid_list.extend(self._getExplanationUidList(ex)) + return explanation_uid_list + def build(self, explanation): """ Build """ - builder_list = self.getBuilderList() # Missing method + builder_list = self.getDeliveryBuilderValueList() # 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 ? + # chosen a way that builder is good enough to decide to select movements + # which shall be really build (movement selection for build is builder + # job, not business path job) + builder.build(select_method_dict={ + 'causality_uid': self.getUid(), + 'explanation_uid': self._getExplanationUidList(explanation) + }) + + def _getRelatedSimulationMovementValueList(self, explanation): # XXX - What API ? """ - + Returns all Simulation Movements related to explanation """ - return self.getCausalityRelatedValueList(portal_type='Simulation Movement', - explanation_uid=explanation.getUid()) + # XXX What about explanations for causality related documents to explanation? + explanation_uid_list = self._getExplanationUidList(explanation) + # getCausalityRelated do not support filtering, so post filtering needed + return [x for x in self.getCausalityRelatedValueList( + portal_type='Simulation Movement') + if x.getExplanationUid() in explanation_uid_list] # IBusinessCompletable implementation def isCompleted(self, explanation): @@ -222,7 +248,7 @@ class BusinessPath(Path): and checks the simulation_state of the delivery """ acceptable_state_list = self.getCompletedStateList() - for movement in self._getRelatedSimulationMovementList(explanation): + for movement in self._getRelatedSimulationMovementValueList(explanation): if movement.getSimulationState() not in acceptable_state_list: return False return True @@ -233,7 +259,7 @@ class BusinessPath(Path): and checks the simulation_state of the delivery """ acceptable_state_list = self.getCompletedStateList() - for movement in self._getRelatedSimulationMovementList(explanation): + for movement in self._getRelatedSimulationMovementValueList(explanation): if movement.getSimulationState() in acceptable_state_list: return True return False @@ -243,7 +269,7 @@ class BusinessPath(Path): Looks at all simulation related movements and checks if frozen """ - movement_list = self._getRelatedSimulationMovementList(explanation) + movement_list = self._getRelatedSimulationMovementValueList(explanation) if len(movement_list) == 0: return False # Nothing to be considered as Frozen for movement in movement_list: -- 2.30.9