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) current_voice_channel = models.ForeignKey('Channel', on_delete=models.SET_NULL, null=True, blank=True, related_name='voice_members') 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): CHANNEL_TYPES = [ ('text', 'Text Channel'), ('voice', 'Voice Channel'), ] name = models.CharField(max_length=100, unique=True) description = models.TextField(blank=True, default='') channel_type = models.CharField(max_length=10, choices=CHANNEL_TYPES, default='text') 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}'