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.subscription import Subscription
from Main.models.settask import SetTask from Main.models.settask import SetTask
from Main.models.solution import Solution from Main.models.solution import Solution
from Main.models.language import Language
from Main.models.extrafile import ExtraFile from Main.models.extrafile import ExtraFile
from Main.models.progress import Progress 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 django.utils import timezone
from Main.models.task import Task from Main.models.task import Task
from Main.models.language import Language
from Sprint.settings import CONSTS, SOLUTIONS_ROOT, SOLUTIONS_ROOT_EXTERNAL from Sprint.settings import CONSTS, SOLUTIONS_ROOT, SOLUTIONS_ROOT_EXTERNAL
from SprintLib.language import languages
class Solution(models.Model): class Solution(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE) task = models.ForeignKey(Task, on_delete=models.CASCADE)
user = models.ForeignKey(User, 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) time_sent = models.DateTimeField(default=timezone.now)
result = models.TextField(default=CONSTS["in_queue_status"]) 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): def delete(self, using=None, keep_parents=False):
if exists(self.directory): if exists(self.directory):
rmtree(self.directory) rmtree(self.directory)
@ -38,10 +42,15 @@ class Solution(models.Model):
'text': open(join(path, file), 'r').read() 'text': open(join(path, file), 'r').read()
} }
end = file.split('.')[-1] end = file.split('.')[-1]
try: language = None
highlight = 'language-' + Language.objects.get(file_type=end).highlight for l in languages:
except ObjectDoesNotExist: if l.file_type == end:
language = l
break
if language is None:
highlight = 'nohighlight' highlight = 'nohighlight'
else:
highlight = 'language-' + language.highlight
entity['highlight'] = highlight entity['highlight'] = highlight
data.append(entity) data.append(entity)
except: except:

View File

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

View File

@ -1,7 +1,8 @@
from zipfile import ZipFile from zipfile import ZipFile
from Main.models import Solution 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.queue import send_testing
from SprintLib.testers import * from SprintLib.testers import *
@ -11,7 +12,7 @@ class TaskView(BaseView):
view_file = "task.html" view_file = "task.html"
def get(self): 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) progress, _ = Progress.objects.get_or_create(user=self.request.user, task=self.entities.task)
self.context['progress'] = progress self.context['progress'] = progress
@ -21,7 +22,7 @@ class TaskView(BaseView):
self.solution = Solution.objects.create( self.solution = Solution.objects.create(
task=self.entities.task, task=self.entities.task,
user=self.request.user, user=self.request.user,
language_id=self.request.POST["language"] language_id=int(self.request.POST["language"])
) )
self.solution.create_dirs() 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>
<td> <td>
<img src="{{ solution.language.logo.url }}" width="30px" height="30px"> <img src="{{ solution.language.logo_url }}" width="30px" height="30px">
</td> </td>
</tr> </tr>
<tr> <tr>

View File

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