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,760 @@
# Generated by Django 5.1.6 on 2025-12-26 14:10
import apps.core.choices.fields
import apps.core.state_machine.fields
import django.contrib.postgres.fields
import django.core.validators
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("parks", "0024_add_timezone_default"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AlterModelOptions(
name="company",
options={
"ordering": ["name"],
"verbose_name": "Company",
"verbose_name_plural": "Companies",
},
),
migrations.AlterModelOptions(
name="park",
options={
"ordering": ["name"],
"verbose_name": "Park",
"verbose_name_plural": "Parks",
},
),
migrations.AlterModelOptions(
name="parkarea",
options={
"ordering": ["park", "name"],
"verbose_name": "Park Area",
"verbose_name_plural": "Park Areas",
},
),
migrations.AlterModelOptions(
name="parkphoto",
options={
"ordering": ["-is_primary", "-created_at"],
"verbose_name": "Park Photo",
"verbose_name_plural": "Park Photos",
},
),
migrations.AlterModelOptions(
name="parkreview",
options={
"ordering": ["-created_at"],
"verbose_name": "Park Review",
"verbose_name_plural": "Park Reviews",
},
),
migrations.AlterField(
model_name="company",
name="description",
field=models.TextField(
blank=True, help_text="Detailed company description"
),
),
migrations.AlterField(
model_name="company",
name="founded_year",
field=models.PositiveIntegerField(
blank=True, help_text="Year 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="parks_count",
field=models.IntegerField(
default=0, help_text="Number of parks operated (auto-calculated)"
),
),
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=[
("OPERATOR", "Park Operator"),
("PROPERTY_OWNER", "Property Owner"),
],
domain="parks",
max_length=20,
),
blank=True,
default=list,
help_text="Company roles (operator, manufacturer, 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="description",
field=models.TextField(
blank=True, help_text="Detailed company description"
),
),
migrations.AlterField(
model_name="companyevent",
name="founded_year",
field=models.PositiveIntegerField(
blank=True, help_text="Year 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="parks_count",
field=models.IntegerField(
default=0, help_text="Number of parks operated (auto-calculated)"
),
),
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=[
("OPERATOR", "Park Operator"),
("PROPERTY_OWNER", "Property Owner"),
],
domain="parks",
max_length=20,
),
blank=True,
default=list,
help_text="Company roles (operator, manufacturer, 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="companyheadquarters",
name="company",
field=models.OneToOneField(
help_text="Company this headquarters belongs to",
on_delete=django.db.models.deletion.CASCADE,
related_name="headquarters",
to="parks.company",
),
),
migrations.AlterField(
model_name="companyheadquartersevent",
name="company",
field=models.ForeignKey(
db_constraint=False,
help_text="Company this headquarters belongs to",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="parks.company",
),
),
migrations.AlterField(
model_name="park",
name="average_rating",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Average user rating (110)",
max_digits=3,
null=True,
),
),
migrations.AlterField(
model_name="park",
name="closing_date",
field=models.DateField(blank=True, help_text="Closing date", null=True),
),
migrations.AlterField(
model_name="park",
name="coaster_count",
field=models.IntegerField(
blank=True, help_text="Total coaster count", null=True
),
),
migrations.AlterField(
model_name="park",
name="description",
field=models.TextField(blank=True, help_text="Park description"),
),
migrations.AlterField(
model_name="park",
name="name",
field=models.CharField(help_text="Park name", max_length=255),
),
migrations.AlterField(
model_name="park",
name="opening_date",
field=models.DateField(blank=True, help_text="Opening date", null=True),
),
migrations.AlterField(
model_name="park",
name="operating_season",
field=models.CharField(
blank=True, help_text="Operating season", max_length=255
),
),
migrations.AlterField(
model_name="park",
name="ride_count",
field=models.IntegerField(
blank=True, help_text="Total ride count", null=True
),
),
migrations.AlterField(
model_name="park",
name="size_acres",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Park size in acres",
max_digits=10,
null=True,
),
),
migrations.AlterField(
model_name="park",
name="slug",
field=models.SlugField(
help_text="URL-friendly identifier", max_length=255, unique=True
),
),
migrations.AlterField(
model_name="park",
name="status",
field=apps.core.state_machine.fields.RichFSMField(
allow_deprecated=False,
choice_group="statuses",
choices=[],
default="OPERATING",
domain="parks",
max_length=20,
),
),
migrations.AlterField(
model_name="park",
name="website",
field=models.URLField(blank=True, help_text="Official website URL"),
),
migrations.AlterField(
model_name="parkarea",
name="closing_date",
field=models.DateField(
blank=True, help_text="Date this area closed (if applicable)", null=True
),
),
migrations.AlterField(
model_name="parkarea",
name="description",
field=models.TextField(
blank=True, help_text="Detailed description of the area"
),
),
migrations.AlterField(
model_name="parkarea",
name="name",
field=models.CharField(help_text="Name of the park area", max_length=255),
),
migrations.AlterField(
model_name="parkarea",
name="opening_date",
field=models.DateField(
blank=True, help_text="Date this area opened", null=True
),
),
migrations.AlterField(
model_name="parkarea",
name="park",
field=models.ForeignKey(
help_text="Park this area belongs to",
on_delete=django.db.models.deletion.CASCADE,
related_name="areas",
to="parks.park",
),
),
migrations.AlterField(
model_name="parkarea",
name="slug",
field=models.SlugField(
help_text="URL-friendly identifier (unique within park)", max_length=255
),
),
migrations.AlterField(
model_name="parkareaevent",
name="closing_date",
field=models.DateField(
blank=True, help_text="Date this area closed (if applicable)", null=True
),
),
migrations.AlterField(
model_name="parkareaevent",
name="description",
field=models.TextField(
blank=True, help_text="Detailed description of the area"
),
),
migrations.AlterField(
model_name="parkareaevent",
name="name",
field=models.CharField(help_text="Name of the park area", max_length=255),
),
migrations.AlterField(
model_name="parkareaevent",
name="opening_date",
field=models.DateField(
blank=True, help_text="Date this area opened", null=True
),
),
migrations.AlterField(
model_name="parkareaevent",
name="park",
field=models.ForeignKey(
db_constraint=False,
help_text="Park this area belongs to",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="parks.park",
),
),
migrations.AlterField(
model_name="parkareaevent",
name="slug",
field=models.SlugField(
db_index=False,
help_text="URL-friendly identifier (unique within park)",
max_length=255,
),
),
migrations.AlterField(
model_name="parkevent",
name="average_rating",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Average user rating (110)",
max_digits=3,
null=True,
),
),
migrations.AlterField(
model_name="parkevent",
name="closing_date",
field=models.DateField(blank=True, help_text="Closing date", null=True),
),
migrations.AlterField(
model_name="parkevent",
name="coaster_count",
field=models.IntegerField(
blank=True, help_text="Total coaster count", null=True
),
),
migrations.AlterField(
model_name="parkevent",
name="description",
field=models.TextField(blank=True, help_text="Park description"),
),
migrations.AlterField(
model_name="parkevent",
name="name",
field=models.CharField(help_text="Park name", max_length=255),
),
migrations.AlterField(
model_name="parkevent",
name="opening_date",
field=models.DateField(blank=True, help_text="Opening date", null=True),
),
migrations.AlterField(
model_name="parkevent",
name="operating_season",
field=models.CharField(
blank=True, help_text="Operating season", max_length=255
),
),
migrations.AlterField(
model_name="parkevent",
name="ride_count",
field=models.IntegerField(
blank=True, help_text="Total ride count", null=True
),
),
migrations.AlterField(
model_name="parkevent",
name="size_acres",
field=models.DecimalField(
blank=True,
decimal_places=2,
help_text="Park size in acres",
max_digits=10,
null=True,
),
),
migrations.AlterField(
model_name="parkevent",
name="slug",
field=models.SlugField(
db_index=False, help_text="URL-friendly identifier", max_length=255
),
),
migrations.AlterField(
model_name="parkevent",
name="status",
field=apps.core.state_machine.fields.RichFSMField(
allow_deprecated=False,
choice_group="statuses",
choices=[],
default="OPERATING",
domain="parks",
max_length=20,
),
),
migrations.AlterField(
model_name="parkevent",
name="timezone",
field=models.CharField(
blank=True,
default="UTC",
help_text="Timezone identifier for park operations (e.g., 'America/New_York')",
max_length=50,
),
),
migrations.AlterField(
model_name="parkevent",
name="website",
field=models.URLField(blank=True, help_text="Official website URL"),
),
migrations.AlterField(
model_name="parkphoto",
name="alt_text",
field=models.CharField(
blank=True,
help_text="Alternative text for accessibility",
max_length=255,
),
),
migrations.AlterField(
model_name="parkphoto",
name="caption",
field=models.CharField(
blank=True, help_text="Photo caption or description", max_length=255
),
),
migrations.AlterField(
model_name="parkphoto",
name="is_approved",
field=models.BooleanField(
default=False,
help_text="Whether this photo has been approved by moderators",
),
),
migrations.AlterField(
model_name="parkphoto",
name="is_primary",
field=models.BooleanField(
default=False,
help_text="Whether this is the primary photo for the park",
),
),
migrations.AlterField(
model_name="parkphoto",
name="park",
field=models.ForeignKey(
help_text="Park this photo belongs to",
on_delete=django.db.models.deletion.CASCADE,
related_name="photos",
to="parks.park",
),
),
migrations.AlterField(
model_name="parkphoto",
name="uploaded_by",
field=models.ForeignKey(
help_text="User who uploaded this photo",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="uploaded_park_photos",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="parkphotoevent",
name="alt_text",
field=models.CharField(
blank=True,
help_text="Alternative text for accessibility",
max_length=255,
),
),
migrations.AlterField(
model_name="parkphotoevent",
name="caption",
field=models.CharField(
blank=True, help_text="Photo caption or description", max_length=255
),
),
migrations.AlterField(
model_name="parkphotoevent",
name="is_approved",
field=models.BooleanField(
default=False,
help_text="Whether this photo has been approved by moderators",
),
),
migrations.AlterField(
model_name="parkphotoevent",
name="is_primary",
field=models.BooleanField(
default=False,
help_text="Whether this is the primary photo for the park",
),
),
migrations.AlterField(
model_name="parkphotoevent",
name="park",
field=models.ForeignKey(
db_constraint=False,
help_text="Park this photo belongs to",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="parks.park",
),
),
migrations.AlterField(
model_name="parkphotoevent",
name="uploaded_by",
field=models.ForeignKey(
db_constraint=False,
help_text="User who uploaded this photo",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="parkreview",
name="content",
field=models.TextField(help_text="Review content"),
),
migrations.AlterField(
model_name="parkreview",
name="is_published",
field=models.BooleanField(
default=True, help_text="Whether this review is publicly visible"
),
),
migrations.AlterField(
model_name="parkreview",
name="moderated_at",
field=models.DateTimeField(
blank=True, help_text="When this review was moderated", null=True
),
),
migrations.AlterField(
model_name="parkreview",
name="moderated_by",
field=models.ForeignKey(
blank=True,
help_text="Moderator who reviewed this",
null=True,
on_delete=django.db.models.deletion.SET_NULL,
related_name="moderated_park_reviews",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="parkreview",
name="moderation_notes",
field=models.TextField(
blank=True, help_text="Internal notes from moderators"
),
),
migrations.AlterField(
model_name="parkreview",
name="park",
field=models.ForeignKey(
help_text="Park being reviewed",
on_delete=django.db.models.deletion.CASCADE,
related_name="reviews",
to="parks.park",
),
),
migrations.AlterField(
model_name="parkreview",
name="rating",
field=models.PositiveSmallIntegerField(
help_text="Rating from 1-10",
validators=[
django.core.validators.MinValueValidator(1),
django.core.validators.MaxValueValidator(10),
],
),
),
migrations.AlterField(
model_name="parkreview",
name="title",
field=models.CharField(help_text="Review title", max_length=200),
),
migrations.AlterField(
model_name="parkreview",
name="user",
field=models.ForeignKey(
help_text="User who wrote the review",
on_delete=django.db.models.deletion.CASCADE,
related_name="park_reviews",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="parkreview",
name="visit_date",
field=models.DateField(help_text="Date the user visited the park"),
),
migrations.AlterField(
model_name="parkreviewevent",
name="content",
field=models.TextField(help_text="Review content"),
),
migrations.AlterField(
model_name="parkreviewevent",
name="is_published",
field=models.BooleanField(
default=True, help_text="Whether this review is publicly visible"
),
),
migrations.AlterField(
model_name="parkreviewevent",
name="moderated_at",
field=models.DateTimeField(
blank=True, help_text="When this review was moderated", null=True
),
),
migrations.AlterField(
model_name="parkreviewevent",
name="moderated_by",
field=models.ForeignKey(
blank=True,
db_constraint=False,
help_text="Moderator who reviewed this",
null=True,
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="parkreviewevent",
name="moderation_notes",
field=models.TextField(
blank=True, help_text="Internal notes from moderators"
),
),
migrations.AlterField(
model_name="parkreviewevent",
name="park",
field=models.ForeignKey(
db_constraint=False,
help_text="Park being reviewed",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to="parks.park",
),
),
migrations.AlterField(
model_name="parkreviewevent",
name="rating",
field=models.PositiveSmallIntegerField(
help_text="Rating from 1-10",
validators=[
django.core.validators.MinValueValidator(1),
django.core.validators.MaxValueValidator(10),
],
),
),
migrations.AlterField(
model_name="parkreviewevent",
name="title",
field=models.CharField(help_text="Review title", max_length=200),
),
migrations.AlterField(
model_name="parkreviewevent",
name="user",
field=models.ForeignKey(
db_constraint=False,
help_text="User who wrote the review",
on_delete=django.db.models.deletion.DO_NOTHING,
related_name="+",
related_query_name="+",
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="parkreviewevent",
name="visit_date",
field=models.DateField(help_text="Date the user visited the park"),
),
]