registration implemented

This commit is contained in:
Egor Matveev
2021-08-29 21:43:34 +03:00
parent f72801d6f5
commit 1307c16ec1
125 changed files with 2158 additions and 4631 deletions

40
Main/views/AccountView.py Normal file
View File

@@ -0,0 +1,40 @@
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User
from SprintLib.BaseView import BaseView
class AccountView(BaseView):
view_file = "account.html"
required_login = True
def get(self):
if "username" in self.request.GET.keys():
self.context["account"] = User.objects.get(
username=self.request.GET["username"]
)
else:
self.context["account"] = self.request.user
self.context["owner"] = self.context["account"] == self.request.user
self.context["error_message"] = self.request.GET.get("error_message", "")
def post_upload_photo(self):
self.request.user.userinfo.profile_picture.delete()
self.request.user.userinfo.profile_picture = self.request.FILES["file"]
self.request.user.userinfo.save()
return "/account"
def post_change_password(self):
password = self.request.POST["password"].strip()
new_password = self.request.POST["new_password"].strip()
user = authenticate(username=self.request.user.username, password=password)
if not user:
return "/account?error_message=Неправильно указан пароль"
if len(new_password) < 8:
return "/account?error_message=Пароль слишком слабый"
if new_password != self.request.POST["repeat"]:
return "/account?error_message=Пароли не совпадают"
self.request.user.set_password(new_password)
self.request.user.save()
login(self.request, self.request.user)
return "/account?error_message=Пароль успешно установлен"

29
Main/views/EnterView.py Normal file
View File

@@ -0,0 +1,29 @@
from django.contrib.auth import authenticate, login
from django.contrib.auth.models import User
from django.core.exceptions import ObjectDoesNotExist
from SprintLib.BaseView import BaseView
class EnterView(BaseView):
view_file = "enter.html"
required_login = False
def get(self):
self.context["error_message"] = self.request.GET.get("error_message", "")
def post(self):
try:
user = User.objects.get(username=self.request.POST["email"])
except ObjectDoesNotExist:
try:
user = User.objects.get(email=self.request.POST["email"])
except ObjectDoesNotExist:
return "/enter?error_message=Данного пользователя не существует"
user = authenticate(
username=user.username, password=self.request.POST["password"].strip()
)
if user is not None:
login(self.request, user)
return "/"
return "/enter?error_message=Неверный пароль"

11
Main/views/ExitView.py Normal file
View File

@@ -0,0 +1,11 @@
from django.contrib.auth import logout
from SprintLib.BaseView import BaseView
class ExitView(BaseView):
required_login = True
def get(self):
logout(self.request)
return "/"

6
Main/views/MainView.py Normal file
View File

@@ -0,0 +1,6 @@
from SprintLib.BaseView import BaseView
class MainView(BaseView):
view_file = "main.html"
required_login = True

11
Main/views/RatingView.py Normal file
View File

@@ -0,0 +1,11 @@
from django.contrib.auth.models import User
from SprintLib.BaseView import BaseView
class RatingView(BaseView):
view_file = "rating.html"
required_login = True
def get(self):
self.context["users"] = User.objects.all().order_by('-userinfo__rating')

View File

@@ -0,0 +1,40 @@
from django.contrib.auth.models import User
from Main.models import UserInfo
from SprintLib.BaseView import BaseView
class RegisterView(BaseView):
view_file = "register.html"
required_login = False
def get(self):
self.context["error_message"] = self.request.GET.get("error_message", "")
def post(self):
data = {**self.request.POST}
data["password"] = data["password"].strip()
if len(data["password"]) < 8:
return "/register?error_message=Пароль слишком слабый"
if data["password"] != data["repeat_password"]:
return "/register?error_message=Пароли не совпадают"
if len(User.objects.filter(username=data["username"])):
return "/register?error_message=Данное имя пользователя уже занято"
if len(User.objects.filter(email=data["email"])):
return "/register?error_message=Пользователь под таким email уже зарегистрирован"
user = User.objects.create_user(
data["username"],
data["email"],
password=data["password"],
)
userinfo = UserInfo.objects.create(
surname=data["surname"],
name=data["name"],
middle_name=data["middle_name"],
user=user,
)
user.userinfo = userinfo
user.save()
# todo: реализовать подтверждение по почте
return "/enter"

12
Main/views/SetsView.py Normal file
View File

@@ -0,0 +1,12 @@
from Main.models import Set
from SprintLib.BaseView import BaseView
class SetsView(BaseView):
view_file = "sets.html"
required_login = True
def post(self):
task_name = self.request.POST["name"]
task = Set.objects.create(name=task_name, creator=self.request.user)
return f"/admin/task?task_id={task.id}"

View File

@@ -0,0 +1,21 @@
from django.http import HttpResponse
from Main.models import Solution
from Sprint.settings import CONSTS
from SprintLib.BaseView import BaseView
class SolutionsTableView(BaseView):
view_file = 'solutions_table.html'
required_login = True
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')

View File

@@ -0,0 +1,80 @@
from django.core.exceptions import ObjectDoesNotExist
from django.http import HttpResponse
from Main.models import ExtraFile
from SprintLib.BaseView import BaseView, AccessError
class TaskSettingsView(BaseView):
view_file = "task_settings.html"
required_login = True
def pre_handle(self):
if self.entities.task not in self.request.user.userinfo.available_tasks:
raise AccessError()
def get(self):
self.context['error_message'] = self.request.GET.get('error_message', '')
def post(self):
for key, value in self.request.POST.items():
setattr(self.entities.task, key, value.strip())
self.entities.task.save()
return f"/admin/task?task_id={self.entities.task.id}"
def _upload(self, is_test):
filename = self.request.FILES['file'].name
ef, created = None, None
if is_test:
name = filename.strip('.a')
if not name.isnumeric():
return f'/admin/task?task_id={self.entities.task.id}&error_message=Формат файла не соответствует тесту'
ef, created = ExtraFile.objects.get_or_create(task=self.entities.task, is_test=True, test_number=int(name))
if not created:
return f'/admin/task?task_id={self.entities.task.id}'
if ef is None or created is None:
ef, created = ExtraFile.objects.get_or_create(
task=self.entities.task,
filename=filename,
is_test=is_test
)
with open(ef.path, 'wb') as fs:
for chunk in self.request.FILES['file'].chunks():
fs.write(chunk)
try:
open(ef.path, 'r').read()
ef.readable = True
except UnicodeDecodeError:
ef.readable = False
ef.save()
return '/admin/task?task_id=' + str(self.entities.task.id)
def post_file_upload(self):
return self._upload(False)
def post_test_upload(self):
return self._upload(True)
def post_delete_file(self):
ef = ExtraFile.objects.get(id=self.request.POST['id'])
ef.delete()
return HttpResponse("ok")
def _create(self, is_test):
name = self.request.POST['newfile_name']
ef, created = ExtraFile.objects.get_or_create(filename=name, task=self.entities.task)
if not created:
return f'/admin/task?task_id={self.entities.task.id}&error_message=Файл с таким именем уже существует'
with open(ef.path, 'w') as fs:
fs.write('')
ef.is_test = is_test
ef.readable = True
ef.save()
return f'/admin/task?task_id={self.entities.task.id}'
def post_create_file(self):
return self._create(False)
def post_create_test(self):
return self._create(True)

46
Main/views/TaskView.py Normal file
View File

@@ -0,0 +1,46 @@
from zipfile import ZipFile
from Main.models import Solution
from Main.tasks import start_testing
from SprintLib.BaseView import BaseView, Language
from SprintLib.testers import *
class TaskView(BaseView):
required_login = True
view_file = "task.html"
def get(self):
self.context['languages'] = Language.objects.filter(opened=True).order_by('name')
def pre_handle(self):
if self.request.method == 'GET':
return
self.solution = Solution.objects.create(
task=self.entities.task,
user=self.request.user,
language_id=self.request.POST["language"]
)
self.solution.create_dirs()
def post_0(self):
# отправка решения через текст
filename = 'solution.' + self.solution.language.file_type
file_path = join(self.solution.directory, filename)
with open(file_path, 'w') as fs:
fs.write(self.request.POST['code'])
start_testing.delay(self.solution.id)
return "task?task_id=" + str(self.entities.task.id)
def post_1(self):
# отправка решения через файл
filename = self.request.FILES['file'].name
file_path = join(self.solution.directory, filename)
with open(file_path, 'wb') as fs:
for chunk in self.request.FILES['file'].chunks():
fs.write(chunk)
if filename.endswith('.zip'):
with ZipFile(file_path) as obj:
obj.extractall(self.solution.directory)
start_testing.delay(self.solution.id)
return "task?task_id=" + str(self.entities.task.id)

13
Main/views/TasksView.py Normal file
View File

@@ -0,0 +1,13 @@
from Main.models import Task
from SprintLib.BaseView import BaseView
from django.db.models import Q
class TasksView(BaseView):
view_file = "tasks.html"
required_login = True
def post(self):
task_name = self.request.POST["name"]
task = Task.objects.create(name=task_name, creator=self.request.user)
return f"/admin/task?task_id={task.id}"

11
Main/views/__init__.py Normal file
View File

@@ -0,0 +1,11 @@
from Main.views.EnterView import EnterView
from Main.views.RegisterView import RegisterView
from Main.views.MainView import MainView
from Main.views.TasksView import TasksView
from Main.views.AccountView import AccountView
from Main.views.ExitView import ExitView
from Main.views.TaskSettingsView import TaskSettingsView
from Main.views.RatingView import RatingView
from Main.views.SetsView import SetsView
from Main.views.TaskView import TaskView
from Main.views.SolutionsTableView import SolutionsTableView