99 lines
3.7 KiB
Python

import hashlib
from django.template.defaultfilters import slugify
from django.utils import timezone
from django.contrib.auth import get_user_model
from django.db import models
from django.dispatch import receiver
from django.db.models.signals import post_save
def _create_unique_string():
time = f"pucko {timezone.now()} prutt"
m = hashlib.blake2s()
m.update(str.encode(time))
return m.hexdigest()[16:52]
class User_Profile(models.Model):
class Meta:
verbose_name = "User profile"
verbose_name_plural = "User profiles"
user = models.OneToOneField(get_user_model(), on_delete=models.CASCADE, related_name="profile")
friends = models.ManyToManyField("self", blank=True)
nickname = models.CharField("Nickname", max_length=36, default=_create_unique_string)
first_name = models.CharField("First name", max_length=35, null=True, blank=True)
last_name = models.CharField("Last name", max_length=50, null=True, blank=True)
birthday = models.DateField("Birthday", null=True, blank=True)
updated_at = models.DateTimeField("Last updated", auto_now=True)
created_at = models.DateTimeField("Created at", auto_now_add=True)
slug = models.CharField(max_length=36, blank=True)
@classmethod
def search_for(cls, query):
search_filter = models.Q(nickname__icontains=query)|models.Q(first_name__icontains=query)|models.Q(last_name__icontains=query)
return cls.objects.filter(search_filter).distinct()
def friend_request_send(self, user):
if self.friends.filter(pk=user.pk).exists():
return "you are already friends!"
_, created = Friend_Request.objects.get_or_create(from_user=self, to_user=user)
if created:
return "friend request sent."
return "friend request already sent."
def friend_request_accept(self, requestID):
friend_request = Friend_Request.objects.get(pk=requestID)
if friend_request.to_user == self:
self.friends.add(friend_request.from_user)
friend_request.from_user.friends.add(friend_request.to_user)
friend_request.delete()
return 0
else:
return -1
def friend_request_deny(self, requestID):
friend_request = Friend_Request.objects.get(pk=requestID)
if friend_request.to_user == self:
friend_request.delete()
return 0
else:
return -1
def save(self, *args, **kwargs):
self.slug = slugify(self.nickname)
if not self.first_name is None:
self.first_name = self.first_name.title()
if not self.last_name is None:
self.last_name = self.last_name.title()
return super(User_Profile, self).save()
@property
def full_name(self):
return f"{self.first_name} {self.last_name}"
@property
def initials(self):
return "".join(x[0] for x in self.full_name.split(" "))
def __str__(self):
return f"[Userprofile] {self.nickname}"
def __repr__(self):
return self.__str__()
class Friend_Request(models.Model):
from_user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, related_name="friend_requests_sent")
to_user = models.ForeignKey(User_Profile, on_delete=models.CASCADE, related_name="friend_requests_recieved")
asked_at = models.DateTimeField("asked at", auto_now_add=True)
def __str__(self):
return f"[Friend Request] from {self.from_user.user.username} to {self.to_user.user.username}"
def __repr__(self):
return self.__str__()
@receiver(post_save, sender=get_user_model())
def create_profile_for_new_user(sender, created, instance, **kwargs):
if created:
profile = User_Profile(user = instance)
profile.save()