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)
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)
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)