feat: Introduce lists and reviews apps, refactor user list functionality from accounts, and add user profile fields.

This commit is contained in:
pacnpal
2025-12-26 09:27:44 -05:00
parent ed04b30469
commit cd8868a591
37 changed files with 5900 additions and 281 deletions

View File

@@ -0,0 +1,945 @@
# Generated by Django 5.1.6 on 2025-12-26 14:10
import apps.core.choices.fields
import django.contrib.postgres.fields
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("pghistory", "0006_delete_aggregateevent"),
("rides", "0026_convert_unique_together_to_constraints"),
]
operations = [
migrations.AlterModelOptions(
name="company",
options={
"ordering": ["name"],
"verbose_name": "Company",
"verbose_name_plural": "Companies",
},
),
migrations.AlterModelOptions(
name="rankingsnapshot",
options={
"ordering": ["-snapshot_date", "rank"],
"verbose_name": "Ranking Snapshot",
"verbose_name_plural": "Ranking Snapshots",
},
),
migrations.AlterModelOptions(
name="ride",
options={
"ordering": ["name"],
"verbose_name": "Ride",
"verbose_name_plural": "Rides",
},
),
migrations.AlterModelOptions(
name="ridemodel",
options={
"ordering": ["manufacturer__name", "name"],
"verbose_name": "Ride Model",
"verbose_name_plural": "Ride Models",
},
),
migrations.AlterModelOptions(
name="ridemodelphoto",
options={
"ordering": ["-is_primary", "-created_at"],
"verbose_name": "Ride Model Photo",
"verbose_name_plural": "Ride Model Photos",
},
),
migrations.AlterModelOptions(
name="ridemodeltechnicalspec",
options={
"ordering": ["spec_category", "spec_name"],
"verbose_name": "Ride Model Technical Specification",
"verbose_name_plural": "Ride Model Technical Specifications",
},
),
migrations.AlterModelOptions(
name="ridemodelvariant",
options={
"ordering": ["ride_model", "name"],
"verbose_name": "Ride Model Variant",
"verbose_name_plural": "Ride Model Variants",
},
),
migrations.AlterModelOptions(
name="ridepaircomparison",
options={
"ordering": ["ride_a", "ride_b"],
"verbose_name": "Ride Pair Comparison",
"verbose_name_plural": "Ride Pair Comparisons",
},
),
migrations.AlterModelOptions(
name="rideranking",
options={
"ordering": ["rank"],
"verbose_name": "Ride Ranking",
"verbose_name_plural": "Ride Rankings",
},
),
migrations.AlterModelOptions(
name="rollercoasterstats",
options={
"ordering": ["ride"],
"verbose_name": "Roller Coaster Statistics",
"verbose_name_plural": "Roller Coaster Statistics",
},
),
migrations.AlterField(
model_name="company",
name="coasters_count",
field=models.IntegerField(
default=0, help_text="Number of coasters manufactured (auto-calculated)"
),
),
migrations.AlterField(
model_name="company",
name="description",
field=models.TextField(
blank=True, help_text="Detailed company description"
),
),
migrations.AlterField(
model_name="company",
name="founded_date",
field=models.DateField(
blank=True, help_text="Date the company was founded", null=True
),
),
migrations.AlterField(
model_name="company",
name="name",
field=models.CharField(help_text="Company name", max_length=255),
),
migrations.AlterField(
model_name="company",
name="rides_count",
field=models.IntegerField(
default=0, help_text="Number of rides manufactured (auto-calculated)"
),
),
migrations.AlterField(
model_name="company",
name="roles",
field=django.contrib.postgres.fields.ArrayField(
base_field=apps.core.choices.fields.RichChoiceField(
allow_deprecated=False,
choice_group="company_roles",
choices=[
("MANUFACTURER", "Ride Manufacturer"),
("DESIGNER", "Ride Designer"),
],
domain="rides",
max_length=20,
),
blank=True,
default=list,
help_text="Company roles (manufacturer, designer, etc.)",
size=None,
),
),
migrations.AlterField(
model_name="company",
name="slug",
field=models.SlugField(
help_text="URL-friendly identifier", max_length=255, unique=True
),
),
migrations.AlterField(
model_name="company",
name="website",
field=models.URLField(blank=True, help_text="Company website URL"),
),
migrations.AlterField(
model_name="companyevent",
name="coasters_count",
field=models.IntegerField(
default=0, help_text="Number of coasters manufactured (auto-calculated)"
),
),
migrations.AlterField(
model_name="companyevent",
name="description",
field=models.TextField(
blank=True, help_text="Detailed company description"
),
),
migrations.AlterField(
model_name="companyevent",
name="founded_date",
field=models.DateField(
blank=True, help_text="Date the company was founded", null=True
),
),
migrations.AlterField(
model_name="companyevent",
name="name",
field=models.CharField(help_text="Company name", max_length=255),
),
migrations.AlterField(
model_name="companyevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="companyevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.company",
),
),
migrations.AlterField(
model_name="companyevent",
name="rides_count",
field=models.IntegerField(
default=0, help_text="Number of rides manufactured (auto-calculated)"
),
),
migrations.AlterField(
model_name="companyevent",
name="roles",
field=django.contrib.postgres.fields.ArrayField(
base_field=apps.core.choices.fields.RichChoiceField(
allow_deprecated=False,
choice_group="company_roles",
choices=[
("MANUFACTURER", "Ride Manufacturer"),
("DESIGNER", "Ride Designer"),
],
domain="rides",
max_length=20,
),
blank=True,
default=list,
help_text="Company roles (manufacturer, designer, etc.)",
size=None,
),
),
migrations.AlterField(
model_name="companyevent",
name="slug",
field=models.SlugField(
db_index=False, help_text="URL-friendly identifier", max_length=255
),
),
migrations.AlterField(
model_name="companyevent",
name="website",
field=models.URLField(blank=True, help_text="Company website URL"),
),
migrations.AlterField(
model_name="rideevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="rideevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ride",
),
),
migrations.AlterField(
model_name="ridelocationevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridelocationevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridelocation",
),
),
migrations.AlterField(
model_name="ridemodelevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridemodelevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridemodel",
),
),
migrations.AlterField(
model_name="ridemodelphoto",
name="alt_text",
field=models.CharField(
blank=True,
help_text="Alternative text for accessibility",
max_length=255,
),
),
migrations.AlterField(
model_name="ridemodelphoto",
name="caption",
field=models.CharField(
blank=True, help_text="Photo caption or description", max_length=500
),
),
migrations.AlterField(
model_name="ridemodelphoto",
name="copyright_info",
field=models.CharField(
blank=True, help_text="Copyright information", max_length=255
),
),
migrations.AlterField(
model_name="ridemodelphoto",
name="photographer",
field=models.CharField(
blank=True, help_text="Name of the photographer", max_length=255
),
),
migrations.AlterField(
model_name="ridemodelphoto",
name="ride_model",
field=models.ForeignKey(
help_text="Ride model this photo belongs to",
on_delete=django.db.models.deletion.CASCADE,
related_name="photos",
to="rides.ridemodel",
),
),
migrations.AlterField(
model_name="ridemodelphoto",
name="source",
field=models.CharField(
blank=True, help_text="Source of the photo", max_length=255
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="alt_text",
field=models.CharField(
blank=True,
help_text="Alternative text for accessibility",
max_length=255,
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="caption",
field=models.CharField(
blank=True, help_text="Photo caption or description", max_length=500
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="copyright_info",
field=models.CharField(
blank=True, help_text="Copyright information", max_length=255
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridemodelphoto",
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="photographer",
field=models.CharField(
blank=True, help_text="Name of the photographer", max_length=255
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="ride_model",
field=models.ForeignKey(
db_constraint=False,
help_text="Ride model this photo belongs to",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="rides.ridemodel",
),
),
migrations.AlterField(
model_name="ridemodelphotoevent",
name="source",
field=models.CharField(
blank=True, help_text="Source of the photo", max_length=255
),
),
migrations.AlterField(
model_name="ridemodeltechnicalspec",
name="ride_model",
field=models.ForeignKey(
help_text="Ride model this specification belongs to",
on_delete=django.db.models.deletion.CASCADE,
related_name="technical_specs",
to="rides.ridemodel",
),
),
migrations.AlterField(
model_name="ridemodeltechnicalspecevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridemodeltechnicalspecevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridemodeltechnicalspec",
),
),
migrations.AlterField(
model_name="ridemodeltechnicalspecevent",
name="ride_model",
field=models.ForeignKey(
db_constraint=False,
help_text="Ride model this specification belongs to",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="rides.ridemodel",
),
),
migrations.AlterField(
model_name="ridemodelvariant",
name="max_height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum height for this variant",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariant",
name="max_speed_mph",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum speed for this variant",
max_digits=5,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariant",
name="min_height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Minimum height for this variant",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariant",
name="min_speed_mph",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Minimum speed for this variant",
max_digits=5,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariant",
name="ride_model",
field=models.ForeignKey(
help_text="Base ride model this variant belongs to",
on_delete=django.db.models.deletion.CASCADE,
related_name="variants",
to="rides.ridemodel",
),
),
migrations.AlterField(
model_name="ridemodelvariantevent",
name="max_height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum height for this variant",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariantevent",
name="max_speed_mph",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum speed for this variant",
max_digits=5,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariantevent",
name="min_height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Minimum height for this variant",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariantevent",
name="min_speed_mph",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Minimum speed for this variant",
max_digits=5,
null=True,
),
),
migrations.AlterField(
model_name="ridemodelvariantevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridemodelvariantevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridemodelvariant",
),
),
migrations.AlterField(
model_name="ridemodelvariantevent",
name="ride_model",
field=models.ForeignKey(
db_constraint=False,
help_text="Base ride model this variant belongs to",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="rides.ridemodel",
),
),
migrations.AlterField(
model_name="ridepaircomparisonevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridepaircomparisonevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridepaircomparison",
),
),
migrations.AlterField(
model_name="ridephotoevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridephotoevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridephoto",
),
),
migrations.AlterField(
model_name="rideranking",
name="ride",
field=models.OneToOneField(
help_text="Ride this ranking entry describes",
on_delete=django.db.models.deletion.CASCADE,
related_name="ranking",
to="rides.ride",
),
),
migrations.AlterField(
model_name="riderankingevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="riderankingevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.rideranking",
),
),
migrations.AlterField(
model_name="riderankingevent",
name="ride",
field=models.ForeignKey(
db_constraint=False,
help_text="Ride this ranking entry describes",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="rides.ride",
),
),
migrations.AlterField(
model_name="ridereviewevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="ridereviewevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.ridereview",
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="cars_per_train",
field=models.PositiveIntegerField(
blank=True, help_text="Number of cars per train", null=True
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum height in feet",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="inversions",
field=models.PositiveIntegerField(
default=0, help_text="Number of inversions"
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="length_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Track length in feet",
max_digits=7,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="max_drop_height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum drop height in feet",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="ride",
field=models.OneToOneField(
help_text="Ride these statistics belong to",
on_delete=django.db.models.deletion.CASCADE,
related_name="coaster_stats",
to="rides.ride",
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="ride_time_seconds",
field=models.PositiveIntegerField(
blank=True, help_text="Duration of the ride in seconds", null=True
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="seats_per_car",
field=models.PositiveIntegerField(
blank=True, help_text="Number of seats per car", null=True
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="speed_mph",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum speed in mph",
max_digits=5,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="track_type",
field=models.CharField(
blank=True,
help_text="Type of track (e.g., tubular steel, wooden)",
max_length=255,
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="train_style",
field=models.CharField(
blank=True,
help_text="Style of train (e.g., floorless, inverted)",
max_length=255,
),
),
migrations.AlterField(
model_name="rollercoasterstats",
name="trains_count",
field=models.PositiveIntegerField(
blank=True, help_text="Number of trains", null=True
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="cars_per_train",
field=models.PositiveIntegerField(
blank=True, help_text="Number of cars per train", null=True
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum height in feet",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="inversions",
field=models.PositiveIntegerField(
default=0, help_text="Number of inversions"
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="length_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Track length in feet",
max_digits=7,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="max_drop_height_ft",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum drop height in feet",
max_digits=6,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="pgh_context",
field=models.ForeignKey(
db_constraint=False,
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
to="pghistory.context",
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="pgh_obj",
field=models.ForeignKey(
db_constraint=False,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="events",
to="rides.rollercoasterstats",
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="ride",
field=models.ForeignKey(
db_constraint=False,
help_text="Ride these statistics belong to",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="rides.ride",
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="ride_time_seconds",
field=models.PositiveIntegerField(
blank=True, help_text="Duration of the ride in seconds", null=True
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="seats_per_car",
field=models.PositiveIntegerField(
blank=True, help_text="Number of seats per car", null=True
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="speed_mph",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Maximum speed in mph",
max_digits=5,
null=True,
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="track_type",
field=models.CharField(
blank=True,
help_text="Type of track (e.g., tubular steel, wooden)",
max_length=255,
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="train_style",
field=models.CharField(
blank=True,
help_text="Style of train (e.g., floorless, inverted)",
max_length=255,
),
),
migrations.AlterField(
model_name="rollercoasterstatsevent",
name="trains_count",
field=models.PositiveIntegerField(
blank=True, help_text="Number of trains", null=True
),
),
]