diff --git a/Main/views/MainView.py b/Main/views/MainView.py
index bb29ac9..865fb98 100644
--- a/Main/views/MainView.py
+++ b/Main/views/MainView.py
@@ -3,19 +3,30 @@ from random import sample
from django.db.models import Count, Max, Q
from django.utils import timezone
+from Checker.models import Checker
from Main.models import Task, UserInfo, Solution, Group
-from SprintLib.BaseView import BaseView
+from SprintLib.BaseView import BaseView, AccessError
+from SprintLib.language import languages
class MainView(BaseView):
- view_file = "main.html"
- required_login = True
endpoint = ""
- def get(self):
- self.context['top_tasks_today'] = Task.objects.filter(public=True, solution__time_sent__date=timezone.now().date()).annotate(count=Count('solution__task_id')).order_by('-count')[:5]
+ @property
+ def view_file(self):
+ if self.request.user.is_authenticated:
+ return "main.html"
+ return "landing.html"
+
+ def get_main(self):
+ self.context['top_tasks_today'] = Task.objects.filter(public=True,
+ solution__time_sent__date=timezone.now().date()).annotate(
+ count=Count('solution__task_id')).order_by('-count')[:5]
if len(self.context['top_tasks_today']) < 5:
- self.context['top_tasks_today'] = Task.objects.filter(public=True, solution__time_sent__isnull=False).annotate(time_sent=Max('solution__time_sent'), count=Count('solution__task_id')).order_by('-count', '-time_sent')[:5]
+ self.context['top_tasks_today'] = Task.objects.filter(public=True,
+ solution__time_sent__isnull=False).annotate(
+ time_sent=Max('solution__time_sent'), count=Count('solution__task_id')).order_by('-count',
+ '-time_sent')[:5]
if len(self.context['top_tasks_today']) < 5:
self.context['top_tasks_today'] = Task.objects.filter(public=True).order_by('name')[:5]
for task in self.context['top_tasks_today']:
@@ -29,8 +40,25 @@ class MainView(BaseView):
setattr(task, 'solution', Solution.objects.filter(user=self.request.user, task=task).last())
new_tasks = set(Task.objects.filter(public=True)) - set(all_tasks)
self.context['new_tasks'] = sample(new_tasks, k=min(5, len(new_tasks)))
- self.context['groups'] = Group.objects.filter(Q(editors__in=self.request.user.username) | Q(creator=self.request.user) | Q(users=self.request.user)).distinct()
+ self.context['groups'] = Group.objects.filter(
+ Q(editors__in=self.request.user.username) | Q(creator=self.request.user) | Q(
+ users=self.request.user)).distinct()
+
+ def get_landing(self):
+ self.context['solutions'] = len(Solution.objects.all())
+ self.context['tasks'] = len(Task.objects.all())
+ self.context['users'] = len(UserInfo.objects.all())
+ self.context['languages'] = len(languages)
+ self.context['groups'] = len(Group.objects.all())
+ self.context['runners'] = len(Checker.objects.all())
+
+ def get(self):
+ if self.request.user.is_authenticated:
+ return self.get_main()
+ return self.get_landing()
def post(self):
+ if not self.request.user.userinfo.teacher:
+ raise AccessError()
group = Group.objects.create(name=self.request.POST['name'], creator=self.request.user)
return '/group?group_id=' + str(group.id)
diff --git a/SprintLib/BaseView.py b/SprintLib/BaseView.py
index aaf800d..679811d 100644
--- a/SprintLib/BaseView.py
+++ b/SprintLib/BaseView.py
@@ -20,9 +20,10 @@ class BaseView:
view_file: Optional[str] = None
endpoint: Optional[str] = None
- def __init__(self):
+ def __init__(self, request):
self.context = {}
self.entities = EntityStorage()
+ self.request = request
@classmethod
def as_view(cls):
@@ -31,14 +32,13 @@ class BaseView:
user_info = request.user.userinfo
user_info.last_request = timezone.now()
user_info.save()
- c = cls()
+ c = cls(request)
if c.required_login is not None:
if c.required_login and not request.user.is_authenticated:
return HttpResponseRedirect("/enter")
if not c.required_login and request.user.is_authenticated:
return HttpResponseRedirect("/")
request_method = request.method.lower()
- c.request = request
exec("from Main.models import *")
for key in request.GET.keys():
if key.endswith("_id"):
diff --git a/SprintLib/testers/BaseTester.py b/SprintLib/testers/BaseTester.py
index 52a6d83..558b6c5 100644
--- a/SprintLib/testers/BaseTester.py
+++ b/SprintLib/testers/BaseTester.py
@@ -1,6 +1,5 @@
-from os import listdir, mkdir, chmod
+from os import listdir, mkdir
from os.path import join, exists
-from shutil import copyfile
from subprocess import call, TimeoutExpired
from Main.management.commands.bot import bot
diff --git a/templates/landing.html b/templates/landing.html
new file mode 100644
index 0000000..ca62b1e
--- /dev/null
+++ b/templates/landing.html
@@ -0,0 +1,133 @@
+{% load static %}
+
+
+
+
+
+
+
+ Sprint welcome
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Добро пожаловать в Sprint!
+
Sprint - система, позволяющая проводить олимпиады и уроки по программированию, а также обучаться этому ремеслу самостоятельно.
+
Войти
+
+
+
+
+
+
+
+
+
Sprint - это {{ users }} пользователей
+
А с тобой будет еще больше
+
+
+
+
+
Sprint - это {{ tasks }} задач
+
А с тобой будет еще больше
+
+
+
+
+
+
+
+
Sprint - это {{ solutions }} решений
+
А с тобой будет еще больше
+
+
+
+
+
Sprint - это {{ languages }} языков
+
А с тобой будет еще больше
+
+
+
+
+
+
+
+
Sprint - это {{ groups }} групп пользователей
+
А с тобой будет еще больше
+
+
+
+
+
Sprint - это {{ runners }} независимых чекеров
+
А с тобой будет еще больше
+
+
+
+
+
+
+
Попробуй Sprint сегодня и стань частью большой команды
+
Бесплатно, быстро и просто.
+
Войти
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file