from django.db import models from django.utils.translation import gettext_lazy as _ from django_core.models import AbstractBaseModel from model_bakery import baker from core.apps.chat.choices.chat import MessageType, RoomType def chat_file_upload_path(instance, filename): return f"chat/{instance.message_type}/{filename}" class ChatroomModel(AbstractBaseModel): type = models.CharField( verbose_name=_("type"), max_length=20, choices=RoomType.choices, default=RoomType.AUTO_EVALUATION, db_index=True, ) auto_evaluation = models.OneToOneField( "evaluation.AutoEvaluationModel", on_delete=models.CASCADE, null=True, blank=True, related_name="chat_room", verbose_name=_("auto evaluation"), ) members = models.ManyToManyField( "accounts.User", blank=True, related_name="chat_rooms", verbose_name=_("members"), ) def __str__(self): if self.type == RoomType.AUTO_EVALUATION and self.auto_evaluation_id: return f"AutoEval #{self.auto_evaluation_id} xonasi" return f"Direct xona #{self.pk}" @classmethod def _baker(cls): return baker.make(cls) class Meta: db_table = "ChatRoom" verbose_name = _("Chat Xona") verbose_name_plural = _("Chat Xonalar") class ChatmessageModel(models.Model): room = models.ForeignKey( ChatroomModel, on_delete=models.CASCADE, related_name="messages", verbose_name=_("room"), ) sender = models.ForeignKey( "accounts.User", on_delete=models.SET_NULL, null=True, related_name="chat_messages", verbose_name=_("sender"), ) message_type = models.CharField( verbose_name=_("message type"), max_length=10, choices=MessageType.choices, default=MessageType.TEXT, db_index=True, ) text = models.TextField(verbose_name=_("text"), null=True, blank=True) file = models.FileField( verbose_name=_("file"), upload_to=chat_file_upload_path, null=True, blank=True, ) is_read = models.BooleanField( verbose_name=_("is read"), default=False, db_index=True, ) created_at = models.DateTimeField( verbose_name=_("created at"), auto_now_add=True, ) def __str__(self): return f"#{self.pk} — {self.sender}" @classmethod def _baker(cls): return baker.make(cls) class Meta: db_table = "ChatMessage" verbose_name = _("Chat Xabar") verbose_name_plural = _("Chat Xabarlar") ordering = ["created_at"] indexes = [ models.Index( fields=["room_id", "created_at"], name="chat_room_date_idx", ), models.Index( fields=["room_id", "is_read"], name="chat_room_read_idx", ), ]