from django.utils import timezone import graphene from graphene_django import DjangoObjectType from graphql import GraphQLError from aleksis.core.models import Person from .models import Checkpoint, Event class EventType(DjangoObjectType): class Meta: model = Event class CheckpointType(DjangoObjectType): class Meta: model = Checkpoint class CheckInMutation(graphene.Mutation): class Arguments: event_slug = graphene.String(required=True) person_id = graphene.Int(required=True) comment = graphene.String(required=True) lat = graphene.Int(required=False) lon = graphene.Int(required=False) checkpoint = graphene.Field(CheckpointType) @classmethod def mutate( cls, root, info, event_slug, person_id, comment, lat=None, lon=None, ): try: event = Event.objects.get(slug=event_slug) except Event.DoesNotExist: raise GraphQLError(f"No Event with slug {event_slug}.") try: person = Person.objects.get(pk=person_id) except Person.DoesNotExist: raise GraphQLError(f"No Person with ID {person_id}.") checkpoint = Checkpoint() checkpoint.event = event checkpoint.person = person checkpoint.checked_by = info.context.user.person checkpoint.comment = comment checkpoint.timestamp = timezone.now() if lat and lon: checkpoint.lat = lat checkpoint.lon = lon checkpoint.save() return CheckInMutation(checkpoint=checkpoint) class Mutation(graphene.ObjectType): check_in = CheckInMutation.Field()