99 lines
3.7 KiB
Python
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() |