def approve_transition(workflow_object, field, user, next_state=None, god_mod=False): approvement, track = TransitionService.process(workflow_object, field, user, APPROVED, next_state, god_mod) workflow_object.approvement_track = track current_state = getattr(workflow_object, field) # Any other approvement is left? required_approvements = ApprovementService.get_approvements_object_waiting_for_approval(workflow_object, field, [current_state], destination_state=next_state, god_mod=god_mod) transition_status = False if required_approvements.count() == 0: setattr(workflow_object, field, approvement.meta.transition.destination_state) transition_status = True # Next states should be PENDING back again if there is circle. ApprovementService.get_next_approvements(workflow_object, field).update(status=PENDING) with ApprovementSignal(workflow_object, field, approvement, track), TransitionSignal(transition_status, workflow_object, field, approvement), FinalSignal(workflow_object, field): workflow_object.save() LOGGER.debug("Workflow object %s for field %s is approved for next transition. Transition: %s -> %s" % (workflow_object, field, current_state.label, getattr(workflow_object, field).label))
def approve_transition(workflow_object, field, user, next_state=None, god_mod=False): approvement, track = TransitionService.process(workflow_object, field, user, APPROVED, next_state, god_mod) workflow_object.approvement_track = track current_state = getattr(workflow_object, field) # Any other approvement is left? required_approvements = ApprovementService.get_approvements_object_waiting_for_approval( workflow_object, field, [current_state], destination_state=next_state, god_mod=god_mod) transition_status = False if required_approvements.count() == 0: setattr(workflow_object, field, approvement.meta.transition.destination_state) transition_status = True # Next states should be PENDING back again if there is circle. ApprovementService.get_next_approvements( workflow_object, field).update(status=PENDING) with ApprovementSignal(workflow_object, field, approvement, track), TransitionSignal( transition_status, workflow_object, field, approvement), FinalSignal( workflow_object, field): workflow_object.save() LOGGER.debug( "Workflow object %s for field %s is approved for next transition. Transition: %s -> %s" % (workflow_object, field, current_state.label, getattr(workflow_object, field).label))
def test_get_next_approvements(self): ObjectService.register_object(self.objects[0], self.field) ObjectService.register_object(self.objects[1], self.field) approvements = ApprovementService.get_next_approvements(self.objects[0], self.field) self.assertEqual(9, approvements.count()) self.objects[0].approve(self.user1) approvements = ApprovementService.get_next_approvements(self.objects[0], self.field) self.assertEqual(8, approvements.count()) self.objects[0].approve(self.user2) # Two approvements exist on same level approvements = ApprovementService.get_next_approvements(self.objects[0], self.field) self.assertEqual(8, approvements.count()) self.objects[0].approve(self.user3) approvements = ApprovementService.get_next_approvements(self.objects[0], self.field) self.assertEqual(6, approvements.count()) self.objects[0].approve(self.user4, next_state=State.objects.get(label='s4')) approvements = ApprovementService.get_next_approvements(self.objects[0], self.field) self.assertEqual(2, approvements.count()) self.objects[0].approve(self.user4, next_state=State.objects.get(label='s4.1')) approvements = ApprovementService.get_next_approvements(self.objects[0], self.field) self.assertEqual(0, approvements.count())
def next_approvements(self): from river.services.approvement import ApprovementService return getattr(self, name) in ApprovementService.get_next_approvements(ContentType.objects.get_for_model(self), name)