From 4e9c195d9db0507f3d97ecaef8e8aed6e55f8045 Mon Sep 17 00:00:00 2001 From: Egor Matveev Date: Wed, 23 Feb 2022 00:15:58 +0300 Subject: [PATCH] landing --- Main/views/MainView.py | 42 ++++++++-- SprintLib/BaseView.py | 6 +- SprintLib/testers/BaseTester.py | 3 +- templates/landing.html | 133 ++++++++++++++++++++++++++++++++ 4 files changed, 172 insertions(+), 12 deletions(-) create mode 100644 templates/landing.html 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