111 lines
3.0 KiB
Python
111 lines
3.0 KiB
Python
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",
|
|
),
|
|
]
|