feat(chat): add models, views, WebSocket consumers, forms and URL config
This commit is contained in:
@@ -0,0 +1,66 @@
|
||||
from django.db import models
|
||||
from django.contrib.auth.models import User
|
||||
|
||||
|
||||
class UserProfile(models.Model):
|
||||
ROLE_CHOICES = [
|
||||
('admin', 'Administrator'),
|
||||
('moderator', 'Moderator'),
|
||||
('user', 'User'),
|
||||
]
|
||||
|
||||
user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile')
|
||||
avatar = models.ImageField(upload_to='avatars/', null=True, blank=True)
|
||||
bio = models.TextField(blank=True, default='')
|
||||
role = models.CharField(max_length=20, choices=ROLE_CHOICES, default='user')
|
||||
blocked_users = models.ManyToManyField(User, related_name='blocked_by', blank=True)
|
||||
online = models.BooleanField(default=False)
|
||||
|
||||
def __str__(self):
|
||||
return f'{self.user.username} ({self.role})'
|
||||
|
||||
def is_admin(self):
|
||||
return self.role == 'admin'
|
||||
|
||||
def is_moderator(self):
|
||||
return self.role in ('admin', 'moderator')
|
||||
|
||||
|
||||
class Channel(models.Model):
|
||||
name = models.CharField(max_length=100, unique=True)
|
||||
description = models.TextField(blank=True, default='')
|
||||
created_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name='created_channels')
|
||||
members = models.ManyToManyField(User, related_name='channels', blank=True)
|
||||
created_at = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
def __str__(self):
|
||||
return f'#{self.name}'
|
||||
|
||||
|
||||
class Message(models.Model):
|
||||
channel = models.ForeignKey(Channel, on_delete=models.CASCADE, related_name='messages')
|
||||
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='messages')
|
||||
content = models.TextField(blank=True, default='')
|
||||
file = models.FileField(upload_to='uploads/', null=True, blank=True)
|
||||
timestamp = models.DateTimeField(auto_now_add=True)
|
||||
deleted = models.BooleanField(default=False)
|
||||
|
||||
class Meta:
|
||||
ordering = ['timestamp']
|
||||
|
||||
def __str__(self):
|
||||
return f'{self.sender.username}: {self.content[:50]}'
|
||||
|
||||
|
||||
class DirectMessage(models.Model):
|
||||
sender = models.ForeignKey(User, on_delete=models.CASCADE, related_name='sent_dms')
|
||||
receiver = models.ForeignKey(User, on_delete=models.CASCADE, related_name='received_dms')
|
||||
content = models.TextField(blank=True, default='')
|
||||
file = models.FileField(upload_to='dm_uploads/', null=True, blank=True)
|
||||
timestamp = models.DateTimeField(auto_now_add=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ['timestamp']
|
||||
|
||||
def __str__(self):
|
||||
return f'DM {self.sender.username} → {self.receiver.username}'
|
||||
Reference in New Issue
Block a user