from django.db import models from django.contrib.contenttypes.fields import GenericForeignKey from django.contrib.contenttypes.models import ContentType from django.core.validators import MinValueValidator, MaxValueValidator class Review(models.Model): # Generic relation to allow reviews on different types (rides, parks) content_type = models.ForeignKey(ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = GenericForeignKey('content_type', 'object_id') # Review details user = models.ForeignKey( 'accounts.User', on_delete=models.CASCADE, related_name='reviews' ) rating = models.PositiveSmallIntegerField( validators=[MinValueValidator(1), MaxValueValidator(10)] ) title = models.CharField(max_length=200) content = models.TextField() visit_date = models.DateField() # Metadata created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) # Moderation is_published = models.BooleanField(default=True) moderation_notes = models.TextField(blank=True) moderated_by = models.ForeignKey( 'accounts.User', on_delete=models.SET_NULL, null=True, blank=True, related_name='moderated_reviews' ) moderated_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ['-created_at'] indexes = [ models.Index(fields=['content_type', 'object_id']), ] def __str__(self): return f"Review of {self.content_object} by {self.user.username}" class ReviewImage(models.Model): review = models.ForeignKey( Review, on_delete=models.CASCADE, related_name='images' ) image = models.ImageField(upload_to='review_images/') caption = models.CharField(max_length=200, blank=True) order = models.PositiveIntegerField(default=0) class Meta: ordering = ['order'] def __str__(self): return f"Image {self.order + 1} for {self.review}" class ReviewLike(models.Model): review = models.ForeignKey( Review, on_delete=models.CASCADE, related_name='likes' ) user = models.ForeignKey( 'accounts.User', on_delete=models.CASCADE, related_name='review_likes' ) created_at = models.DateTimeField(auto_now_add=True) class Meta: unique_together = ['review', 'user'] def __str__(self): return f"{self.user.username} likes {self.review}" class ReviewReport(models.Model): review = models.ForeignKey( Review, on_delete=models.CASCADE, related_name='reports' ) user = models.ForeignKey( 'accounts.User', on_delete=models.CASCADE, related_name='review_reports' ) reason = models.TextField() created_at = models.DateTimeField(auto_now_add=True) resolved = models.BooleanField(default=False) resolved_by = models.ForeignKey( 'accounts.User', on_delete=models.SET_NULL, null=True, blank=True, related_name='resolved_review_reports' ) resolution_notes = models.TextField(blank=True) resolved_at = models.DateTimeField(null=True, blank=True) class Meta: ordering = ['-created_at'] def __str__(self): return f"Report on {self.review} by {self.user.username}"