solutions table
This commit is contained in:
@@ -1,8 +1,10 @@
|
||||
from functools import cached_property
|
||||
|
||||
from SprintLib.utils import get_bytes, write_bytes, delete_file
|
||||
|
||||
|
||||
class FileStorageMixin:
|
||||
@property
|
||||
@cached_property
|
||||
def text(self):
|
||||
return get_bytes(self.fs_id).decode("utf-8")
|
||||
|
||||
|
@@ -1,4 +1,5 @@
|
||||
from os.path import join, exists
|
||||
from functools import cached_property
|
||||
from os.path import exists
|
||||
from shutil import rmtree
|
||||
from subprocess import call
|
||||
|
||||
@@ -8,7 +9,7 @@ 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 Sprint.settings import CONSTS
|
||||
from SprintLib.language import languages
|
||||
|
||||
|
||||
@@ -28,7 +29,7 @@ class Solution(models.Model):
|
||||
rmtree(self.directory)
|
||||
super().delete(using=using, keep_parents=keep_parents)
|
||||
|
||||
@property
|
||||
@cached_property
|
||||
def files(self):
|
||||
data = []
|
||||
for file in SolutionFile.objects.filter(solution=self):
|
||||
|
@@ -1,25 +1,58 @@
|
||||
from django.http import HttpResponse
|
||||
from django.db.models import QuerySet
|
||||
|
||||
from Main.models import Solution
|
||||
from Sprint.settings import CONSTS
|
||||
from SprintLib.BaseView import BaseView
|
||||
from SprintLib.BaseView import BaseView, AccessError
|
||||
|
||||
|
||||
class SolutionsTableView(BaseView):
|
||||
view_file = "solutions_table.html"
|
||||
required_login = True
|
||||
endpoint = "solutions_table"
|
||||
page_size = 20
|
||||
page = None
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
self.filters = [
|
||||
self.filter_user,
|
||||
self.filter_task,
|
||||
self.filter_set,
|
||||
]
|
||||
self.queryset = Solution.objects.all()
|
||||
|
||||
def filter_user(self, queryset: QuerySet):
|
||||
if 'username' in self.request.GET:
|
||||
return queryset.filter(user__username=self.request.GET["username"])
|
||||
return queryset
|
||||
|
||||
def filter_task(self, queryset: QuerySet):
|
||||
if 'task_id' in self.request.GET:
|
||||
return queryset.filter(task_id=int(self.request.GET['task_id']))
|
||||
return queryset
|
||||
|
||||
def filter_set(self, queryset: QuerySet):
|
||||
if 'set_id' in self.request.GET:
|
||||
return queryset.filter()
|
||||
return queryset
|
||||
|
||||
def pre_handle(self):
|
||||
if 'page' not in self.request.GET:
|
||||
raise AccessError()
|
||||
self.page = int(self.request.GET['page'])
|
||||
if "username" in self.request.GET and self.request.user.username == self.request.GET['username']:
|
||||
return
|
||||
if hasattr(self.entities, "set"):
|
||||
if self.entities.set.creator != self.request.user:
|
||||
raise AccessError()
|
||||
if hasattr(self.entities, "task"):
|
||||
if self.entities.task.creator != self.request.user:
|
||||
raise AccessError()
|
||||
|
||||
def get(self):
|
||||
self.context["solutions"] = Solution.objects.filter(
|
||||
user=self.request.user, task=self.entities.task
|
||||
).order_by("-time_sent")
|
||||
if "render" in self.request.GET.keys():
|
||||
return
|
||||
for sol in self.context["solutions"]:
|
||||
if (
|
||||
sol.result == CONSTS["testing_status"]
|
||||
or sol.result == CONSTS["in_queue_status"]
|
||||
):
|
||||
return
|
||||
return HttpResponse("done")
|
||||
for fltr in self.filters:
|
||||
self.queryset = fltr(self.queryset)
|
||||
offset = self.page_size * (self.page - 1)
|
||||
limit = self.page_size
|
||||
self.context["solutions"] = self.queryset.order_by("-id")[offset:offset + limit]
|
||||
self.context["count_pages"] = range(1, (len(self.queryset) - 1) // self.page_size + 2)
|
||||
self.context["need_pagination"] = len(self.context["count_pages"]) > 1
|
||||
|
16
Main/views/SolutionsView.py
Normal file
16
Main/views/SolutionsView.py
Normal file
@@ -0,0 +1,16 @@
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
|
||||
class SolutionsView(BaseView):
|
||||
required_login = True
|
||||
endpoint = "solutions"
|
||||
view_file = "solutions.html"
|
||||
|
||||
def get(self):
|
||||
self.context["username"] = self.request.GET.get("username")
|
||||
self.context["task_id"] = self.request.GET.get("task_id")
|
||||
if self.context["task_id"]:
|
||||
self.context["task_id"] = int(self.context["task_id"])
|
||||
self.context["set_id"] = self.request.GET.get("set_id")
|
||||
if self.context["set_id"]:
|
||||
self.context["set_id"] = int(self.context["set_id"])
|
@@ -1,5 +1,3 @@
|
||||
from django.http import HttpResponse
|
||||
|
||||
from Main.models import Progress
|
||||
from SprintLib.BaseView import BaseView
|
||||
|
||||
@@ -12,7 +10,3 @@ class TaskRuntimeView(BaseView):
|
||||
def get(self):
|
||||
progress = Progress.objects.get(task=self.entities.task, user=self.request.user)
|
||||
self.context["progress"] = progress
|
||||
if "render" in self.request.GET.keys():
|
||||
return
|
||||
if progress.finished:
|
||||
return HttpResponse("done")
|
||||
|
@@ -13,4 +13,5 @@ from Main.views.SolutionView import SolutionView
|
||||
from Main.views.ImageView import ImageView
|
||||
from Main.views.SendCodeView import SendCodeView
|
||||
from Main.views.SetSettingsView import SetSettingsView
|
||||
from Main.views.UsersView import UsersView
|
||||
from Main.views.UsersView import UsersView
|
||||
from Main.views.SolutionsView import SolutionsView
|
||||
|
Reference in New Issue
Block a user