71 lines
2.1 KiB
Python
71 lines
2.1 KiB
Python
from django.db import models
|
|
from django.urls import reverse
|
|
|
|
|
|
class ResakaProfile(models.Model):
|
|
display_name = models.CharField(max_length=80)
|
|
handle = models.SlugField(max_length=80, unique=True)
|
|
status_text = models.CharField(max_length=140, blank=True)
|
|
avatar_color = models.CharField(max_length=7, default="#22D3EE")
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
ordering = ["display_name"]
|
|
|
|
def __str__(self):
|
|
return f"{self.display_name} (@{self.handle})"
|
|
|
|
|
|
class Conversation(models.Model):
|
|
starter = models.ForeignKey(
|
|
ResakaProfile,
|
|
on_delete=models.CASCADE,
|
|
related_name="started_conversations",
|
|
)
|
|
recipient = models.ForeignKey(
|
|
ResakaProfile,
|
|
on_delete=models.CASCADE,
|
|
related_name="received_conversations",
|
|
)
|
|
subject = models.CharField(max_length=120, blank=True)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
class Meta:
|
|
ordering = ["-updated_at", "-created_at"]
|
|
|
|
def __str__(self):
|
|
return self.subject or f"{self.starter.display_name} → {self.recipient.display_name}"
|
|
|
|
def counterpart_for(self, profile):
|
|
if profile and self.starter_id == profile.id:
|
|
return self.recipient
|
|
return self.starter
|
|
|
|
def get_absolute_url(self):
|
|
return reverse("conversation_detail", args=[self.pk])
|
|
|
|
|
|
class Message(models.Model):
|
|
conversation = models.ForeignKey(
|
|
Conversation,
|
|
on_delete=models.CASCADE,
|
|
related_name="messages",
|
|
)
|
|
author = models.ForeignKey(
|
|
ResakaProfile,
|
|
on_delete=models.CASCADE,
|
|
related_name="messages",
|
|
)
|
|
body = models.TextField()
|
|
reaction = models.CharField(max_length=8, blank=True)
|
|
is_read = models.BooleanField(default=False)
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
class Meta:
|
|
ordering = ["created_at"]
|
|
|
|
def __str__(self):
|
|
preview = (self.body[:30] + "…") if len(self.body) > 30 else self.body
|
|
return f"{self.author.display_name}: {preview}"
|