# Generated by Django 5.2.6 on 2025-09-21 01:27 import apps.core.choices.fields import django.contrib.postgres.fields import django.core.validators import django.db.models.deletion import django.db.models.functions.datetime import pgtrigger.compiler import pgtrigger.migrations from django.conf import settings from django.db import migrations, models class Migration(migrations.Migration): initial = True dependencies = [ ("django_cloudflareimages_toolkit", "__first__"), ("pghistory", "0007_auto_20250421_0444"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="Company", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("name", models.CharField(max_length=255)), ("slug", models.SlugField(max_length=255, unique=True)), ( "roles", 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, size=None, ), ), ("description", models.TextField(blank=True)), ("website", models.URLField(blank=True)), ("founded_year", models.PositiveIntegerField(blank=True, null=True)), ("parks_count", models.IntegerField(default=0)), ("rides_count", models.IntegerField(default=0)), ], options={ "verbose_name_plural": "Companies", "ordering": ["name"], "abstract": False, }, ), migrations.CreateModel( name="CompanyEvent", fields=[ ("pgh_id", models.AutoField(primary_key=True, serialize=False)), ("pgh_created_at", models.DateTimeField(auto_now_add=True)), ("pgh_label", models.TextField(help_text="The event label.")), ("id", models.BigIntegerField()), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("name", models.CharField(max_length=255)), ("slug", models.SlugField(db_index=False, max_length=255)), ( "roles", 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, size=None, ), ), ("description", models.TextField(blank=True)), ("website", models.URLField(blank=True)), ("founded_year", models.PositiveIntegerField(blank=True, null=True)), ("parks_count", models.IntegerField(default=0)), ("rides_count", models.IntegerField(default=0)), ], options={ "abstract": False, }, ), migrations.CreateModel( name="CompanyHeadquarters", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "street_address", models.CharField( blank=True, help_text="Mailing address if publicly available", max_length=255, ), ), ( "city", models.CharField( db_index=True, help_text="Headquarters city", max_length=100 ), ), ( "state_province", models.CharField( blank=True, db_index=True, help_text="State/Province/Region", max_length=100, ), ), ( "country", models.CharField( db_index=True, default="USA", help_text="Country where headquarters is located", max_length=100, ), ), ( "postal_code", models.CharField( blank=True, help_text="ZIP or postal code", max_length=20 ), ), ( "mailing_address", models.TextField( blank=True, help_text="Complete mailing address if different from basic address", ), ), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ], options={ "verbose_name": "Company Headquarters", "verbose_name_plural": "Company Headquarters", "ordering": ["company__name"], }, ), migrations.CreateModel( name="CompanyHeadquartersEvent", fields=[ ("pgh_id", models.AutoField(primary_key=True, serialize=False)), ("pgh_created_at", models.DateTimeField(auto_now_add=True)), ("pgh_label", models.TextField(help_text="The event label.")), ("id", models.BigIntegerField()), ( "street_address", models.CharField( blank=True, help_text="Mailing address if publicly available", max_length=255, ), ), ( "city", models.CharField(help_text="Headquarters city", max_length=100), ), ( "state_province", models.CharField( blank=True, help_text="State/Province/Region", max_length=100 ), ), ( "country", models.CharField( default="USA", help_text="Country where headquarters is located", max_length=100, ), ), ( "postal_code", models.CharField( blank=True, help_text="ZIP or postal code", max_length=20 ), ), ( "mailing_address", models.TextField( blank=True, help_text="Complete mailing address if different from basic address", ), ), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ], options={ "abstract": False, }, ), migrations.CreateModel( name="Park", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("name", models.CharField(max_length=255)), ("slug", models.SlugField(max_length=255, unique=True)), ("description", models.TextField(blank=True)), ( "status", apps.core.choices.fields.RichChoiceField( allow_deprecated=False, choice_group="statuses", choices=[ ("OPERATING", "Operating"), ("CLOSED_TEMP", "Temporarily Closed"), ("CLOSED_PERM", "Permanently Closed"), ("UNDER_CONSTRUCTION", "Under Construction"), ("DEMOLISHED", "Demolished"), ("RELOCATED", "Relocated"), ], default="OPERATING", domain="parks", max_length=20, ), ), ( "park_type", apps.core.choices.fields.RichChoiceField( allow_deprecated=False, choice_group="types", choices=[ ("THEME_PARK", "Theme Park"), ("AMUSEMENT_PARK", "Amusement Park"), ("WATER_PARK", "Water Park"), ( "FAMILY_ENTERTAINMENT_CENTER", "Family Entertainment Center", ), ("CARNIVAL", "Carnival"), ("FAIR", "Fair"), ("PIER", "Pier"), ("BOARDWALK", "Boardwalk"), ("SAFARI_PARK", "Safari Park"), ("ZOO", "Zoo"), ("OTHER", "Other"), ], db_index=True, default="THEME_PARK", domain="parks", help_text="Type/category of the park", max_length=30, ), ), ("opening_date", models.DateField(blank=True, null=True)), ("closing_date", models.DateField(blank=True, null=True)), ("operating_season", models.CharField(blank=True, max_length=255)), ( "size_acres", models.DecimalField( blank=True, decimal_places=2, max_digits=10, null=True ), ), ("website", models.URLField(blank=True)), ( "average_rating", models.DecimalField( blank=True, decimal_places=2, max_digits=3, null=True ), ), ("ride_count", models.IntegerField(blank=True, null=True)), ("coaster_count", models.IntegerField(blank=True, null=True)), ("created_at", models.DateTimeField(auto_now_add=True, null=True)), ("updated_at", models.DateTimeField(auto_now=True)), ( "url", models.URLField(blank=True, help_text="Frontend URL for this park"), ), ( "opening_year", models.IntegerField( blank=True, db_index=True, help_text="Year the park opened (computed from opening_date)", null=True, ), ), ( "search_text", models.TextField( blank=True, db_index=True, help_text="Searchable text combining name, description, location, and operator", ), ), ( "timezone", models.CharField( help_text="Timezone identifier for park operations (e.g., 'America/New_York')", max_length=50, ), ), ], options={ "ordering": ["name"], }, ), migrations.CreateModel( name="ParkArea", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("name", models.CharField(max_length=255)), ("slug", models.SlugField(max_length=255)), ("description", models.TextField(blank=True)), ("opening_date", models.DateField(blank=True, null=True)), ("closing_date", models.DateField(blank=True, null=True)), ], ), migrations.CreateModel( name="ParkAreaEvent", fields=[ ("pgh_id", models.AutoField(primary_key=True, serialize=False)), ("pgh_created_at", models.DateTimeField(auto_now_add=True)), ("pgh_label", models.TextField(help_text="The event label.")), ("id", models.BigIntegerField()), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("name", models.CharField(max_length=255)), ("slug", models.SlugField(db_index=False, max_length=255)), ("description", models.TextField(blank=True)), ("opening_date", models.DateField(blank=True, null=True)), ("closing_date", models.DateField(blank=True, null=True)), ], options={ "abstract": False, }, ), migrations.CreateModel( name="ParkEvent", fields=[ ("pgh_id", models.AutoField(primary_key=True, serialize=False)), ("pgh_created_at", models.DateTimeField(auto_now_add=True)), ("pgh_label", models.TextField(help_text="The event label.")), ("id", models.BigIntegerField()), ("name", models.CharField(max_length=255)), ("slug", models.SlugField(db_index=False, max_length=255)), ("description", models.TextField(blank=True)), ( "status", apps.core.choices.fields.RichChoiceField( allow_deprecated=False, choice_group="statuses", choices=[ ("OPERATING", "Operating"), ("CLOSED_TEMP", "Temporarily Closed"), ("CLOSED_PERM", "Permanently Closed"), ("UNDER_CONSTRUCTION", "Under Construction"), ("DEMOLISHED", "Demolished"), ("RELOCATED", "Relocated"), ], default="OPERATING", domain="parks", max_length=20, ), ), ( "park_type", apps.core.choices.fields.RichChoiceField( allow_deprecated=False, choice_group="types", choices=[ ("THEME_PARK", "Theme Park"), ("AMUSEMENT_PARK", "Amusement Park"), ("WATER_PARK", "Water Park"), ( "FAMILY_ENTERTAINMENT_CENTER", "Family Entertainment Center", ), ("CARNIVAL", "Carnival"), ("FAIR", "Fair"), ("PIER", "Pier"), ("BOARDWALK", "Boardwalk"), ("SAFARI_PARK", "Safari Park"), ("ZOO", "Zoo"), ("OTHER", "Other"), ], default="THEME_PARK", domain="parks", help_text="Type/category of the park", max_length=30, ), ), ("opening_date", models.DateField(blank=True, null=True)), ("closing_date", models.DateField(blank=True, null=True)), ("operating_season", models.CharField(blank=True, max_length=255)), ( "size_acres", models.DecimalField( blank=True, decimal_places=2, max_digits=10, null=True ), ), ("website", models.URLField(blank=True)), ( "average_rating", models.DecimalField( blank=True, decimal_places=2, max_digits=3, null=True ), ), ("ride_count", models.IntegerField(blank=True, null=True)), ("coaster_count", models.IntegerField(blank=True, null=True)), ("created_at", models.DateTimeField(auto_now_add=True, null=True)), ("updated_at", models.DateTimeField(auto_now=True)), ( "url", models.URLField(blank=True, help_text="Frontend URL for this park"), ), ( "opening_year", models.IntegerField( blank=True, help_text="Year the park opened (computed from opening_date)", null=True, ), ), ( "search_text", models.TextField( blank=True, help_text="Searchable text combining name, description, location, and operator", ), ), ( "timezone", models.CharField( help_text="Timezone identifier for park operations (e.g., 'America/New_York')", max_length=50, ), ), ], options={ "abstract": False, }, ), migrations.CreateModel( name="ParkLocation", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("point", models.CharField(blank=True, max_length=50, null=True)), ("street_address", models.CharField(blank=True, max_length=255)), ("city", models.CharField(db_index=True, max_length=100)), ("state", models.CharField(db_index=True, max_length=100)), ("country", models.CharField(default="USA", max_length=100)), ( "continent", models.CharField( blank=True, db_index=True, help_text="Continent where the park is located", max_length=50, ), ), ("postal_code", models.CharField(blank=True, max_length=20)), ("highway_exit", models.CharField(blank=True, max_length=100)), ("parking_notes", models.TextField(blank=True)), ("best_arrival_time", models.TimeField(blank=True, null=True)), ("seasonal_notes", models.TextField(blank=True)), ("osm_id", models.BigIntegerField(blank=True, null=True)), ( "osm_type", models.CharField( blank=True, help_text="Type of OpenStreetMap object (node, way, or relation)", max_length=10, ), ), ], options={ "verbose_name": "Park Location", "verbose_name_plural": "Park Locations", "ordering": ["park__name"], }, ), migrations.CreateModel( name="ParkLocationEvent", fields=[ ("pgh_id", models.AutoField(primary_key=True, serialize=False)), ("pgh_created_at", models.DateTimeField(auto_now_add=True)), ("pgh_label", models.TextField(help_text="The event label.")), ("id", models.BigIntegerField()), ("point", models.CharField(blank=True, max_length=50, null=True)), ("street_address", models.CharField(blank=True, max_length=255)), ("city", models.CharField(max_length=100)), ("state", models.CharField(max_length=100)), ("country", models.CharField(default="USA", max_length=100)), ( "continent", models.CharField( blank=True, help_text="Continent where the park is located", max_length=50, ), ), ("postal_code", models.CharField(blank=True, max_length=20)), ("highway_exit", models.CharField(blank=True, max_length=100)), ("parking_notes", models.TextField(blank=True)), ("best_arrival_time", models.TimeField(blank=True, null=True)), ("seasonal_notes", models.TextField(blank=True)), ("osm_id", models.BigIntegerField(blank=True, null=True)), ( "osm_type", models.CharField( blank=True, help_text="Type of OpenStreetMap object (node, way, or relation)", max_length=10, ), ), ], options={ "abstract": False, }, ), migrations.CreateModel( name="ParkPhoto", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ("caption", models.CharField(blank=True, max_length=255)), ("alt_text", models.CharField(blank=True, max_length=255)), ("is_primary", models.BooleanField(default=False)), ("is_approved", models.BooleanField(default=False)), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("date_taken", models.DateTimeField(blank=True, null=True)), ], options={ "ordering": ["-is_primary", "-created_at"], "abstract": False, }, ), migrations.CreateModel( name="ParkPhotoEvent", fields=[ ("pgh_id", models.AutoField(primary_key=True, serialize=False)), ("pgh_created_at", models.DateTimeField(auto_now_add=True)), ("pgh_label", models.TextField(help_text="The event label.")), ("id", models.BigIntegerField()), ("caption", models.CharField(blank=True, max_length=255)), ("alt_text", models.CharField(blank=True, max_length=255)), ("is_primary", models.BooleanField(default=False)), ("is_approved", models.BooleanField(default=False)), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("date_taken", models.DateTimeField(blank=True, null=True)), ], options={ "abstract": False, }, ), migrations.CreateModel( name="ParkReview", fields=[ ( "id", models.BigAutoField( auto_created=True, primary_key=True, serialize=False, verbose_name="ID", ), ), ( "rating", models.PositiveSmallIntegerField( validators=[ django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(10), ] ), ), ("title", models.CharField(max_length=200)), ("content", models.TextField()), ("visit_date", models.DateField()), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("is_published", models.BooleanField(default=True)), ("moderation_notes", models.TextField(blank=True)), ("moderated_at", models.DateTimeField(blank=True, null=True)), ], options={ "ordering": ["-created_at"], }, ), migrations.CreateModel( name="ParkReviewEvent", fields=[ ("pgh_id", models.AutoField(primary_key=True, serialize=False)), ("pgh_created_at", models.DateTimeField(auto_now_add=True)), ("pgh_label", models.TextField(help_text="The event label.")), ("id", models.BigIntegerField()), ( "rating", models.PositiveSmallIntegerField( validators=[ django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(10), ] ), ), ("title", models.CharField(max_length=200)), ("content", models.TextField()), ("visit_date", models.DateField()), ("created_at", models.DateTimeField(auto_now_add=True)), ("updated_at", models.DateTimeField(auto_now=True)), ("is_published", models.BooleanField(default=True)), ("moderation_notes", models.TextField(blank=True)), ("moderated_at", models.DateTimeField(blank=True, null=True)), ], options={ "abstract": False, }, ), pgtrigger.migrations.AddTrigger( model_name="company", trigger=pgtrigger.compiler.Trigger( name="insert_insert", sql=pgtrigger.compiler.UpsertTriggerSql( func='INSERT INTO "parks_companyevent" ("created_at", "description", "founded_year", "id", "name", "parks_count", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "rides_count", "roles", "slug", "updated_at", "website") VALUES (NEW."created_at", NEW."description", NEW."founded_year", NEW."id", NEW."name", NEW."parks_count", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."rides_count", NEW."roles", NEW."slug", NEW."updated_at", NEW."website"); RETURN NULL;', hash="0ed33eeca3344c43d8124d1f12e3acd3e6fdef02", operation="INSERT", pgid="pgtrigger_insert_insert_35b57", table="parks_company", when="AFTER", ), ), ), pgtrigger.migrations.AddTrigger( model_name="company", trigger=pgtrigger.compiler.Trigger( name="update_update", sql=pgtrigger.compiler.UpsertTriggerSql( condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)", func='INSERT INTO "parks_companyevent" ("created_at", "description", "founded_year", "id", "name", "parks_count", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "rides_count", "roles", "slug", "updated_at", "website") VALUES (NEW."created_at", NEW."description", NEW."founded_year", NEW."id", NEW."name", NEW."parks_count", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."rides_count", NEW."roles", NEW."slug", NEW."updated_at", NEW."website"); RETURN NULL;', hash="ce9d8347090a033d0a9550419b80a1c4a339216c", operation="UPDATE", pgid="pgtrigger_update_update_d3286", table="parks_company", when="AFTER", ), ), ), migrations.AddField( 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.AddField( model_name="companyevent", name="pgh_obj", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="events", to="parks.company", ), ), migrations.AddField( model_name="companyheadquarters", name="company", field=models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, related_name="headquarters", to="parks.company", ), ), migrations.AddField( model_name="companyheadquartersevent", name="company", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.company", ), ), migrations.AddField( model_name="companyheadquartersevent", 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.AddField( model_name="companyheadquartersevent", name="pgh_obj", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="events", to="parks.companyheadquarters", ), ), migrations.AddField( model_name="park", name="operator", field=models.ForeignKey( help_text="Company that operates this park", limit_choices_to={"roles__contains": ["OPERATOR"]}, on_delete=django.db.models.deletion.PROTECT, related_name="operated_parks", to="parks.company", ), ), migrations.AddField( model_name="park", name="property_owner", field=models.ForeignKey( blank=True, help_text="Company that owns the property (if different from operator)", limit_choices_to={"roles__contains": ["PROPERTY_OWNER"]}, null=True, on_delete=django.db.models.deletion.PROTECT, related_name="owned_parks", to="parks.company", ), ), migrations.AddField( model_name="parkarea", name="park", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="areas", to="parks.park", ), ), migrations.AddField( model_name="parkareaevent", name="park", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.park", ), ), migrations.AddField( model_name="parkareaevent", 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.AddField( model_name="parkareaevent", name="pgh_obj", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="events", to="parks.parkarea", ), ), migrations.AddField( model_name="parkevent", name="operator", field=models.ForeignKey( db_constraint=False, help_text="Company that operates this park", limit_choices_to={"roles__contains": ["OPERATOR"]}, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.company", ), ), migrations.AddField( model_name="parkevent", 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.AddField( model_name="parkevent", name="pgh_obj", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="events", to="parks.park", ), ), migrations.AddField( model_name="parkevent", name="property_owner", field=models.ForeignKey( blank=True, db_constraint=False, help_text="Company that owns the property (if different from operator)", limit_choices_to={"roles__contains": ["PROPERTY_OWNER"]}, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.company", ), ), migrations.AddField( model_name="parklocation", name="park", field=models.OneToOneField( on_delete=django.db.models.deletion.CASCADE, related_name="location", to="parks.park", ), ), migrations.AddField( model_name="parklocationevent", name="park", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.park", ), ), migrations.AddField( model_name="parklocationevent", 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.AddField( model_name="parklocationevent", name="pgh_obj", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="events", to="parks.parklocation", ), ), migrations.AddField( model_name="parkphoto", name="image", field=models.ForeignKey( help_text="Park photo stored on Cloudflare Images", on_delete=django.db.models.deletion.CASCADE, to="django_cloudflareimages_toolkit.cloudflareimage", ), ), migrations.AddField( model_name="parkphoto", name="park", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="photos", to="parks.park", ), ), migrations.AddField( model_name="parkphoto", name="uploaded_by", field=models.ForeignKey( null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="uploaded_park_photos", to=settings.AUTH_USER_MODEL, ), ), migrations.AddField( model_name="parkevent", name="banner_image", field=models.ForeignKey( blank=True, db_constraint=False, help_text="Photo to use as banner image for this park", null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.parkphoto", ), ), migrations.AddField( model_name="parkevent", name="card_image", field=models.ForeignKey( blank=True, db_constraint=False, help_text="Photo to use as card image for this park", null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.parkphoto", ), ), migrations.AddField( model_name="park", name="banner_image", field=models.ForeignKey( blank=True, help_text="Photo to use as banner image for this park", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="parks_using_as_banner", to="parks.parkphoto", ), ), migrations.AddField( model_name="park", name="card_image", field=models.ForeignKey( blank=True, help_text="Photo to use as card image for this park", null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="parks_using_as_card", to="parks.parkphoto", ), ), migrations.AddField( model_name="parkphotoevent", name="image", field=models.ForeignKey( db_constraint=False, help_text="Park photo stored on Cloudflare Images", on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="django_cloudflareimages_toolkit.cloudflareimage", ), ), migrations.AddField( model_name="parkphotoevent", name="park", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.park", ), ), migrations.AddField( model_name="parkphotoevent", 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.AddField( model_name="parkphotoevent", name="pgh_obj", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="events", to="parks.parkphoto", ), ), migrations.AddField( model_name="parkphotoevent", name="uploaded_by", field=models.ForeignKey( db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to=settings.AUTH_USER_MODEL, ), ), migrations.AddField( model_name="parkreview", name="moderated_by", field=models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="moderated_park_reviews", to=settings.AUTH_USER_MODEL, ), ), migrations.AddField( model_name="parkreview", name="park", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="reviews", to="parks.park", ), ), migrations.AddField( model_name="parkreview", name="user", field=models.ForeignKey( on_delete=django.db.models.deletion.CASCADE, related_name="park_reviews", to=settings.AUTH_USER_MODEL, ), ), migrations.AddField( model_name="parkreviewevent", name="moderated_by", field=models.ForeignKey( blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to=settings.AUTH_USER_MODEL, ), ), migrations.AddField( model_name="parkreviewevent", name="park", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to="parks.park", ), ), migrations.AddField( model_name="parkreviewevent", 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.AddField( model_name="parkreviewevent", name="pgh_obj", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="events", to="parks.parkreview", ), ), migrations.AddField( model_name="parkreviewevent", name="user", field=models.ForeignKey( db_constraint=False, on_delete=django.db.models.deletion.DO_NOTHING, related_name="+", related_query_name="+", to=settings.AUTH_USER_MODEL, ), ), migrations.AddIndex( model_name="companyheadquarters", index=models.Index( fields=["city", "country"], name="parks_compa_city_cf9a4e_idx" ), ), pgtrigger.migrations.AddTrigger( model_name="companyheadquarters", trigger=pgtrigger.compiler.Trigger( name="insert_insert", sql=pgtrigger.compiler.UpsertTriggerSql( func='INSERT INTO "parks_companyheadquartersevent" ("city", "company_id", "country", "created_at", "id", "mailing_address", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "postal_code", "state_province", "street_address", "updated_at") VALUES (NEW."city", NEW."company_id", NEW."country", NEW."created_at", NEW."id", NEW."mailing_address", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."postal_code", NEW."state_province", NEW."street_address", NEW."updated_at"); RETURN NULL;', hash="acf99673091ec3717f404fdccefd6e0cb228c82e", operation="INSERT", pgid="pgtrigger_insert_insert_72259", table="parks_companyheadquarters", when="AFTER", ), ), ), pgtrigger.migrations.AddTrigger( model_name="companyheadquarters", trigger=pgtrigger.compiler.Trigger( name="update_update", sql=pgtrigger.compiler.UpsertTriggerSql( condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)", func='INSERT INTO "parks_companyheadquartersevent" ("city", "company_id", "country", "created_at", "id", "mailing_address", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "postal_code", "state_province", "street_address", "updated_at") VALUES (NEW."city", NEW."company_id", NEW."country", NEW."created_at", NEW."id", NEW."mailing_address", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."postal_code", NEW."state_province", NEW."street_address", NEW."updated_at"); RETURN NULL;', hash="bbbff3a1c9748d3ce1b2bf1b705d03ea40530c9b", operation="UPDATE", pgid="pgtrigger_update_update_c5392", table="parks_companyheadquarters", when="AFTER", ), ), ), migrations.AlterUniqueTogether( name="parkarea", unique_together={("park", "slug")}, ), pgtrigger.migrations.AddTrigger( model_name="parkarea", trigger=pgtrigger.compiler.Trigger( name="insert_insert", sql=pgtrigger.compiler.UpsertTriggerSql( func='INSERT INTO "parks_parkareaevent" ("closing_date", "created_at", "description", "id", "name", "opening_date", "park_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "slug", "updated_at") VALUES (NEW."closing_date", NEW."created_at", NEW."description", NEW."id", NEW."name", NEW."opening_date", NEW."park_id", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."slug", NEW."updated_at"); RETURN NULL;', hash="fa64ee07f872bf2214b2c1b638b028429752bac4", operation="INSERT", pgid="pgtrigger_insert_insert_13457", table="parks_parkarea", when="AFTER", ), ), ), pgtrigger.migrations.AddTrigger( model_name="parkarea", trigger=pgtrigger.compiler.Trigger( name="update_update", sql=pgtrigger.compiler.UpsertTriggerSql( condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)", func='INSERT INTO "parks_parkareaevent" ("closing_date", "created_at", "description", "id", "name", "opening_date", "park_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "slug", "updated_at") VALUES (NEW."closing_date", NEW."created_at", NEW."description", NEW."id", NEW."name", NEW."opening_date", NEW."park_id", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."slug", NEW."updated_at"); RETURN NULL;', hash="59fa84527a4fd0fa51685058b6037fa22163a095", operation="UPDATE", pgid="pgtrigger_update_update_6e5aa", table="parks_parkarea", when="AFTER", ), ), ), migrations.AddIndex( model_name="parklocation", index=models.Index( fields=["city", "state"], name="parks_parkl_city_7cc873_idx" ), ), pgtrigger.migrations.AddTrigger( model_name="parklocation", trigger=pgtrigger.compiler.Trigger( name="insert_insert", sql=pgtrigger.compiler.UpsertTriggerSql( func='INSERT INTO "parks_parklocationevent" ("best_arrival_time", "city", "continent", "country", "highway_exit", "id", "osm_id", "osm_type", "park_id", "parking_notes", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "point", "postal_code", "seasonal_notes", "state", "street_address") VALUES (NEW."best_arrival_time", NEW."city", NEW."continent", NEW."country", NEW."highway_exit", NEW."id", NEW."osm_id", NEW."osm_type", NEW."park_id", NEW."parking_notes", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."point", NEW."postal_code", NEW."seasonal_notes", NEW."state", NEW."street_address"); RETURN NULL;', hash="aecd083c917cea3170e944c73c4906a78eccd676", operation="INSERT", pgid="pgtrigger_insert_insert_f8c53", table="parks_parklocation", when="AFTER", ), ), ), pgtrigger.migrations.AddTrigger( model_name="parklocation", trigger=pgtrigger.compiler.Trigger( name="update_update", sql=pgtrigger.compiler.UpsertTriggerSql( condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)", func='INSERT INTO "parks_parklocationevent" ("best_arrival_time", "city", "continent", "country", "highway_exit", "id", "osm_id", "osm_type", "park_id", "parking_notes", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "point", "postal_code", "seasonal_notes", "state", "street_address") VALUES (NEW."best_arrival_time", NEW."city", NEW."continent", NEW."country", NEW."highway_exit", NEW."id", NEW."osm_id", NEW."osm_type", NEW."park_id", NEW."parking_notes", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."point", NEW."postal_code", NEW."seasonal_notes", NEW."state", NEW."street_address"); RETURN NULL;', hash="a70bc26b34235fe4342009d491d80b990ee3ed7e", operation="UPDATE", pgid="pgtrigger_update_update_6dd0d", table="parks_parklocation", when="AFTER", ), ), ), migrations.AddIndex( model_name="parkphoto", index=models.Index( fields=["park", "is_primary"], name="parks_parkp_park_id_eda26e_idx" ), ), migrations.AddIndex( model_name="parkphoto", index=models.Index( fields=["park", "is_approved"], name="parks_parkp_park_id_5fe576_idx" ), ), migrations.AddIndex( model_name="parkphoto", index=models.Index( fields=["created_at"], name="parks_parkp_created_033dc3_idx" ), ), migrations.AddConstraint( model_name="parkphoto", constraint=models.UniqueConstraint( condition=models.Q(("is_primary", True)), fields=("park",), name="unique_primary_park_photo", ), ), pgtrigger.migrations.AddTrigger( model_name="parkphoto", trigger=pgtrigger.compiler.Trigger( name="insert_insert", sql=pgtrigger.compiler.UpsertTriggerSql( func='INSERT INTO "parks_parkphotoevent" ("alt_text", "caption", "created_at", "date_taken", "id", "image_id", "is_approved", "is_primary", "park_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "updated_at", "uploaded_by_id") VALUES (NEW."alt_text", NEW."caption", NEW."created_at", NEW."date_taken", NEW."id", NEW."image_id", NEW."is_approved", NEW."is_primary", NEW."park_id", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."updated_at", NEW."uploaded_by_id"); RETURN NULL;', hash="403652164d3e615dae5a14052a56db2851c5cf05", operation="INSERT", pgid="pgtrigger_insert_insert_e2033", table="parks_parkphoto", when="AFTER", ), ), ), pgtrigger.migrations.AddTrigger( model_name="parkphoto", trigger=pgtrigger.compiler.Trigger( name="update_update", sql=pgtrigger.compiler.UpsertTriggerSql( condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)", func='INSERT INTO "parks_parkphotoevent" ("alt_text", "caption", "created_at", "date_taken", "id", "image_id", "is_approved", "is_primary", "park_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "updated_at", "uploaded_by_id") VALUES (NEW."alt_text", NEW."caption", NEW."created_at", NEW."date_taken", NEW."id", NEW."image_id", NEW."is_approved", NEW."is_primary", NEW."park_id", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."updated_at", NEW."uploaded_by_id"); RETURN NULL;', hash="29c60ad09c570b8c03ad6c17052a8f9874314895", operation="UPDATE", pgid="pgtrigger_update_update_42711", table="parks_parkphoto", when="AFTER", ), ), ), migrations.AddConstraint( model_name="park", constraint=models.CheckConstraint( condition=models.Q( ("closing_date__isnull", True), ("opening_date__isnull", True), ("closing_date__gte", models.F("opening_date")), _connector="OR", ), name="park_closing_after_opening", violation_error_message="Closing date must be after opening date", ), ), migrations.AddConstraint( model_name="park", constraint=models.CheckConstraint( condition=models.Q( ("size_acres__isnull", True), ("size_acres__gt", 0), _connector="OR" ), name="park_size_positive", violation_error_message="Park size must be positive", ), ), migrations.AddConstraint( model_name="park", constraint=models.CheckConstraint( condition=models.Q( ("average_rating__isnull", True), models.Q(("average_rating__gte", 1), ("average_rating__lte", 10)), _connector="OR", ), name="park_rating_range", violation_error_message="Average rating must be between 1 and 10", ), ), migrations.AddConstraint( model_name="park", constraint=models.CheckConstraint( condition=models.Q( ("ride_count__isnull", True), ("ride_count__gte", 0), _connector="OR", ), name="park_ride_count_non_negative", violation_error_message="Ride count must be non-negative", ), ), migrations.AddConstraint( model_name="park", constraint=models.CheckConstraint( condition=models.Q( ("coaster_count__isnull", True), ("coaster_count__gte", 0), _connector="OR", ), name="park_coaster_count_non_negative", violation_error_message="Coaster count must be non-negative", ), ), migrations.AddConstraint( model_name="park", constraint=models.CheckConstraint( condition=models.Q( ("coaster_count__isnull", True), ("ride_count__isnull", True), ("coaster_count__lte", models.F("ride_count")), _connector="OR", ), name="park_coaster_count_lte_ride_count", violation_error_message="Coaster count cannot exceed total ride count", ), ), pgtrigger.migrations.AddTrigger( model_name="park", trigger=pgtrigger.compiler.Trigger( name="insert_insert", sql=pgtrigger.compiler.UpsertTriggerSql( func='INSERT INTO "parks_parkevent" ("average_rating", "banner_image_id", "card_image_id", "closing_date", "coaster_count", "created_at", "description", "id", "name", "opening_date", "opening_year", "operating_season", "operator_id", "park_type", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "property_owner_id", "ride_count", "search_text", "size_acres", "slug", "status", "timezone", "updated_at", "url", "website") VALUES (NEW."average_rating", NEW."banner_image_id", NEW."card_image_id", NEW."closing_date", NEW."coaster_count", NEW."created_at", NEW."description", NEW."id", NEW."name", NEW."opening_date", NEW."opening_year", NEW."operating_season", NEW."operator_id", NEW."park_type", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."property_owner_id", NEW."ride_count", NEW."search_text", NEW."size_acres", NEW."slug", NEW."status", NEW."timezone", NEW."updated_at", NEW."url", NEW."website"); RETURN NULL;', hash="9da686bd8a1881fe7a3fdfebc14411680fe47527", operation="INSERT", pgid="pgtrigger_insert_insert_66883", table="parks_park", when="AFTER", ), ), ), pgtrigger.migrations.AddTrigger( model_name="park", trigger=pgtrigger.compiler.Trigger( name="update_update", sql=pgtrigger.compiler.UpsertTriggerSql( condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)", func='INSERT INTO "parks_parkevent" ("average_rating", "banner_image_id", "card_image_id", "closing_date", "coaster_count", "created_at", "description", "id", "name", "opening_date", "opening_year", "operating_season", "operator_id", "park_type", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "property_owner_id", "ride_count", "search_text", "size_acres", "slug", "status", "timezone", "updated_at", "url", "website") VALUES (NEW."average_rating", NEW."banner_image_id", NEW."card_image_id", NEW."closing_date", NEW."coaster_count", NEW."created_at", NEW."description", NEW."id", NEW."name", NEW."opening_date", NEW."opening_year", NEW."operating_season", NEW."operator_id", NEW."park_type", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."property_owner_id", NEW."ride_count", NEW."search_text", NEW."size_acres", NEW."slug", NEW."status", NEW."timezone", NEW."updated_at", NEW."url", NEW."website"); RETURN NULL;', hash="787e3176b96b506020f056ee1122d90d25e4cb0d", operation="UPDATE", pgid="pgtrigger_update_update_19f56", table="parks_park", when="AFTER", ), ), ), migrations.AddConstraint( model_name="parkreview", constraint=models.CheckConstraint( condition=models.Q(("rating__gte", 1), ("rating__lte", 10)), name="park_review_rating_range", violation_error_message="Rating must be between 1 and 10", ), ), migrations.AddConstraint( model_name="parkreview", constraint=models.CheckConstraint( condition=models.Q( ("visit_date__lte", django.db.models.functions.datetime.Now()) ), name="park_review_visit_date_not_future", violation_error_message="Visit date cannot be in the future", ), ), migrations.AddConstraint( model_name="parkreview", constraint=models.CheckConstraint( condition=models.Q( models.Q( ("moderated_at__isnull", True), ("moderated_by__isnull", True) ), models.Q( ("moderated_at__isnull", False), ("moderated_by__isnull", False) ), _connector="OR", ), name="park_review_moderation_consistency", violation_error_message="Moderated reviews must have both moderator and moderation timestamp", ), ), migrations.AlterUniqueTogether( name="parkreview", unique_together={("park", "user")}, ), pgtrigger.migrations.AddTrigger( model_name="parkreview", trigger=pgtrigger.compiler.Trigger( name="insert_insert", sql=pgtrigger.compiler.UpsertTriggerSql( func='INSERT INTO "parks_parkreviewevent" ("content", "created_at", "id", "is_published", "moderated_at", "moderated_by_id", "moderation_notes", "park_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "rating", "title", "updated_at", "user_id", "visit_date") VALUES (NEW."content", NEW."created_at", NEW."id", NEW."is_published", NEW."moderated_at", NEW."moderated_by_id", NEW."moderation_notes", NEW."park_id", _pgh_attach_context(), NOW(), \'insert\', NEW."id", NEW."rating", NEW."title", NEW."updated_at", NEW."user_id", NEW."visit_date"); RETURN NULL;', hash="fb501d2b3a0d903a03f1a1ff0ae8dd79b189791f", operation="INSERT", pgid="pgtrigger_insert_insert_a99bc", table="parks_parkreview", when="AFTER", ), ), ), pgtrigger.migrations.AddTrigger( model_name="parkreview", trigger=pgtrigger.compiler.Trigger( name="update_update", sql=pgtrigger.compiler.UpsertTriggerSql( condition="WHEN (OLD.* IS DISTINCT FROM NEW.*)", func='INSERT INTO "parks_parkreviewevent" ("content", "created_at", "id", "is_published", "moderated_at", "moderated_by_id", "moderation_notes", "park_id", "pgh_context_id", "pgh_created_at", "pgh_label", "pgh_obj_id", "rating", "title", "updated_at", "user_id", "visit_date") VALUES (NEW."content", NEW."created_at", NEW."id", NEW."is_published", NEW."moderated_at", NEW."moderated_by_id", NEW."moderation_notes", NEW."park_id", _pgh_attach_context(), NOW(), \'update\', NEW."id", NEW."rating", NEW."title", NEW."updated_at", NEW."user_id", NEW."visit_date"); RETURN NULL;', hash="254ab0f9ccc0488ea313f1c50a2c35603f7ef02d", operation="UPDATE", pgid="pgtrigger_update_update_0e40d", table="parks_parkreview", when="AFTER", ), ), ), ]