Skip to content

Commit

Permalink
Merge pull request #9 from Decibels-UTC/back
Browse files Browse the repository at this point in the history
Back
  • Loading branch information
leopoldch authored Feb 5, 2024
2 parents 93779ed + 40eea74 commit 119886d
Show file tree
Hide file tree
Showing 35 changed files with 2,074 additions and 27 deletions.
3 changes: 3 additions & 0 deletions .idea/misc.xml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 19 additions & 0 deletions backend/app/migrations/0002_item_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.0.1 on 2024-02-04 11:46

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('app', '0001_initial'),
]

operations = [
migrations.AddField(
model_name='item',
name='type',
field=models.CharField(choices=[('light', 'Light'), ('son', 'Son'), ('structure', 'Structure'), ('autre', 'Autre')], default='autre', max_length=20),
preserve_default=False,
),
]
19 changes: 19 additions & 0 deletions backend/app/migrations/0003_alter_item_price.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.0.1 on 2024-02-04 14:55

import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('app', '0002_item_type'),
]

operations = [
migrations.AlterField(
model_name='item',
name='price',
field=models.FloatField(validators=[django.core.validators.MinValueValidator(0)]),
),
]
18 changes: 18 additions & 0 deletions backend/app/migrations/0004_item_state.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
# Generated by Django 5.0.1 on 2024-02-04 18:40

from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('app', '0003_alter_item_price'),
]

operations = [
migrations.AddField(
model_name='item',
name='state',
field=models.CharField(choices=[('neuf', 'Neuf'), ('use', 'Usé'), ('reparable', 'Réparable'), ('casse', 'Cassé')], default='neuf', max_length=20),
),
]
19 changes: 19 additions & 0 deletions backend/app/migrations/0005_item_power.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Generated by Django 5.0.1 on 2024-02-05 00:40

import django.core.validators
from django.db import migrations, models


class Migration(migrations.Migration):

dependencies = [
('app', '0004_item_state'),
]

operations = [
migrations.AddField(
model_name='item',
name='power',
field=models.IntegerField(default=0, validators=[django.core.validators.MinValueValidator(0)]),
),
]
37 changes: 36 additions & 1 deletion backend/app/models.py
Original file line number Diff line number Diff line change
@@ -1,16 +1,51 @@
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator


# Create your models here.
class Item(models.Model):
TYPES_CHOICES1 = [
('light', 'Light'),
('son', 'Son'),
('structure', 'Structure'),
('autre', 'Autre'),
]
TYPES_CHOICES2 = [
('neuf', 'Neuf'),
('use', 'Usé'),
('reparable', 'Réparable'),
('casse', 'Cassé'),
]
id = models.AutoField(primary_key=True)
name = models.CharField(max_length = 150)
brand = models.CharField(max_length = 150, null=True, blank=True)
price = models.IntegerField(validators=[MinValueValidator(0)])
price = models.FloatField(validators=[MinValueValidator(0)])
state = models.CharField(max_length=20, choices=TYPES_CHOICES2, default='neuf')
power = models.IntegerField(validators=[MinValueValidator(0)],default=0)
quantity = models.IntegerField(validators=[MinValueValidator(0)])
modification_reason = models.CharField(max_length = 500, null=True, blank=True)
type = models.CharField(max_length=20, choices=TYPES_CHOICES1)
creation = models.DateTimeField(auto_now=True)
removed = models.DateTimeField(null=True, blank=True)
modification_date = models.DateTimeField(auto_now=True)





















32 changes: 31 additions & 1 deletion backend/app/serializer.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,39 @@
from rest_framework import serializers
from . models import *
from django.contrib.auth import get_user_model, authenticate

class ItemSerializer(serializers.ModelSerializer):
class Meta:
model = Item
fields = ['id','name' , 'brand', 'price', 'quantity', 'modification_reason', 'creation', 'removed', 'modification_date']
fields = ['id','name' , 'brand','state', 'price','type', 'quantity', 'modification_reason', 'creation', 'removed', 'modification_date']


class LoginSerializer(serializers.Serializer):
username = serializers.CharField(label="Username", write_only=True)
password = serializers.CharField(
label="Password",
style={'input_type': 'password'},
trim_whitespace=False,
write_only=True
)

def validate(self, attrs):
username = attrs.get('username')
password = attrs.get('password')

if username and password:
user = authenticate(request=self.context.get('request'), username=username, password=password)
if not user:
msg = 'Access denied: wrong username or password.'
raise serializers.ValidationError(msg, code='authorization')
attrs['user'] = user
else:
msg = 'Both "username" and "password" are required.'
raise serializers.ValidationError(msg, code='authorization')

return attrs





107 changes: 101 additions & 6 deletions backend/app/views.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,22 @@
from django.shortcuts import render
from rest_framework.views import APIView
from . models import *
from django.shortcuts import get_object_or_404
from . serializer import *
from rest_framework.response import Response
from rest_framework import status
from datetime import datetime, timezone
from django.contrib.auth import get_user_model, login, logout
from rest_framework.authentication import SessionAuthentication
from rest_framework import permissions, status
from rest_framework.authtoken.models import Token
from rest_framework.permissions import IsAuthenticated
from django.contrib.auth.models import User
from datetime import timedelta





# Create your views here.

Expand All @@ -14,11 +28,15 @@ def get(self, request):
"name" : output.name,
"brand" : output.brand,
"price" : output.price,
"power" : output.power,
"type": output.type,
"state": output.state,
"quantity" : output.quantity,
"modification_reason" : output.modification_reason,
"creation" : output.creation,
"removed" : output.removed,
"modification_date" : output.modification_date}
"modification_date" : output.modification_date,
}
for output in Item.objects.all()
]

Expand All @@ -30,8 +48,85 @@ def post(self, request):
serializer.save()
return Response(serializer.data)

def update(self, request):
serializer = ItemSerializer(data=request.data)
if serializer.is_valid(raise_exception=True):
serializer.save()
return Response(serializer.data)
def put(self, request, pk):
try:
item = Item.objects.get(pk=pk)
except Item.DoesNotExist:
return Response({"error": "Item not found"}, status=status.HTTP_404_NOT_FOUND)

if(item.name != None):
item.name = request.data.get("name", item.name)
if (item.brand != None):
item.brand = request.data.get("brand", item.brand)
if (item.price != None):
item.price = request.data.get("price", item.price)
if (item.type != None):
item.type = request.data.get("type", item.type)
if (item.quantity != None):
item.quantity = request.data.get("quantity", item.quantity)
if(item.quantity == 0):
item.removed = datetime.now(timezone.utc);
if (item.modification_reason != None):
item.modification_reason = request.data.get("modification_reason", item.modification_reason)
if item.modification_reason == "item deleted":
item.removed = datetime.now(timezone.utc);
if (item.state != None):
item.state = request.data.get("state", item.state)
if (item.power != None):
item.power = request.data.get("power", item.power)

item.save()

return Response({
"id":item.id,
"name" : item.name,
"brand" : item.brand,
"price" : item.price,
"power" : item.power,
"type": item.type,
"state": item.state,
"quantity" : item.quantity,
"modification_reason" : item.modification_reason,
"creation" : item.creation,
"removed" : item.removed,
"modification_date" : item.modification_date}
)




class LoginView(APIView):
permission_classes = (permissions.AllowAny,)

def post(self, request, format=None):
serializer = LoginSerializer(data=self.request.data, context={'request': self.request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
login(request, user)

# Générer un token pour l'utilisateur authentifié
token, created = Token.objects.get_or_create(user=user)

# Définir une date d'expiration pour le token
expiry_duration = timedelta(minutes=30) # Le token expire après 30 minutes
token.expires = datetime.now() + expiry_duration
token.save()

# Renvoyer le token dans la réponse
return Response({'token': token.key}, status=status.HTTP_200_OK)

class LogoutView(APIView):
def post(self, request, format=None):
if request.user.is_authenticated:
request.user.auth_token.delete()
return Response(status=status.HTTP_200_OK)

class VerifyTokenView(APIView):
def get(self, request):
token = request.META.get('HTTP_AUTHORIZATION', '')[6:] # Retirez 'Token ' du début
try:
token_obj = Token.objects.get(key=token)
user = User.objects.get(id=token_obj.user_id)
return Response({'user': user.username})
except Token.DoesNotExist:
return Response({'error': 'Token does not exist'}, status=401)
1 change: 1 addition & 0 deletions backend/backend/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
'app',
'rest_framework',
'corsheaders',
'rest_framework.authtoken',
]

MIDDLEWARE = [
Expand Down
6 changes: 5 additions & 1 deletion backend/backend/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,9 @@

urlpatterns = [
# path('youwillneverfindme/', admin.site.urls),
path('', ItemView.as_view(), name="Main")
path('', ItemView.as_view(), name="Main"),
path('items/<int:pk>/', ItemView.as_view(), name='item-update'),
path('login/', LoginView.as_view(), name='login'),
path('logout/', LogoutView.as_view(), name='logout'),
path('verify-token/', VerifyTokenView.as_view(), name='verify-token'),
]
Binary file modified backend/db.sqlite3
Binary file not shown.
Loading

0 comments on commit 119886d

Please sign in to comment.