registration implemented
This commit is contained in:
40
Main/views/AccountView.py
Normal file
40
Main/views/AccountView.py
Normal 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
29
Main/views/EnterView.py
Normal 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
11
Main/views/ExitView.py
Normal 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
6
Main/views/MainView.py
Normal 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
11
Main/views/RatingView.py
Normal 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')
|
40
Main/views/RegisterView.py
Normal file
40
Main/views/RegisterView.py
Normal 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
12
Main/views/SetsView.py
Normal 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}"
|
21
Main/views/SolutionsTableView.py
Normal file
21
Main/views/SolutionsTableView.py
Normal 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')
|
80
Main/views/TaskSettingsView.py
Normal file
80
Main/views/TaskSettingsView.py
Normal 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
46
Main/views/TaskView.py
Normal 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
13
Main/views/TasksView.py
Normal 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
11
Main/views/__init__.py
Normal 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
|
Reference in New Issue
Block a user