diff --git a/Main/migrations/0007_friendship.py b/Main/migrations/0007_friendship.py new file mode 100644 index 0000000..46a4fe6 --- /dev/null +++ b/Main/migrations/0007_friendship.py @@ -0,0 +1,47 @@ +# Generated by Django 3.2.4 on 2021-12-19 14:52 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + migrations.swappable_dependency(settings.AUTH_USER_MODEL), + ("Main", "0006_solution_test"), + ] + + operations = [ + migrations.CreateModel( + name="Friendship", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ("verified", models.BooleanField(default=False)), + ( + "from_user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="from_friendship", + to=settings.AUTH_USER_MODEL, + ), + ), + ( + "to_user", + models.ForeignKey( + on_delete=django.db.models.deletion.CASCADE, + related_name="to_friendship", + to=settings.AUTH_USER_MODEL, + ), + ), + ], + ), + ] diff --git a/Main/models/__init__.py b/Main/models/__init__.py index dc84196..fd4e376 100644 --- a/Main/models/__init__.py +++ b/Main/models/__init__.py @@ -8,3 +8,4 @@ from Main.models.solution import Solution from Main.models.extrafile import ExtraFile from Main.models.progress import Progress from Main.models.solution_file import SolutionFile +from Main.models.friendship import Friendship diff --git a/Main/models/friendship.py b/Main/models/friendship.py new file mode 100644 index 0000000..7c60c78 --- /dev/null +++ b/Main/models/friendship.py @@ -0,0 +1,8 @@ +from django.contrib.auth.models import User +from django.db import models + + +class Friendship(models.Model): + from_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="from_friendship") + to_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="to_friendship") + verified = models.BooleanField(default=False) diff --git a/Main/models/userinfo.py b/Main/models/userinfo.py index 0c43d6e..d80b177 100644 --- a/Main/models/userinfo.py +++ b/Main/models/userinfo.py @@ -1,5 +1,8 @@ +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.set import Set @@ -28,6 +31,13 @@ class UserInfo(models.Model): def has_favourite_language(self): return self.favourite_language_id is not None + @cached_property + def friends(self): + return User.objects.filter( + Q(to_friendship__to_user=self, to_friendship__verified=True) + | Q(from_friendship__from_user=self, from_friendship__verified=True) + ) + @property def favourite_language(self): if not self.has_favourite_language: diff --git a/Main/views/AccountView.py b/Main/views/AccountView.py index cdb7bd0..4d7edbd 100644 --- a/Main/views/AccountView.py +++ b/Main/views/AccountView.py @@ -1,5 +1,8 @@ from django.contrib.auth.models import User +from django.db.models import Q +from Main.management.commands.bot import bot +from Main.models import Friendship from SprintLib.BaseView import BaseView from SprintLib.utils import delete_file, write_bytes @@ -9,7 +12,7 @@ class AccountView(BaseView): required_login = True endpoint = "account" - def get(self): + def pre_handle(self): if "username" in self.request.GET.keys(): self.context["account"] = User.objects.get( username=self.request.GET["username"] @@ -17,7 +20,45 @@ class AccountView(BaseView): else: self.context["account"] = self.request.user self.context["owner"] = self.context["account"] == self.request.user + + def get(self): self.context["error_message"] = self.request.GET.get("error_message", "") + friendship = Friendship.objects.filter( + Q(from_user=self.request.user, to_user=self.context["account"]) + | Q(to_user=self.request.user, from_user=self.context["account"]) + ).first() + if friendship is None: + self.context["friendship_status"] = 0 + elif friendship.verified: + self.context["friendship_status"] = 1 + elif friendship.from_user == self.request.user: + self.context["friendship_status"] = 2 + else: + self.context["friendship_status"] = 3 + + def post_friendship(self): + if "to_do" in self.request.POST: + friendship = Friendship.objects.filter( + Q(from_user=self.request.user, to_user=self.context["account"]) + | Q(to_user=self.request.user, from_user=self.context["account"]) + ).first() + if friendship is None: + Friendship.objects.create(from_user=self.request.user, to_user=self.context["account"]) + bot.send_message(self.context["account"].userinfo.telegram_chat_id, f"Пользователь {self.request.user.username} хочет добавить тебя в друзья") + elif friendship.verified or friendship.from_user == self.request.user: + friendship.delete() + else: + if self.request.POST["todo"] == "yes": + friendship.verified = True + friendship.save() + bot.send_message(self.context["account"].userinfo.telegram_chat_id, + f"Пользователь {self.request.user.username} добавил тебя в друзья") + else: + friendship.delete() + bot.send_message(self.context["account"].userinfo.telegram_chat_id, + f"Пользователь {self.request.user.username} отклонил твою заявку") + return "/account?username=" + self.request.GET["username"] + def post_upload_photo(self): if self.request.user.userinfo.has_profile_pic: diff --git a/templates/account.html b/templates/account.html index 2f12c8c..52c48f6 100644 --- a/templates/account.html +++ b/templates/account.html @@ -24,6 +24,21 @@