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

10
Main/models/__init__.py Normal file
View File

@@ -0,0 +1,10 @@
from Main.models.userinfo import UserInfo
from Main.models.group import Group
from Main.models.task import Task
from Main.models.file import File
from Main.models.set import Set
from Main.models.subscription import Subscription
from Main.models.settask import SetTask
from Main.models.solution import Solution
from Main.models.language import Language
from Main.models.extrafile import ExtraFile

27
Main/models/extrafile.py Normal file
View File

@@ -0,0 +1,27 @@
from os import remove
from os.path import join, exists
from django.db import models
from Sprint.settings import DATA_ROOT
class ExtraFile(models.Model):
task = models.ForeignKey('Task', on_delete=models.CASCADE)
filename = models.TextField()
is_test = models.BooleanField(null=True)
readable = models.BooleanField(null=True)
test_number = models.IntegerField(null=True)
@property
def path(self):
return join(DATA_ROOT, 'extra_files', str(self.id))
@property
def text(self):
return open(self.path, 'r').read()
def delete(self, using=None, keep_parents=False):
if exists(self.path):
remove(self.path)
super().delete(using=using, keep_parents=keep_parents)

7
Main/models/file.py Normal file
View File

@@ -0,0 +1,7 @@
from django.db import models
from Main.models.task import Task
class File(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
name = models.TextField()

7
Main/models/group.py Normal file
View File

@@ -0,0 +1,7 @@
from django.db import models
from Main.models.set import Set
class Group(models.Model):
name = models.TextField()
sets = models.ManyToManyField(Set)

13
Main/models/language.py Normal file
View File

@@ -0,0 +1,13 @@
from django.db import models
class Language(models.Model):
name = models.TextField()
work_name = models.TextField(default='')
file_type = models.TextField(null=True)
logo = models.ImageField(upload_to="logos", null=True)
image = models.TextField(default='ubuntu')
opened = models.BooleanField(default=False)
def __str__(self):
return self.name

8
Main/models/set.py Normal file
View File

@@ -0,0 +1,8 @@
from django.contrib.auth.models import User
from django.db import models
class Set(models.Model):
name = models.TextField()
public = models.BooleanField(default=False)
creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

10
Main/models/settask.py Normal file
View File

@@ -0,0 +1,10 @@
from django.db import models
from Main.models.task import Task
from Main.models.set import Set
class SetTask(models.Model):
set = models.ForeignKey(Set, on_delete=models.CASCADE)
task = models.ForeignKey(Task, on_delete=models.CASCADE, related_name="settasks")
name = models.CharField(max_length=2)

40
Main/models/solution.py Normal file
View File

@@ -0,0 +1,40 @@
from os import mkdir
from os.path import join, exists
from shutil import rmtree
from subprocess import call
from django.contrib.auth.models import User
from django.db import models
from django.utils import timezone
from Main.models.task import Task
from Main.models.language import Language
from Sprint.settings import CONSTS, SOLUTIONS_ROOT
class Solution(models.Model):
task = models.ForeignKey(Task, on_delete=models.CASCADE)
user = models.ForeignKey(User, on_delete=models.CASCADE)
language = models.ForeignKey(Language, on_delete=models.SET_NULL, null=True)
time_sent = models.DateTimeField(default=timezone.now)
result = models.TextField(default=CONSTS["in_queue_status"])
def delete(self, using=None, keep_parents=False):
if exists(self.directory):
rmtree(self.directory)
super().delete(using=using, keep_parents=keep_parents)
def create_dirs(self):
mkdir(self.directory)
mkdir(self.testing_directory)
@property
def directory(self):
return join(SOLUTIONS_ROOT, str(self.id))
@property
def testing_directory(self):
return join(self.directory, 'test_dir')
def exec_command(self, command, working_directory='app', timeout=None):
return call(f'docker exec -i solution_{self.id} bash -c "cd {working_directory} && {command}"', shell=True, timeout=timeout)

View File

@@ -0,0 +1,12 @@
from django.db import models
from django.contrib.auth.models import User
from Main.models.group import Group
class Subscription(models.Model):
group = models.ForeignKey(
Group, on_delete=models.CASCADE, related_name="subscriptions"
)
user = models.ForeignKey(User, on_delete=models.CASCADE)
role = models.IntegerField()

26
Main/models/task.py Normal file
View File

@@ -0,0 +1,26 @@
from django.db import models
from django.contrib.auth.models import User
from Main.models.extrafile import ExtraFile
class Task(models.Model):
name = models.TextField()
public = models.BooleanField(default=False)
legend = models.TextField(default="")
input_format = models.TextField(default="")
output_format = models.TextField(default="")
specifications = models.TextField(default="")
time_limit = models.IntegerField(default=10000)
creator = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)
def __str__(self):
return self.name
@property
def files(self):
return ExtraFile.objects.filter(task=self, is_test=False)
@property
def tests(self):
return ExtraFile.objects.filter(task=self, is_test=True)

71
Main/models/userinfo.py Normal file
View File

@@ -0,0 +1,71 @@
from django.contrib.auth.models import User
from django.db import models
from django.utils import timezone
from Main.models.subscription import Subscription
from Main.models.group import Group
from Main.models.settask import SetTask
from Main.models.task import Task
from Sprint.settings import CONSTS
class UserInfo(models.Model):
surname = models.TextField()
name = models.TextField()
middle_name = models.TextField()
last_request = models.DateTimeField(default=timezone.now)
profile_picture = models.ImageField(upload_to="profile_pictures", null=True)
rating = models.IntegerField(default=0)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
def _append_task(self, task, tasks):
if task.creator == self.user or task.public:
tasks.append(task)
return
for st in SetTask.objects.filter(task=task):
if st.set.public:
tasks.append(task)
return
for group in Group.objects.filter(sets=st.set):
for sub in Subscription.objects.filter(group=group):
if sub.user == self.user:
tasks.append(task)
return
@property
def available_tasks(self):
tasks = []
for task in Task.objects.all():
self._append_task(task, tasks)
return tasks
@property
def place(self):
return len(UserInfo.objects.filter(rating__gt=self.rating)) + 1
@property
def activity_status(self):
if timezone.now() - self.last_request <= timezone.timedelta(minutes=5):
return CONSTS["online_status"]
return timezone.datetime.strftime(self.last_request, "%d-%m-%Y %H:%M")
@property
def can_create(self):
# todo:
return self.user.is_superuser
@property
def has_profile_pic(self):
try:
return self.profile_picture.url is not None
except ValueError:
return False
@property
def profile_pic_url(self):
if self.has_profile_pic:
return self.profile_picture.url
return "https://i2.wp.com/electrolabservice.com/wp-content/uploads/2021/01/blank-profile-picture-mystery-man-avatar-973460.jpg"
def __str__(self):
return "{} {} {}".format(self.surname, self.name, self.middle_name)