Skip to content

Commit

Permalink
Remove all unused imports, finished typing of API, and changed Django…
Browse files Browse the repository at this point in the history
… dependency to use latest
  • Loading branch information
MitchellAV committed Jun 4, 2024
1 parent 0c677eb commit c5ab31a
Show file tree
Hide file tree
Showing 15 changed files with 102 additions and 62 deletions.
2 changes: 1 addition & 1 deletion valhub/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ RUN apt-get update -qq
RUN apt-get install -y libpq-dev python3-psycopg2
# RUN apt-get --assume-yes install python3-pip
RUN apt-get --assume-yes install mariadb-client supervisor postgresql-client
RUN apt-get --assume-yes install python3-dev default-libmysqlclient-dev build-essential
RUN apt-get --assume-yes install python3-dev default-libmysqlclient-dev build-essential pkg-config
RUN python3 -m pip install --upgrade pip
WORKDIR /root/valhub
RUN python3 -m pip install -r requirements.txt
Expand Down
1 change: 0 additions & 1 deletion valhub/accounts/serializers.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from rest_framework import serializers
from django.contrib.auth.models import User
from .models import Account


Expand Down
3 changes: 1 addition & 2 deletions valhub/accounts/urls.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
from django.urls import path, re_path
from rest_framework import routers
from django.urls import path
from accounts import views

urlpatterns = [
Expand Down
55 changes: 42 additions & 13 deletions valhub/accounts/views.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
from boto3 import Session
from django.http import HttpResponse, JsonResponse
from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
import django.contrib.auth as auth

from rest_framework.decorators import (
api_view,
authentication_classes,
permission_classes,
)
from rest_framework.request import Request
from rest_framework.views import APIView
from rest_framework.authtoken.models import Token
from rest_framework.permissions import IsAuthenticated
Expand All @@ -27,7 +26,21 @@

@csrf_exempt
@api_view(["POST"])
def register(request):
def register(request: Request):
required_fields = [
"username",
"email",
"password",
"firstName",
"lastName",
]

if request.data is None or not isinstance(request.data, dict):
return HttpResponse("missing request data", status=400)

if not all(field in request.data for field in required_fields):
return HttpResponse("missing required fields", status=400)

_username = request.data["username"]
_useremail = request.data["email"]
_password = request.data["password"]
Expand All @@ -48,15 +61,25 @@ def register(request):

@csrf_exempt
@api_view(["POST"])
def login(request):
def login(request: Request):

if request.data is None or not isinstance(request.data, dict):
return HttpResponse("missing request data", status=400)

required_fields = ["username", "password"]

if not all(field in request.data for field in required_fields):
return HttpResponse("missing required fields", status=400)

_username = request.data["username"]
_password = request.data["password"]

user = auth.authenticate(request, username=_username, password=_password)

if user is not None:
logger.info("User is authenticated")
auth.login(request, user)

auth.login(request._request, user)

# get or create login token for the user
token = Token.objects.get_or_create(user=user)
Expand All @@ -79,25 +102,24 @@ class AccountDetail(APIView):
permission_classes = [IsAuthenticated]

@csrf_exempt
def get(self, request):
def get(self, request: Request):
serializer = AccountSerializer(request.user)
return JsonResponse(serializer.data)

@csrf_exempt
def put(self, request):
def put(self, request: Request):
account = request.user
data = request.data

# update origin account
serializer = AccountSerializer(
account, data=request.data, partial=True
)
serializer = AccountSerializer(account, data=data, partial=True)
if serializer.is_valid():
serializer.save()
return JsonResponse(serializer.data)
return JsonResponse(serializer.errors, status=400)

@csrf_exempt
def delete(self, request):
def delete(self, request: Request):
account = request.user
account.delete()
return HttpResponse(status=204)
Expand All @@ -106,6 +128,13 @@ def delete(self, request):
@api_view(["GET"])
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def get_user_id(request):
def get_user_id(request: Request):
user = request.user
return JsonResponse({"user_id": user.uuid})
if user is None:
return JsonResponse({"error": "user not found"}, status=404)

if "uuid" not in user:
return JsonResponse({"error": "user id not found"}, status=404)

user_id = user.uuid
return JsonResponse({"user_id": user_id}, status=200)
3 changes: 0 additions & 3 deletions valhub/analyses/models.py
Original file line number Diff line number Diff line change
@@ -1,8 +1,5 @@
from django.db import models

from base.utils import RandomFileName
from accounts.models import Account


class Analysis(models.Model):
analysis_id = models.AutoField(primary_key=True)
Expand Down
15 changes: 3 additions & 12 deletions valhub/analyses/views.py
Original file line number Diff line number Diff line change
@@ -1,25 +1,16 @@
from venv import logger
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt
from django.core import serializers

from rest_framework.response import Response
from rest_framework.request import Request
from rest_framework import status
from rest_framework.decorators import (
api_view,
)
from rest_framework.parsers import JSONParser

import boto3
import os

from .models import Analysis
from submissions.models import Submission
from submissions.serializers import SubmissionDetailSerializer
from .serializers import AnalysisSerializer
from base.utils import upload_to_s3_bucket
from accounts.models import Account
from error_report.models import ErrorReport
import logging

from rest_framework.decorators import (
Expand All @@ -43,7 +34,7 @@
@csrf_exempt
@authentication_classes([SessionAuthentication, TokenAuthentication])
@permission_classes([IsAuthenticated])
def list_analysis(request):
def list_analysis(request: Request):
analyses = Analysis.objects.all()
# print(analyses)
# response_data = serializers.serialize('json', analyses)
Expand Down Expand Up @@ -88,7 +79,7 @@ def leaderboard(request, analysis_id):
@api_view(["POST"])
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def create_new_analysis(request):
def create_new_analysis(request: Request):
# Remove user_id related code
serializer = AnalysisSerializer(data=request.data)
if serializer.is_valid():
Expand Down
1 change: 0 additions & 1 deletion valhub/backend/views.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,3 @@
from django.shortcuts import render
from django.http import HttpResponse


Expand Down
5 changes: 0 additions & 5 deletions valhub/base/utils.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
from logging import Logger
import logging
from django.utils.deconstruct import deconstructible
from urllib.parse import urljoin

import os
import uuid
Expand All @@ -16,10 +15,6 @@
from cryptography.hazmat.primitives import hashes
from cryptography.hazmat.backends import default_backend

import base64
import json
import os


def is_local():
"""
Expand Down
6 changes: 3 additions & 3 deletions valhub/error_report/views.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from math import e
from rest_framework import generics
from rest_framework.response import Response
from rest_framework.request import Request
from rest_framework import status
from rest_framework.decorators import (
api_view,
Expand Down Expand Up @@ -184,7 +184,7 @@ def ErrorReport(request: Request, *args, **kwargs):
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
@csrf_exempt
def ErrorReportPrivateList(request, pk):
def ErrorReportPrivateList(request: Request, pk):
try:
error_reports = ErrorReportModel.objects.filter(submission=pk)
serializer = ErrorReportSerializer(error_reports, many=True)
Expand All @@ -204,7 +204,7 @@ def ErrorReportPrivateList(request, pk):
@csrf_exempt
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def ErrorReportNew(request, pk):
def ErrorReportNew(request: Request, pk):
# queryset = ErrorReport.objects.all()
# serializer_class = ErrorReportSerializer

Expand Down
4 changes: 2 additions & 2 deletions valhub/requirements.txt
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Django==4.2
mysqlclient==2.1.1
Django
mysqlclient
boto3
requests
djangorestframework
Expand Down
2 changes: 1 addition & 1 deletion valhub/submissions/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,4 +47,4 @@ class Submission(models.Model):

mae = models.FloatField(null=True, blank=True)
mrt = models.FloatField(null=True, blank=True)
data_requirements = models.JSONField(null=True, blank=True)
data_requirements = models.TextField(null=True, blank=True)
2 changes: 1 addition & 1 deletion valhub/submissions/urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
name="analysis_submission",
),
path(
"analysis/<int:analysis_id>/submission/<int:submission_id>",
"submission/<int:submission_id>",
views.submission_detail,
name="submission_detail",
),
Expand Down
60 changes: 46 additions & 14 deletions valhub/submissions/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@
from venv import logger
from django.views.decorators.csrf import csrf_exempt
from django.http import JsonResponse
from django.core.files.storage import default_storage
from django.core.exceptions import ValidationError

from rest_framework.response import Response
Expand Down Expand Up @@ -190,7 +189,7 @@ def analysis_submission(request: Request, analysis_id: str):
@csrf_exempt
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def submission_detail(request, analysis_id, submission_id):
def submission_detail(request: Request, submission_id):
try:
submission = Submission.objects.get(submission_id=submission_id)
except Submission.DoesNotExist:
Expand All @@ -213,7 +212,7 @@ def submission_detail(request, analysis_id, submission_id):
@csrf_exempt
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def change_submission_status(request: Request, submission_id):
def change_submission_status(request: Request, submission_id: str):

data = cast(dict[str, Any], request.data)

Expand Down Expand Up @@ -249,13 +248,29 @@ def change_submission_status(request: Request, submission_id):
@csrf_exempt
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def update_submission_result(request, submission_id):
def update_submission_result(request: Request, submission_id: str):
try:
submission = Submission.objects.get(submission_id=submission_id)
except Submission.DoesNotExist:
response_data = {"error": "submission does not exist"}
return Response(response_data, status=status.HTTP_406_NOT_ACCEPTABLE)

results = request.data

if results is None or not isinstance(results, dict):
response_data = {"error": "results are required"}
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

required_fields = [
"mean_mean_absolute_error",
"mean_run_time",
"function_parameters",
]

if not all(field in results for field in required_fields):
response_data = {"error": "missing required fields"}
return Response(response_data, status=status.HTTP_400_BAD_REQUEST)

logging.info(f"results = {results}")
submission.mae = float(results["mean_mean_absolute_error"])
submission.mrt = float(results["mean_run_time"])
Expand Down Expand Up @@ -317,12 +332,29 @@ def analysis_user_submission(request, analysis_id):
@parser_classes([JSONParser])
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def leaderboard_update(request):
def leaderboard_update(request: Request):
if request.method in ["PUT", "POST"]:
submission_id = request.data.get("submission_id")
mae = request.data.get("mae")
mrt = request.data.get("mrt")
data_requirements = request.data.get("data_requirements")

required_fields = ["submission_id", "mae", "mrt", "data_requirements"]

if request.data is None or not isinstance(request.data, dict):
return Response(
{"error": "Request data must be a json object"},
status=status.HTTP_400_BAD_REQUEST,
)

if not all(field in request.data for field in required_fields):
return Response(
{"error": "missing required fields"},
status=status.HTTP_400_BAD_REQUEST,
)

body: dict[str, str] = request.data

submission_id = body.get("submission_id", None)
mae = body.get("mae", None)
mrt = body.get("mrt", None)
data_requirements = body.get("data_requirements", None)

if not submission_id:
return Response(
Expand All @@ -339,10 +371,10 @@ def leaderboard_update(request):
)

if mae is not None:
submission.mae = mae
submission.mae = float(mae)

if mrt is not None:
submission.mrt = mrt
submission.mrt = float(mrt)

if data_requirements is not None:
submission.data_requirements = data_requirements
Expand All @@ -363,7 +395,7 @@ def leaderboard_update(request):
@csrf_exempt
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def preload_submissions(request):
def preload_submissions(request: Request):
data = request.data
if not isinstance(data, list):
return JsonResponse(
Expand Down Expand Up @@ -405,7 +437,7 @@ def preload_submissions(request):
@csrf_exempt
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def get_submission_results(request, submission_id):
def get_submission_results(request: Request, submission_id: str):
try:
submission = Submission.objects.get(submission_id=submission_id)
except Submission.DoesNotExist:
Expand Down Expand Up @@ -522,7 +554,7 @@ def get_submission_results(request, submission_id):
@csrf_exempt
@authentication_classes([TokenAuthentication, SessionAuthentication])
@permission_classes([IsAuthenticated])
def get_user_submissions(request, user_id):
def get_user_submissions(request: Request, user_id: str):
try:
user = Account.objects.get(uuid=user_id)
except Account.DoesNotExist:
Expand Down
Loading

0 comments on commit c5ab31a

Please sign in to comment.