from django.db import models from users.models import User from django.conf import settings from django.utils import timezone from django.core.validators import FileExtensionValidator class Category(models.Model): name = models.CharField(max_length=255) slug = models.SlugField(unique=True) def __str__(self): return self.name class AbstractContent(models.Model): STATUS_CHOICES = ( ('draft', 'Draft'), ('pending', 'Pending Review'), ('published', 'Published'), ) title = models.CharField(max_length=255) slug = models.SlugField(unique=True, blank=True) content = models.TextField() status = models.CharField(max_length=10, choices=STATUS_CHOICES, default='draft') author = models.ForeignKey(User, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) category = models.ForeignKey('Category', on_delete=models.CASCADE) tags = models.ManyToManyField('Tag', blank=True) class Meta: abstract = True def __str__(self): return self.title class Post(AbstractContent): pass class Page(AbstractContent): pass class Comment(models.Model): content = models.TextField(max_length=2000) approved = models.BooleanField(default=False) author = models.ForeignKey(User, on_delete=models.CASCADE) post = models.ForeignKey(Post, null=True, blank=True, on_delete=models.CASCADE) page = models.ForeignKey(Page, null=True, blank=True, on_delete=models.CASCADE) created_at = models.DateTimeField(auto_now_add=True) class UploadedImage(models.Model): user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) image = models.ImageField( upload_to='uploads/%Y/%m/%d/', validators=[FileExtensionValidator(allowed_extensions=['jpg', 'jpeg', 'png', 'gif', 'webp'])] ) title = models.CharField(max_length=255) uploaded_at = models.DateTimeField(auto_now_add=True) file_size = models.PositiveIntegerField() # Size in bytes class Meta: ordering = ['-uploaded_at'] def __str__(self): return f"{self.title} - {self.user.username}" @property def url(self): return self.image.url if self.image else None def save(self, *args, **kwargs): if not self.file_size and self.image: self.file_size = self.image.size super().save(*args, **kwargs) @classmethod def get_user_daily_upload_size(cls, user): today = timezone.now().date() tomorrow = today + timezone.timedelta(days=1) return cls.objects.filter( user=user, uploaded_at__gte=today, uploaded_at__lt=tomorrow ).aggregate(total_size=models.Sum('file_size'))['total_size'] or 0 class Tag(models.Model): name = models.CharField(max_length=255) slug = models.SlugField(unique=True) def __str__(self): return self.name