Refactor API structure and add comprehensive user management features

- Restructure API v1 with improved serializers organization
- Add user deletion requests and moderation queue system
- Implement bulk moderation operations and permissions
- Add user profile enhancements with display names and avatars
- Expand ride and park API endpoints with better filtering
- Add manufacturer API with detailed ride relationships
- Improve authentication flows and error handling
- Update frontend documentation and API specifications
This commit is contained in:
pacnpal
2025-08-29 16:03:51 -04:00
parent 7b9f64be72
commit bb7da85516
92 changed files with 19690 additions and 9076 deletions

View File

@@ -6,8 +6,8 @@ from django.utils.text import slugify
def populate_ride_model_slugs(apps, schema_editor):
"""Populate unique slugs for existing RideModel records."""
RideModel = apps.get_model('rides', 'RideModel')
Company = apps.get_model('rides', 'Company')
RideModel = apps.get_model("rides", "RideModel")
Company = apps.get_model("rides", "Company")
for ride_model in RideModel.objects.all():
# Generate base slug from manufacturer name + model name
@@ -25,13 +25,13 @@ def populate_ride_model_slugs(apps, schema_editor):
# Update the slug
ride_model.slug = slug
ride_model.save(update_fields=['slug'])
ride_model.save(update_fields=["slug"])
def reverse_populate_ride_model_slugs(apps, schema_editor):
"""Reverse operation - clear slugs (not really needed but for completeness)."""
RideModel = apps.get_model('rides', 'RideModel')
RideModel.objects.all().update(slug='')
RideModel = apps.get_model("rides", "RideModel")
RideModel.objects.all().update(slug="")
class Migration(migrations.Migration):

View File

@@ -6,7 +6,7 @@ from django.utils.text import slugify
def update_ride_model_slugs(apps, schema_editor):
"""Update RideModel slugs to be just the model name, not manufacturer + name."""
RideModel = apps.get_model('rides', 'RideModel')
RideModel = apps.get_model("rides", "RideModel")
for ride_model in RideModel.objects.all():
# Generate new slug from just the name
@@ -15,22 +15,25 @@ def update_ride_model_slugs(apps, schema_editor):
# Ensure uniqueness within the same manufacturer
counter = 1
base_slug = new_slug
while RideModel.objects.filter(
manufacturer=ride_model.manufacturer,
slug=new_slug
).exclude(pk=ride_model.pk).exists():
while (
RideModel.objects.filter(
manufacturer=ride_model.manufacturer, slug=new_slug
)
.exclude(pk=ride_model.pk)
.exists()
):
new_slug = f"{base_slug}-{counter}"
counter += 1
# Update the slug
ride_model.slug = new_slug
ride_model.save(update_fields=['slug'])
ride_model.save(update_fields=["slug"])
print(f"Updated {ride_model.name}: {ride_model.slug}")
def reverse_ride_model_slugs(apps, schema_editor):
"""Reverse the slug update by regenerating the old format."""
RideModel = apps.get_model('rides', 'RideModel')
RideModel = apps.get_model("rides", "RideModel")
for ride_model in RideModel.objects.all():
# Generate old-style slug with manufacturer + name
@@ -41,19 +44,21 @@ def reverse_ride_model_slugs(apps, schema_editor):
# Ensure uniqueness globally (old way)
counter = 1
base_slug = old_slug
while RideModel.objects.filter(slug=old_slug).exclude(pk=ride_model.pk).exists():
while (
RideModel.objects.filter(slug=old_slug).exclude(pk=ride_model.pk).exists()
):
old_slug = f"{base_slug}-{counter}"
counter += 1
# Update the slug
ride_model.slug = old_slug
ride_model.save(update_fields=['slug'])
ride_model.save(update_fields=["slug"])
class Migration(migrations.Migration):
dependencies = [
('rides', '0013_fix_ride_model_slugs'),
("rides", "0013_fix_ride_model_slugs"),
]
operations = [