Browse Source

+ part of user graphQL (UserFind,UserFindOne,UserUpsert)

ilya_shyian 2 years ago
parent
commit
e99143ec58

+ 30 - 0
store_back/apps/authAPI/migrations/0002_customuser_avatar_customuser_name_customuser_nick.py

@@ -0,0 +1,30 @@
+# Generated by Django 4.0.4 on 2022-06-29 12:56
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('goods', '0005_rename_date_good_createdat'),
+        ('authAPI', '0001_initial'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='customuser',
+            name='avatar',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.CASCADE, to='goods.image'),
+        ),
+        migrations.AddField(
+            model_name='customuser',
+            name='name',
+            field=models.CharField(default='-', max_length=50, verbose_name='name'),
+        ),
+        migrations.AddField(
+            model_name='customuser',
+            name='nick',
+            field=models.CharField(default='-', max_length=50, verbose_name='nick'),
+        ),
+    ]

+ 18 - 0
store_back/apps/authAPI/migrations/0003_customuser_login.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.0.4 on 2022-06-29 18:13
+
+from django.db import migrations, models
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('authAPI', '0002_customuser_avatar_customuser_name_customuser_nick'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='customuser',
+            name='login',
+            field=models.CharField(default='-', max_length=50, verbose_name='login'),
+        ),
+    ]

+ 6 - 0
store_back/apps/authAPI/models.py

@@ -3,7 +3,13 @@ from django.contrib.auth.models import AbstractUser
 from django.db import models
 
 
+
 class CustomUser(AbstractUser):
     _id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
+    name = models.CharField("name",max_length=50,default="-")
+    nick = models.CharField("nick",max_length=50,default="-")
+    avatar = models.ForeignKey('goods.Image', null = True, on_delete=models.CASCADE)
+    login = models.CharField("login",max_length=50,default="-")
+
     def __str__(self):
         return self.username

+ 198 - 0
store_back/apps/authAPI/schema.py

@@ -0,0 +1,198 @@
+import graphene
+from graphene_django.types import DjangoObjectType
+from graphql_jwt.decorators import login_required
+from goods.schema import ImageType,ImageInput
+import json
+from functools import reduce
+from django.forms.models import model_to_dict
+from django.contrib.auth import get_user_model
+
+import operator
+from django.db.models import Q
+
+
+User = get_user_model()
+
+
+class UserType(graphene.ObjectType):
+    _id = graphene.String(name='_id')
+    avatar = graphene.Field(ImageType)
+    name = graphene.String()
+    nick = graphene.String()
+    username = graphene.String()
+    acl = graphene.List(graphene.String)
+    createdAt = graphene.String()
+
+
+
+    def resolve__id(self,info):
+        return self._id
+
+    def resolve_avatar(self,info):
+        return self.avatar
+
+    def resolve_nick(self,info):
+        return self.nick
+
+    def resolve_name(self,info):
+        return self.name
+
+    def resolve_username(self,info):
+        return self.username
+
+    def resolve_acl(self,info):
+        print(self._id)
+        user = User.objects.get(_id = self._id)
+        print(user)
+        acl = ["anon"]
+        if user._id:
+            acl.append(str(user._id))
+            acl.append("user")
+            if  user.is_superuser:
+                acl.append("admin")
+
+        print(acl)
+        return acl
+
+
+    def resolve_createdAt(self,info):
+        return self.createdAt.strftime('%s')
+
+
+class UserInput(graphene.InputObjectType):
+    _id = graphene.String(name='_id')
+    avatar = graphene.Field(ImageInput)
+    name = graphene.String()
+    nick = graphene.String()
+    acl = graphene.List(graphene.String)
+    username = graphene.String()
+
+
+
+
+
+class Query(graphene.ObjectType):
+    UserFind = graphene.List(UserType,query = graphene.String())
+    UserFindOne = graphene.Field(UserType,query = graphene.String())
+
+    # ImageFind = graphene.List(ImageType,query = graphene.String())
+    # ImageFindOne = graphene.Field(ImageType,query = graphene.String())
+
+    def resolve_UserFind(self,info,query = "[{}]"):
+        additional_params = {}
+        query_list = json.loads(query)
+        filter_params = query_list[0]
+        if len(query_list) > 1:
+            additional_params = query_list[1]
+
+        skip = int(additional_params.get("skip",0))
+        limit = int(additional_params.get("limit",20))
+        order_by = additional_params.get("orderBy","_id")
+
+        query_set = User.objects.all()
+
+
+        if len(filter_params):
+            query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+
+        query_set = query_set.order_by(order_by)[skip:skip+limit]
+        return query_set
+
+
+    def resolve_UserFindOne(self,info,query = "[{}]"):
+        additional_params = {}
+        query_list = json.loads(query)
+        filter_params = query_list[0]
+        if len(query_list) > 1:
+            additional_params = query_list[1]
+
+        skip = additional_params.get("skip",0)
+        limit = additional_params.get("limit",20)
+        order_by = additional_params.get("orderBy","_id")
+
+        query_set = User.objects.all()
+
+        if len(filter_params):
+            query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+
+        return query_set.first()
+
+
+
+
+
+
+class UserUpsert(graphene.Mutation):
+
+    class Arguments:
+        user = UserInput(required=True)
+
+    Output =UserType
+
+    @staticmethod
+    def mutate(root,info,user):
+        new_user={}
+
+        try:
+            _id = user._id
+            new_user = User.objects.get(_id = _id)
+            user.pop("_id",None)
+            new_user.__dict__.update(**user)
+        except Exception as e:
+            try:
+                User.objects.get(username = user.username)
+                raise Exception("Username вже зайнятий")
+            except:
+                pass
+            new_user = User(**user)
+
+        new_user.save()
+        user_data =  {key: new_user.__dict__[key] for key in  new_user.__dict__.keys() & {"username","_id","name","avatar","nick"}}
+        user_data["_id"] = new_user._id
+
+
+        return UserType(**user_data)
+
+
+
+
+# class GoodDelete(graphene.Mutation):
+
+#     class Arguments:
+#         good = GoodInput(required=True)
+
+#     Output =GoodType
+
+#     @staticmethod
+#     def mutate(root,info,good):
+#         user = info.context.user
+#         if not user.is_superuser:
+#             raise Exception("Authentication credentials were not provided")
+
+
+#         try:
+#             _id = good._id
+#             good_to_delete = Good.objects.get(_id=_id)
+#             good_data = model_to_dict(good_to_delete)
+#             good_data["_id"] = new_good._id
+#             good_to_delete.delete()
+#         except:
+#             raise Exception("Не вірні дані")
+
+
+
+#         return GoodType(**good_data)
+
+
+
+
+
+
+
+class Mutations(graphene.ObjectType):
+
+    UserUpsert =  UserUpsert.Field()
+    # GoodDelete = GoodDelete.Field()
+
+
+

+ 12 - 10
store_back/apps/categories/schema.py

@@ -12,16 +12,12 @@ from django.forms.models import model_to_dict
 
 
 
-class CategoryType(DjangoObjectType):
+class CategoryType(graphene.ObjectType):
     _id = graphene.String(name='_id')
     name = graphene.String()
     parent = graphene.Field(lambda: CategoryType)
     goods = graphene.List(good_schema.GoodType)
 
-    class Meta:
-        model = Category
-        exclude_fields = ('_id',"name","parent","goods")
-
     def resolve__id(self,info):
         return self._id
 
@@ -104,6 +100,11 @@ class CategoryUpsert(graphene.Mutation):
         new_category={}
         good_list = []
 
+        user = info.context.user
+        if not user.is_superuser:
+            raise Exception("Authentication credentials were not provided")
+
+
         if "goods" in category:
             good_list = [f['_id'] for f in category["goods"]]
             category.pop("goods",None)
@@ -122,7 +123,6 @@ class CategoryUpsert(graphene.Mutation):
             new_category.goods.set(good_list)
         category_data = model_to_dict(new_category)
         category_data["_id"] = new_category._id
-        print(category_data)
         return CategoryType(**category_data)
 
 
@@ -137,15 +137,17 @@ class CategoryDelete(graphene.Mutation):
 
     @staticmethod
     def mutate(root,info,category):
-        # user = info.context.user
-        # if not user.is_superuser:
-        #     raise Exception("Authentication credentials were not provided")
+        user = info.context.user
+        if not user.is_superuser:
+            raise Exception("Authentication credentials were not provided")
+
 
 
         try:
             _id = category._id
             category_to_delete = Category.objects.get(_id=_id)
-            category_data = CategorySerializer(category_to_delete).data
+            category_data = model_to_dict(category_to_delete)
+            category_data["_id"] = new_category._id
             category_to_delete.delete()
 
         except:

+ 6 - 1
store_back/apps/goods/admin.py

@@ -1,5 +1,5 @@
 from django.contrib import admin
-from .models import Good, Image
+from .models import Good, Image,GoodImage
 
 @admin.register(Good)
 class GoodAdmin(admin.ModelAdmin):
@@ -8,3 +8,8 @@ class GoodAdmin(admin.ModelAdmin):
 @admin.register(Image)
 class ImageAdmin(admin.ModelAdmin):
     pass
+
+@admin.register(GoodImage)
+class GoodImageAdmin(admin.ModelAdmin):
+    pass
+

+ 18 - 0
store_back/apps/goods/migrations/0005_rename_date_good_createdat.py

@@ -0,0 +1,18 @@
+# Generated by Django 4.0.4 on 2022-06-24 21:21
+
+from django.db import migrations
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('goods', '0004_alter_good_amount_alter_good_description_and_more'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='good',
+            old_name='date',
+            new_name='createdAt',
+        ),
+    ]

+ 40 - 0
store_back/apps/goods/migrations/0006_goodimage_alter_good_images_goodimage_good_and_more.py

@@ -0,0 +1,40 @@
+# Generated by Django 4.0.4 on 2022-06-29 20:02
+
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('goods', '0005_rename_date_good_createdat'),
+    ]
+
+    operations = [
+        migrations.CreateModel(
+            name='GoodImage',
+            fields=[
+                ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+                ('order', models.IntegerField(default=1)),
+            ],
+        ),
+        migrations.RemoveField(
+            model_name='good',
+            name='images',
+        ),
+        migrations.AddField(
+            model_name='good',
+            name='images',
+            field=models.ManyToManyField(blank=True, related_name='goods', through='goods.GoodImage', to='goods.image'),
+        ),
+        migrations.AddField(
+            model_name='goodimage',
+            name='good',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='goods.good'),
+        ),
+        migrations.AddField(
+            model_name='goodimage',
+            name='image',
+            field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='goods.image'),
+        ),
+    ]

+ 8 - 3
store_back/apps/goods/models.py

@@ -4,7 +4,6 @@ from django.utils import timezone
 
 
 
-
 class Image(models.Model):
     _id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
     url = models.ImageField(upload_to ='uploads/')
@@ -17,6 +16,12 @@ class Good(models.Model):
     description = models.CharField('description',default="", max_length = 1000,blank=True)
     price = models.IntegerField("price", default=0,blank=True)
     amount = models.IntegerField("amount", default=0,blank=True)
-    images = models.ManyToManyField(Image,related_name ="goods", blank = True)
-    date = models.DateTimeField(default=timezone.now)
+    images = models.ManyToManyField(Image,related_name ="goods", blank = True,through='GoodImage')
+    createdAt = models.DateTimeField(default=timezone.now)
+
+
 
+class GoodImage(models.Model):
+    image = models.ForeignKey(Image,on_delete=models.CASCADE)
+    good = models.ForeignKey(Good,on_delete=models.CASCADE)
+    order = models.IntegerField(default=1)

+ 16 - 11
store_back/apps/goods/schema.py

@@ -7,6 +7,7 @@ from functools import reduce
 from .serializers import GoodSerializer
 from django.forms.models import model_to_dict
 
+
 import operator
 from django.db.models import Q
 
@@ -26,7 +27,7 @@ class ImageInput(graphene.InputObjectType):
     url = graphene.String(name='url',required=True)
 
 
-class GoodType(DjangoObjectType):
+class GoodType(graphene.ObjectType):
     _id = graphene.String(name='_id')
     images = graphene.List(ImageType)
     name = graphene.String()
@@ -34,10 +35,9 @@ class GoodType(DjangoObjectType):
     price = graphene.Int()
     amount = graphene.Int()
     categories = graphene.List('categories.schema.CategoryType')
+    createdAt = graphene.String()
+
 
-    class Meta:
-        model = Good
-        exclude_fields = ('_id',"name","description","price","amount",)
 
     def resolve__id(self,info):
         return self._id
@@ -60,6 +60,8 @@ class GoodType(DjangoObjectType):
     def resolve_amount(self,info):
         return self.amount
 
+    def resolve_createdAt(self,info):
+        return self.createdAt.strftime('%s')
 
 class GoodInput(graphene.InputObjectType):
     _id = graphene.String(name='_id')
@@ -174,9 +176,11 @@ class GoodUpsert(graphene.Mutation):
     def mutate(root,info,good):
         new_good={}
         image_list = []
-        # user = info.context.user
-        # if not user.is_superuser:
-        #     raise Exception("Authentication credentials were not provided")
+
+        user = info.context.user
+        if not user.is_superuser:
+            raise Exception("Authentication credentials were not provided")
+
         if "images" in good:
             image_list = [f['_id'] for f in good["images"]]
             good.pop("images",None)
@@ -211,15 +215,16 @@ class GoodDelete(graphene.Mutation):
 
     @staticmethod
     def mutate(root,info,good):
-        # user = info.context.user
-        # if not user.is_superuser:
-        #     raise Exception("Authentication credentials were not provided")
+        user = info.context.user
+        if not user.is_superuser:
+            raise Exception("Authentication credentials were not provided")
 
 
         try:
             _id = good._id
             good_to_delete = Good.objects.get(_id=_id)
-            good_data = GoodSerializer(good_to_delete).data
+            good_data = model_to_dict(good_to_delete)
+            good_data["_id"] = new_good._id
             good_to_delete.delete()
         except:
             raise Exception("Не вірні дані")

+ 44 - 0
store_back/apps/orders/migrations/0008_rename_date_order_createdat_remove_order_address_and_more.py

@@ -0,0 +1,44 @@
+# Generated by Django 4.0.4 on 2022-06-24 19:24
+
+from django.db import migrations, models
+import django.utils.timezone
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        ('orders', '0007_remove_order_adress_order_address'),
+    ]
+
+    operations = [
+        migrations.RenameField(
+            model_name='order',
+            old_name='date',
+            new_name='createdAt',
+        ),
+        migrations.RemoveField(
+            model_name='order',
+            name='address',
+        ),
+        migrations.RemoveField(
+            model_name='order',
+            name='email',
+        ),
+        migrations.RemoveField(
+            model_name='order',
+            name='name',
+        ),
+        migrations.RemoveField(
+            model_name='order',
+            name='phoneNumber',
+        ),
+        migrations.RemoveField(
+            model_name='order',
+            name='surname',
+        ),
+        migrations.AddField(
+            model_name='ordergood',
+            name='createdAt',
+            field=models.DateTimeField(default=django.utils.timezone.now),
+        ),
+    ]

+ 21 - 0
store_back/apps/orders/migrations/0009_order_owner.py

@@ -0,0 +1,21 @@
+# Generated by Django 4.0.4 on 2022-06-29 13:05
+
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+    dependencies = [
+        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
+        ('orders', '0008_rename_date_order_createdat_remove_order_address_and_more'),
+    ]
+
+    operations = [
+        migrations.AddField(
+            model_name='order',
+            name='owner',
+            field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='orders', to=settings.AUTH_USER_MODEL),
+        ),
+    ]

+ 4 - 7
store_back/apps/orders/models.py

@@ -1,20 +1,17 @@
 from django.db import models
 from goods.models import Good
 from django.utils import timezone
+from django.contrib.auth import get_user_model
 import uuid
 
 
 class Order(models.Model):
     _id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
-    date = models.DateTimeField(default=timezone.now)
+    createdAt = models.DateTimeField(default=timezone.now)
     status = models.IntegerField("status", default=1)
     price = models.IntegerField("price", default=1)
-    phoneNumber = models.CharField("phoneNumber", max_length=15)
     delivery = models.CharField("delivery",max_length=50,default="-")
-    address = models.CharField("address",max_length=150,default="-")
-    name = models.CharField("name",max_length=150,default="-")
-    surname = models.CharField("surname",max_length=150,default="-")
-    email  = models.CharField("email", max_length=50)
+    owner = models.ForeignKey(get_user_model(),related_name="orders",on_delete=models.SET_NULL, null = True)
 
 
 
@@ -24,7 +21,7 @@ class OrderGood(models.Model):
     price = models.IntegerField("price", default=1)
     count = models.IntegerField("count", default=1)
     order = models.ForeignKey(Order, on_delete=models.CASCADE, related_name="orderGoods",blank=True,null=True)
-
+    createdAt = models.DateTimeField(default=timezone.now)
 
 
 

+ 322 - 0
store_back/apps/orders/schema.py

@@ -0,0 +1,322 @@
+import graphene
+from graphene_django.types import DjangoObjectType
+from graphql_jwt.decorators import login_required
+from .models import Order,OrderGood
+from goods.models import Good
+import json
+from functools import reduce
+from django.forms.models import model_to_dict
+
+import operator
+from django.db.models import Q
+
+
+
+
+class OrderGoodType(graphene.ObjectType):
+    _id = graphene.String(name='_id')
+    good = graphene.Field('goods.schema.GoodType')
+    price = graphene.Int()
+    count = graphene.Int()
+    order = graphene.Field(lambda:OrderType)
+    createdAt = graphene.String()
+
+
+    def resolve__id(self,info):
+        return self._id
+
+    def resolve_good(self,info):
+        return self.good
+
+    def resolve_price(self,info):
+        return self.price
+
+    def resolve_count(self,info):
+        print(self)
+        return self.count
+
+    def resolve_order(self,info):
+        return self.order
+
+    def resolve_createdAt(self,info):
+        return self.createdAt.strftime('%s')
+
+
+class OrderGoodInput(graphene.InputObjectType):
+    _id = graphene.String(name='_id')
+    good = graphene.Field("goods.schema.GoodInput")
+    count = graphene.Int()
+    order = graphene.Field(lambda:OrderInput)
+
+
+
+
+
+
+
+class OrderType(graphene.ObjectType):
+    _id = graphene.String(name='_id')
+    createdAt = graphene.String()
+    status = graphene.Int()
+    price = graphene.Int()
+    orderGoods = graphene.List(OrderGoodType)
+    delivery = graphene.String()
+
+
+
+    def resolve__id(self,info):
+        return self._id
+
+    def resolve_status(self,info):
+        return self.status
+
+    def resolve_price(self,info):
+        return self.price
+
+    def resolve_delivery(self,info):
+        return self.delivery
+
+    def resolve_orderGoods(self,info):
+        try:
+            iter(self.orderGoods)
+            return self.orderGoods
+        except:
+            return self.orderGoods.all()
+
+    def resolve_createdAt(self,info):
+        return self.createdAt.strftime('%s')
+
+
+class OrderInput(graphene.InputObjectType):
+    _id = graphene.String(name='_id')
+    status = graphene.Int()
+    price = graphene.Int()
+    delivery = graphene.String()
+    orderGoods = graphene.List(OrderGoodInput)
+
+
+
+
+
+
+class Query(graphene.ObjectType):
+    OrderFind = graphene.List(OrderType,query = graphene.String())
+    OrderFindOne = graphene.Field(OrderType,query = graphene.String())
+
+    OrderGoodFind = graphene.List(OrderGoodType,query = graphene.String())
+    OrderGoodFindOne = graphene.Field(OrderGoodType,query = graphene.String())
+
+    def resolve_OrderFind(self,info,query = "[{}]"):
+        additional_params = {}
+        query_list = json.loads(query)
+        filter_params = query_list[0]
+        if len(query_list) > 1:
+            additional_params = query_list[1]
+
+        skip = int(additional_params.get("skip",0))
+        limit = int(additional_params.get("limit",20))
+        order_by = additional_params.get("orderBy","_id")
+
+        user = info.context.user
+        if not user.is_superuser:
+            query_set = Order.objects.all()
+
+        else:
+            query_set = Order.objects.filter(owner = user)
+
+
+        if len(filter_params):
+            query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+
+        query_set = query_set.order_by(order_by)[skip:skip+limit]
+        return query_set
+
+
+    def resolve_OrderFindOne(self,info,query = "[{}]"):
+        additional_params = {}
+        query_list = json.loads(query)
+        filter_params = query_list[0]
+        if len(query_list) > 1:
+            additional_params = query_list[1]
+
+        skip = additional_params.get("skip",0)
+        limit = additional_params.get("limit",20)
+        order_by = additional_params.get("orderBy","_id")
+
+        query_set = Order.objects.all()
+
+        if len(filter_params):
+            query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+
+        return query_set.first()
+
+
+
+    def resolve_OrderGoodFind(self,info,query = "[{}]"):
+        additional_params = {}
+        query_list = json.loads(query)
+        filter_params = query_list[0]
+        if len(query_list) > 1:
+            additional_params = query_list[1]
+
+        skip = additional_params.get("skip",0)
+        limit = additional_params.get("limit",20)
+        order_by = additional_params.get("orderBy","_id")
+
+        query_set = OrderGood.objects.all()
+
+        if len(filter_params):
+            query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+
+
+        return query_set
+
+
+    def resolve_OrderGoodFindOne(self,info,query = "[{}]"):
+        additional_params = {}
+        query_list = json.loads(query)
+        filter_params = query_list[0]
+        if len(query_list) > 1:
+            additional_params = query_list[1]
+
+        skip = additional_params.get("skip",0)
+        limit = additional_params.get("limit",20)
+        order_by = additional_params.get("orderBy","_id")
+
+        query_set = OrderGood.objects.all()
+
+        if len(filter_params):
+            query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+
+        return query_set.first()
+
+
+
+
+class OrderUpsert(graphene.Mutation):
+
+    class Arguments:
+        order = OrderInput(required=True)
+
+    Output =OrderType
+
+    @staticmethod
+    def mutate(root,info,order):
+
+        user = info.context.user
+        if not user.is_superuser:
+            raise Exception("Authentication credentials were not provided")
+
+        orderPrice = 0
+        new_order={}
+        orderGoods_list = []
+        # user = info.context.user
+        # if not user.is_superuser:
+        #     raise Exception("Authentication credentials were not provided")
+
+        if "orderGoods" in order:
+            orderGoods_list = order.pop("orderGoods",[])
+
+
+
+
+        try:
+            _id = order.pop("_id",None)
+            new_order = Order.objects.get(_id = _id)
+            new_order.__dict__.update(**order)
+        except Exception as e:
+            new_order = Order(**order)
+
+
+
+        if new_order:
+            new_order.save()
+
+        for orderGood in new_order.orderGoods.all():
+            if new_order.status != 4:
+                orderGood.good.amount += orderGood.count
+                orderGood.good.save()
+
+        new_order.orderGoods.clear()
+        for orderGood in orderGoods_list:
+
+            try:
+                good = Good.objects.get(_id = orderGood.get("_id"))
+            except:
+                raise Exception("Товар не знайдено")
+
+            count = orderGood.get("count")
+            if int(good.amount) - int(count) >= 0:
+                price = int(count) * int(good.price)
+                orderGoodToSave = OrderGood.objects.create(price = price, count = count, good = good)
+                orderGoodToSave.save()
+                new_order.orderGoods.add(orderGoodToSave)
+                orderPrice+=int(price)
+
+                if int(new_order.status) != 4:
+                    good.amount = int(good.amount) - int(count)
+                    good.save()
+
+            else:
+                raise Exception(f"{good.name}:Недостатньо товару!")
+
+        new_order.price = orderPrice
+
+
+        if new_order:
+            new_order.save()
+
+        else:
+            raise Exception("Error during order save")
+
+
+
+        order_data = model_to_dict(new_order)
+        order_data["_id"] = new_order._id
+        order_data["orderGoods"] = new_order.orderGoods.all()
+
+        return OrderType(**order_data)
+
+
+class OrderDelete(graphene.Mutation):
+
+    class Arguments:
+        order = OrderInput(required=True)
+
+    Output =OrderType
+
+    @staticmethod
+    def mutate(root,info,order):
+        user = info.context.user
+        if not user.is_superuser:
+            raise Exception("Authentication credentials were not provided")
+
+
+        try:
+            _id = order._id
+            order_to_delete = Order.objects.get(_id=_id)
+            order_data = model_to_dict(order_to_delete)
+            order_data["_id"] = order_to_delete._id
+            order_data["orderGoods"] = order_to_delete.orderGoods.all()
+            order_to_delete.delete()
+
+        except:
+            raise Exception("Не вірні дані")
+
+
+
+        return OrderType(**order_data)
+
+
+
+
+
+
+
+class Mutations(graphene.ObjectType):
+
+    OrderUpsert = OrderUpsert.Field()
+    OrderDelete = OrderDelete.Field()
+
+
+

+ 6 - 2
store_back/schema.py

@@ -1,18 +1,22 @@
 import graphene
 from goods.schema import Query as good_query
 from categories.schema import Query as category_query
+from orders.schema import Query as order_query
+from authAPI.schema import Query as auth_query
 from goods.schema import Mutations as good_mutations
 from categories.schema import Mutations as category_mutations
+from orders.schema import Mutations as order_mutations
+from authAPI.schema import Mutations as auth_mutations
 
 import graphql_jwt
 
 
-class Mutation(good_mutations,category_mutations):
+class Mutation(good_mutations,category_mutations,order_mutations,auth_mutations):
     token_auth = graphql_jwt.ObtainJSONWebToken.Field()
     verify_token = graphql_jwt.Verify.Field()
 
 
-class Query(good_query,category_query):
+class Query(good_query,category_query,order_query,auth_query):
     pass