49 lines
1.7 KiB
Python
49 lines
1.7 KiB
Python
|
from typing import TYPE_CHECKING
|
||
|
|
||
|
from django.contrib import admin as django_admin
|
||
|
from django.contrib.admin.exceptions import AlreadyRegistered # type: ignore
|
||
|
from django.db import models
|
||
|
|
||
|
|
||
|
class tMUser(models.Model):
|
||
|
username = models.CharField(max_length=30, unique=True, primary_key=True)
|
||
|
|
||
|
if TYPE_CHECKING:
|
||
|
liked = models.Manager["tMMessage"]
|
||
|
sent = models.Manager["tMMessage"]
|
||
|
received = models.Manager["tMMessage"]
|
||
|
|
||
|
def __str__(self) -> str:
|
||
|
return self.username
|
||
|
|
||
|
class tMMessage(models.Model):
|
||
|
message_id = models.IntegerField(primary_key=True)
|
||
|
content = models.CharField(max_length=10_000)
|
||
|
response = models.CharField(max_length=10_000, blank=True, null=True)
|
||
|
anonymous = models.BooleanField()
|
||
|
likes = models.ManyToManyField(tMUser, through="tMM2MLike", related_name="liked")
|
||
|
u_to = models.ForeignKey(tMUser, on_delete=models.CASCADE, related_name="received")
|
||
|
|
||
|
if TYPE_CHECKING:
|
||
|
u_from: tMUser | None
|
||
|
else:
|
||
|
u_from = models.ForeignKey(tMUser, on_delete=models.SET_NULL, blank=True, null=True, related_name="sent")
|
||
|
|
||
|
def __str__(self) -> str:
|
||
|
return f"({self.message_id}) {self.u_from.username if self.u_from else 'Anonymous'} messaged {self.u_to.username}"
|
||
|
|
||
|
class tMM2MLike(models.Model):
|
||
|
user = models.ForeignKey(tMUser, on_delete=models.CASCADE, related_name="liked_obj")
|
||
|
message = models.ForeignKey(tMMessage, on_delete=models.CASCADE, related_name="likes_obj")
|
||
|
|
||
|
class Meta:
|
||
|
unique_together = ("user", "message")
|
||
|
|
||
|
def __str__(self) -> str:
|
||
|
return f"{self.user.username} liked message {self.message.message_id}"
|
||
|
|
||
|
try:
|
||
|
django_admin.site.register((tMUser, tMMessage, tMM2MLike))
|
||
|
except AlreadyRegistered:
|
||
|
...
|