Skip to content

Commit 7afe104

Browse files
committed
Templated routes/views to be fulfilled. Added dotenv functionality. Updated requirements.
1 parent 37b589a commit 7afe104

22 files changed

+301
-48
lines changed

.env

Whitespace-only changes.

.gitignore

+2
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
1+
*/__pycache__/
2+
13
/books
24
/covers
4 Bytes
Binary file not shown.
-3.52 KB
Binary file not shown.

alttextbackend/urls.py

+5-5
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,16 @@
2121
from .views.books_bookid import BooksBookidView
2222
from .views.books_bookid_export import BooksBookidExportView
2323
from .views.books_bookid_images import BooksBookidImagesView
24-
from .views.books_bookid_src import BooksBookidSrcView
24+
from .views.books_bookid_image import BooksBookidImageView
2525
from .views.images_hash import ImagesHashView
2626

2727
urlpatterns = [
2828
# path("admin/", admin.site.urls),
2929
# path("api-auth/", include("rest_framework.urls")),
3030
path("books", BooksView.as_view()),
31-
path("books/<str:bookId>", BooksBookidView.as_view()),
32-
path("books/<str:bookId>/export", BooksBookidExportView.as_view()),
33-
path("books/<str:bookId>/images", BooksBookidImagesView.as_view()),
34-
path("books/<str:bookId>/<str:src>", BooksBookidSrcView.as_view()),
31+
path("books/<str:bookid>", BooksBookidView.as_view()),
32+
path("books/<str:bookid>/export", BooksBookidExportView.as_view()),
33+
path("books/<str:bookid>/images", BooksBookidImagesView.as_view()),
34+
path("books/<str:bookid>/<str:src>", BooksBookidImageView.as_view()),
3535
path("images/<str:hash>", ImagesHashView.as_view()),
3636
]
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.

alttextbackend/views/books.py

+41-9
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,55 @@
88
from uuid import uuid4
99

1010

11-
class BookSerializer(serializers.Serializer):
12-
title = serializers.CharField()
13-
description = serializers.CharField()
14-
cover = serializers.ImageField()
15-
file = serializers.FileField()
11+
class GetBooksSerializer(serializers.Serializer):
12+
titleQ = serializers.CharField(required=False)
13+
authorQ = serializers.CharField(required=False)
14+
sortBy = serializers.ChoiceField(choices=['title', 'author'], style={'base_template': 'radio.html'}, default = 'title')
15+
sortOrder = serializers.ChoiceField(choices=['asc', 'desc'], style={'base_template': 'radio.html'}, default = 'asc')
16+
limit = serializers.IntegerField(min_value=1, required=False)
17+
skip = serializers.IntegerField(min_value=0, required=False)
1618

19+
class AddBookSerializer(serializers.Serializer):
20+
title = serializers.CharField(required=True, allow_blank=False)
21+
author = serializers.CharField(required=True, allow_blank=False)
22+
description = serializers.CharField(required=False, allow_blank=True)
23+
file = serializers.FileField(required=True)
24+
cover = serializers.ImageField(required=False)
1725

1826
class BooksView(APIView):
1927
parser_classes = (FormParser, MultiPartParser)
20-
serializer_class = BookSerializer
28+
serializer_class = AddBookSerializer
29+
def get_serializer_class(self):
30+
if self.request.method == 'GET':
31+
return GetBooksSerializer
32+
elif self.request.method == 'POST':
33+
return AddBookSerializer
34+
return super().get_serializer_class()
2135

2236
def get(self, request, *args, **kwargs):
23-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
37+
serializer_class = self.get_serializer_class()
38+
serializer = serializer_class(data=request.query_params)
39+
if not serializer.is_valid():
40+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
41+
42+
# Access validated data
43+
validated_data = serializer.validated_data
44+
title_query = validated_data.get('titleQ')
45+
author_query = validated_data.get('authorQ')
46+
sort_by = validated_data.get('sortBy')
47+
sort_order = validated_data.get('sortOrder')
48+
limit = validated_data.get('limit')
49+
skip = validated_data.get('skip')
50+
51+
# TODO: perform logic
52+
53+
# TODO: return books
54+
return Response(validated_data, status=status.HTTP_200_OK)
2455

2556
def post(self, request, *args, **kwargs):
2657
# validate request data
27-
serializer = self.serializer_class(data=request.data)
58+
serializer_class = self.get_serializer_class()
59+
serializer = serializer_class(data=request.data)
2860
if not serializer.is_valid():
2961
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
3062
validated_data = serializer.validated_data
@@ -41,7 +73,7 @@ def post(self, request, *args, **kwargs):
4173

4274
# TODO: ensure book has valid root html file
4375

44-
# TODO: start analyzing book
76+
# TODO: analyze book and images, store them in database
4577

4678
# save cover image
4779
covers_path = "./covers/"

alttextbackend/views/books_bookid.py

+84-5
Original file line numberDiff line numberDiff line change
@@ -7,17 +7,96 @@
77
from django.core.files.base import ContentFile
88
from uuid import uuid4
99

10+
class GetBookSerializer(serializers.Serializer):
11+
bookid = serializers.CharField(required=True)
12+
13+
class UpdateBookSerialzer(serializers.Serializer):
14+
bookid = serializers.CharField(required=True)
15+
title = serializers.CharField(required=False, allow_blank=False)
16+
author = serializers.CharField(required=False, allow_blank=False)
17+
description = serializers.CharField(required=False, allow_blank=True)
18+
cover = serializers.ImageField(required=False)
19+
20+
class AnalyzeBookSerializer(serializers.Serializer):
21+
bookid = serializers.CharField(required=True)
22+
23+
class OverwriteBookSerializer(serializers.Serializer):
24+
bookid = serializers.CharField(required=True)
25+
file = serializers.FileField(required=True)
26+
27+
class DeleteBookSerializer(serializers.Serializer):
28+
bookid = serializers.CharField(required=True)
29+
1030
class BooksBookidView(APIView):
1131
parser_classes = (FormParser, MultiPartParser)
1232

33+
serializer_class = UpdateBookSerialzer
34+
def get_serializer_class(self):
35+
if self.request.method == 'GET':
36+
return GetBookSerializer
37+
elif self.request.method == 'PATCH':
38+
return UpdateBookSerialzer
39+
elif self.request.method == 'PUT':
40+
return AnalyzeBookSerializer
41+
elif self.request.method == 'DELETE':
42+
return DeleteBookSerializer
43+
return super().get_serializer_class()
44+
1345
def get(self, request, *args, **kwargs):
14-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
46+
serializer_class = self.get_serializer_class()
47+
serializer = serializer_class(data={"bookid": kwargs.get('bookid')})
48+
if not serializer.is_valid():
49+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
50+
validated_data = serializer.validated_data
1551

16-
def post(self, request, *args, **kwargs):
17-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
52+
# TODO: IMPLEMENT LOGIC
53+
54+
return Response(validated_data, status=status.HTTP_200_OK)
55+
56+
def patch(self, request, *args, **kwargs):
57+
serializer_class = self.get_serializer_class()
58+
data = request.data
59+
data['bookid'] = kwargs.get('bookid')
60+
serializer = serializer_class(data=data)
61+
if not serializer.is_valid():
62+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
63+
validated_data = serializer.validated_data
64+
65+
# TODO: IMPLEMENT LOGIC
66+
67+
return Response(validated_data, status=status.HTTP_200_OK)
1868

1969
def put(self, request, *args, **kwargs):
20-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
70+
serializer_class = self.get_serializer_class()
71+
serializer = serializer_class(data={"bookid": kwargs.get('bookid')})
72+
if not serializer.is_valid():
73+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
74+
validated_data = serializer.validated_data
75+
76+
# TODO: IMPLEMENT LOGIC
77+
78+
return Response(validated_data, status=status.HTTP_200_OK)
79+
80+
def post(self, request, *args, **kwargs):
81+
serializer_class = self.get_serializer_class()
82+
data = request.data
83+
data['bookid'] = kwargs.get('bookid')
84+
serializer = serializer_class(data=request.data)
85+
if not serializer.is_valid():
86+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
87+
validated_data = serializer.validated_data
88+
89+
# TODO: IMPLEMENT LOGIC
90+
91+
return Response(validated_data, status=status.HTTP_200_OK)
2192

2293
def delete(self, request, *args, **kwargs):
23-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
94+
serializer_class = self.get_serializer_class()
95+
serializer = serializer_class(data={"bookid": kwargs.get('bookid')})
96+
if not serializer.is_valid():
97+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
98+
validated_data = serializer.validated_data
99+
100+
# TODO: IMPLEMENT LOGIC
101+
102+
return Response(validated_data, status=status.HTTP_200_OK)

alttextbackend/views/books_bookid_export.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,19 @@
77
from django.core.files.base import ContentFile
88
from uuid import uuid4
99

10+
class ExportBookSerializer(serializers.Serializer):
11+
bookid = serializers.CharField(required=True)
12+
1013
class BooksBookidExportView(APIView):
1114
parser_classes = (FormParser, MultiPartParser)
15+
serializer_class = ExportBookSerializer
1216

1317
def get(self, request, *args, **kwargs):
14-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
18+
serializer = self.serializer_class(data={"bookid": kwargs.get('bookid')})
19+
if not serializer.is_valid():
20+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
21+
validated_data = serializer.validated_data
22+
23+
# TODO: IMPLEMENT LOGIC
24+
25+
return Response(validated_data, status=status.HTTP_200_OK)
+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
from rest_framework.views import APIView
2+
from rest_framework.response import Response
3+
from rest_framework import status, permissions, serializers
4+
from rest_framework.exceptions import ValidationError
5+
from rest_framework.parsers import FormParser, MultiPartParser
6+
from django.core.files.storage import default_storage
7+
from django.core.files.base import ContentFile
8+
from uuid import uuid4
9+
10+
class GetImageBySrc(serializers.Serializer):
11+
bookid = serializers.CharField(required=True)
12+
src = serializers.CharField(required=True)
13+
14+
class UpdateImageBySrc(serializers.Serializer):
15+
bookid = serializers.CharField(required=True)
16+
src = serializers.CharField(required=True)
17+
alt = serializers.CharField(required=True)
18+
beforeContext = serializers.CharField(required=False)
19+
afterContext = serializers.CharField(required=False)
20+
21+
class AnalyzeImageBySrc(serializers.Serializer):
22+
bookid = serializers.CharField(required=True)
23+
src = serializers.CharField(required=True)
24+
25+
class BooksBookidImageView(APIView):
26+
parser_classes = (FormParser, MultiPartParser)
27+
def get_serializer_class(self):
28+
if self.request.method == 'GET':
29+
return GetImageBySrc
30+
elif self.request.method == 'PATCH':
31+
return UpdateImageBySrc
32+
elif self.request.method == 'PUT':
33+
return AnalyzeImageBySrc
34+
return super().get_serializer_class()
35+
36+
def get(self, request, *args, **kwargs):
37+
serializer_class = self.get_serializer_class()
38+
data = request.query_params
39+
data['bookid'] = kwargs.get('bookid')
40+
serializer = serializer_class(data=data)
41+
if not serializer.is_valid():
42+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
43+
validated_data = serializer.validated_data
44+
45+
# TODO: IMPLEMENT LOGIC
46+
47+
return Response(validated_data, status=status.HTTP_200_OK)
48+
49+
def patch(self, request, *args, **kwargs):
50+
serializer_class = self.get_serializer_class()
51+
data = request.data
52+
data.update(request.query_params)
53+
data['bookid'] = kwargs.get('bookid')
54+
serializer = serializer_class(data=data)
55+
if not serializer.is_valid():
56+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
57+
validated_data = serializer.validated_data
58+
59+
# TODO: IMPLEMENT LOGIC
60+
61+
return Response(validated_data, status=status.HTTP_200_OK)
62+
63+
def put(self, request, *args, **kwargs):
64+
serializer_class = self.get_serializer_class()
65+
data = request.query_params
66+
data['bookid'] = kwargs.get('bookid')
67+
serializer = serializer_class(data=data)
68+
if not serializer.is_valid():
69+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
70+
validated_data = serializer.validated_data
71+
72+
# TODO: IMPLEMENT LOGIC
73+
74+
return Response(validated_data, status=status.HTTP_200_OK)

alttextbackend/views/books_bookid_images.py

+12-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,19 @@
77
from django.core.files.base import ContentFile
88
from uuid import uuid4
99

10+
class ImagesFromBookSerializer(serializers.Serializer):
11+
bookid = serializers.CharField(required=True)
12+
1013
class BooksBookidImagesView(APIView):
1114
parser_classes = (FormParser, MultiPartParser)
15+
serializer_class = ImagesFromBookSerializer
1216

1317
def get(self, request, *args, **kwargs):
14-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
18+
serializer = self.serializer_class(data={"bookid": kwargs.get('bookid')})
19+
if not serializer.is_valid():
20+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
21+
validated_data = serializer.validated_data
22+
23+
# TODO: IMPLEMENT LOGIC
24+
25+
return Response(validated_data, status=status.HTTP_200_OK)

alttextbackend/views/books_bookid_src.py

-20
This file was deleted.

alttextbackend/views/images_hash.py

+13-1
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,20 @@
77
from django.core.files.base import ContentFile
88
from uuid import uuid4
99

10+
class GetImagesByHashSerializer(serializers.Serializer):
11+
hash = serializers.CharField(required=True)
12+
1013
class ImagesHashView(APIView):
1114
parser_classes = (FormParser, MultiPartParser)
15+
serializer_class = GetImagesByHashSerializer
1216

1317
def get(self, request, *args, **kwargs):
14-
return Response({"TODO": "TODO"}, status=status.HTTP_200_OK)
18+
image_hash = kwargs.get('hash')
19+
data = {'hash': image_hash}
20+
serializer = self.serializer_class(data=data)
21+
if not serializer.is_valid():
22+
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
23+
24+
# TODO: IMPLEMENT LOGIC
25+
26+
return Response(data, status=status.HTTP_200_OK)

manage.py

+2-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"""Django's command-line utility for administrative tasks."""
33
import os
44
import sys
5-
5+
from dotenv import load_dotenv
66

77
def main():
88
"""Run administrative tasks."""
@@ -19,4 +19,5 @@ def main():
1919

2020

2121
if __name__ == '__main__':
22+
load_dotenv()
2223
main()

0 commit comments

Comments
 (0)