2026-03-25 02:46:50 +00:00
|
|
|
from django.db import models
|
|
|
|
|
from django.core.validators import MinValueValidator, MaxValueValidator
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class Review(models.Model):
|
|
|
|
|
STATUS_PENDING = 'pending'
|
|
|
|
|
STATUS_LIVE = 'live'
|
|
|
|
|
STATUS_REJECTED = 'rejected'
|
|
|
|
|
STATUS_CHOICES = [
|
|
|
|
|
(STATUS_PENDING, 'Pending'),
|
|
|
|
|
(STATUS_LIVE, 'Live'),
|
|
|
|
|
(STATUS_REJECTED, 'Rejected'),
|
|
|
|
|
]
|
|
|
|
|
REJECT_CHOICES = [
|
|
|
|
|
('spam', 'Spam'),
|
|
|
|
|
('inappropriate', 'Inappropriate'),
|
|
|
|
|
('fake', 'Fake'),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
reviewer = models.ForeignKey(
|
|
|
|
|
'accounts.User', on_delete=models.CASCADE, related_name='admin_reviews'
|
|
|
|
|
)
|
|
|
|
|
event = models.ForeignKey(
|
|
|
|
|
'events.Event', on_delete=models.CASCADE, related_name='admin_reviews'
|
|
|
|
|
)
|
|
|
|
|
rating = models.IntegerField(
|
|
|
|
|
validators=[MinValueValidator(1), MaxValueValidator(5)]
|
|
|
|
|
)
|
|
|
|
|
review_text = models.TextField()
|
|
|
|
|
submission_date = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
status = models.CharField(
|
|
|
|
|
max_length=10, choices=STATUS_CHOICES, default=STATUS_PENDING
|
|
|
|
|
)
|
|
|
|
|
reject_reason = models.CharField(
|
|
|
|
|
max_length=15, choices=REJECT_CHOICES, null=True, blank=True
|
|
|
|
|
)
|
2026-03-26 09:50:03 +00:00
|
|
|
display_name = models.CharField(max_length=100, blank=True, default='')
|
|
|
|
|
is_verified = models.BooleanField(default=False)
|
|
|
|
|
helpful_count = models.IntegerField(default=0)
|
|
|
|
|
flag_count = models.IntegerField(default=0)
|
2026-03-25 02:46:50 +00:00
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
ordering = ['-submission_date']
|
|
|
|
|
indexes = [
|
|
|
|
|
models.Index(fields=['status']),
|
|
|
|
|
models.Index(fields=['submission_date']),
|
|
|
|
|
]
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f'Review #{self.pk} by {self.reviewer_id} — {self.status}'
|
2026-03-26 09:50:03 +00:00
|
|
|
|
|
|
|
|
|
|
|
|
|
class ReviewInteraction(models.Model):
|
|
|
|
|
INTERACTION_CHOICES = [('HELPFUL', 'Helpful'), ('FLAG', 'Flag')]
|
|
|
|
|
|
|
|
|
|
review = models.ForeignKey(Review, on_delete=models.CASCADE, related_name='interactions')
|
|
|
|
|
username = models.CharField(max_length=255)
|
|
|
|
|
interaction_type = models.CharField(max_length=20, choices=INTERACTION_CHOICES)
|
|
|
|
|
created_at = models.DateTimeField(auto_now_add=True)
|
|
|
|
|
|
|
|
|
|
class Meta:
|
|
|
|
|
unique_together = ('review', 'username', 'interaction_type')
|
|
|
|
|
|
|
|
|
|
def __str__(self):
|
|
|
|
|
return f'{self.username} {self.interaction_type} on Review #{self.review_id}'
|