2025-09-23 21:09:38 +02:00
|
|
|
# Add FTP quota models to existing models.py
|
|
|
|
|
|
|
|
|
|
# Add these models to the existing file
|
|
|
|
|
class FTPQuota(models.Model):
|
|
|
|
|
"""
|
|
|
|
|
FTP User Quota Management
|
|
|
|
|
"""
|
|
|
|
|
user = models.ForeignKey('loginSystem.Administrator', on_delete=models.CASCADE)
|
|
|
|
|
ftp_user = models.CharField(max_length=255, unique=True)
|
|
|
|
|
domain = models.ForeignKey(Websites, on_delete=models.CASCADE, null=True, blank=True)
|
|
|
|
|
quota_size_mb = models.IntegerField(default=0) # 0 = unlimited
|
|
|
|
|
quota_used_mb = models.IntegerField(default=0)
|
|
|
|
|
quota_files = models.IntegerField(default=0) # 0 = unlimited
|
|
|
|
|
quota_files_used = models.IntegerField(default=0)
|
|
|
|
|
is_active = models.BooleanField(default=True)
|
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
updated_at = models.DateTimeField(auto_now=True)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
db_table = 'ftp_quotas'
|
|
|
|
|
verbose_name = 'FTP Quota'
|
|
|
|
|
verbose_name_plural = 'FTP Quotas'
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.ftp_user} - {self.quota_size_mb}MB"
|
|
|
|
|
|
|
|
|
|
def get_quota_percentage(self):
|
|
|
|
|
"""Calculate quota usage percentage"""
|
|
|
|
|
if self.quota_size_mb == 0:
|
|
|
|
|
return 0
|
|
|
|
|
return (self.quota_used_mb / self.quota_size_mb) * 100
|
|
|
|
|
|
|
|
|
|
def is_quota_exceeded(self):
|
|
|
|
|
"""Check if quota is exceeded"""
|
|
|
|
|
if self.quota_size_mb == 0:
|
|
|
|
|
return False
|
|
|
|
|
return self.quota_used_mb >= self.quota_size_mb
|
|
|
|
|
|
|
|
|
|
class BandwidthResetLog(models.Model):
|
|
|
|
|
"""
|
|
|
|
|
Bandwidth Reset Log
|
|
|
|
|
"""
|
|
|
|
|
RESET_TYPES = [
|
|
|
|
|
('manual', 'Manual Reset'),
|
|
|
|
|
('scheduled', 'Scheduled Reset'),
|
|
|
|
|
('individual', 'Individual Domain Reset'),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
reset_type = models.CharField(max_length=20, choices=RESET_TYPES)
|
|
|
|
|
domain = models.ForeignKey(Websites, on_delete=models.CASCADE, null=True, blank=True)
|
|
|
|
|
reset_by = models.ForeignKey('loginSystem.Administrator', on_delete=models.CASCADE)
|
|
|
|
|
reset_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
domains_affected = models.IntegerField(default=0)
|
|
|
|
|
bandwidth_reset_mb = models.BigIntegerField(default=0)
|
|
|
|
|
notes = models.TextField(blank=True, null=True)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
db_table = 'bandwidth_reset_logs'
|
|
|
|
|
verbose_name = 'Bandwidth Reset Log'
|
|
|
|
|
verbose_name_plural = 'Bandwidth Reset Logs'
|
|
|
|
|
ordering = ['-reset_at']
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f"{self.reset_type} - {self.domain or 'All Domains'} - {self.reset_at}"
|