def process(content_type_id, object_id, field_id, user_id, action, next_state_id=None): obj = Object.objects.get(content_type_id=content_type_id, object_id=object_id, field_id=field_id) current_state = obj.state next_state = None if next_state_id: next_state = State.objects.get(pk=next_state_id) approvements = ApprovementService.get_approvements_object_waiting_for_approval(content_type_id, object_id, field_id, user_id, [current_state]) c = approvements.count() if c == 0: raise Exception("There is no available state for destination for the user.") if c > 1: if next_state: approvements = approvements.filter(approve_definition__transition__destination_state=next_state) if approvements.count() == 0: available_states = StateService.get_available_states(content_type_id, object_id, field_id, user_id) raise Exception("Invalid state is given(%s). Valid states is(are) %s" % (next_state.__unicode__(), ','.join([ast.__unicode__() for ast in available_states]))) else: raise Exception("State must be given when there are multiple states for destination") approvement = approvements[0] approvement.status = action approvement.transactioner = ExternalUser.objects.get(user_id=user_id) approvement.transaction_date = datetime.now() approvement.save() return approvement
def test_get_available_states(self): ct = ExternalContentType.objects.get(pk=1501) field = Field.objects.get(pk=3501) ObjectService.register_object(ct.pk, 5001, field.pk) ObjectService.register_object(ct.pk, 5002, field.pk) middleware.get_user = MagicMock(return_value=User.objects.get(pk=2101)) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 2, include_user=False) self.assertEqual(1, available_states.count()) self.assertEqual(State.objects.get(label='s2'), available_states[0]) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 2, include_user=True) self.assertEqual(0, available_states.count()) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 2) self.assertEqual(0, available_states.count()) obj = TestModel.objects.get(pk=5001) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 3, include_user=False) self.assertEqual(1, available_states.count()) self.assertEqual(State.objects.get(label='s2'), available_states[0]) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 3, include_user=True) self.assertEqual(0, available_states.count()) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 3) self.assertEqual(0, available_states.count()) obj = TestModel.objects.get(pk=5001) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 4, include_user=False) self.assertEqual(1, available_states.count()) self.assertEqual(State.objects.get(label='s2'), available_states[0]) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 4, include_user=True) self.assertEqual(0, available_states.count()) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 4) self.assertEqual(0, available_states.count()) obj = TestModel.objects.get(pk=5001) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 1, include_user=False) self.assertEqual(1, available_states.count()) self.assertEqual(State.objects.get(label='s2'), available_states[0]) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 1, include_user=True) self.assertEqual(1, available_states.count()) self.assertEqual(State.objects.get(label='s2'), available_states[0]) available_states = StateService.get_available_states(ct.pk, 5001, field.pk, 1) self.assertEqual(1, available_states.count()) self.assertEqual(State.objects.get(label='s2'), available_states[0])