filestorage
This commit is contained in:
@@ -8,3 +8,4 @@ from Main.models.settask import SetTask
|
||||
from Main.models.solution import Solution
|
||||
from Main.models.extrafile import ExtraFile
|
||||
from Main.models.progress import Progress
|
||||
from Main.models.solution_file import SolutionFile
|
||||
|
@@ -1,23 +1,17 @@
|
||||
from os import remove
|
||||
from os.path import join, exists
|
||||
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.db import models
|
||||
|
||||
from Sprint.settings import DATA_ROOT
|
||||
from .mixins import FileStorageMixin
|
||||
|
||||
|
||||
class ExtraFile(models.Model):
|
||||
class ExtraFile(FileStorageMixin, models.Model):
|
||||
task = models.ForeignKey("Task", on_delete=models.CASCADE)
|
||||
filename = models.TextField()
|
||||
is_test = models.BooleanField(null=True)
|
||||
is_sample = models.BooleanField(null=True)
|
||||
readable = models.BooleanField(null=True)
|
||||
test_number = models.IntegerField(null=True)
|
||||
|
||||
@property
|
||||
def path(self):
|
||||
return join(DATA_ROOT, "extra_files", str(self.id))
|
||||
fs_id = models.IntegerField(null=True)
|
||||
|
||||
@property
|
||||
def can_be_sample(self):
|
||||
@@ -29,13 +23,8 @@ class ExtraFile(models.Model):
|
||||
)
|
||||
)
|
||||
|
||||
@property
|
||||
def text(self):
|
||||
return open(self.path, "r").read()
|
||||
|
||||
def delete(self, using=None, keep_parents=False):
|
||||
if exists(self.path):
|
||||
remove(self.path)
|
||||
self.remove_from_fs()
|
||||
if self.is_test and self.filename.endswith('.a'):
|
||||
try:
|
||||
ef = ExtraFile.objects.get(task=self.task, filename=self.filename.rstrip('.a'), is_test=True)
|
||||
@@ -47,4 +36,4 @@ class ExtraFile(models.Model):
|
||||
|
||||
@property
|
||||
def answer(self):
|
||||
return ExtraFile.objects.get(task=self.task, is_test=True, filename=self.filename + '.a')
|
||||
return ExtraFile.objects.get(task=self.task, is_test=True, filename=self.filename + '.a')
|
||||
|
14
Main/models/mixins.py
Normal file
14
Main/models/mixins.py
Normal file
@@ -0,0 +1,14 @@
|
||||
from SprintLib.utils import get_bytes, write_bytes, delete_file
|
||||
|
||||
|
||||
class FileStorageMixin:
|
||||
@property
|
||||
def text(self):
|
||||
return get_bytes(self.fs_id).decode("utf-8")
|
||||
|
||||
def write(self, bytes):
|
||||
self.fs_id = write_bytes(bytes)
|
||||
self.save()
|
||||
|
||||
def remove_from_fs(self):
|
||||
delete_file(self.fs_id)
|
@@ -1,13 +1,12 @@
|
||||
from os import mkdir, walk
|
||||
from os.path import join, exists
|
||||
from shutil import rmtree
|
||||
from subprocess import call
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.core.exceptions import ObjectDoesNotExist
|
||||
from django.db import models
|
||||
from django.utils import timezone
|
||||
|
||||
from Main.models.solution_file import SolutionFile
|
||||
from Main.models.task import Task
|
||||
from Sprint.settings import CONSTS, SOLUTIONS_ROOT, SOLUTIONS_ROOT_EXTERNAL
|
||||
from SprintLib.language import languages
|
||||
@@ -32,36 +31,30 @@ class Solution(models.Model):
|
||||
@property
|
||||
def files(self):
|
||||
data = []
|
||||
for path, _, files in walk(self.directory):
|
||||
if path.startswith(self.testing_directory):
|
||||
for file in SolutionFile.objects.filter(solution=self):
|
||||
try:
|
||||
text = file.text
|
||||
except:
|
||||
continue
|
||||
for file in files:
|
||||
try:
|
||||
entity = {
|
||||
'filename': file,
|
||||
'text': open(join(path, file), 'r').read()
|
||||
}
|
||||
end = file.split('.')[-1]
|
||||
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:
|
||||
continue
|
||||
entity = {
|
||||
'filename': file.path,
|
||||
'text': text
|
||||
}
|
||||
end = file.path.split('.')[-1]
|
||||
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)
|
||||
data.sort(key=lambda x: x['filename'])
|
||||
return data
|
||||
|
||||
def create_dirs(self):
|
||||
mkdir(self.directory)
|
||||
mkdir(self.testing_directory)
|
||||
|
||||
@property
|
||||
def directory(self):
|
||||
return join(SOLUTIONS_ROOT, str(self.id))
|
||||
|
9
Main/models/solution_file.py
Normal file
9
Main/models/solution_file.py
Normal file
@@ -0,0 +1,9 @@
|
||||
from django.db import models
|
||||
|
||||
from Main.models.mixins import FileStorageMixin
|
||||
|
||||
|
||||
class SolutionFile(FileStorageMixin, models.Model):
|
||||
path = models.TextField()
|
||||
fs_id = models.IntegerField()
|
||||
solution = models.ForeignKey('Solution', on_delete=models.CASCADE)
|
Reference in New Issue
Block a user