Advertisement
Guest User

Untitled

a guest
Dec 12th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.77 KB | None | 0 0
  1. from django.db.models import Q, Avg
  2. from django.contrib.auth.models import User
  3. import graphene
  4. from graphene_django import DjangoObjectType
  5. from graphql import GraphQLError
  6.  
  7. from .models import Regex, Rating
  8. from .util import get_re_explanation
  9.  
  10.  
  11. class UserType(DjangoObjectType):
  12.     class Meta:
  13.         model = User
  14.         only_fields = ('id', 'username', 'email')
  15.  
  16.  
  17. class RegexType(DjangoObjectType):
  18.     class Meta:
  19.         model = Regex
  20.         only_fields = ('id', 'expression', 'explanation', 'date', 'author')
  21.  
  22.  
  23. class RatingType(DjangoObjectType):
  24.     class Meta:
  25.         model = Rating
  26.  
  27.  
  28. class CreateUser(graphene.Mutation):
  29.     user = graphene.Field(UserType)
  30.  
  31.     class Arguments:
  32.         username = graphene.String()
  33.         password = graphene.String()
  34.         email = graphene.String()
  35.  
  36.     def mutate(self, info, username, password, email):
  37.         user = User(
  38.             username=username,
  39.             email=email
  40.         )
  41.  
  42.         user.set_password(password)
  43.         user.save()
  44.  
  45.         return CreateUser(user=user)
  46.  
  47.  
  48. class CreateRegex(graphene.Mutation):
  49.     id = graphene.Int()
  50.     expression = graphene.String()
  51.     explanation = graphene.String()
  52.     date = graphene.String()
  53.     author = graphene.Field(UserType)
  54.  
  55.     class Arguments:
  56.         expression = graphene.String()
  57.  
  58.     def mutate(self, info, expression):
  59.         user = info.context.user
  60.         if user.is_anonymous:
  61.             raise GraphQLError('You must be logged in!')
  62.         explanation = get_re_explanation(expression)
  63.         if explanation:
  64.             regex = Regex(expression=expression, explanation=explanation, author=user)
  65.             regex.save()
  66.  
  67.             return CreateRegex(
  68.                 id=regex.id,
  69.                 expression=regex.expression,
  70.                 explanation=regex.explanation,
  71.                 date=regex.date,
  72.                 author=regex.author
  73.             )
  74.         else:
  75.             raise GraphQLError('Invalid expression')
  76.  
  77.  
  78. class DeleteRegex(graphene.Mutation):
  79.     result = graphene.String()
  80.  
  81.     class Arguments:
  82.         id = graphene.Int()
  83.  
  84.     def mutate(self, info, id):
  85.         user = info.context.user
  86.         if user.is_anonymous:
  87.             raise GraphQLError('You must be logged in!')
  88.         item = Regex.objects.get(id=id)
  89.         if item.author != user:
  90.             raise GraphQLError('Wrong user!')
  91.         else:
  92.             item.delete()
  93.             return DeleteRegex(result="Regex was deleted")
  94.  
  95.  
  96. class CreateOrUpdateRating(graphene.Mutation):
  97.     result = graphene.String()
  98.  
  99.     class Arguments:
  100.         id = graphene.Int()
  101.         mark = graphene.Int()
  102.  
  103.     def mutate(self, info, id, mark):
  104.         user = info.context.user
  105.         if user.is_anonymous:
  106.             raise GraphQLError('You must be logged in!')
  107.         r = Regex.objects.filter(id=id).first()
  108.         if user == r.author:
  109.             raise GraphQLError('Author cannot add mark to regex')
  110.         obj, created = Rating.objects.get_or_create(user=user, regex=r)
  111.         obj.mark = mark
  112.         obj.save()
  113.         if created:
  114.             return CreateOrUpdateRating(result="Mark created")
  115.         else:
  116.             return CreateOrUpdateRating(result="Mark updated")
  117.  
  118.  
  119. class Query(graphene.ObjectType):
  120.     regex = graphene.List(
  121.         RegexType,
  122.         search=graphene.String(),
  123.         first=graphene.Int(),
  124.         skip=graphene.Int()
  125.     )
  126.     me = graphene.Field(UserType)
  127.     get_rating = graphene.Field(graphene.Float, id=graphene.NonNull(graphene.Int))
  128.     user_mark = graphene.Field(graphene.Float, id=graphene.NonNull(graphene.Int))
  129.  
  130.     def resolve_regex(self, info, search=None, first=None, skip=None, **kwargs):
  131.         qs = Regex.objects.all()
  132.         if search:
  133.             qs = qs.filter(Q(expression__contains=search))
  134.         if skip:
  135.             qs = qs[skip:]
  136.         if first:
  137.             qs = qs[first:]
  138.         return qs
  139.  
  140.     def resolve_me(self, info, **kwargs):
  141.         user = info.context.user
  142.         if user.is_anonymous:
  143.             raise GraphQLError('Not logged in!')
  144.         return user
  145.  
  146.     def resolve_get_rating(self, info, id=None, **kwargs):
  147.         res = Rating.objects.filter(regex__id=id).aggregate(Avg('mark'))['mark__avg'] or 0.
  148.         return res
  149.  
  150.     def resolve_user_mark(self, info, id=None, **kwargs):
  151.         user = info.context.user
  152.         if user.is_anonymous:
  153.             raise GraphQLError('Not logged in!')
  154.         res = Rating.objects.filter(user=user, regex__id=id).first()
  155.         if res:
  156.             return float(res.mark)
  157.         return 0.
  158.  
  159.  
  160. class Mutation(graphene.ObjectType):
  161.     create_user = CreateUser.Field()
  162.     create_regex = CreateRegex.Field()
  163.     delete_regex = DeleteRegex.Field()
  164.     set_mark = CreateOrUpdateRating.Field()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement