diff --git a/.gitignore b/.gitignore index 68bc17f..4309b3e 100644 --- a/.gitignore +++ b/.gitignore @@ -2,10 +2,10 @@ __pycache__/ *.py[cod] *$py.class - +back/back/__pycache__/ # C extensions *.so - + # Distribution / packaging .Python build/ diff --git a/back/back/__pycache__/settings.cpython-310.pyc b/back/back/__pycache__/settings.cpython-310.pyc index 88adf35..f53848e 100644 Binary files a/back/back/__pycache__/settings.cpython-310.pyc and b/back/back/__pycache__/settings.cpython-310.pyc differ diff --git a/back/back/__pycache__/urls.cpython-310.pyc b/back/back/__pycache__/urls.cpython-310.pyc index 8568b7f..f37c6a0 100644 Binary files a/back/back/__pycache__/urls.cpython-310.pyc and b/back/back/__pycache__/urls.cpython-310.pyc differ diff --git a/back/back/settings.py b/back/back/settings.py index d660a26..0a5c933 100644 --- a/back/back/settings.py +++ b/back/back/settings.py @@ -39,6 +39,7 @@ 'django.contrib.staticfiles', 'fantazoo.apps.FantazooConfig', 'rest_framework', + 'corsheaders', ] MIDDLEWARE = [ @@ -49,6 +50,7 @@ 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'corsheaders.middleware.CorsMiddleware' ] ROOT_URLCONF = 'back.urls' @@ -80,7 +82,7 @@ 'ENGINE': 'djongo', # 'ENFORCE_SCHEMA': False, 'CLIENT': { - 'host': 'mongodb+srv://LucieB:Vedterg55@cluster0.3ipdlcg.mongodb.net/?retryWrites=true&w=majority', + 'host': 'mongodb+srv://lionel:lionel@cluster0.nxldmip.mongodb.net/?retryWrites=true&w=majority', 'name': 'fantazoo', 'authMechanism': 'SCRAM-SHA-1', } @@ -128,3 +130,5 @@ # https://docs.djangoproject.com/en/4.1/ref/settings/#default-auto-field DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' + +CORS_ORIGIN_ALLOW_ALL = True \ No newline at end of file diff --git a/back/back/urls.py b/back/back/urls.py index b3a9ecb..83d6328 100644 --- a/back/back/urls.py +++ b/back/back/urls.py @@ -15,12 +15,23 @@ """ from django.contrib import admin from django.urls import path,include -from fantazoo.views import AnimalAPIView -""" router=routers.SimpleRouter() -router.register('animals',AnimalAPIView) """ +from fantazoo.views import AnimalViewSet,ShoppingCartViewSet,OrderViewSet,OrderItemViewSet,UserViewSet +from fantazoo.views import AnimalAPIView,UserAPIView,OrderAPIView,OrderItemAPIView +from rest_framework import routers + +router=routers.SimpleRouter() +router.register('animals',AnimalViewSet,basename='animals') +router.register('users',UserViewSet,basename='users') +router.register('orders',OrderViewSet,basename='orders') +router.register('orderitems',OrderItemViewSet,basename='orderitems') +router.register('shoppingcarts',ShoppingCartViewSet,basename='shoppingcarts') + + urlpatterns = [ path('admin/', admin.site.urls), + path('api/',include(router.urls)), path('api-auth/', include('rest_framework.urls')), - path('api/animals/',AnimalAPIView.as_view()), + + ] diff --git a/back/fantazoo/__pycache__/models.cpython-310.pyc b/back/fantazoo/__pycache__/models.cpython-310.pyc index a38e689..73317e9 100644 Binary files a/back/fantazoo/__pycache__/models.cpython-310.pyc and b/back/fantazoo/__pycache__/models.cpython-310.pyc differ diff --git a/back/fantazoo/migrations/0001_initial.py b/back/fantazoo/migrations/0001_initial.py deleted file mode 100644 index dc8d4a0..0000000 --- a/back/fantazoo/migrations/0001_initial.py +++ /dev/null @@ -1,25 +0,0 @@ -# Generated by Django 4.1.2 on 2022-11-04 13:54 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - initial = True - - dependencies = [ - ] - - operations = [ - migrations.CreateModel( - name='Animal', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=50)), - ('description', models.CharField(max_length=200)), - ('age', models.IntegerField()), - ('type', models.CharField(max_length=50)), - ('image', models.CharField(max_length=200)), - ], - ), - ] diff --git a/back/fantazoo/migrations/__init__.py b/back/fantazoo/migrations/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/back/fantazoo/migrations/__pycache__/0001_initial.cpython-310.pyc b/back/fantazoo/migrations/__pycache__/0001_initial.cpython-310.pyc deleted file mode 100644 index 95722ca..0000000 Binary files a/back/fantazoo/migrations/__pycache__/0001_initial.cpython-310.pyc and /dev/null differ diff --git a/back/fantazoo/migrations/__pycache__/__init__.cpython-310.pyc b/back/fantazoo/migrations/__pycache__/__init__.cpython-310.pyc deleted file mode 100644 index f5c8fc4..0000000 Binary files a/back/fantazoo/migrations/__pycache__/__init__.cpython-310.pyc and /dev/null differ diff --git a/back/fantazoo/models.py b/back/fantazoo/models.py index a5bfd1f..836d590 100644 --- a/back/fantazoo/models.py +++ b/back/fantazoo/models.py @@ -4,18 +4,72 @@ # Create your models here. +class User(models.Model): + password = models.CharField(max_length=50) + email = models.CharField(max_length=50) + firstname = models.CharField(max_length=50) + lastname = models.CharField(max_length=50) + phone_number = models.CharField(max_length=10) + address = models.CharField(max_length=50) + is_admin = models.BooleanField(default=False) + + + class Animal(models.Model): + SEXE =[('M','Mâle'),('F','Femelle'),('ND','Non défini')] - SPECIES=[('Phoenix','Phoenix'),('Dragon','Dragon'),('Unicorn','Unicorn'),('Griffin','Griffin'),('Hippogriff','Hippogriff'),('Pegasus','Pegasus'),('Chimera','Chimera'),('Basilisk','Basilisk'),('Gorgon','Gorgon'),('ND','Non défini')] STATUT=[('A VENDRE','A VENDRE'),('VENDU','VENDU'),('EN STOCK','EN STOCK')] + TYPE=[('REPTILE','REPTILE'),('MAMMIFERE','MAMMIFERE'),('POISSON','POISSON'),('INSECTE','INSECTE'),('ARACHNIDE','ARACHNIDE'),('ND','Non défini')] + DIET=[('OMNIVORE','OMNIVORE'),('HERBIVORE','HERBIVORE'),('CARNIVORE','CARNIVORE'),('ND','Non défini')] + animal_name = models.CharField(max_length=50,default='ND') description = models.CharField(max_length=200) - price=models.FloatField() - Animalstatus=models.CharField(max_length=20,default='EN STOCK',choices=STATUT) - species=models.CharField(max_length=20,choices=SPECIES,default='ND') + price=models.FloatField(null=False, default=0) + animal_status=models.CharField(max_length=20,default='EN STOCK',choices=STATUT) + species=models.CharField(max_length=200) sexe=models.CharField(max_length=20,choices=SEXE,default='ND') age = models.IntegerField() - Animaltype = models.CharField(max_length=50) + animal_type = models.CharField(max_length=50,choices=TYPE,default='ND') image = models.CharField(max_length=200) - diet = models.CharField(max_length=200) + diet = models.CharField(max_length=200,choices=DIET,default='ND') + +class ShoppingCart(models.Model): + userID = models.ForeignKey(User, on_delete=models.CASCADE) + product = models.ForeignKey(Animal, on_delete=models.CASCADE) + product_quantity = models.IntegerField(null=False,blank=False) + created_at = models.DateTimeField(auto_now_add=True) + total = models.FloatField() + + def get_price(self): + return self.product.price * self.product_quantity + + def __str__(self): + return self.product.description + +class Order(models.Model): + userID = models.ForeignKey(User, on_delete=models.CASCADE) + product = models.ForeignKey(Animal, on_delete=models.CASCADE) + product_quantity = models.IntegerField() + total_price = models.FloatField(null=False,blank=False) + created_at = models.DateTimeField(auto_now_add=True) + + def get_order_address(self): + return self.userID.address + + + def __str__(self): + return self.product.description + +class OrderItem(models.Model): + order=models.ForeignKey(Order,on_delete=models.CASCADE) + product=models.ForeignKey(Animal,on_delete=models.CASCADE) + price = models.FloatField(null=False,default=0.0) + quantity = models.IntegerField(null=False,default=0) + + def get_price_item(self): + return self.product.price + + + def __str__(self): + return '{}{}'.format(self.order.id) \ No newline at end of file diff --git a/back/fantazoo/serializers.py b/back/fantazoo/serializers.py index 520677c..3a6b3d5 100644 --- a/back/fantazoo/serializers.py +++ b/back/fantazoo/serializers.py @@ -1,14 +1,34 @@ from rest_framework.serializers import ModelSerializer -from .models import Animal +from .models import Animal,User,ShoppingCart,Order,OrderItem + + +class UserSerializer(ModelSerializer): + class Meta: + model = User + fields = '__all__' +class OrderItemSerializer(ModelSerializer): + class Meta: + model = OrderItem + fields = '__all__' +class OrderSerializer(ModelSerializer): + class Meta: + model = Order + fields = '__all__' + +class ShoppingCartSerializer(ModelSerializer): + class Meta: + model = ShoppingCart + fields = '__all__' + class AnimalSerializer(ModelSerializer): class Meta: model = Animal fields = '__all__' - def create(self, validated_data): + """ def create(self, validated_data): validated_data['Animalstatus'] = 'EN STOCK' instance= Animal.objects.create(**validated_data) instance.save() - return instance - \ No newline at end of file + return instance """ + diff --git a/back/fantazoo/views.py b/back/fantazoo/views.py index 3027d14..8d3fadf 100644 --- a/back/fantazoo/views.py +++ b/back/fantazoo/views.py @@ -1,22 +1,76 @@ from django.shortcuts import render -from .models import Animal -from .serializers import AnimalSerializer +from .models import Animal,User,ShoppingCart,Order,OrderItem +from .serializers import AnimalSerializer,UserSerializer,ShoppingCartSerializer,OrderSerializer,OrderItemSerializer from rest_framework.views import APIView from rest_framework.response import Response from rest_framework.viewsets import ModelViewSet # Create your views here. + class AnimalAPIView(APIView): def get(self, *args,**kwargs): data = Animal.objects.all() serializer = AnimalSerializer(data, many=True) return Response(serializer.data) -""" - def post(self, request): - serializer = AnimalSerializer(data=request.data) + +class AnimalViewSet(ModelViewSet): + serializer_class = AnimalSerializer + def get_queryset(self): + return Animal.objects.all() +######## SHOPPING CART ######## + + ###AJOUTER UN PRODUIT AU PANIER##### + +class AddToCartAPIView(APIView): + def post(self, request, *args, **kwargs): + data = request.data + serializer = ShoppingCartSerializer(data=data) if serializer.is_valid(): serializer.save() - return Response(serializer.data, status=status.HTTP_201_CREATED) - return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) -# Create your views here. - """ \ No newline at end of file + return Response(serializer.data) + return Response(serializer.errors) + + ###AFFICHER LE PANIER##### + + +class ShoppingCartAPIView(APIView): + def get(self, *args,**kwargs): + data = ShoppingCart.objects.all() + serializer = ShoppingCartSerializer(data, many=True) + return Response(serializer.data) +class ShoppingCartViewSet(ModelViewSet): + serializer_class = ShoppingCartSerializer + def get_queryset(self): + return ShoppingCart.objects.all() +class UserAPIView(APIView): + def get(self, *args,**kwargs): + data = User.objects.all() + serializer = UserSerializer(data, many=True) + return Response(serializer.data) + +class UserViewSet(ModelViewSet): + serializer_class = UserSerializer + def get_queryset(self): + return User.objects.all() + +class OrderAPIView(APIView): + def get(self, *args,**kwargs): + data = Order.objects.all() + serializer = OrderSerializer(data, many=True) + return Response(serializer.data) + +class OrderViewSet(ModelViewSet): + serializer_class = OrderSerializer + def get_queryset(self): + return Order.objects.all() + +class OrderItemAPIView(APIView): + def get(self, *args,**kwargs): + data = OrderItem.objects.all() + serializer = OrderItemSerializer(data, many=True) + return Response(serializer.data) + +class OrderItemViewSet(ModelViewSet): + serializer_class = OrderItemSerializer + def get_queryset(self): + return OrderItem.objects.all() diff --git a/back/requirements.txt b/back/requirements.txt index 1de9e4f..9dbeaf6 100644 --- a/back/requirements.txt +++ b/back/requirements.txt @@ -1,5 +1,6 @@ asgiref==3.5.2 Django==4.1.3 +django-cors-headers==3.13.0 djangorestframework==3.14.0 djongo==1.3.6 dnspython==2.2.1 diff --git a/docu.md b/docu.md index e0cbbcf..2596230 100644 --- a/docu.md +++ b/docu.md @@ -1,4 +1,21 @@ Lancement de l'environnement + +Cours + + Utilisation de l’environnement virtuel et commandes associées : + 1. Création de l’environnement virtuel: py –m venv path/venv + 2. Utilisation/Activation du venv: source path/venv/Scripts/activate + 3. Installation de librairie: pip install + 4. Installation Django: pip install Django + 5. Copie des librairies dans un fichier: pip freeze> requirements.txt + 6. Installation des librairies depuis un fichier: pip install -r requirements.txt + 7. Fermeture/Désactivation du venv: deactivate + Se placer dans le répertoire du projet -source path/venv/Scripts/activate \ No newline at end of file +source path/venv/Scripts/activate + +python3 manage.py makemigrations fantazoo + python3 manage.py migrate + + python3 manage.py runserver fantazoo \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 06fabd0..1de9e4f 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,9 +1,17 @@ asgiref==3.5.2 Django==4.1.3 +djangorestframework==3.14.0 djongo==1.3.6 dnspython==2.2.1 +et-xmlfile==1.1.0 +numpy==1.23.4 +openpyxl==3.0.10 +pandas==1.5.0 +pykerberos==1.2.4 pymongo==3.12.3 +python-dateutil==2.8.2 python-snappy==0.6.1 +pytz==2022.4 +six==1.16.0 sqlparse==0.2.4 tzdata==2022.6 -#winkerberos==0.9.0