Add ReviewEvent model and ReviewSubmissionService for review management

- Created a new ReviewEvent model to track review events with fields for content, rating, moderation status, and timestamps.
- Added ForeignKey relationships to connect ReviewEvent with ContentSubmission, User, and Review.
- Implemented ReviewSubmissionService to handle review submissions, including creation, updates, and moderation workflows.
- Introduced atomic transactions to ensure data integrity during review submissions and updates.
- Added logging for review submission and moderation actions for better traceability.
- Implemented validation to prevent duplicate reviews and ensure only the review owner can update their review.
This commit is contained in:
pacnpal
2025-11-08 16:49:58 -05:00
parent 618310a87b
commit 9122320e7e
18 changed files with 3170 additions and 171 deletions

View File

@@ -4,8 +4,10 @@ from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey, GenericRelation
from django.contrib.contenttypes.models import ContentType
from model_utils.models import TimeStampedModel
import pghistory
@pghistory.track()
class Review(TimeStampedModel):
"""
User reviews for parks or rides.
@@ -90,6 +92,16 @@ class Review(TimeStampedModel):
related_name='moderated_reviews'
)
# Link to ContentSubmission (Sacred Pipeline integration)
submission = models.ForeignKey(
'moderation.ContentSubmission',
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name='reviews',
help_text="ContentSubmission that created this review"
)
# Photos related to this review (via media.Photo model with generic relation)
photos = GenericRelation('media.Photo')
@@ -124,24 +136,6 @@ class Review(TimeStampedModel):
def is_pending(self):
"""Check if review is pending moderation."""
return self.moderation_status == self.MODERATION_PENDING
def approve(self, moderator, notes=''):
"""Approve the review."""
from django.utils import timezone
self.moderation_status = self.MODERATION_APPROVED
self.moderated_by = moderator
self.moderated_at = timezone.now()
self.moderation_notes = notes
self.save()
def reject(self, moderator, notes=''):
"""Reject the review."""
from django.utils import timezone
self.moderation_status = self.MODERATION_REJECTED
self.moderated_by = moderator
self.moderated_at = timezone.now()
self.moderation_notes = notes
self.save()
class ReviewHelpfulVote(TimeStampedModel):