From 882fd19be92e31f0a2337b724e5619008a9c62a4 Mon Sep 17 00:00:00 2001 From: Asraralqarnii Date: Mon, 1 Aug 2022 00:32:08 +0300 Subject: [PATCH] lab4 --- .gitignore | 2 + eStore/db.sqlite3 | Bin 0 -> 143360 bytes eStore/eStore/__init__.py | 0 eStore/eStore/asgi.py | 16 ++ eStore/eStore/settings.py | 125 ++++++++++++ eStore/eStore/urls.py | 22 ++ eStore/eStore/wsgi.py | 16 ++ eStore/estore_app/__init__.py | 0 eStore/estore_app/admin.py | 3 + eStore/estore_app/apps.py | 6 + eStore/estore_app/migrations/0001_initial.py | 38 ++++ eStore/estore_app/migrations/__init__.py | 0 eStore/estore_app/models.py | 20 ++ eStore/estore_app/serializers.py | 17 ++ eStore/estore_app/tests.py | 3 + eStore/estore_app/urls.py | 25 +++ eStore/estore_app/views.py | 200 +++++++++++++++++++ eStore/manage.py | 22 ++ 18 files changed, 515 insertions(+) create mode 100644 .gitignore create mode 100644 eStore/db.sqlite3 create mode 100644 eStore/eStore/__init__.py create mode 100644 eStore/eStore/asgi.py create mode 100644 eStore/eStore/settings.py create mode 100644 eStore/eStore/urls.py create mode 100644 eStore/eStore/wsgi.py create mode 100644 eStore/estore_app/__init__.py create mode 100644 eStore/estore_app/admin.py create mode 100644 eStore/estore_app/apps.py create mode 100644 eStore/estore_app/migrations/0001_initial.py create mode 100644 eStore/estore_app/migrations/__init__.py create mode 100644 eStore/estore_app/models.py create mode 100644 eStore/estore_app/serializers.py create mode 100644 eStore/estore_app/tests.py create mode 100644 eStore/estore_app/urls.py create mode 100644 eStore/estore_app/views.py create mode 100755 eStore/manage.py diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..d75edeae --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +venv +__pycache__ \ No newline at end of file diff --git a/eStore/db.sqlite3 b/eStore/db.sqlite3 new file mode 100644 index 0000000000000000000000000000000000000000..788472e5c4f22eecb9f855d489be0d80748e9c59 GIT binary patch literal 143360 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", views.update_brand, name="update_brand"), + path("delete/brand/", views.delete_brand, name="delete_brand"), + #Product + path("add/product", views.new_product, name="new_product"), + path("all/products", views.read_product, name="read_product"), + path("update/product/", views.update_product, name="update_product"), + path("delete/product/", views.delete_product, name="delete_product"), + #Spicific + path("products/brand/",views.products_of_brand,name="products_of_brand"), + path("limited/brands/",views.limited_list_brand,name="limited_list_brand"), + path("limited/products/",views.limited_list_product,name="limited_list_product"), + + #Search + path("search/",views.search,name="search"), + +] \ No newline at end of file diff --git a/eStore/estore_app/views.py b/eStore/estore_app/views.py new file mode 100644 index 00000000..8abe4d1d --- /dev/null +++ b/eStore/estore_app/views.py @@ -0,0 +1,200 @@ +from hashlib import new +from urllib import response +from django.shortcuts import render +from rest_framework.decorators import api_view +from rest_framework.response import Response +from rest_framework.request import Request +from rest_framework import status +from .models import Brand,Product +from .serializers import BrandSerializer,ProductSerializer + +# Brand... +# Add new brand +@api_view(['POST']) +def new_brand(request:Request): + + Brand_serializer = BrandSerializer(data=request.data) + + if Brand_serializer.is_valid(): + Brand_serializer.save() + else: + return Response({"Message" : "Couldn't create a brand", "errors" : Brand_serializer.errors}, status=status.HTTP_403_FORBIDDEN) + + return Response({"Message" : "Brand added successfully"}, status=status.HTTP_201_CREATED) + +# Get all brands +@api_view(['GET']) +def read_brand(request:Request): + + all_brands = Brand.objects.all() + brand_data = BrandSerializer(instance=all_brands, many=True).data + + response_data = { + "Message" : "All Brands List", + "Brand" : brand_data + } + + return Response(response_data, status=status.HTTP_200_OK) + + +# Update brand by id +@api_view(['PUT']) +def update_brand(request:Request, brand_id): + + try: + brand = Brand.objects.get(id = brand_id) + except Exception as e: + return Response({"Message" : "This brand is not found"}, status=status.HTTP_404_NOT_FOUND) + + brand_serializer = BrandSerializer(instance=brand, data=request.data) + + if brand_serializer.is_valid(): + brand_serializer.save() + else: + return Response({"Message" : "Couldn't update", "errors" : brand_serializer.errors}) + + return Response({"Message" : "Brand updated successfully"}) + +# Delete brand by id +@api_view(['DELETE']) +def delete_brand(request:Request, brand_id): + + brand = Brand.objects.get(id = brand_id) + brand.delete() + + response_data = { + "Message" : "Brand Information Deleted!", + } + return Response(response_data, status=status.HTTP_200_OK) + +# Limited list of brands +@api_view(["GET"]) +def limited_list_brand(request : Request): + + skip = int(request.query_params.get("skip", 0)) + get = int(request.query_params.get("get", 2)) + + brands_list = Brand.objects.all()[skip:get] + + brands = BrandSerializer(instance=brands_list, many=True).data + + res_data = { + "msg" : "Limited list of Brands", + "Brand" : brands + } + + return Response(res_data, status=status.HTTP_200_OK) + +# ***************************************************** # + +# Product... +# Add new brand +@api_view(['POST']) +def new_product(request:Request): + + Product_serializer = ProductSerializer(data=request.data) + if Product_serializer.is_valid(): + Product_serializer.save() + + else: + return Response({"Message" : "Couldn't create a product", "errors" : Product_serializer.errors}, status=status.HTTP_403_FORBIDDEN) + + return Response({ "Message" : "Added a Product Successfully"}, status=status.HTTP_201_CREATED) + +# Get all products +@api_view(['GET']) +def read_product(request:Request): + + all_products = Product.objects.all() + product_data = ProductSerializer(instance=all_products, many=True).data + + response_data = { + "Message" : "All Products List", + "Brand" : product_data + } + + return Response(response_data, status=status.HTTP_200_OK) + +# Update product by id +@api_view(['PUT']) +def update_product(request:Request,product_id): + + try: + product = Product.objects.get(id = product_id) + except Exception as e: + return Response({"Message" : "This product is not found"}, status=status.HTTP_404_NOT_FOUND) + + product_serializer = ProductSerializer(instance=product, data=request.data) + + if product_serializer.is_valid(): + product_serializer.save() + else: + return Response({"Message" : "Couldn't update", "errors" : product_serializer.errors}) + + return Response({"Message" : "Product updated successfully"}) + +# Delete product by id +@api_view(['DELETE']) +def delete_product(request:Request, product_id): + + product = Product.objects.get(id = product_id) + product.delete() + + response_data = { + "Message" : "Product Information Deleted!", + } + return Response(response_data, status=status.HTTP_200_OK) + +# Limited list of products +@api_view(["GET"]) +def limited_list_product(request : Request): + + skip = int(request.query_params.get("skip", 0)) + get = int(request.query_params.get("get", 2)) + + products_list = Product.objects.all()[skip:get] + + products = ProductSerializer(instance=products_list, many=True).data + + res_data = { + "msg" : "Limited list of Products", + "Products" : products + } + + return Response(res_data, status=status.HTTP_200_OK) + +# Get all products of spcific brand +@api_view(['GET']) +def products_of_brand(request:Request, brand_id): + + brand = Brand.objects.get(id= brand_id) + products = Product.objects.filter(brand= brand_id) + product_data = ProductSerializer(instance=products, many=True).data + + response_data = { + "Brand" : brand.title, + "Products" : product_data + } + + return Response(response_data, status=status.HTTP_200_OK) + +# ***************************************************** # + +#Search +@api_view(["GET"]) +def search(request : Request , brand_title): + try: + brand = Brand.objects.get(title = brand_title) + except Exception as e: + return Response({"Message" : "This brand title is not found"}, status=status.HTTP_404_NOT_FOUND) + + brands = Brand.objects.filter(title = brand_title) + brands_list = BrandSerializer(instance=brands, many=True).data + + res_data = { + "Search of brand title" : brand_title, + "Brand" : brands_list + } + + return Response(res_data, status=status.HTTP_200_OK) + diff --git a/eStore/manage.py b/eStore/manage.py new file mode 100755 index 00000000..df40967e --- /dev/null +++ b/eStore/manage.py @@ -0,0 +1,22 @@ +#!/usr/bin/env python +"""Django's command-line utility for administrative tasks.""" +import os +import sys + + +def main(): + """Run administrative tasks.""" + os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'eStore.settings') + try: + from django.core.management import execute_from_command_line + except ImportError as exc: + raise ImportError( + "Couldn't import Django. Are you sure it's installed and " + "available on your PYTHONPATH environment variable? Did you " + "forget to activate a virtual environment?" + ) from exc + execute_from_command_line(sys.argv) + + +if __name__ == '__main__': + main()