feat: Implement MFA authentication, add ride statistics model, and update various services, APIs, and tests across the application.

This commit is contained in:
pacnpal
2025-12-28 17:32:53 -05:00
parent aa56c46c27
commit c95f99ca10
452 changed files with 7948 additions and 6073 deletions

View File

@@ -1,9 +1,10 @@
from django.apps import AppConfig
class ReviewsConfig(AppConfig):
default_auto_field = "django.db.models.BigAutoField"
name = "apps.reviews"
verbose_name = "User Reviews"
def ready(self):
import apps.reviews.signals
pass

View File

@@ -1,9 +1,11 @@
from django.db import models
import pghistory
from django.conf import settings
from django.contrib.contenttypes.fields import GenericForeignKey
from django.contrib.contenttypes.models import ContentType
from django.db import models
from apps.core.history import TrackedModel
import pghistory
@pghistory.track()
class Review(TrackedModel):
@@ -13,7 +15,7 @@ class Review(TrackedModel):
related_name="reviews",
help_text="User who wrote the review",
)
# Generic relation to target object (Park, Ride, etc.)
content_type = models.ForeignKey(
ContentType,
@@ -30,14 +32,14 @@ class Review(TrackedModel):
db_index=True,
)
text = models.TextField(blank=True, help_text="Review text (optional)")
# Metadata
is_public = models.BooleanField(
default=True,
default=True,
help_text="Whether this review is visible to others"
)
helpful_votes = models.PositiveIntegerField(
default=0,
default=0,
help_text="Number of users who found this helpful"
)

View File

@@ -1,10 +1,13 @@
from rest_framework import serializers
from .models import Review
from apps.accounts.serializers import UserSerializer
from .models import Review
class ReviewSerializer(serializers.ModelSerializer):
user = UserSerializer(read_only=True)
class Meta:
model = Review
fields = [

View File

@@ -1,8 +1,10 @@
from django.db.models.signals import post_save, post_delete
from django.dispatch import receiver
from django.db.models import Avg
from django.db.models.signals import post_delete, post_save
from django.dispatch import receiver
from .models import Review
@receiver(post_save, sender=Review)
@receiver(post_delete, sender=Review)
def update_average_rating(sender, instance, **kwargs):

View File

@@ -1,5 +1,6 @@
from django.urls import path, include
from django.urls import include, path
from rest_framework.routers import DefaultRouter
from .views import ReviewViewSet
router = DefaultRouter()

View File

@@ -1,8 +1,11 @@
from rest_framework import viewsets, permissions, filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework import filters, permissions, viewsets
from apps.core.permissions import IsOwnerOrReadOnly
from .models import Review
from .serializers import ReviewSerializer
from apps.core.permissions import IsOwnerOrReadOnly
class ReviewViewSet(viewsets.ModelViewSet):
queryset = Review.objects.filter(is_public=True)
@@ -14,8 +17,8 @@ class ReviewViewSet(viewsets.ModelViewSet):
ordering = ["-created_at"]
def get_queryset(self):
# Users can see their own non-public reviews?
# Standard queryset is public only.
# Users can see their own non-public reviews?
# Standard queryset is public only.
# But if we want authors to see their own pending/private reviews:
qs = Review.objects.filter(is_public=True)
if self.request.user.is_authenticated: