예제 #1
0
    def mutate(cls, root, args, context, info):
        action = args.get('action')
        input_of_id = args.get('input_of_id')
        output_of_id = args.get('output_of_id')
        provider_id = args.get('provider_id')
        receiver_id = args.get('receiver_id')
        scope_id = args.get('scope_id')
        affects_id = args.get('affects_id')
        affected_resource_classified_as_id = args.get('affected_resource_classified_as_id')
        affected_numeric_value = args.get('affected_numeric_value')
        affected_unit_id = args.get('affected_unit_id')
        start = args.get('start')
        fulfills_commitment_id = args.get('fulfills_commitment_id') #TODO see if this needs fixing for multiples when doing exchanges
        url = args.get('url')
        request_distribution = args.get('request_distribution')
        note = args.get('note')
        create_resource = args.get('create_resource')
        resource_tracking_identifier = args.get('resource_tracking_identifier')
        resource_image = args.get('resource_image')
        resource_current_location_id = args.get('resource_current_location_id')
        resource_note = args.get('resource_note')
        resource_url = args.get('resource_url')

        if fulfills_commitment_id:
            commitment = Commitment.objects.get(pk=fulfills_commitment_id)
        else:
            commitment = None
        if action:
            event_type = EventType.objects.convert_action_to_event_type(action)
        elif commitment:
            event_type = commitment.event_type
        else:
            raise ValidationError("Must provide an action in either economic event or its commitment")
        if not note:
            note = ""
        if start:
            start = datetime.datetime.strptime(start, '%Y-%m-%d').date()
        else:
            start = datetime.date.today()
        if scope_id:
            scope = EconomicAgent.objects.get(pk=scope_id)
        elif commitment:
            scope = commitment.context_agent
        else:
            raise ValidationError("Must provide a scope in either economic event or its commitment")
        if provider_id:
            provider = EconomicAgent.objects.get(pk=provider_id)
        elif action == "work":
            user_agent = AgentUser.objects.get(user=context.user)
            provider = user_agent.agent
        elif commitment:
            provider = commitment.from_agent
        else:
            provider = scope
        if receiver_id:
            receiver = EconomicAgent.objects.get(pk=receiver_id)
        elif commitment:
            receiver = commitment.to_agent
        else:
            receiver = scope
        if input_of_id:
            process = Process.objects.get(pk=input_of_id)
        elif output_of_id:
            process = Process.objects.get(pk=output_of_id)
        elif commitment:
            process = commitment.process
        else:
            process = None
        if affects_id:
            affects = EconomicResourceProxy.objects.get(pk=affects_id)
        else:
            affects = None
        if affected_resource_classified_as_id:
            affected_resource_classification = EconomicResourceType.objects.get(pk=affected_resource_classified_as_id)
        elif affects:
            affected_resource_classification = EconomicResourceType.objects.get(pk=affects.resource_type.id)
        elif commitment:
            affected_resource_classification = EconomicResourceType.objects.get(pk=commitment.resource_type.id)
        else:
            raise ValidationError("Must provide a resource classification in either economic event or its commitment")
        if affected_unit_id:
            affected_unit = Unit.objects.get(pk=affected_unit_id)
        elif commitment:
            affected_unit = Unit.objects.get(pk=commitment.unit_of_quantity__id)
        else:
            raise ValidationError("Must provide a unit in either economic event or its commitment")
        if not url:
            url = ""
        if not request_distribution:
            request_distribution = False
        current_location = None
        if resource_current_location_id:
            current_location = Location.objects.get(pk=resource_current_location_id)
        arr = None
        if not affects:
            if create_resource:
                if not resource_note:
                    resource_note = ""
                if not resource_image:
                    resource_image = ""
                if not resource_tracking_identifier:
                    resource_tracking_identifier = ""
                if not resource_url:
                    resource_url = ""
                affects = EconomicResourceProxy(
                    resource_type=affected_resource_classification,
                    quantity=Decimal(affected_numeric_value),
                    photo_url=resource_image,
                    identifier=resource_tracking_identifier,
                    current_location=current_location,
                    notes=resource_note,
                    url=resource_url,
                    created_by=context.user,
                    #location
                )

        economic_event = EconomicEventProxy(
            event_type = event_type,
            process = process,
            from_agent = provider,
            to_agent = receiver,
            resource_type = affected_resource_classification,
            resource = affects,
            quantity = Decimal(affected_numeric_value),
            unit_of_quantity = affected_unit,
            event_date = start,
            description=note,
            context_agent=scope,
            url=url,
            commitment=commitment,
            is_contribution=request_distribution,
            created_by=context.user,
        )

        user_agent = AgentUser.objects.get(user=context.user).agent
        is_authorized = user_agent.is_authorized(object_to_mutate=economic_event)
        if is_authorized:
            economic_event.save_api(user=context.user, create_resource=create_resource)                
            #find the first "owner" type resource-agent role, use it for a relationship so inventory will show up #TODO: make more coherent when VF does so
            if create_resource:
                roles = AgentResourceRoleType.objects.filter(is_owner=True)
                if roles and receiver:
                    owner_role = roles[0]
                    arr = AgentResourceRole(
                        agent=receiver,
                        resource=affects,
                        role=owner_role,
                    )
                    arr.save()
        else:
            raise PermissionDenied('User not authorized to perform this action.')

        return CreateEconomicEvent(economic_event=economic_event)
예제 #2
0
    def mutate(cls, root, args, context, info):
        action = args.get('action')
        input_of_id = args.get('input_of_id')
        output_of_id = args.get('output_of_id')
        provider_id = args.get('provider_id')
        receiver_id = args.get('receiver_id')
        scope_id = args.get('scope_id')
        affects_id = args.get('affects_id')
        affected_resource_classified_as_id = args.get(
            'affected_resource_classified_as_id')
        affected_numeric_value = args.get('affected_numeric_value')
        affected_unit_id = args.get('affected_unit_id')
        start = args.get('start')
        fulfills_commitment_id = args.get(
            'fulfills_commitment_id'
        )  #TODO see if this needs fixing for multiples when doing exchanges
        url = args.get('url')
        request_distribution = args.get('request_distribution')
        note = args.get('note')
        create_resource = args.get('create_resource')
        resource_tracking_identifier = args.get('resource_tracking_identifier')
        resource_image = args.get('resource_image')
        resource_current_location_id = args.get('resource_current_location_id')
        resource_note = args.get('resource_note')

        if fulfills_commitment_id:
            commitment = Commitment.objects.get(pk=fulfills_commitment_id)
        else:
            commitment = None
        if action:
            event_type = EventType.objects.convert_action_to_event_type(action)
        elif commitment:
            event_type = commitment.event_type
        else:
            raise ValidationError(
                "Must provide an action in either economic event or its commitment"
            )
        if not note:
            note = ""
        if start:
            start = datetime.datetime.strptime(start, '%Y-%m-%d').date()
        else:
            start = datetime.date.today()
        if scope_id:
            scope = EconomicAgent.objects.get(pk=scope_id)
        elif commitment:
            scope = commitment.context_agent
        else:
            raise ValidationError(
                "Must provide a scope in either economic event or its commitment"
            )
        if provider_id:
            provider = EconomicAgent.objects.get(pk=provider_id)
        elif action == "work":
            user_agent = AgentUser.objects.get(user=context.user)
            provider = user_agent.agent
        elif commitment:
            provider = commitment.from_agent
        else:
            provider = scope
        if receiver_id:
            receiver = EconomicAgent.objects.get(pk=receiver_id)
        elif commitment:
            receiver = commitment.to_agent
        else:
            receiver = scope
        if input_of_id:
            process = Process.objects.get(pk=input_of_id)
        elif output_of_id:
            process = Process.objects.get(pk=output_of_id)
        elif commitment:
            process = commitment.process
        else:
            process = None
        if affects_id:
            affects = EconomicResourceProxy.objects.get(pk=affects_id)
        else:
            affects = None
        if affected_resource_classified_as_id:
            affected_resource_classification = EconomicResourceType.objects.get(
                pk=affected_resource_classified_as_id)
        elif affects:
            affected_resource_classification = EconomicResourceType.objects.get(
                pk=affects.resource_type.id)
        elif commitment:
            affected_resource_classification = EconomicResourceType.objects.get(
                pk=commitment.resource_type.id)
        else:
            raise ValidationError(
                "Must provide a resource classification in either economic event or its commitment"
            )
        if affected_unit_id:
            affected_unit = Unit.objects.get(pk=affected_unit_id)
        elif commitment:
            affected_unit = Unit.objects.get(
                pk=commitment.unit_of_quantity__id)
        else:
            raise ValidationError(
                "Must provide a unit in either economic event or its commitment"
            )
        if not url:
            url = ""
        if not request_distribution:
            request_distribution = False
        if resource_current_location_id:
            current_location = Location.objects.get(
                pk=resource_current_location_id)
        if not affects:
            if create_resource:
                if not resource_note:
                    resource_note = ""
                if not resource_image:
                    resource_image = ""
                if not resource_tracking_identifier:
                    resource_tracking_identifier = ""
                affects = EconomicResourceProxy(
                    resource_type=affected_resource_classification,
                    quantity=Decimal(affected_numeric_value),
                    photo_url=resource_image,
                    identifier=resource_tracking_identifier,
                    current_location=current_location,
                    notes=resource_note,
                    created_by=context.user,
                    #location
                )

        economic_event = EconomicEventProxy(
            event_type=event_type,
            process=process,
            from_agent=provider,
            to_agent=receiver,
            resource_type=affected_resource_classification,
            resource=affects,
            quantity=Decimal(affected_numeric_value),
            unit_of_quantity=affected_unit,
            event_date=start,
            description=note,
            context_agent=scope,
            url=url,
            commitment=commitment,
            is_contribution=request_distribution,
            created_by=context.user,
        )

        user_agent = AgentUser.objects.get(user=context.user).agent
        is_authorized = user_agent.is_authorized(
            object_to_mutate=economic_event)
        if is_authorized:
            economic_event.save_api(user=context.user,
                                    create_resource=create_resource)
        else:
            raise PermissionDenied(
                'User not authorized to perform this action.')

        return CreateEconomicEvent(economic_event=economic_event)
예제 #3
0
    def mutate(cls, root, args, context, info):
        provider_id = args.get('provider_id')
        receiver_id = args.get('receiver_id')
        affects_id = args.get('affects_id')
        receiver_affects_id = args.get('receiver_affects_id')
        affected_numeric_value = args.get('affected_numeric_value')
        start = args.get('start')
        create_resource = args.get('create_resource', False)
        resource_image = args.get('resource_image')
        resource_note = args.get('resource_note')
        #import pdb; pdb.set_trace()

        if start:
            start = datetime.datetime.strptime(start, '%Y-%m-%d').date()
        else:
            start = datetime.date.today()
        provider = EconomicAgent.objects.get(pk=provider_id)
        receiver = EconomicAgent.objects.get(pk=receiver_id)
        affects = EconomicResourceProxy.objects.get(pk=affects_id)
        receiver_affects = None
        if receiver_affects_id:
            receiver_affects = EconomicResourceProxy.objects.get(
                pk=receiver_affects_id)
        if not receiver_affects:
            if create_resource:
                if not resource_note:
                    resource_note = affects.notes
                if not resource_image:
                    resource_image = affects.image
                receiver_affects = EconomicResourceProxy(
                    resource_type=affects.resource_type,
                    quantity=Decimal(affected_numeric_value),
                    photo_url=resource_image,
                    identifier=affects.identifier,
                    current_location=None,
                    notes=resource_note,
                    url="",
                    created_by=context.user,
                    #location
                )

        transfer = TransferProxy(name="Transfer item",
                                 transfer_date=start,
                                 notes="",
                                 context_agent=provider)
        give_et = EventType.objects.get(name="Give")
        give_event = EconomicEventProxy(
            event_type=give_et,
            process=None,
            from_agent=provider,
            to_agent=receiver,
            resource_type=affects.resource_type,
            resource=affects,
            quantity=Decimal(affected_numeric_value),
            unit_of_quantity=affects.resource_type.unit,
            event_date=start,
            description=resource_note,
            context_agent=provider,
            url="",
            commitment=None,
            is_contribution=False,
        )
        receive_et = EventType.objects.get(name="Receive")
        receive_event = EconomicEventProxy(
            event_type=receive_et,
            process=None,
            from_agent=provider,
            to_agent=receiver,
            resource_type=affects.resource_type,
            quantity=Decimal(affected_numeric_value),
            unit_of_quantity=affects.resource_type.unit,
            event_date=start,
            description=resource_note,
            context_agent=receiver,
            url="",
            commitment=None,
            is_contribution=False,
        )

        #import pdb; pdb.set_trace()
        user_agent = AgentUser.objects.get(user=context.user).agent
        is_authorized = user_agent.is_authorized(object_to_mutate=give_event)
        if is_authorized:
            transfer.save_api()
            give_event.transfer = transfer
            give_event.save_api(user=context.user, create_resource=False)
            if receiver_affects:
                receiver_affects.save()
                receive_event.resource = receiver_affects
            receive_event.transfer = transfer
            receive_event.save_api(user=context.user,
                                   create_resource=create_resource)
            if create_resource:
                roles = AgentResourceRoleType.objects.filter(is_owner=True)
                if roles and receiver:
                    owner_role = roles[0]
                    arr = AgentResourceRole(
                        agent=receiver,
                        resource=receiver_affects,
                        role=owner_role,
                    )
                    arr.save()
        else:
            raise PermissionDenied(
                'User not authorized to perform this action.')

        return CreateTransfer(transfer=transfer)