diff --git a/openvj/urls.py b/openvj/urls.py index 15f5eb6..f661ec7 100644 --- a/openvj/urls.py +++ b/openvj/urls.py @@ -16,9 +16,11 @@ Including another URLconf from django.conf.urls import url from django.contrib import admin -from server.views import ProblemAPIView +from server.views import ProblemAPIView, SubmissionAPIView + urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^problem/$', ProblemAPIView.as_view()), + url(r'^submission/$', SubmissionAPIView.as_view()), ] diff --git a/server/admin.py b/server/admin.py index d00bef8..5ce62ef 100644 --- a/server/admin.py +++ b/server/admin.py @@ -1,6 +1,12 @@ # coding=utf-8 from django.contrib import admin -from .models import OJ, RobotUser, RobotStatusInfo, Problem, Submission +from .models import OJ, RobotUser, RobotStatusInfo, Problem, Submission, APIKey + + +class APIKeyAdmin(admin.ModelAdmin): + list_display = ["name", "create_time"] + +admin.site.register(APIKey, APIKeyAdmin) class OJAdmin(admin.ModelAdmin): @@ -34,4 +40,7 @@ class ProblemAdmin(admin.ModelAdmin): admin.site.register(Problem, ProblemAdmin) -admin.site.register(Submission) +class SubmissionAdmin(admin.ModelAdmin): + list_display = ["api_key", "problem", "language", "result", "create_time", "status"] + +admin.site.register(Submission, SubmissionAdmin) diff --git a/server/migrations/0003_problem_origin_id.py b/server/migrations/0003_problem_origin_id.py new file mode 100644 index 0000000..d28c7ef --- /dev/null +++ b/server/migrations/0003_problem_origin_id.py @@ -0,0 +1,20 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.4 on 2016-03-09 09:06 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0002_auto_20160309_1656'), + ] + + operations = [ + migrations.AddField( + model_name='problem', + name='origin_id', + field=models.CharField(blank=True, max_length=30, null=True), + ), + ] diff --git a/server/migrations/0004_auto_20160309_1911.py b/server/migrations/0004_auto_20160309_1911.py new file mode 100644 index 0000000..957458d --- /dev/null +++ b/server/migrations/0004_auto_20160309_1911.py @@ -0,0 +1,37 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-03-09 11:11 +from __future__ import unicode_literals + +import datetime +from django.db import migrations, models +import django.db.models.deletion +from django.utils.timezone import utc +import server.models + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0003_problem_origin_id'), + ] + + operations = [ + migrations.AddField( + model_name='submission', + name='api_key', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='server.APIKey'), + preserve_default=False, + ), + migrations.AddField( + model_name='submission', + name='create_time', + field=models.DateTimeField(auto_now_add=True, default=datetime.datetime(2016, 3, 9, 11, 11, 38, 878862, tzinfo=utc)), + preserve_default=False, + ), + migrations.AddField( + model_name='submission', + name='status', + field=models.IntegerField(choices=[(1, 'done'), (server.models.SubmissionStatus, 'crawling'), (3, 'failed')], default=1), + preserve_default=False, + ), + ] diff --git a/server/migrations/0005_submission_language.py b/server/migrations/0005_submission_language.py new file mode 100644 index 0000000..fde8bf0 --- /dev/null +++ b/server/migrations/0005_submission_language.py @@ -0,0 +1,21 @@ +# -*- coding: utf-8 -*- +# Generated by Django 1.9.1 on 2016-03-09 11:18 +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('server', '0004_auto_20160309_1911'), + ] + + operations = [ + migrations.AddField( + model_name='submission', + name='language', + field=models.IntegerField(choices=[('C', 0), ('CPP', 1), ('Java', 2)], default=1), + preserve_default=False, + ), + ] diff --git a/server/models.py b/server/models.py index 077e70e..7eeaf50 100644 --- a/server/models.py +++ b/server/models.py @@ -2,6 +2,7 @@ from __future__ import unicode_literals from django.db import models +from robots.utils import Language, Result class OJ(models.Model): @@ -71,6 +72,7 @@ class ProblemStatus(models.Model): class Problem(models.Model): oj = models.ForeignKey(OJ) url = models.URLField() + origin_id = models.CharField(max_length=30, blank=True, null=True) submit_url = models.URLField(blank=True, null=True) title = models.CharField(max_length=100, blank=True, null=True) description = models.TextField(blank=True, null=True) @@ -99,13 +101,34 @@ class Problem(models.Model): return self.oj.name + " - " + self.title +class SubmissionStatus(object): + done = 1 + crawling = 2 + failed = 3 + + class Submission(models.Model): + api_key = models.ForeignKey(APIKey) problem = models.ForeignKey(Problem) - result = models.IntegerField() + robot_user = models.ForeignKey(RobotUser) + language = models.IntegerField(choices=((Language.C, "C", ), (Language.CPP, "CPP"), (Language.Java, "Java"))) + result = models.IntegerField(choices=((Result.accepted, "accepted"), + (Result.wrong_answer, "wrong_answer"), + (Result.compile_error, "compiler_error"), + (Result.format_error, "format_error"), + (Result.memory_limit_exceeded, "memory_limit_exceeded"), + (Result.time_limit_exceeded, "time_limit_exceeded"), + (Result.runtime_error, "runtime_error"), + (Result.system_error, "system_error"), + (Result.waiting, "waiting"))) cpu_time = models.IntegerField() memory = models.IntegerField() info = models.TextField() - robot_user = models.ForeignKey(RobotUser) + create_time = models.DateTimeField(auto_now_add=True) + status = models.IntegerField(choices=((SubmissionStatus.done, "done"), + (SubmissionStatus, "crawling"), + (SubmissionStatus.failed, "failed"))) class Meta: db_table = "submission" + diff --git a/server/serializers.py b/server/serializers.py index 9295bd2..dc3d594 100644 --- a/server/serializers.py +++ b/server/serializers.py @@ -1,9 +1,16 @@ # coding=utf-8 from rest_framework import serializers +from robots.utils import Language from .models import Problem class ProblemSerializer(serializers.ModelSerializer): class Meta: model = Problem + + +class CreateSubmissionSerializer(serializers.Serializer): + url = serializers.URLField() + language = serializers.ChoiceField(choices=[Language.C, Language.CPP, Language.Java]) + code = serializers.CharField(max_length=10000) \ No newline at end of file diff --git a/server/views.py b/server/views.py index e1d25b2..316a9c2 100644 --- a/server/views.py +++ b/server/views.py @@ -6,7 +6,7 @@ from rest_framework.response import Response from celery import states -from .serializers import ProblemSerializer +from .serializers import ProblemSerializer, CreateSubmissionSerializer from .models import OJ, Problem, RobotUser, RobotStatusInfo, ProblemStatus from .tasks import get_problem @@ -16,7 +16,7 @@ def error_response(error_reason): def serializer_invalid_response(serializer): - for k, v in serializer.errors.iteritems(): + for k, v in serializer.errors.items(): return error_response(k + " : " + v[0]) @@ -48,6 +48,7 @@ class ProblemAPIView(APIView): # 如果任务状态是成功,就更新数据库,并返回结果 if task.state == states.SUCCESS: result = task.get() + problem.origin_id = result["id"] problem.title = result["title"] problem.submit_url = result["submit_url"] problem.description = result["description"] @@ -88,3 +89,11 @@ class ProblemAPIView(APIView): Problem.objects.create(oj=oj, url=url, status=ProblemStatus.crawling, task_id=task_id) return success_response({"status": ProblemStatus.crawling}) + +class SubmissionAPIView(APIView): + def post(self, request): + serializer = CreateSubmissionSerializer(data=request.data) + if serializer.is_valid(): + return success_response(serializer.data) + else: + return serializer_invalid_response(serializer) \ No newline at end of file