diff --git a/course/serializers.py b/course/serializers.py index e69de29..458a798 100644 --- a/course/serializers.py +++ b/course/serializers.py @@ -0,0 +1,8 @@ +from rest_framework import serializers +from .models import Course +from user.models import Student + +class CourseSerializers(serializers.ModelSerializer): + class Meta: + model = Course + fields = '__all__' diff --git a/course/urls/student.py b/course/urls/student.py index 11d65f2..8961ed5 100644 --- a/course/urls/student.py +++ b/course/urls/student.py @@ -1,4 +1,10 @@ from django.conf.urls import url +from course.views.student import GetAllCourseAPI,GetAllMessageAPI,GetMessageOfCourseAPI,GetMyCourseAPI,GetMyCourseByIDAPI urlpatterns = [ + url(r'get-all-course/?$', GetAllCourseAPI.as_view(), name="get-all-course"), + url(r'get-all-message/?$', GetAllMessageAPI.as_view(), name="get-all-message"), + url(r'get-course-message/?$', GetMessageOfCourseAPI.as_view(), name="get-course-message"), + url(r'get-my-course/?$',GetMyCourseAPI.as_view(),name="get-my-course"), + url(r'get-my-course-by-id/?$',GetMyCourseByIDAPI.as_view(),name="get-my-course-by-id") ] \ No newline at end of file diff --git a/course/views/student.py b/course/views/student.py index 2b3ae7e..557f040 100644 --- a/course/views/student.py +++ b/course/views/student.py @@ -1 +1,79 @@ -from utils.api import APIView \ No newline at end of file +from utils.api import APIView +from course.models import Course, Message +from course.serializers import CourseSerializers +from utils.api import JSONResponse +from django.forms import model_to_dict + + +class GetAllCourseAPI(APIView): + #OK# + def get(self, request): + AllCourse = Course.objects.all() + AllCourseResult = [] + for item in AllCourse: + item_result = model_to_dict(item) + del item_result['students'] + del item_result['teachers'] + AllCourseResult.append(item_result) + return self.success(AllCourseResult) + + +class GetAllMessageAPI(APIView): + #OK# + def get(self, request): + AllMessage = Message.objects.all() + AllMessageResult = [] + for item in AllMessage: + item_result = model_to_dict(item) + AllMessageResult.append(item_result) + return self.success(AllMessageResult) + + +class GetMessageOfCourseAPI(APIView): + #OK# + def get(self, request): + course_id = int(request.GET.get('course_id')) + AllMessage = Message.objects.filter(course=course_id) + AllMessageResult = [] + for item in AllMessage: + item_result = model_to_dict(item) + AllMessageResult.append(item_result) + return self.success(AllMessageResult) + + +class GetMyCourseAPI(APIView): + # 根据student_number找到他的所有课程 + def get(self, request): + studentNumber = request.GET.get('studentNumber') + AllCourse = Course.objects.all() + MyCourses = [] + for item in AllCourse: + item_result = model_to_dict(item) + for student in item_result['students']: + print(student.student_number) + stu_num=""+student.student_number + if stu_num == studentNumber: + del item_result['students'] + del item_result['teachers'] + MyCourses.append(item_result) + break + + return self.success(MyCourses) + +class GetMyCourseByIDAPI(APIView): + # 根据student的user id找到他的所有课程 + def get(self, request): + studentID = request.GET.get('studentID') + AllCourse = Course.objects.all() + MyCourses = [] + for item in AllCourse: + item_result = model_to_dict(item) + for student in item_result['students']: + stu_id=str(student.user.id) + if stu_id == studentID: + del item_result['students'] + del item_result['teachers'] + MyCourses.append(item_result) + break + + return self.success(MyCourses) \ No newline at end of file diff --git a/oj/dev_settings.py b/oj/dev_settings.py index 27a6548..cd02108 100644 --- a/oj/dev_settings.py +++ b/oj/dev_settings.py @@ -14,11 +14,11 @@ DATABASES = { 'default': { - 'ENGINE': 'django.db.backends.mysql', + 'ENGINE': 'django.db.backends.mysql', 'HOST': os.getenv("DB_HOST", "127.0.0.1"), 'PORT': os.getenv("DB_PORT", 3306), 'USER': os.getenv("DB_USER", "root"), 'PASSWORD': os.getenv("DB_USER", "root"), 'NAME': os.getenv("DB_NAME", "oj"), } -} \ No newline at end of file +} diff --git a/oj/urls.py b/oj/urls.py index 70c0424..af094a1 100644 --- a/oj/urls.py +++ b/oj/urls.py @@ -29,17 +29,20 @@ url(r"^exam/student", include("exam.urls.admin")), url(r"^exam/examlist", include("exam.urls.admin")), url(r"^teacher/course/", include("course.urls.admin")), + url(r"^api/student/lab/", include("lab.urls.student")), + url(r"^api/student/course/", include("course.urls.student")), url(r"^teacher/course/stat/", include("course.urls.statistics")), url(r"^teacher/submission/stat/", include("submission.urls.statistics")), url(r"^teacher/student/stat/", include("user.urls.statistics")), + url(r"^api/student/submission", include("submission.urls.student")), + url(r"^api/student/problem", include("problem.urls.student")), + url(r"^api/student/user", include("user.urls.student")), url(r"^statistic/course/", include("course.urls.statistics")), url(r"^api/student/", include("lab.urls.student")), url(r"^student/lab/", include("lab.urls.student")), url(r"^auth/", include("user.urls.auth")), url(r"^swagger$", schema_view), url(r"^teacher/problem/", include("problem.urls.admin")), - url(r"^administrator/student/", include("user.urls.student")), - url(r"^teacher/submission/statistics/", - include("submission.urls.statistics")), + url(r"^teacher/submission/statistics/",include("submission.urls.statistics")), url(r"^distribution/", include("submission.urls.statistics")), ] diff --git a/problem/urls/student.py b/problem/urls/student.py index 11d65f2..b65608e 100644 --- a/problem/urls/student.py +++ b/problem/urls/student.py @@ -1,4 +1,7 @@ from django.conf.urls import url +from problem.views.student import GetProblemAPI,GetCaseOfProblemAPI urlpatterns = [ + url(r"get-problem/?$", GetProblemAPI.as_view(), name="get-problem"), + url(r"get-problem-cases/?$", GetCaseOfProblemAPI.as_view(), name="get-problem-cases"), ] \ No newline at end of file diff --git a/problem/views/student.py b/problem/views/student.py index 2b3ae7e..b9fa229 100644 --- a/problem/views/student.py +++ b/problem/views/student.py @@ -1 +1,26 @@ -from utils.api import APIView \ No newline at end of file +from utils.api import APIView, JSONResponse +from rest_framework import status +from django.http import HttpResponse, JsonResponse +from ..models import Problem, Case +from django.forms import model_to_dict + +class GetProblemAPI(APIView): + def get(self, request): + # get information from frontend #ok# + id_problem = int(request.GET.get('id_problem')) + problem_return = model_to_dict(Problem.objects.get(id=id_problem)) + del problem_return['tags'] + return self.success(problem_return) + + +class GetCaseOfProblemAPI(APIView): + def get(self, request): + # get information from frontend #ok# + id_problem = int(request.GET.get('id_problem')) + case_list = Case.objects.filter(problem=id_problem) + case_list_result = [] + for item in case_list: + item_result = model_to_dict(item) + del item_result['tags'] + case_list_result.append(item_result) + return self.success(case_list_result) diff --git a/submission/models.py b/submission/models.py index fcf1d87..07779e8 100644 --- a/submission/models.py +++ b/submission/models.py @@ -27,8 +27,7 @@ class ProblemSubmission(models.Model): IP = models.CharField(max_length=20) language = models.IntegerField() submission_status = models.ForeignKey(CaseStatus, default=CaseStatus.default, on_delete=models.SET_DEFAULT) - cases = models.ManyToManyField(Case, blank=True, related_name='problem_submissions', - through='ProblemSubmissionCase') + cases = models.ManyToManyField(Case, blank=True, related_name='problem_submissions',through='ProblemSubmissionCase') lectures = models.ManyToManyField(Lecture, blank=True, related_name='problem_submissions') diff --git a/submission/urls/student.py b/submission/urls/student.py index 11d65f2..bab2f57 100644 --- a/submission/urls/student.py +++ b/submission/urls/student.py @@ -1,4 +1,14 @@ from django.conf.urls import url +from ..views.student import GetAllStudentSubmissionAPI +from ..views.student import GetUserSubmissionAPI +from ..views.student import AddLabAttachmentAPI +from ..views.student import CreateProblemSubmissionAPI +from ..views.student import GetProblemSubmissionAPI urlpatterns = [ + url(r"get_all_submission/?$", GetAllStudentSubmissionAPI.as_view(), name="get_all_submission"), + url(r"get_user_submission/?$", GetUserSubmissionAPI.as_view(), name="get_user_submission"), + url(r"get_problem_submission/?$", GetProblemSubmissionAPI.as_view(), name="get_problem_submission"), + url(r"add_ab_attachment/?$", AddLabAttachmentAPI.as_view(), name="add_ab_attachment"), + url(r"add_problem_submission/?$", CreateProblemSubmissionAPI.as_view(), name="add_problem_submission"), ] \ No newline at end of file diff --git a/submission/views/student.py b/submission/views/student.py index 2b3ae7e..eab0818 100644 --- a/submission/views/student.py +++ b/submission/views/student.py @@ -1 +1,114 @@ -from utils.api import APIView \ No newline at end of file +from utils.api import APIView +from rest_framework import status +from ..serializers import ProblemSubmissionSerializers1 +from django.http import HttpResponse, JsonResponse +from submission.models import ProblemSubmission, CaseStatus +from lab.models import LabSubmission,Attachment +from django.forms import model_to_dict +import time; + +class GetProblemSubmissionAPI(APIView): # 获取一个学生的所有提交记录 #OK# + def get(self, request): + submission_problem_id = int(request.GET.get('problem_id')) + problem_submission = ProblemSubmission.objects.filter(problem=submission_problem_id) + caseStatusResult = CaseStatus.objects.all() + caseStatusDemo = [] + for item in caseStatusResult: + caseStatusDemo.append(model_to_dict(item)) + + problem_submission_result = [] + for item in problem_submission: + item_result = model_to_dict(item) + del item_result['cases'] + item_result['create_at'] = str(item.created_at) + item_result['status'] = caseStatusDemo[int(item_result['submission_status'])]['name'] + problem_submission_result.append(item_result) + return self.success(problem_submission_result) + +class GetAllStudentSubmissionAPI(APIView): # 获取一个学生的所有提交记录 #OK# + def get(self, request): + submission_student_id = int(request.GET.get('student_id')) + student_submission = ProblemSubmission.objects.filter(student=submission_student_id) + caseStatusResult = CaseStatus.objects.all() + caseStatusDemo = [] + for item in caseStatusResult: + caseStatusDemo.append(model_to_dict(item)) + + student_submission_result = [] + for item in student_submission: + item_result = model_to_dict(item) + del item_result['cases'] + item_result['create_at'] = str(item.created_at) + item_result['status'] = caseStatusDemo[int(item_result['submission_status'])]['name'] + student_submission_result.append(item_result) + return self.success(student_submission_result) + +class GetUserSubmissionAPI(APIView): # 获取一个学生关于一道题目的提交记录 + def get(self, request): + submission_student_id = int(request.GET.get('student_id')) + submission_problem_id = int(request.GET.get('problem_id')) + # query from database for submissions of student and problem + caseStatusResult = CaseStatus.objects.all() + caseStatusDemo = [] + for item in caseStatusResult: + caseStatusDemo.append(model_to_dict(item)) + + userPersonalSubmission = ProblemSubmission.objects.filter(student=submission_student_id, problem=submission_problem_id) + userPersonalSubmissionResult = [] + for item in userPersonalSubmission: + item_result = model_to_dict(item) + del item_result['cases'] + item_result['create_at'] = str(item.created_at) + item_result['status'] = caseStatusDemo[int(item_result['submission_status'])]['name'] + userPersonalSubmissionResult.append(item_result) + return self.success(userPersonalSubmissionResult) + + +class CreateProblemSubmissionAPI(APIView): # 获取一个学生关于一道题目的提交记录 + def post(self, request): + submission_student_id = int(request.GET.get('student_id')) + submission_problem_id = int(request.GET.get('problem_id')) + submission_program = str(request.GET.get('program')) + submission_create_at= time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()) + submission_runtime = int(request.GET.get('runtime')) + submission_memory = int(request.GET.get('memory')) + submission_ip = str(request.GET.get('ip')) + submission_language = int(request.GET.get('language')) + submission_status_id = int(request.GET.get('status')) + + submission_result = ProblemSubmission.objects.create( + problem=submission_problem_id, + student=submission_student_id, + program=submission_program, + created_at=submission_create_at, + runtime=submission_runtime, + memory=submission_memory, + Ip=submission_ip, + language=submission_language, + submission_status=submission_status_id, + ) + + submission_result = model_to_dict(submission_result) + return self.success(submission_result) + +class AddLabAttachmentAPI(APIView): + # create submission of a lab + def post(self, request): + submission_student_id = int(request.GET.get('id_user')) + course_id = int(request.GET.get('id_course')) + lab_id = int(request.GET.get('id_lab')) + attachment_path = int(request.GET.get('file')) + # query from database for submissions of student and problem + try: + labSubmission = LabSubmission.objects.filter(id_student=submission_student_id, id_lab=lab_id) + except ProblemSubmission.DoesNotExist: + return HttpResponse(status=404) + try: + attachment = Attachment.objects.create( + id_lab_submission = labSubmission.id, + path = attachment_path + ) + except Exception as e: + return HttpResponse(status=-1) + return HttpResponse(status=0) + diff --git a/user/urls/student.py b/user/urls/student.py index ab4af31..3871c45 100644 --- a/user/urls/student.py +++ b/user/urls/student.py @@ -1,8 +1,9 @@ from django.conf.urls import url -from user.views.student import GetStudentListAPI,DeleteStudentAPI +from user.views.student import GetStudentListAPI,DeleteStudentAPI, GetStudentAPI urlpatterns = [ url(r'student_list?$', GetStudentListAPI.as_view(), name="get_student_list"), - url(r'student_delete?$', DeleteStudentAPI.as_view(), name="delete_student") + url(r'student_delete?$', DeleteStudentAPI.as_view(), name="delete_student"), + url(r'student_get/?$', GetStudentAPI.as_view(), name="get_student") ] \ No newline at end of file diff --git a/user/views/student.py b/user/views/student.py index 777022d..660bfd5 100644 --- a/user/views/student.py +++ b/user/views/student.py @@ -1,10 +1,54 @@ +from utils.api import APIView, JSONResponse +from rest_framework import status +from django.http import HttpResponse, JsonResponse +from course.models import Course import math from django.contrib.auth.models import Group from django.db.models import Model - from utils.api import APIView, JSONResponse - from ..models import Student,UserStatus,Gender,User +from django.forms import model_to_dict + +class GetStudentAPI(APIView): + def get(self, request): + # get information from frontend #OK# + id_user = int(request.GET.get('id_user')) + NowStudent = Student.objects.get(user=id_user) + NowStudentResult = model_to_dict(NowStudent) + del NowStudentResult['followers'] + del NowStudentResult['achievements'] + return self.success(NowStudentResult) + +def LoginStudentAPI(APIView): + # Login API + def post(self, request): + studentName = request.GET.get('name') + studentPasswordHash = request.GET.get('password_hash') + studentUser = Student.objects.get(name=studentName) + if studentUser: + if studentUser.password_hash == studentPasswordHash: + return HttpResponse(status=0) + else: + return HttpResponse(status=1) + else: + return HttpResponse(status=-1) + + +def GetStudentCourseAPI(APIView): + # Get Course of an Student + def get(self, request): + idStudent = int(request.GET.get('id_student')) + courseListID = CourseStudent.object.filter(id_student = idStudent) + courseList = [] + for item in courseListID.data: + studentCourse = Course.object.get(id = item.id_course) + courseList.append(studentCourse) + courseListSerializer = CourseSerializers(courseList) + return JsonResponse(courseListSerializer.data,status=status.HTTP_200_OK) + +def GetMessageAPI(APiView): + pass +