from django.utils import timezone import graphene from graphene_django import DjangoObjectType from graphql import GraphQLError from aleksis.core.models import Person from aleksis.core.util.core_helpers import has_person from .models import Checkpoint, Event class EventType(DjangoObjectType): class Meta: model = Event class CheckpointType(DjangoObjectType): class Meta: model = Checkpoint class CheckpointCheckInMutation(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, ): if not has_person(info.context.user) or not info.context.user.has_perm("paweljong.event_checkpoint_rule"): raise PermissionDenied() 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 CheckpointCheckInMutation(checkpoint=checkpoint) class Mutation(graphene.ObjectType): checkpoint_check_in = CheckpointCheckInMutation.Field()