registration implemented
This commit is contained in:
10
Main/models/__init__.py
Normal file
10
Main/models/__init__.py
Normal 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
27
Main/models/extrafile.py
Normal 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
7
Main/models/file.py
Normal 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
7
Main/models/group.py
Normal 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
13
Main/models/language.py
Normal 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
8
Main/models/set.py
Normal 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
10
Main/models/settask.py
Normal 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
40
Main/models/solution.py
Normal 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)
|
12
Main/models/subscription.py
Normal file
12
Main/models/subscription.py
Normal 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
26
Main/models/task.py
Normal 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
71
Main/models/userinfo.py
Normal 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)
|
Reference in New Issue
Block a user