def register_object(content_type_id, object_id, field_id): transition_approvements = TransitionApprovement.objects.filter(content_type__pk=content_type_id, object_id=object_id, field__pk=field_id) if transition_approvements.count() == 0: ApprovementService.init_approvements(content_type_id, object_id, field_id) initial_state = StateService.get_init_state(content_type_id, field_id) obj = Object.objects.get(object_id=object_id) obj.state = initial_state obj.save() return {'state': initial_state.details()}
def get_objects_waiting_for_approval(content_type_id, field_id, user_id): object_pks = [] for obj in Object.objects.filter(content_type__pk=content_type_id, field__pk=field_id): current_state = obj.state approvements = ApprovementService.get_approvements_object_waiting_for_approval(content_type_id, obj.object_id, field_id, user_id, [current_state]) if approvements.count(): object_pks.append(obj.pk) return Object.objects.filter(pk__in=object_pks)
def test_get_approvements_object_waiting_for_approval_without_skip(self): ct = ExternalContentType.objects.get(pk=1501) field = Field.objects.get(pk=3501) middleware.get_user = MagicMock(return_value=User.objects.get(pk=2101)) ObjectService.register_object(ct.pk, 5001, field.pk) ObjectService.register_object(ct.pk, 5002, field.pk) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5001, field.pk, 1, [Object.objects.get(object_id=5001).state], include_user=True) self.assertEqual(1, approvements.count()) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5001, field.pk, 2, [Object.objects.get(object_id=5001).state], include_user=False) self.assertEqual(1, approvements.count()) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5001, field.pk, 2, [Object.objects.get(object_id=5001).state], include_user=True) self.assertEqual(0, approvements.count()) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5001, field.pk, 3, [Object.objects.get(object_id=5001).state], include_user=False) self.assertEqual(1, approvements.count()) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5001, field.pk, 3, [Object.objects.get(object_id=5001).state], include_user=True) self.assertEqual(0, approvements.count()) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5001, field.pk, 4, [Object.objects.get(object_id=5001).state], include_user=False) self.assertEqual(1, approvements.count()) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5001, field.pk, 4, [Object.objects.get(object_id=5001).state], include_user=True) self.assertEqual(0, approvements.count())
def approve_transition(content_type_id, object_id, field_id, user_id, next_state_id=None): content_type = ExternalContentType.objects.get(pk=content_type_id) field = Field.objects.get(pk=field_id) object = Object.objects.get(content_type=content_type, object_id=object_id, field=field) approvement = TransitionService.process(content_type_id, object_id, field_id, user_id, APPROVED, next_state_id) current_state = object.state required_approvements = ApprovementService.get_approvements_object_waiting_for_approval(content_type_id, object_id, field_id, user_id, [current_state], include_user=False, destination_state_id=next_state_id) if required_approvements.count() == 0: object.state = approvement.approve_definition.transition.destination_state object.save()
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_approvements_object_waiting_for_approval_with_skip(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)) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=False) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s2'), approvements[0].approve_definition.transition.destination_state) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=True) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s2'), approvements[0].approve_definition.transition.destination_state) TransitionApprovement.objects.filter( content_type=ct, field=field, object_id=5002, approve_definition__transition__destination_state=State.objects.get(label='s2') ).update(skip=True) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=False) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s3'), approvements[0].approve_definition.transition.destination_state) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=True) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s3'), approvements[0].approve_definition.transition.destination_state) TransitionApprovement.objects.filter( content_type=ct, field=field, object_id=5002, approve_definition__transition__destination_state=State.objects.get(label='s3') ).update(skip=True) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=False) self.assertEqual(2, approvements.count()) self.assertEqual(State.objects.get(label='s4'), approvements[0].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5'), approvements[1].approve_definition.transition.destination_state) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=True) self.assertEqual(2, approvements.count()) self.assertEqual(State.objects.get(label='s4'), approvements[0].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5'), approvements[1].approve_definition.transition.destination_state) TransitionApprovement.objects.filter( content_type=ct, field=field, object_id=5002, approve_definition__transition__destination_state=State.objects.get(label='s4') ).update(skip=True) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=False) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s5'), approvements[0].approve_definition.transition.destination_state) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=True) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s5'), approvements[0].approve_definition.transition.destination_state) TransitionApprovement.objects.filter( content_type=ct, field=field, object_id=5002, approve_definition__transition__destination_state=State.objects.get(label='s4') ).update(skip=False) TransitionApprovement.objects.filter( content_type=ct, field=field, object_id=5002, approve_definition__transition__destination_state=State.objects.get(label='s5') ).update(skip=True) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=False) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s4'), approvements[0].approve_definition.transition.destination_state) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=True) self.assertEqual(1, approvements.count()) self.assertEqual(State.objects.get(label='s4'), approvements[0].approve_definition.transition.destination_state) TransitionApprovement.objects.filter( content_type=ct, field=field, object_id=5002, approve_definition__transition__destination_state__in=State.objects.filter(label__in=['s4', 's5']) ).update(skip=True) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=False) self.assertEqual(4, approvements.count()) self.assertEqual(State.objects.get(label='s4.1'), approvements[0].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s4.2'), approvements[1].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5.1'), approvements[2].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5.2'), approvements[3].approve_definition.transition.destination_state) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=True) self.assertEqual(4, approvements.count()) self.assertEqual(State.objects.get(label='s4.1'), approvements[0].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s4.2'), approvements[1].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5.1'), approvements[2].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5.2'), approvements[3].approve_definition.transition.destination_state) TransitionApprovement.objects.filter( content_type=ct, field=field, object_id=5002, approve_definition__transition__destination_state__in=State.objects.filter(label__in=['s4.1', 's5.1']) ).update(skip=True) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=False) self.assertEqual(2, approvements.count()) self.assertEqual(State.objects.get(label='s4.2'), approvements[0].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5.2'), approvements[1].approve_definition.transition.destination_state) approvements = ApprovementService.get_approvements_object_waiting_for_approval(ct.pk, 5002, field.pk, 1, [Object.objects.get(object_id=5002).state], include_user=True) self.assertEqual(2, approvements.count()) self.assertEqual(State.objects.get(label='s4.2'), approvements[0].approve_definition.transition.destination_state) self.assertEqual(State.objects.get(label='s5.2'), approvements[1].approve_definition.transition.destination_state)
def init_approvements(request, content_type_id, object_id, field_id): return ApprovementService.init_approvements(content_type_id, object_id, field_id)