apply languages
This commit is contained in:
0
Checker/__init__.py
Normal file
0
Checker/__init__.py
Normal file
3
Checker/admin.py
Normal file
3
Checker/admin.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.contrib import admin
|
||||
|
||||
# Register your models here.
|
6
Checker/apps.py
Normal file
6
Checker/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class CheckerConfig(AppConfig):
|
||||
default_auto_field = 'django.db.models.BigAutoField'
|
||||
name = 'Checker'
|
27
Checker/migrations/0001_initial.py
Normal file
27
Checker/migrations/0001_initial.py
Normal file
@@ -0,0 +1,27 @@
|
||||
# Generated by Django 3.2.4 on 2022-02-15 18:22
|
||||
|
||||
import Checker.models
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('Main', '0020_languageapply'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Checker',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('token', models.CharField(db_index=True, default=Checker.models.generate_token, max_length=30)),
|
||||
('last_request', models.DateTimeField()),
|
||||
('set', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='Main.set')),
|
||||
('testing_solution', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, to='Main.solution')),
|
||||
],
|
||||
),
|
||||
]
|
20
Checker/migrations/0002_alter_checker_set.py
Normal file
20
Checker/migrations/0002_alter_checker_set.py
Normal file
@@ -0,0 +1,20 @@
|
||||
# Generated by Django 3.2.4 on 2022-02-15 18:23
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('Main', '0020_languageapply'),
|
||||
('Checker', '0001_initial'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='checker',
|
||||
name='set',
|
||||
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkers', to='Main.set'),
|
||||
),
|
||||
]
|
18
Checker/migrations/0003_checker_name.py
Normal file
18
Checker/migrations/0003_checker_name.py
Normal file
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 3.2.4 on 2022-02-15 18:24
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('Checker', '0002_alter_checker_set'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='checker',
|
||||
name='name',
|
||||
field=models.CharField(default='', max_length=50),
|
||||
),
|
||||
]
|
19
Checker/migrations/0004_alter_checker_token.py
Normal file
19
Checker/migrations/0004_alter_checker_token.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 3.2.4 on 2022-02-15 18:48
|
||||
|
||||
import Checker.models
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('Checker', '0003_checker_name'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name='checker',
|
||||
name='token',
|
||||
field=models.CharField(db_index=True, default=Checker.models.generate_token, max_length=30, unique=True),
|
||||
),
|
||||
]
|
19
Checker/migrations/0005_checker_dynamic_token.py
Normal file
19
Checker/migrations/0005_checker_dynamic_token.py
Normal file
@@ -0,0 +1,19 @@
|
||||
# Generated by Django 3.2.4 on 2022-02-16 07:33
|
||||
|
||||
import Checker.models
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
('Checker', '0004_alter_checker_token'),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AddField(
|
||||
model_name='checker',
|
||||
name='dynamic_token',
|
||||
field=models.CharField(db_index=True, default=Checker.models.generate_token, max_length=30, unique=True),
|
||||
),
|
||||
]
|
0
Checker/migrations/__init__.py
Normal file
0
Checker/migrations/__init__.py
Normal file
28
Checker/models.py
Normal file
28
Checker/models.py
Normal file
@@ -0,0 +1,28 @@
|
||||
from random import choice
|
||||
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
from Main.models import Solution, Set
|
||||
|
||||
|
||||
def generate_token():
|
||||
letters = '1234567890qwertyuiopasdfghjklzxcvbnm!@#$%^&*()QWERTYUIOPASDFGHJKLZXCVBNM'
|
||||
return ''.join([choice(letters) for _ in range(30)])
|
||||
|
||||
|
||||
class Checker(models.Model):
|
||||
token = models.CharField(max_length=30, default=generate_token, db_index=True, unique=True)
|
||||
dynamic_token = models.CharField(max_length=30, default=generate_token, db_index=True, unique=True)
|
||||
testing_solution = models.ForeignKey(Solution, on_delete=models.SET_NULL, null=True)
|
||||
set = models.ForeignKey(Set, on_delete=models.CASCADE, related_name="checkers")
|
||||
last_request = models.DateTimeField()
|
||||
name = models.CharField(max_length=50, default='')
|
||||
|
||||
@property
|
||||
def status(self):
|
||||
if self.testing_solution is not None:
|
||||
return 'Testing'
|
||||
if (timezone.now() - self.last_request).total_seconds() > 3:
|
||||
return 'Disabled'
|
||||
return 'Active'
|
3
Checker/tests.py
Normal file
3
Checker/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
10
Checker/urls.py
Normal file
10
Checker/urls.py
Normal file
@@ -0,0 +1,10 @@
|
||||
from django.urls import path
|
||||
|
||||
from Checker import views
|
||||
|
||||
urlpatterns = [
|
||||
path("status", views.status),
|
||||
path("available", views.available),
|
||||
path("get_dynamic", views.get_dynamic),
|
||||
path("set_result", views.set_result),
|
||||
]
|
73
Checker/views.py
Normal file
73
Checker/views.py
Normal file
@@ -0,0 +1,73 @@
|
||||
from os.path import join
|
||||
from tempfile import TemporaryDirectory
|
||||
from zipfile import ZipFile
|
||||
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.http import JsonResponse, HttpResponse
|
||||
|
||||
from django.utils import timezone
|
||||
|
||||
from Checker.models import Checker, generate_token
|
||||
from FileStorage.sync import synchronized_method
|
||||
from Main.models import Solution, SolutionFile, ExtraFile
|
||||
|
||||
|
||||
def get_dynamic(request):
|
||||
try:
|
||||
checker = Checker.objects.get(token=request.GET['token'])
|
||||
if checker.status == 'Active':
|
||||
return JsonResponse({"status": "Another checker is working"}, status=403)
|
||||
checker.dynamic_token = generate_token()
|
||||
checker.save()
|
||||
return JsonResponse({"token": checker.dynamic_token})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({"status": "incorrect token"}, status=403)
|
||||
|
||||
|
||||
def status(request):
|
||||
try:
|
||||
checker = Checker.objects.get(dynamic_token=request.GET['token'])
|
||||
now = timezone.now()
|
||||
checker.last_request = now
|
||||
checker.save()
|
||||
return JsonResponse({"status": "ok"})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({"status": "incorrect token"}, status=403)
|
||||
|
||||
|
||||
@synchronized_method
|
||||
def available(request):
|
||||
try:
|
||||
checker = Checker.objects.get(dynamic_token=request.GET['token'])
|
||||
solution = Solution.objects.filter(set=checker.set, result="In queue").order_by('time_sent').first()
|
||||
if solution is None:
|
||||
return JsonResponse({"id": None})
|
||||
solution.result = "Testing"
|
||||
solution.save()
|
||||
with TemporaryDirectory() as tempdir:
|
||||
with ZipFile(join(tempdir, "package.zip"), 'w') as zip_file:
|
||||
for sf in SolutionFile.objects.filter(solution=solution):
|
||||
zip_file.writestr(sf.path, sf.bytes)
|
||||
for ef in ExtraFile.objects.filter(task=solution.task):
|
||||
zip_file.writestr(ef.filename, ef.bytes)
|
||||
response = HttpResponse(open(join(tempdir, 'package.zip'), 'rb').read(), content_type='application/octet-stream', status=201)
|
||||
response.headers['language_id'] = solution.language_id
|
||||
response.headers['solution_id'] = solution.id
|
||||
response.headers['timeout'] = solution.task.time_limit
|
||||
return response
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({"status": "incorrect token"}, status=403)
|
||||
|
||||
|
||||
def set_result(request):
|
||||
try:
|
||||
checker = Checker.objects.get(dynamic_token=request.GET['token'])
|
||||
solution = Solution.objects.get(id=request.GET['solution_id'])
|
||||
result = request.GET['result']
|
||||
if checker.set != solution.set:
|
||||
return JsonResponse({"status": "incorrect solution"}, status=403)
|
||||
solution.result = result
|
||||
solution.save()
|
||||
return JsonResponse({"status": True})
|
||||
except ObjectDoesNotExist:
|
||||
return JsonResponse({"status": "incorrect token"}, status=403)
|
Reference in New Issue
Block a user