from django.db import models from django.contrib.auth import get_user_model from emails.models import EmailFolder User = get_user_model() class FolderStructure(models.Model): """Folder structure for organizing emails and other content.""" user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='folder_structures') name = models.CharField(max_length=100) description = models.TextField(blank=True) parent = models.ForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children') folder_type = models.CharField(max_length=20, default='custom') color = models.CharField(max_length=7, default='#007bff') icon = models.CharField(max_length=50, default='folder') is_system = models.BooleanField(default=False) is_shared = models.BooleanField(default=False) sort_order = models.IntegerField(default=0) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) class Meta: db_table = 'folder_structures' unique_together = ['user', 'name', 'parent'] ordering = ['sort_order', 'name'] def __str__(self): return f"{self.user.email} - {self.name}" def get_path(self): """Get full path of the folder.""" path = [self.name] parent = self.parent while parent: path.insert(0, parent.name) parent = parent.parent return ' / '.join(path) def get_children(self): """Get all children folders.""" return self.children.all().order_by('sort_order', 'name') def get_descendants(self): """Get all descendant folders.""" descendants = [] for child in self.get_children(): descendants.append(child) descendants.extend(child.get_descendants()) return descendants class FolderPermission(models.Model): """Permissions for shared folders.""" PERMISSION_CHOICES = [ ('read', 'Read'), ('write', 'Write'), ('admin', 'Admin'), ] folder = models.ForeignKey(FolderStructure, on_delete=models.CASCADE, related_name='permissions') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='folder_permissions') permission = models.CharField(max_length=10, choices=PERMISSION_CHOICES) granted_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='granted_permissions') granted_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'folder_permissions' unique_together = ['folder', 'user'] def __str__(self): return f"{self.folder.name} - {self.user.email} ({self.permission})" class FolderBookmark(models.Model): """Bookmarks for quick access to folders.""" user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='folder_bookmarks') folder = models.ForeignKey(FolderStructure, on_delete=models.CASCADE, related_name='bookmarks') created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'folder_bookmarks' unique_together = ['user', 'folder'] def __str__(self): return f"{self.user.email} - {self.folder.name}" class FolderActivity(models.Model): """Activity log for folders.""" ACTIVITY_TYPES = [ ('created', 'Created'), ('updated', 'Updated'), ('deleted', 'Deleted'), ('shared', 'Shared'), ('unshared', 'Unshared'), ('moved', 'Moved'), ('renamed', 'Renamed'), ] folder = models.ForeignKey(FolderStructure, on_delete=models.CASCADE, related_name='activities') user = models.ForeignKey(User, on_delete=models.CASCADE, related_name='folder_activities') activity_type = models.CharField(max_length=20, choices=ACTIVITY_TYPES) description = models.TextField() metadata = models.JSONField(default=dict) created_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = 'folder_activities' ordering = ['-created_at'] def __str__(self): return f"{self.folder.name} - {self.get_activity_type_display()} by {self.user.email}"