sprint/Main/models/userinfo.py
2021-12-21 14:05:06 +03:00

104 lines
3.5 KiB
Python

from functools import cached_property
from django.contrib.auth.models import User
from django.db import models
from django.db.models import Q
from django.utils import timezone
from Main.models.friendship import Friendship
from Main.models.set import Set
from Main.models.group import Group
from Main.models.settask import SetTask
from Main.models.subscription import Subscription
from Main.models.task import Task
from Sprint.settings import CONSTS
from SprintLib.language import languages
class UserInfo(models.Model):
surname = models.TextField(null=True)
name = models.TextField(null=True)
last_request = models.DateTimeField(default=timezone.now)
profile_picture_fs_id = models.IntegerField(null=True)
favourite_language_id = models.IntegerField(null=True)
rating = models.IntegerField(default=0)
user = models.OneToOneField(User, on_delete=models.CASCADE, null=True)
telegram_chat_id = models.TextField(default="")
notification_solution_result = models.BooleanField(default=False)
notification_friends = models.BooleanField(default=False)
notification_messages = models.BooleanField(default=False)
code = models.IntegerField(null=True)
verified = models.BooleanField(default=False)
@property
def tasks_solved(self):
fltr = Task.objects.filter(solution__result=CONSTS["ok_status"], solution__user=self.user).distinct()
return len(fltr)
@property
def has_favourite_language(self):
return self.favourite_language_id is not None
@cached_property
def friends(self):
return Friendship.objects.filter(Q(to_user=self.user) | Q(from_user=self.user)).order_by("verified")
@property
def favourite_language(self):
if not self.has_favourite_language:
return None
return languages[self.favourite_language_id]
def _append_task(self, task, tasks):
if task.creator == self.user or task.public or self.user.is_superuser:
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 sorted(tasks, key=lambda x: x.time_estimation)
@property
def available_sets(self):
return Set.objects.all()
@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_fs_id is not None
except ValueError:
return False
@property
def profile_pic_url(self):
if self.has_profile_pic:
return "/image?id=" + str(self.profile_picture_fs_id)
return "https://i2.wp.com/electrolabservice.com/wp-content/uploads/2021/01/blank-profile-picture-mystery-man-avatar-973460.jpg"