rest api implementation

This commit is contained in:
Corban-Lee Jones 2024-01-12 19:25:25 +00:00
parent 690bec9b24
commit e0e16efb71
11 changed files with 134 additions and 1 deletions

0
apps/api/__init__.py Normal file
View File

3
apps/api/admin.py Normal file
View File

@ -0,0 +1,3 @@
from django.contrib import admin
# Register your models here.

8
apps/api/config.py Normal file
View File

@ -0,0 +1,8 @@
# -*- encoding: utf-8 -*-
from django.apps import AppConfig
class MyConfig(AppConfig):
name = 'apps.api'
label = 'apps_api'

View File

3
apps/api/models.py Normal file
View File

@ -0,0 +1,3 @@
from django.db import models
# Create your models here.

57
apps/api/serializers.py Normal file
View File

@ -0,0 +1,57 @@
# -*- encoding: utf-8 -*-
from django.apps import apps
from django.conf import settings
from rest_framework import serializers
from apps.home.models import Ticket, TicketPriority, TicketTag
from apps.authentication.models import Department
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = Department
fields = [
"uuid", "title", "icon"
]
class UserSerializer(serializers.ModelSerializer):
department = DepartmentSerializer()
class Meta:
model = apps.get_model(settings.AUTH_USER_MODEL)
fields = [
"uuid", "icon", "email", "forename", "surname", "department",
"create_timestamp", "edit_timestamp"
]
class TicketPrioritySerializer(serializers.ModelSerializer):
class Meta:
model = TicketPriority
fields = [
"uuid", "title", "colour", "backgroundcolour"
]
class TicketTagSerializer(serializers.ModelSerializer):
class Meta:
model = TicketTag
fields = [
"uuid", "title", "colour", "backgroundcolour"
]
class TicketSerializer(serializers.ModelSerializer):
author = UserSerializer()
priority = TicketPrioritySerializer()
tags = TicketTagSerializer(many=True)
class Meta:
model = Ticket
fields = [
"uuid", "title", "description", "author", "create_timestamp",
"edit_timestamp", "is_edited", "was_yesterday", "is_older_than_day",
"timestamp", "priority", "tags",
]

3
apps/api/tests.py Normal file
View File

@ -0,0 +1,3 @@
from django.test import TestCase
# Create your tests here.

9
apps/api/urls.py Normal file
View File

@ -0,0 +1,9 @@
# -*- encoding: utf-8 -*-
from django.urls import path
from .views import TicketListApiView
urlpatterns = [
path("ticket/", TicketListApiView.as_view(), name="ticket"),
]

46
apps/api/views.py Normal file
View File

@ -0,0 +1,46 @@
# -*- encoding: utf-8 -*-
import json
from django.conf import settings
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status, permissions
from apps.home.models import Ticket, TicketPriority, TicketTag
from .serializers import (
TicketSerializer, TicketTagSerializer, TicketPrioritySerializer,
UserSerializer
)
class TicketListApiView(APIView):
permission_classes = [permissions.IsAuthenticated]
def get(self, request):
"""Return all tickets."""
filters = json.loads(request.GET.get("filters", "{}"))
queryset = Ticket.objects.all()
for key, values in filters.items():
for value in values:
if value == "all": continue
queryset = queryset.filter(**{key: [value]})
tickets = queryset.order_by("-create_timestamp")
serializer = TicketSerializer(tickets, many=True)
return Response(serializer.data, status=status.HTTP_200_OK)
def post(self, request):
"""Create a new ticket"""
serializer = TicketSerializer(data={
})
if not serializer.is_valid():
return Response(serlializer.errors, status=status.HTTP_400_BAD_REQUEST)
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)

View File

@ -36,7 +36,9 @@ INSTALLED_APPS = [
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'apps.home', # Enable the inner home (home)
'rest_framework',
'apps.api',
'apps.home',
'apps.authentication'
]

View File

@ -7,6 +7,8 @@ from django.urls import path, include # add this
urlpatterns = [
path('admin/', admin.site.urls), # Django admin route
path("api-auth/", include("rest_framework.urls")),
path("api/", include(("apps.api.urls", "apps.api"), namespace="api")),
# ADD NEW Routes HERE
*static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT),