language moved to dataclass

This commit is contained in:
Egor Matveev 2021-11-06 12:35:57 +03:00
parent c2490b564e
commit 5fd4823740
9 changed files with 82 additions and 26 deletions

View File

@ -0,0 +1,22 @@
# Generated by Django 3.2.4 on 2021-11-06 09:15
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('Main', '0073_auto_20211106_0125'),
]
operations = [
migrations.RemoveField(
model_name='solution',
name='language',
),
migrations.AddField(
model_name='solution',
name='language_id',
field=models.IntegerField(default=0),
),
]

View File

@ -6,6 +6,5 @@ from Main.models.set import Set
from Main.models.subscription import Subscription
from Main.models.settask import SetTask
from Main.models.solution import Solution
from Main.models.language import Language
from Main.models.extrafile import ExtraFile
from Main.models.progress import Progress

View File

@ -1,14 +0,0 @@
from django.db import models
class Language(models.Model):
name = models.TextField()
work_name = models.TextField(default='')
file_type = models.TextField(null=True)
logo = models.ImageField(upload_to="logos", null=True)
image = models.TextField(default='ubuntu')
highlight = models.TextField(default='plaintext')
opened = models.BooleanField(default=False)
def __str__(self):
return self.name

View File

@ -9,17 +9,21 @@ from django.db import models
from django.utils import timezone
from Main.models.task import Task
from Main.models.language import Language
from Sprint.settings import CONSTS, SOLUTIONS_ROOT, SOLUTIONS_ROOT_EXTERNAL
from SprintLib.language import languages
class Solution(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
language = models.ForeignKey(Language, on_delete=models.SET_NULL, null=True)
language_id = models.IntegerField(default=0)
time_sent = models.DateTimeField(default=timezone.now)
result = models.TextField(default=CONSTS["in_queue_status"])
@property
def language(self):
return languages[self.language_id]
def delete(self, using=None, keep_parents=False):
if exists(self.directory):
rmtree(self.directory)
@ -38,10 +42,15 @@ class Solution(models.Model):
'text': open(join(path, file), 'r').read()
}
end = file.split('.')[-1]
try:
highlight = 'language-' + Language.objects.get(file_type=end).highlight
except ObjectDoesNotExist:
language = None
for l in languages:
if l.file_type == end:
language = l
break
if language is None:
highlight = 'nohighlight'
else:
highlight = 'language-' + language.highlight
entity['highlight'] = highlight
data.append(entity)
except:

View File

@ -6,5 +6,7 @@ class SolutionView(BaseView):
required_login = True
def pre_handle(self):
if self.request.user.is_superuser:
return
if self.entities.solution.user != self.request.user:
raise AccessError()

View File

@ -1,7 +1,8 @@
from zipfile import ZipFile
from Main.models import Solution
from SprintLib.BaseView import BaseView, Language
from SprintLib.BaseView import BaseView
from SprintLib.language import languages
from SprintLib.queue import send_testing
from SprintLib.testers import *
@ -11,7 +12,7 @@ class TaskView(BaseView):
view_file = "task.html"
def get(self):
self.context['languages'] = Language.objects.filter(opened=True).order_by('name')
self.context['languages'] = sorted(languages, key=lambda x: x.name)
progress, _ = Progress.objects.get_or_create(user=self.request.user, task=self.entities.task)
self.context['progress'] = progress
@ -21,7 +22,7 @@ class TaskView(BaseView):
self.solution = Solution.objects.create(
task=self.entities.task,
user=self.request.user,
language_id=self.request.POST["language"]
language_id=int(self.request.POST["language"])
)
self.solution.create_dirs()

37
SprintLib/language.py Normal file
View File

@ -0,0 +1,37 @@
from dataclasses import dataclass
@dataclass
class Language:
id: int
name: str
work_name: str
file_type: str
logo_url: str
image: str
highlight: str
def __str__(self):
return self.name
languages = [
Language(
id=0,
name="Python3",
work_name="Python3",
file_type="py",
logo_url="https://entredatos.es/wp-content/uploads/2021/05/1200px-Python-logo-notext.svg.png",
image="python:3.6",
highlight="python",
),
Language(
id=1,
name="Kotlin",
work_name="Kotlin",
file_type="kt",
logo_url="https://upload.wikimedia.org/wikipedia/commons/0/06/Kotlin_Icon.svg",
image="zenika/kotlin",
highlight="kotlin",
),
]

View File

@ -24,7 +24,7 @@
Язык
</td>
<td>
<img src="{{ solution.language.logo.url }}" width="30px" height="30px">
<img src="{{ solution.language.logo_url }}" width="30px" height="30px">
</td>
</tr>
<tr>

View File

@ -7,8 +7,8 @@
{{ solution.time_sent }}
</td>
<td>
<img src="{{ solution.language.logo.url }}" width="30px" height="30px">
{{ solution.language }}
<img src="{{ solution.language.logo_url }}" width="30px" height="30px">
{{ solution.language.name }}
</td>
<td>
<h4>