Browse Source

filter fix

ilya_shyian 2 years ago
parent
commit
98d04a05e2

+ 6 - 5
store_back/apps/authAPI/schema.py

@@ -27,6 +27,7 @@ class UserType(graphene.ObjectType):
 
 
 
+
     def resolve__id(self,info):
         return self._id
 
@@ -43,9 +44,7 @@ class UserType(graphene.ObjectType):
         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))
@@ -53,7 +52,6 @@ class UserType(graphene.ObjectType):
             if  user.is_superuser:
                 acl.append("admin")
 
-        print(acl)
         return acl
 
 
@@ -61,6 +59,7 @@ class UserType(graphene.ObjectType):
         return self.createdAt.strftime('%s')
 
 
+
 class UserInput(graphene.InputObjectType):
     _id = graphene.String(name='_id')
     avatar = graphene.Field(ImageInput)
@@ -68,6 +67,7 @@ class UserInput(graphene.InputObjectType):
     nick = graphene.String()
     acl = graphene.List(graphene.String)
     username = graphene.String()
+    password = graphene.String()
 
 
 
@@ -95,7 +95,7 @@ class Query(graphene.ObjectType):
 
 
         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.filter(reduce(operator.or_,(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
@@ -146,9 +146,10 @@ class UserUpsert(graphene.Mutation):
                 raise Exception("Username вже зайнятий")
             except:
                 pass
-            new_user = User(**user)
+            new_user = User.objects.create_user(username = user.username,password=user.password)
 
         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
 

+ 23 - 4
store_back/apps/categories/schema.py

@@ -17,9 +17,13 @@ class CategoryType(graphene.ObjectType):
     name = graphene.String()
     parent = graphene.Field(lambda: CategoryType)
     goods = graphene.List(good_schema.GoodType)
+    subcategories = graphene.List(lambda: CategoryType)
 
     def resolve__id(self,info):
-        return self._id
+        if isinstance(self, Category):
+            return self._id
+        else:
+            return self
 
     def resolve_goods(self,info):
         try:
@@ -33,12 +37,18 @@ class CategoryType(graphene.ObjectType):
         return self.parent
 
 
+    def resolve_subcategories(self,info):
+        query_set = []
+        query_set = Category.objects.filter(parent = self._id)
+        return query_set
+
 
 class CategoryInput(graphene.InputObjectType):
     _id = graphene.String(name='_id')
     name = graphene.String()
     parent = graphene.Field(lambda:CategoryInput)
     goods = graphene.List(good_schema.GoodInput)
+    subcategories = graphene.List(lambda:CategoryInput)
 
 
 
@@ -48,6 +58,7 @@ class Query(graphene.ObjectType):
 
 
     def resolve_CategoryFind(self,info,query = "[{}]"):
+
         additional_params = {}
         query_list = json.loads(query)
         filter_params = query_list[0]
@@ -61,9 +72,9 @@ class Query(graphene.ObjectType):
         query_set = Category.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.filter(reduce(operator.or_,(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
 
 
@@ -99,6 +110,7 @@ class CategoryUpsert(graphene.Mutation):
     def mutate(root,info,category ={}):
         new_category={}
         good_list = []
+        subcategories_list = []
 
         user = info.context.user
         if not user.is_superuser:
@@ -109,6 +121,9 @@ class CategoryUpsert(graphene.Mutation):
             good_list = [f['_id'] for f in category["goods"]]
             category.pop("goods",None)
 
+        if "subcategories" in category:
+            subcategories_list = [Category.objects.get(_id = f["_id"]) for f in category["subcategories"]]
+            category.pop("subcategories",None)
 
         try:
             _id = category._id
@@ -121,6 +136,10 @@ class CategoryUpsert(graphene.Mutation):
         new_category.save()
         if len(good_list):
             new_category.goods.set(good_list)
+
+        if len(subcategories_list):
+            new_category.subcategories.set(subcategories_list)
+
         category_data = model_to_dict(new_category)
         category_data["_id"] = new_category._id
         return CategoryType(**category_data)
@@ -147,7 +166,7 @@ class CategoryDelete(graphene.Mutation):
             _id = category._id
             category_to_delete = Category.objects.get(_id=_id)
             category_data = model_to_dict(category_to_delete)
-            category_data["_id"] = new_category._id
+            category_data["_id"] = category_to_delete._id
             category_to_delete.delete()
 
         except:

+ 5 - 2
store_back/apps/goods/models.py

@@ -23,5 +23,8 @@ class Good(models.Model):
 
 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)
+    good = models.ForeignKey(Good,on_delete=models.CASCADE,related_name="GoodImages")
+    order = models.IntegerField(default=1)
+
+    class Meta:
+        ordering = ('order',)

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

@@ -6,25 +6,27 @@ import json
 from functools import reduce
 from .serializers import GoodSerializer
 from django.forms.models import model_to_dict
-
+from django.db.models import Count
 
 import operator
 from django.db.models import Q
 
 
 
-class ImageType(DjangoObjectType):
+class ImageType(graphene.ObjectType):
     _id = graphene.String(name='_id')
-    class Meta:
-        model = Image
-        exclude_fields = ('_id',)
+    url = graphene.String()
 
     def resolve__id(self,info):
         return self._id
 
+    def resolve_url(self,info):
+        return self.url
+
+
 class ImageInput(graphene.InputObjectType):
     _id = graphene.String(name='_id')
-    url = graphene.String(name='url',required=True)
+    url = graphene.String(name='url')
 
 
 class GoodType(graphene.ObjectType):
@@ -43,7 +45,7 @@ class GoodType(graphene.ObjectType):
         return self._id
 
     def resolve_images(self,info):
-        return self.images.all()
+        return self.images.all().order_by("goodimage__order")
 
     def resolve_categories(self,info):
         return self.categories.all()
@@ -98,9 +100,13 @@ class Query(graphene.ObjectType):
 
 
         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.filter(reduce(operator.or_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+
+        if order_by == 'popular':
+            query_set = query_set.annotate(order_count=Count('orderGoods')).order_by("order_count")[skip:skip+limit]
+        else:
+            query_set = query_set.order_by(order_by)[skip:skip+limit]
 
-        query_set = query_set.order_by(order_by)[skip:skip+limit]
         return query_set
 
 
@@ -118,7 +124,7 @@ class Query(graphene.ObjectType):
         query_set = Good.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.filter(reduce(operator.or_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
 
         return query_set.first()
 
@@ -158,8 +164,10 @@ class Query(graphene.ObjectType):
         query_set = Image.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()])))
-
+            try:
+                query_set = query_set.filter(reduce(operator.and_,(Q(**d) for d in [dict([i]) for i in filter_params.items()])))
+            except:
+                raise Exception("Не вірні дані")
         return query_set.first()
 
 
@@ -175,17 +183,28 @@ class GoodUpsert(graphene.Mutation):
     @staticmethod
     def mutate(root,info,good):
         new_good={}
-        image_list = []
+        image_list = None
+        category_list = None
 
         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"]]
+            image_list = [f["_id"] for f in good["images"]]
+        #     image_list = []
+        #     for idx, image in enumerate(good["images"]):
+        #         image["order"] = idx+1
+        #         image_list.append(image)
+
+
+
             good.pop("images",None)
 
 
+        if "categories" in good:
+            category_list = [f['_id'] for f in good["categories"]]
+            good.pop("categories",None)
 
         try:
             _id = good._id
@@ -196,9 +215,19 @@ class GoodUpsert(graphene.Mutation):
             new_good = Good(**good)
 
         new_good.save()
-        if len(image_list):
+
+        if image_list != None:
             new_good.images.set(image_list)
+            
+            for idx,image in enumerate(image_list):
+                instance = new_good.GoodImages.get(image = image)
+                instance.order = idx+1
+                instance.save()
+        
+        if category_list != None:
+            new_good.categories.set(category_list)    
 
+        new_good.save()
         good_data = model_to_dict(new_good)
         good_data["_id"] = new_good._id
         return GoodType(**good_data)
@@ -216,6 +245,7 @@ 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")
 
@@ -224,7 +254,7 @@ class GoodDelete(graphene.Mutation):
             _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_data["_id"] = good_to_delete ._id
             good_to_delete.delete()
         except:
             raise Exception("Не вірні дані")

+ 1 - 5
store_back/apps/goods/urls.py

@@ -10,9 +10,5 @@ urlpatterns = [
     path('goods/<str:_id>/',views.good_detail, name = 'good_detail'),
     path('good/<str:_id>/delete/',views.good_delete, name = 'good_delete'),
     path('good/',views.good_upsert, name = 'good_upsert'),
-    path('upload/',views.image_upsert, name = 'image_upsert')
-    # path('add-rating/',views.AddStarRating.as_view(),name = "add_rating"),
-    # path('<slug:slug>/',views.BookDetailView.as_view(), name = 'book_detail'),
-    # path('<slug:slug>/<int:page_id>/',views.Page.as_view(), name = 'page'),
-    # path('ajax/show_more_books/<int:page>/',views.ShowMoreBooks.as_view(), name = 'show_more_books'),
+   
 ]

+ 0 - 3
store_back/apps/goods/views.py

@@ -123,9 +123,6 @@ def good_upsert(request):
 
 
 @csrf_exempt
-@api_view(['POST'])
-@authentication_classes([JWTAuthentication])
-@permission_classes((IsAdminUser, ))
 def image_upsert(request):
         file = request.FILES.get("photo" , None)
         if file:

+ 1 - 1
store_back/apps/orders/models.py

@@ -17,7 +17,7 @@ class Order(models.Model):
 
 class OrderGood(models.Model):
     _id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
-    good = models.ForeignKey(Good, on_delete=models.CASCADE)
+    good = models.ForeignKey(Good, on_delete=models.CASCADE,related_name="orderGoods")
     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)

+ 50 - 18
store_back/apps/orders/schema.py

@@ -4,13 +4,17 @@ from graphql_jwt.decorators import login_required
 from .models import Order,OrderGood
 from goods.models import Good
 import json
+from authAPI.schema import UserInput
 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 OrderGoodType(graphene.ObjectType):
@@ -21,7 +25,6 @@ class OrderGoodType(graphene.ObjectType):
     order = graphene.Field(lambda:OrderType)
     createdAt = graphene.String()
 
-
     def resolve__id(self,info):
         return self._id
 
@@ -32,12 +35,13 @@ class OrderGoodType(graphene.ObjectType):
         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')
 
@@ -46,7 +50,6 @@ class OrderGoodInput(graphene.InputObjectType):
     _id = graphene.String(name='_id')
     good = graphene.Field("goods.schema.GoodInput")
     count = graphene.Int()
-    order = graphene.Field(lambda:OrderInput)
 
 
 
@@ -61,6 +64,7 @@ class OrderType(graphene.ObjectType):
     price = graphene.Int()
     orderGoods = graphene.List(OrderGoodType)
     delivery = graphene.String()
+    owner = graphene.Field('authAPI.schema.UserType')
 
 
 
@@ -83,6 +87,9 @@ class OrderType(graphene.ObjectType):
         except:
             return self.orderGoods.all()
 
+    def resolve_owner(self,info):
+        return self.owner
+
     def resolve_createdAt(self,info):
         return self.createdAt.strftime('%s')
 
@@ -92,6 +99,7 @@ class OrderInput(graphene.InputObjectType):
     status = graphene.Int()
     price = graphene.Int()
     delivery = graphene.String()
+    owner = graphene.Field(UserInput)
     orderGoods = graphene.List(OrderGoodInput)
 
 
@@ -110,23 +118,27 @@ class Query(graphene.ObjectType):
         additional_params = {}
         query_list = json.loads(query)
         filter_params = query_list[0]
+  
+        if "status" in filter_params and int(filter_params.get("status")) == 0:
+            filter_params.pop("status")
+            
         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:
+        if 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.filter(reduce(operator.or_,(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
@@ -142,8 +154,12 @@ class Query(graphene.ObjectType):
         skip = additional_params.get("skip",0)
         limit = additional_params.get("limit",20)
         order_by = additional_params.get("orderBy","_id")
+        user = info.context.user
 
-        query_set = Order.objects.all()
+        if  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()])))
@@ -204,29 +220,45 @@ class OrderUpsert(graphene.Mutation):
     def mutate(root,info,order):
 
         user = info.context.user
-        if not user.is_superuser:
+
+        if not user.is_authenticated:
             raise Exception("Authentication credentials were not provided")
 
         orderPrice = 0
         new_order={}
+        owner = None
         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",[])
 
+        
+        if "owner" in order:
+            try:
+                owner = User.objects.get(pk =order.pop("owner")["_id"])
+            except:
+                raise Exception("Не вірні дані")
 
+        try:
+            if "_id" in order:
 
+                new_order = Order.objects.get(_id = order._id)
 
-        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 not user.is_superuser:
+                    raise Exception("Authentication credentials were not provided")
 
+                new_order.__dict__.update(**order)
+
+                if owner:
+                    new_order.owner = owner
+
+            else:
+                new_order = Order(**order)
+                new_order.owner = user
+
+        except Exception as e:
+            raise Exception("Не вірні дані")
 
 
         if new_order:
@@ -241,7 +273,7 @@ class OrderUpsert(graphene.Mutation):
         for orderGood in orderGoods_list:
 
             try:
-                good = Good.objects.get(_id = orderGood.get("_id"))
+                good = Good.objects.get(_id = orderGood.get("good")["_id"])
             except:
                 raise Exception("Товар не знайдено")
 

+ 2 - 2
store_back/settings.py

@@ -137,10 +137,10 @@ DATABASES = {
 # https://docs.djangoproject.com/en/4.0/howto/static-files/
 
 STATIC_ROOT = os.path.join(BASE_DIR, 'static')
-STATIC_URL = 'api/static/'
+STATIC_URL = '/static/'
 
 MEDIA_ROOT = os.path.join(BASE_DIR, 'media').replace('\\', '/')
-MEDIA_URL = 'api/media/'
+MEDIA_URL = '/media/'
 
 
 # Default primary key field type

+ 2 - 1
store_back/urls.py

@@ -6,13 +6,14 @@ from django.views.decorators.csrf import csrf_exempt
 from django.conf.urls.static import static
 from django.conf import settings
 from .schema import schema
-
+from goods.views import image_upsert
 
 
 urlpatterns = [
     path('api/', include('goods.urls')),
     path('api/', include('orders.urls')),
     path('api/', include('categories.urls')),
+    path('upload/',image_upsert),
     path('api/auth/',include('authAPI.urls')),
     path('api/admin/', admin.site.urls),
     path('graphql/',csrf_exempt(GraphQLView.as_view(

+ 1 - 0
store_back/utils.py

@@ -26,6 +26,7 @@ def jwt_payload(user, context=None):
 
     if user._id:
         payload["sub"]["acl"].append(str(user._id))
+        payload["sub"]["acl"].append("user")
         if  user.is_superuser:
             payload["sub"]["acl"].append("admin")
         payload["sub"]["login"] = user.username