This commit is contained in:
Iliyan Angelov
2025-09-14 23:24:25 +03:00
commit c67067a2a4
71311 changed files with 6800714 additions and 0 deletions

117
folders/models.py Normal file
View File

@@ -0,0 +1,117 @@
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}"