1
1
Fork 0

API changes

This commit is contained in:
Jordy van Zeeland 2023-02-15 16:00:58 +01:00
parent 6c2301b1be
commit aeaa8cb3b5
9 changed files with 185 additions and 70 deletions

101
ras/api/login.py Normal file
View File

@ -0,0 +1,101 @@
import jwt, json
from django.contrib.auth import get_user_model
from rest_framework.decorators import api_view
from sqlalchemy import create_engine, insert
from sqlalchemy.sql import text
from django.http import JsonResponse
import ras.settings
@api_view(['POST'])
def login(request):
username = request.POST.get('username')
password = request.POST.get('password')
User = get_user_model()
try:
user = User.objects.get(username=username)
if user.check_password(password):
payload = {'id': user.id, 'username': user.username}
jwt_token = {'token': jwt.encode(payload, 'secret', algorithm='HS256')}
return JsonResponse(jwt_token)
else:
return JsonResponse({'error': 'Wrong credentials'})
except User.DoesNotExist:
return JsonResponse({'error': 'User does not exist'})
@api_view(['POST'])
def addBook(request):
if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1]
book = request.POST.get('book')
book = json.loads(book)
try:
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME'])
conn = engine.connect()
conn.execute(text("INSERT INTO api_books (name, author, genre, country, country_code, pages, readed, rating) VALUES ('" + str(book['name']) + "', '" + str(book['author']) + "', '" + str(book['genre']) + "', '" + str(book['country']) + "', '" + str(book['country_code']) + "', " + str(book['pages']) + ", '" + str(book['readed']) + "', " + str(book['rating']) + ")"))
return JsonResponse("OK", safe=False)
else:
return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist):
return JsonResponse({'error': 'Token invalid'}, safe=False)
else:
return JsonResponse({'error': 'testing'}, safe=False)
@api_view(['PUT'])
def updateBook(request):
if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1]
book = request.POST.get('book')
book = json.loads(book)
bookid = request.headers.get('bookid')
try:
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME'])
conn = engine.connect()
conn.execute(text("UPDATE api_books set name='" + str(book['name']) + "', author='" + str(book['author']) + "', genre='" + str(book['genre']) + "', country='" + str(book['country']) + "', country_code='" + str(book['country_code']) + "', pages='" + str(book['pages']) + "', readed='" + str(book['readed']) + "', rating='" + str(book['rating']) + "' WHERE id=" + str(bookid)))
return JsonResponse("OK", safe=False)
else:
return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist):
return JsonResponse({'error': 'Token invalid'}, safe=False)
else:
return JsonResponse({'error': 'No Token'}, safe=False)
@api_view(['DELETE'])
def deleteBook(request):
if(request.headers.get('Authorization')):
token = request.headers.get('Authorization').split(' ')[1]
bookid = request.headers.get('bookid')
try:
User = get_user_model()
payload = jwt.decode(token, 'secret', algorithms=['HS256'])
user = User.objects.get(id=payload['id'])
if(user):
engine = create_engine('mysql+mysqldb://' + ras.settings.DATABASES['default']['USER'] + ':' + ras.settings.DATABASES['default']['PASSWORD'] + '@' + ras.settings.DATABASES['default']['HOST'] + ':3306/' + ras.settings.DATABASES['default']['NAME'])
conn = engine.connect()
conn.execute(text("DELETE FROM api_books WHERE id = " + str(bookid)))
return JsonResponse("OK", safe=False)
else:
return JsonResponse({'error': 'No user detected'}, safe=False)
except (jwt.DecodeError, User.DoesNotExist):
return JsonResponse({'error': 'Token invalid'}, safe=False)
else:
return JsonResponse({'error': 'No Token'}, safe=False)

View File

@ -1,23 +0,0 @@
# Generated by Django 4.1.1 on 2022-09-05 13:27
from django.db import migrations, models
class Migration(migrations.Migration):
initial = True
dependencies = [
]
operations = [
migrations.CreateModel(
name='Books',
fields=[
('id', models.AutoField(primary_key=True, serialize=False)),
('name', models.TextField(max_length=255)),
('author', models.TextField(max_length=255)),
('genre', models.TextField(max_length=100)),
],
),
]

View File

@ -1,43 +1,43 @@
from django.db import models
# from django.db import models
# Create your models here.
class Books(models.Model):
id = models.AutoField(
primary_key=True
)
# # Create your models here.
# class Books(models.Model):
# id = models.AutoField(
# primary_key=True
# )
name = models.TextField(
max_length=255,
null=False,
blank=False
)
# name = models.TextField(
# max_length=255,
# null=False,
# blank=False
# )
author = models.TextField(
max_length=255,
null=False,
blank=False
)
# author = models.TextField(
# max_length=255,
# null=False,
# blank=False
# )
genre = models.TextField(
max_length=100,
null=False,
blank=False
)
# genre = models.TextField(
# max_length=100,
# null=False,
# blank=False
# )
pages = models.TextField(
max_length=100,
null=False,
blank=False
)
# pages = models.TextField(
# max_length=100,
# null=False,
# blank=False
# )
readed = models.TextField(
max_length=100,
null=False,
blank=False
)
# readed = models.TextField(
# max_length=100,
# null=False,
# blank=False
# )
rating = models.TextField(
max_length=100,
null=False,
blank=False
)
# rating = models.TextField(
# max_length=100,
# null=False,
# blank=False
# )

View File

@ -1,7 +1,7 @@
from rest_framework import serializers
from .models import Books
# from rest_framework import serializers
# from .models import Books
class BooksSerializer(serializers.ModelSerializer):
class Meta:
model = Books
fields = ('id', 'name', 'author', 'genre')
# class BooksSerializer(serializers.ModelSerializer):
# class Meta:
# model = Books
# fields = ('id', 'name', 'author', 'genre')

View File

@ -0,0 +1,5 @@
year,books_read
2013,1
2020,10
2021,36
2022,24
1 year books_read
2 2013 1
3 2020 10
4 2021 36
5 2022 24

View File

@ -1,11 +1,17 @@
from django.urls import path
from django.urls import path, include
from .views import *
from .login import *
urlpatterns = [
path('books', getAllBooks),
path('books/challenge', getChallengeOfYear),
path('books/years', getYears),
path('books/stats', getStats),
path('books/predict', predictAmountBooks),
path('books/insert', addBook),
path('books/delete', deleteBook),
path('books/update', updateBook),
path('books/pages/stats', getStatsPages),
path('books/pages', pages_per_month),
@ -14,4 +20,7 @@ urlpatterns = [
path('books/genres/count', countGenres),
path('books/authors', books_per_author),
path('books/countries', books_per_country),
path('auth/login', login),
]

View File

@ -1,12 +1,14 @@
from sqlite3 import connect
from rest_framework.decorators import api_view
from rest_framework.response import Response
from .models import Books
import pandas as pd
import ras.settings
import math
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
from sqlalchemy import create_engine
from .serializers import BooksSerializer
from django.db.models import Q
from django.templatetags.static import static
import json
@ -253,3 +255,24 @@ def getYears(request):
years = df.groupby('year')['year'].count().reset_index(name="count")
return Response(years['year'])
@api_view(['GET'])
def predictAmountBooks(request):
books_data = pd.read_csv("api/static/books_data.csv")
books_data = books_data.dropna()
model = LinearRegression()
X = books_data[['year']]
Y = books_data['books_read']
model.fit(X.values, Y.values)
current_year = 2023
predict_books = model.predict([[current_year]])
return Response({
"year": current_year,
"amount": math.floor(predict_books[0])
})
# return Response(f"The amount of books i'm gonna read in {current_year} is {math.floor(predict_books[0])}")

View File

@ -20,5 +20,5 @@ urlpatterns = [
path('admin/', admin.site.urls),
path('api/', include('api.urls')),
path('', include('frontend.urls')),
path('booklist/', include('frontend.urls')),
path('booklist/', include('frontend.urls'))
]

BIN
requirements.txt Normal file

Binary file not shown.