This commit is contained in:
Egor Matveev
2021-12-19 23:15:19 +03:00
parent 014ab7a6b8
commit 17573e1a76
12 changed files with 246 additions and 1 deletions

39
Main/views/ChatView.py Normal file
View File

@@ -0,0 +1,39 @@
from typing import Optional
from django.utils import timezone
from Main.management.commands.bot import bot
from Main.models import Chat, Message
from Sprint.settings import CONSTS
from SprintLib.BaseView import BaseView
class ChatView(BaseView):
endpoint = "chat"
required_login = True
view_file = "chat.html"
chat: Optional[Chat] = None
def pre_handle(self):
if self.entities.chat.from_user == self.request.user:
self.entities.chat.user = self.entities.chat.to_user
else:
self.entities.chat.user = self.entities.chat.from_user
def post(self):
Message.objects.create(
user=self.request.user,
chat=self.entities.chat,
text=self.request.POST["text"],
time_sent=timezone.now(),
)
if (
self.entities.chat.user.userinfo.activity_status != CONSTS["online_status"]
and self.entities.chat.user.userinfo.notification_messages
):
bot.send_message(
self.entities.chat.user.userinfo.telegram_chat_id,
f"Пользователь {self.request.user.username} отправил сообщение:\n"
f"{self.request.POST['text']}",
)
return "/chat?chat_id" + str(self.entities.chat.id)

View File

@@ -0,0 +1,30 @@
from django.contrib.auth.models import User
from django.db.models import Q
from Main.models import Chat
from SprintLib.BaseView import BaseView, AccessError
class ChatWithView(BaseView):
required_login = True
endpoint = "chat_with"
chat = None
def pre_handle(self):
if "username" not in self.request.GET:
raise AccessError()
def get(self):
chat = Chat.objects.filter(
Q(
from_user=self.request.user,
to_user__username=self.request.GET["username"],
)
| Q(
to_user=self.request.user,
from_user__username=self.request.GET["username"],
)
).first()
if chat is None:
chat = Chat.objects.create(from_user=self.request.user, to_user=User.objects.get(username=self.request.GET['username']))
return "/chat?chat_id=" + str(chat.id)

View File

@@ -0,0 +1,24 @@
from Main.models import Message
from SprintLib.BaseView import BaseView, AccessError
class MessagesView(BaseView):
required_login = True
view_file = "messages.html"
endpoint = "messages"
page_size = 20
def pre_handle(self):
if not hasattr(self.entities, "chat") or 'page' not in self.request.GET:
raise AccessError()
if self.entities.chat.from_user != self.request.user and self.entities.chat.to_user != self.request.user:
raise AccessError()
def get(self):
offset = (int(self.request.GET["page"]) - 1) * self.page_size
limit = self.page_size
messages = Message.objects.filter(chat=self.entities.chat).order_by("-time_sent")
messages.update(read=True)
self.context["messages"] = messages[offset:offset + limit]
self.context["count_pages"] = range(1, (len(messages) - 1) // self.page_size + 2)
self.context["need_pagination"] = len(self.context["count_pages"]) > 1

View File

@@ -15,3 +15,6 @@ from Main.views.SendCodeView import SendCodeView
from Main.views.SetSettingsView import SetSettingsView
from Main.views.UsersView import UsersView
from Main.views.SolutionsView import SolutionsView
from Main.views.ChatView import ChatView
from Main.views.ChatWithView import ChatWithView
from Main.views.MessagesView import MessagesView