From 5fd4823740469be116dc416eee9bfc68367e29aa Mon Sep 17 00:00:00 2001 From: Egor Matveev Date: Sat, 6 Nov 2021 12:35:57 +0300 Subject: [PATCH] language moved to dataclass --- Main/migrations/0074_auto_20211106_1215.py | 22 +++++++++++++ Main/models/__init__.py | 1 - Main/models/language.py | 14 -------- Main/models/solution.py | 19 ++++++++--- Main/views/SolutionView.py | 2 ++ Main/views/TaskView.py | 7 ++-- SprintLib/language.py | 37 ++++++++++++++++++++++ templates/solution.html | 2 +- templates/solutions_table.html | 4 +-- 9 files changed, 82 insertions(+), 26 deletions(-) create mode 100644 Main/migrations/0074_auto_20211106_1215.py delete mode 100644 Main/models/language.py create mode 100644 SprintLib/language.py diff --git a/Main/migrations/0074_auto_20211106_1215.py b/Main/migrations/0074_auto_20211106_1215.py new file mode 100644 index 0000000..1d4fefe --- /dev/null +++ b/Main/migrations/0074_auto_20211106_1215.py @@ -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), + ), + ] diff --git a/Main/models/__init__.py b/Main/models/__init__.py index a85fb68..393b604 100644 --- a/Main/models/__init__.py +++ b/Main/models/__init__.py @@ -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 diff --git a/Main/models/language.py b/Main/models/language.py deleted file mode 100644 index 475a3d3..0000000 --- a/Main/models/language.py +++ /dev/null @@ -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 diff --git a/Main/models/solution.py b/Main/models/solution.py index 518ab68..52256ad 100644 --- a/Main/models/solution.py +++ b/Main/models/solution.py @@ -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: diff --git a/Main/views/SolutionView.py b/Main/views/SolutionView.py index 3773355..f48a890 100644 --- a/Main/views/SolutionView.py +++ b/Main/views/SolutionView.py @@ -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() diff --git a/Main/views/TaskView.py b/Main/views/TaskView.py index 9c4d9b2..a812bad 100644 --- a/Main/views/TaskView.py +++ b/Main/views/TaskView.py @@ -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() diff --git a/SprintLib/language.py b/SprintLib/language.py new file mode 100644 index 0000000..63d7e27 --- /dev/null +++ b/SprintLib/language.py @@ -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", + ), +] diff --git a/templates/solution.html b/templates/solution.html index e0a3b21..c35acfb 100644 --- a/templates/solution.html +++ b/templates/solution.html @@ -24,7 +24,7 @@ Язык - + diff --git a/templates/solutions_table.html b/templates/solutions_table.html index 2363c4c..c998e22 100644 --- a/templates/solutions_table.html +++ b/templates/solutions_table.html @@ -7,8 +7,8 @@ {{ solution.time_sent }} - - {{ solution.language }} + + {{ solution.language.name }}