mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-22 07:31:08 -05:00
yay
This commit is contained in:
Binary file not shown.
BIN
rides/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
rides/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
rides/__pycache__/admin.cpython-312.pyc
Normal file
BIN
rides/__pycache__/admin.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
rides/__pycache__/apps.cpython-312.pyc
Normal file
BIN
rides/__pycache__/apps.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
rides/__pycache__/models.cpython-312.pyc
Normal file
BIN
rides/__pycache__/models.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
rides/__pycache__/signals.cpython-312.pyc
Normal file
BIN
rides/__pycache__/signals.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
rides/__pycache__/urls.cpython-312.pyc
Normal file
BIN
rides/__pycache__/urls.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
BIN
rides/__pycache__/views.cpython-312.pyc
Normal file
BIN
rides/__pycache__/views.cpython-312.pyc
Normal file
Binary file not shown.
@@ -32,12 +32,12 @@ class RollerCoasterStatsInline(admin.StackedInline):
|
||||
|
||||
@admin.register(Ride)
|
||||
class RideAdmin(SimpleHistoryAdmin):
|
||||
list_display = ('name', 'park', 'category', 'get_status', 'manufacturer', 'opening_date', 'get_avg_rating')
|
||||
list_display = ('id', 'name', 'park', 'category', 'get_status', 'manufacturer', 'opening_date', 'get_avg_rating')
|
||||
list_filter = ('status', 'category', 'manufacturer', 'park')
|
||||
search_fields = ('name', 'park__name', 'manufacturer__name', 'description')
|
||||
prepopulated_fields = {'slug': ('name',)}
|
||||
inlines = [RollerCoasterStatsInline]
|
||||
readonly_fields = ('created_at', 'updated_at')
|
||||
readonly_fields = ('id', 'created_at', 'updated_at')
|
||||
history_list_display = ['status', 'manufacturer']
|
||||
actions = ['mark_as_operating', 'mark_as_closed', 'mark_as_under_maintenance', 'mark_as_removed']
|
||||
|
||||
@@ -80,18 +80,19 @@ class RideAdmin(SimpleHistoryAdmin):
|
||||
)
|
||||
}),
|
||||
('Metadata', {
|
||||
'fields': ('created_at', 'updated_at'),
|
||||
'fields': ('id', 'created_at', 'updated_at'),
|
||||
'classes': ('collapse',)
|
||||
}),
|
||||
)
|
||||
|
||||
def get_status(self, obj):
|
||||
status_colors = {
|
||||
'operating': 'green',
|
||||
'closed': 'red',
|
||||
'under_maintenance': 'orange',
|
||||
'under_construction': 'blue',
|
||||
'removed': 'grey'
|
||||
'OPERATING': 'green',
|
||||
'CLOSED_TEMP': 'orange',
|
||||
'CLOSED_PERM': 'red',
|
||||
'UNDER_CONSTRUCTION': 'blue',
|
||||
'DEMOLISHED': 'grey',
|
||||
'RELOCATED': 'purple'
|
||||
}
|
||||
return format_html(
|
||||
'<span style="color: {};">{}</span>',
|
||||
@@ -101,43 +102,44 @@ class RideAdmin(SimpleHistoryAdmin):
|
||||
get_status.short_description = 'Status'
|
||||
|
||||
def get_avg_rating(self, obj):
|
||||
avg = obj.reviews.filter(status='approved').aggregate(avg_rating=Avg('rating'))['avg_rating']
|
||||
avg = obj.reviews.filter(is_published=True).aggregate(avg_rating=Avg('rating'))['avg_rating']
|
||||
if avg:
|
||||
rating_str = '{:.1f}'.format(float(avg))
|
||||
return format_html(
|
||||
'<span style="color: {};">★ {:.1f}</span>',
|
||||
'gold',
|
||||
avg
|
||||
'<span style="color: gold;">★ {}</span>',
|
||||
rating_str
|
||||
)
|
||||
return '-'
|
||||
get_avg_rating.short_description = 'Rating'
|
||||
|
||||
def mark_as_operating(self, request, queryset):
|
||||
queryset.update(status='operating')
|
||||
queryset.update(status='OPERATING')
|
||||
mark_as_operating.short_description = "Mark selected rides as operating"
|
||||
|
||||
def mark_as_closed(self, request, queryset):
|
||||
queryset.update(status='closed')
|
||||
mark_as_closed.short_description = "Mark selected rides as closed"
|
||||
queryset.update(status='CLOSED_TEMP')
|
||||
mark_as_closed.short_description = "Mark selected rides as temporarily closed"
|
||||
|
||||
def mark_as_under_maintenance(self, request, queryset):
|
||||
queryset.update(status='under_maintenance')
|
||||
queryset.update(status='CLOSED_TEMP')
|
||||
mark_as_under_maintenance.short_description = "Mark selected rides as under maintenance"
|
||||
|
||||
def mark_as_removed(self, request, queryset):
|
||||
queryset.update(status='removed')
|
||||
mark_as_removed.short_description = "Mark selected rides as removed"
|
||||
queryset.update(status='DEMOLISHED')
|
||||
mark_as_removed.short_description = "Mark selected rides as demolished"
|
||||
|
||||
@admin.register(RollerCoasterStats)
|
||||
class RollerCoasterStatsAdmin(SimpleHistoryAdmin):
|
||||
list_display = ('ride', 'height_ft', 'length_ft', 'speed_mph', 'inversions', 'get_capacity')
|
||||
list_filter = ('launch_type', 'track_type', 'train_style')
|
||||
search_fields = ('ride__name', 'track_type')
|
||||
readonly_fields = ('ride',)
|
||||
readonly_fields = ('id', 'ride')
|
||||
history_list_display = ['height_ft', 'length_ft', 'speed_mph', 'inversions']
|
||||
|
||||
fieldsets = (
|
||||
('Basic Stats', {
|
||||
'fields': (
|
||||
'id',
|
||||
'ride',
|
||||
('height_ft', 'length_ft'),
|
||||
('speed_mph', 'inversions'),
|
||||
@@ -163,7 +165,7 @@ class RollerCoasterStatsAdmin(SimpleHistoryAdmin):
|
||||
capacity = obj.trains_count * obj.cars_per_train * obj.seats_per_car
|
||||
return format_html(
|
||||
'{} seats total',
|
||||
capacity
|
||||
str(capacity)
|
||||
)
|
||||
return '-'
|
||||
get_capacity.short_description = 'Total Capacity'
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Generated by Django 5.1.2 on 2024-10-28 20:17
|
||||
# Generated by Django 5.1.2 on 2024-10-28 21:53
|
||||
|
||||
import django.db.models.deletion
|
||||
import simple_history.models
|
||||
@@ -11,130 +11,400 @@ class Migration(migrations.Migration):
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
('companies', '0001_initial'),
|
||||
('parks', '0001_initial'),
|
||||
("companies", "0002_stats_fields"),
|
||||
("parks", "0001_initial"),
|
||||
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='HistoricalRide',
|
||||
name="HistoricalRide",
|
||||
fields=[
|
||||
('id', models.BigIntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=255)),
|
||||
('slug', models.SlugField(max_length=255)),
|
||||
('description', models.TextField(blank=True)),
|
||||
('category', models.CharField(choices=[('RC', 'Roller Coaster'), ('DR', 'Dark Ride'), ('FR', 'Flat Ride'), ('WR', 'Water Ride'), ('TR', 'Transport'), ('OT', 'Other')], default='OT', max_length=2)),
|
||||
('model_name', models.CharField(blank=True, max_length=255)),
|
||||
('status', models.CharField(choices=[('OPERATING', 'Operating'), ('CLOSED_TEMP', 'Temporarily Closed'), ('CLOSED_PERM', 'Permanently Closed'), ('UNDER_CONSTRUCTION', 'Under Construction'), ('DEMOLISHED', 'Demolished'), ('RELOCATED', 'Relocated')], default='OPERATING', max_length=20)),
|
||||
('opening_date', models.DateField(blank=True, null=True)),
|
||||
('closing_date', models.DateField(blank=True, null=True)),
|
||||
('status_since', models.DateField(blank=True, null=True)),
|
||||
('min_height_in', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('max_height_in', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('accessibility_options', models.TextField(blank=True)),
|
||||
('capacity_per_hour', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('ride_duration_seconds', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('average_rating', models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True)),
|
||||
('created_at', models.DateTimeField(blank=True, editable=False)),
|
||||
('updated_at', models.DateTimeField(blank=True, editable=False)),
|
||||
('history_id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('history_date', models.DateTimeField(db_index=True)),
|
||||
('history_change_reason', models.CharField(max_length=100, null=True)),
|
||||
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
|
||||
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||||
('manufacturer', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='companies.manufacturer')),
|
||||
('park', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='parks.park')),
|
||||
('park_area', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='parks.parkarea')),
|
||||
(
|
||||
"id",
|
||||
models.BigIntegerField(
|
||||
auto_created=True, blank=True, db_index=True, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
("name", models.CharField(max_length=255)),
|
||||
("slug", models.SlugField(max_length=255)),
|
||||
("description", models.TextField(blank=True)),
|
||||
(
|
||||
"category",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("RC", "Roller Coaster"),
|
||||
("DR", "Dark Ride"),
|
||||
("FR", "Flat Ride"),
|
||||
("WR", "Water Ride"),
|
||||
("TR", "Transport"),
|
||||
("OT", "Other"),
|
||||
],
|
||||
default="OT",
|
||||
max_length=2,
|
||||
),
|
||||
),
|
||||
("model_name", models.CharField(blank=True, max_length=255)),
|
||||
(
|
||||
"status",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("OPERATING", "Operating"),
|
||||
("CLOSED_TEMP", "Temporarily Closed"),
|
||||
("CLOSED_PERM", "Permanently Closed"),
|
||||
("UNDER_CONSTRUCTION", "Under Construction"),
|
||||
("DEMOLISHED", "Demolished"),
|
||||
("RELOCATED", "Relocated"),
|
||||
],
|
||||
default="OPERATING",
|
||||
max_length=20,
|
||||
),
|
||||
),
|
||||
("opening_date", models.DateField(blank=True, null=True)),
|
||||
("closing_date", models.DateField(blank=True, null=True)),
|
||||
("status_since", models.DateField(blank=True, null=True)),
|
||||
("min_height_in", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("max_height_in", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("accessibility_options", models.TextField(blank=True)),
|
||||
(
|
||||
"capacity_per_hour",
|
||||
models.PositiveIntegerField(blank=True, null=True),
|
||||
),
|
||||
(
|
||||
"ride_duration_seconds",
|
||||
models.PositiveIntegerField(blank=True, null=True),
|
||||
),
|
||||
(
|
||||
"average_rating",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=3, null=True
|
||||
),
|
||||
),
|
||||
("created_at", models.DateTimeField(blank=True, editable=False)),
|
||||
("updated_at", models.DateTimeField(blank=True, editable=False)),
|
||||
("history_id", models.AutoField(primary_key=True, serialize=False)),
|
||||
("history_date", models.DateTimeField(db_index=True)),
|
||||
("history_change_reason", models.CharField(max_length=100, null=True)),
|
||||
(
|
||||
"history_type",
|
||||
models.CharField(
|
||||
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
|
||||
max_length=1,
|
||||
),
|
||||
),
|
||||
(
|
||||
"history_user",
|
||||
models.ForeignKey(
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="+",
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
),
|
||||
),
|
||||
(
|
||||
"manufacturer",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
db_constraint=False,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.DO_NOTHING,
|
||||
related_name="+",
|
||||
to="companies.manufacturer",
|
||||
),
|
||||
),
|
||||
(
|
||||
"park",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
db_constraint=False,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.DO_NOTHING,
|
||||
related_name="+",
|
||||
to="parks.park",
|
||||
),
|
||||
),
|
||||
(
|
||||
"park_area",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
db_constraint=False,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.DO_NOTHING,
|
||||
related_name="+",
|
||||
to="parks.parkarea",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'historical ride',
|
||||
'verbose_name_plural': 'historical rides',
|
||||
'ordering': ('-history_date', '-history_id'),
|
||||
'get_latest_by': ('history_date', 'history_id'),
|
||||
"verbose_name": "historical ride",
|
||||
"verbose_name_plural": "historical rides",
|
||||
"ordering": ("-history_date", "-history_id"),
|
||||
"get_latest_by": ("history_date", "history_id"),
|
||||
},
|
||||
bases=(simple_history.models.HistoricalChanges, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Ride',
|
||||
name="Ride",
|
||||
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)),
|
||||
('description', models.TextField(blank=True)),
|
||||
('category', models.CharField(choices=[('RC', 'Roller Coaster'), ('DR', 'Dark Ride'), ('FR', 'Flat Ride'), ('WR', 'Water Ride'), ('TR', 'Transport'), ('OT', 'Other')], default='OT', max_length=2)),
|
||||
('model_name', models.CharField(blank=True, max_length=255)),
|
||||
('status', models.CharField(choices=[('OPERATING', 'Operating'), ('CLOSED_TEMP', 'Temporarily Closed'), ('CLOSED_PERM', 'Permanently Closed'), ('UNDER_CONSTRUCTION', 'Under Construction'), ('DEMOLISHED', 'Demolished'), ('RELOCATED', 'Relocated')], default='OPERATING', max_length=20)),
|
||||
('opening_date', models.DateField(blank=True, null=True)),
|
||||
('closing_date', models.DateField(blank=True, null=True)),
|
||||
('status_since', models.DateField(blank=True, null=True)),
|
||||
('min_height_in', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('max_height_in', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('accessibility_options', models.TextField(blank=True)),
|
||||
('capacity_per_hour', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('ride_duration_seconds', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('average_rating', models.DecimalField(blank=True, decimal_places=2, max_digits=3, null=True)),
|
||||
('created_at', models.DateTimeField(auto_now_add=True)),
|
||||
('updated_at', models.DateTimeField(auto_now=True)),
|
||||
('manufacturer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rides', to='companies.manufacturer')),
|
||||
('park', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rides', to='parks.park')),
|
||||
('park_area', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='rides', to='parks.parkarea')),
|
||||
(
|
||||
"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)),
|
||||
("description", models.TextField(blank=True)),
|
||||
(
|
||||
"category",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("RC", "Roller Coaster"),
|
||||
("DR", "Dark Ride"),
|
||||
("FR", "Flat Ride"),
|
||||
("WR", "Water Ride"),
|
||||
("TR", "Transport"),
|
||||
("OT", "Other"),
|
||||
],
|
||||
default="OT",
|
||||
max_length=2,
|
||||
),
|
||||
),
|
||||
("model_name", models.CharField(blank=True, max_length=255)),
|
||||
(
|
||||
"status",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("OPERATING", "Operating"),
|
||||
("CLOSED_TEMP", "Temporarily Closed"),
|
||||
("CLOSED_PERM", "Permanently Closed"),
|
||||
("UNDER_CONSTRUCTION", "Under Construction"),
|
||||
("DEMOLISHED", "Demolished"),
|
||||
("RELOCATED", "Relocated"),
|
||||
],
|
||||
default="OPERATING",
|
||||
max_length=20,
|
||||
),
|
||||
),
|
||||
("opening_date", models.DateField(blank=True, null=True)),
|
||||
("closing_date", models.DateField(blank=True, null=True)),
|
||||
("status_since", models.DateField(blank=True, null=True)),
|
||||
("min_height_in", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("max_height_in", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("accessibility_options", models.TextField(blank=True)),
|
||||
(
|
||||
"capacity_per_hour",
|
||||
models.PositiveIntegerField(blank=True, null=True),
|
||||
),
|
||||
(
|
||||
"ride_duration_seconds",
|
||||
models.PositiveIntegerField(blank=True, null=True),
|
||||
),
|
||||
(
|
||||
"average_rating",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=3, null=True
|
||||
),
|
||||
),
|
||||
("created_at", models.DateTimeField(auto_now_add=True)),
|
||||
("updated_at", models.DateTimeField(auto_now=True)),
|
||||
(
|
||||
"manufacturer",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="rides",
|
||||
to="companies.manufacturer",
|
||||
),
|
||||
),
|
||||
(
|
||||
"park",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="rides",
|
||||
to="parks.park",
|
||||
),
|
||||
),
|
||||
(
|
||||
"park_area",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="rides",
|
||||
to="parks.parkarea",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'ordering': ['name'],
|
||||
'unique_together': {('park', 'slug')},
|
||||
"ordering": ["name"],
|
||||
"unique_together": {("park", "slug")},
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='HistoricalRollerCoasterStats',
|
||||
name="HistoricalRollerCoasterStats",
|
||||
fields=[
|
||||
('id', models.BigIntegerField(auto_created=True, blank=True, db_index=True, verbose_name='ID')),
|
||||
('height_ft', models.DecimalField(blank=True, decimal_places=2, max_digits=6, null=True)),
|
||||
('length_ft', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)),
|
||||
('speed_mph', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)),
|
||||
('inversions', models.PositiveIntegerField(default=0)),
|
||||
('ride_time_seconds', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('track_type', models.CharField(blank=True, max_length=255)),
|
||||
('launch_type', models.CharField(choices=[('CHAIN', 'Chain Lift'), ('CABLE', 'Cable Launch'), ('HYDRAULIC', 'Hydraulic Launch'), ('LSM', 'Linear Synchronous Motor'), ('LIM', 'Linear Induction Motor'), ('GRAVITY', 'Gravity'), ('OTHER', 'Other')], default='CHAIN', max_length=20)),
|
||||
('train_style', models.CharField(blank=True, max_length=255)),
|
||||
('trains_count', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('cars_per_train', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('seats_per_car', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('history_id', models.AutoField(primary_key=True, serialize=False)),
|
||||
('history_date', models.DateTimeField(db_index=True)),
|
||||
('history_change_reason', models.CharField(max_length=100, null=True)),
|
||||
('history_type', models.CharField(choices=[('+', 'Created'), ('~', 'Changed'), ('-', 'Deleted')], max_length=1)),
|
||||
('history_user', models.ForeignKey(null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='+', to=settings.AUTH_USER_MODEL)),
|
||||
('ride', models.ForeignKey(blank=True, db_constraint=False, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='+', to='rides.ride')),
|
||||
(
|
||||
"id",
|
||||
models.BigIntegerField(
|
||||
auto_created=True, blank=True, db_index=True, verbose_name="ID"
|
||||
),
|
||||
),
|
||||
(
|
||||
"height_ft",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=6, null=True
|
||||
),
|
||||
),
|
||||
(
|
||||
"length_ft",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=7, null=True
|
||||
),
|
||||
),
|
||||
(
|
||||
"speed_mph",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=5, null=True
|
||||
),
|
||||
),
|
||||
("inversions", models.PositiveIntegerField(default=0)),
|
||||
(
|
||||
"ride_time_seconds",
|
||||
models.PositiveIntegerField(blank=True, null=True),
|
||||
),
|
||||
("track_type", models.CharField(blank=True, max_length=255)),
|
||||
(
|
||||
"launch_type",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("CHAIN", "Chain Lift"),
|
||||
("CABLE", "Cable Launch"),
|
||||
("HYDRAULIC", "Hydraulic Launch"),
|
||||
("LSM", "Linear Synchronous Motor"),
|
||||
("LIM", "Linear Induction Motor"),
|
||||
("GRAVITY", "Gravity"),
|
||||
("OTHER", "Other"),
|
||||
],
|
||||
default="CHAIN",
|
||||
max_length=20,
|
||||
),
|
||||
),
|
||||
("train_style", models.CharField(blank=True, max_length=255)),
|
||||
("trains_count", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("cars_per_train", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("seats_per_car", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("history_id", models.AutoField(primary_key=True, serialize=False)),
|
||||
("history_date", models.DateTimeField(db_index=True)),
|
||||
("history_change_reason", models.CharField(max_length=100, null=True)),
|
||||
(
|
||||
"history_type",
|
||||
models.CharField(
|
||||
choices=[("+", "Created"), ("~", "Changed"), ("-", "Deleted")],
|
||||
max_length=1,
|
||||
),
|
||||
),
|
||||
(
|
||||
"history_user",
|
||||
models.ForeignKey(
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.SET_NULL,
|
||||
related_name="+",
|
||||
to=settings.AUTH_USER_MODEL,
|
||||
),
|
||||
),
|
||||
(
|
||||
"ride",
|
||||
models.ForeignKey(
|
||||
blank=True,
|
||||
db_constraint=False,
|
||||
null=True,
|
||||
on_delete=django.db.models.deletion.DO_NOTHING,
|
||||
related_name="+",
|
||||
to="rides.ride",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'historical Roller Coaster Statistics',
|
||||
'verbose_name_plural': 'historical Roller Coaster Statistics',
|
||||
'ordering': ('-history_date', '-history_id'),
|
||||
'get_latest_by': ('history_date', 'history_id'),
|
||||
"verbose_name": "historical Roller Coaster Statistics",
|
||||
"verbose_name_plural": "historical Roller Coaster Statistics",
|
||||
"ordering": ("-history_date", "-history_id"),
|
||||
"get_latest_by": ("history_date", "history_id"),
|
||||
},
|
||||
bases=(simple_history.models.HistoricalChanges, models.Model),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='RollerCoasterStats',
|
||||
name="RollerCoasterStats",
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('height_ft', models.DecimalField(blank=True, decimal_places=2, max_digits=6, null=True)),
|
||||
('length_ft', models.DecimalField(blank=True, decimal_places=2, max_digits=7, null=True)),
|
||||
('speed_mph', models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True)),
|
||||
('inversions', models.PositiveIntegerField(default=0)),
|
||||
('ride_time_seconds', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('track_type', models.CharField(blank=True, max_length=255)),
|
||||
('launch_type', models.CharField(choices=[('CHAIN', 'Chain Lift'), ('CABLE', 'Cable Launch'), ('HYDRAULIC', 'Hydraulic Launch'), ('LSM', 'Linear Synchronous Motor'), ('LIM', 'Linear Induction Motor'), ('GRAVITY', 'Gravity'), ('OTHER', 'Other')], default='CHAIN', max_length=20)),
|
||||
('train_style', models.CharField(blank=True, max_length=255)),
|
||||
('trains_count', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('cars_per_train', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('seats_per_car', models.PositiveIntegerField(blank=True, null=True)),
|
||||
('ride', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, related_name='coaster_stats', to='rides.ride')),
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
(
|
||||
"height_ft",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=6, null=True
|
||||
),
|
||||
),
|
||||
(
|
||||
"length_ft",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=7, null=True
|
||||
),
|
||||
),
|
||||
(
|
||||
"speed_mph",
|
||||
models.DecimalField(
|
||||
blank=True, decimal_places=2, max_digits=5, null=True
|
||||
),
|
||||
),
|
||||
("inversions", models.PositiveIntegerField(default=0)),
|
||||
(
|
||||
"ride_time_seconds",
|
||||
models.PositiveIntegerField(blank=True, null=True),
|
||||
),
|
||||
("track_type", models.CharField(blank=True, max_length=255)),
|
||||
(
|
||||
"launch_type",
|
||||
models.CharField(
|
||||
choices=[
|
||||
("CHAIN", "Chain Lift"),
|
||||
("CABLE", "Cable Launch"),
|
||||
("HYDRAULIC", "Hydraulic Launch"),
|
||||
("LSM", "Linear Synchronous Motor"),
|
||||
("LIM", "Linear Induction Motor"),
|
||||
("GRAVITY", "Gravity"),
|
||||
("OTHER", "Other"),
|
||||
],
|
||||
default="CHAIN",
|
||||
max_length=20,
|
||||
),
|
||||
),
|
||||
("train_style", models.CharField(blank=True, max_length=255)),
|
||||
("trains_count", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("cars_per_train", models.PositiveIntegerField(blank=True, null=True)),
|
||||
("seats_per_car", models.PositiveIntegerField(blank=True, null=True)),
|
||||
(
|
||||
"ride",
|
||||
models.OneToOneField(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="coaster_stats",
|
||||
to="rides.ride",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
'verbose_name': 'Roller Coaster Statistics',
|
||||
'verbose_name_plural': 'Roller Coaster Statistics',
|
||||
"verbose_name": "Roller Coaster Statistics",
|
||||
"verbose_name_plural": "Roller Coaster Statistics",
|
||||
},
|
||||
),
|
||||
]
|
||||
|
||||
25
rides/migrations/0002_alter_ride_manufacturer.py
Normal file
25
rides/migrations/0002_alter_ride_manufacturer.py
Normal file
@@ -0,0 +1,25 @@
|
||||
# Generated by Django 5.1.2 on 2024-10-29 02:02
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("companies", "0004_add_total_parks"),
|
||||
("rides", "0001_initial"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="ride",
|
||||
name="manufacturer",
|
||||
field=models.ForeignKey(
|
||||
default=1,
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="companies.manufacturer",
|
||||
),
|
||||
preserve_default=False,
|
||||
),
|
||||
]
|
||||
Binary file not shown.
BIN
rides/migrations/__pycache__/0001_initial.cpython-312.pyc
Normal file
BIN
rides/migrations/__pycache__/0001_initial.cpython-312.pyc
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
rides/migrations/__pycache__/__init__.cpython-312.pyc
Normal file
BIN
rides/migrations/__pycache__/__init__.cpython-312.pyc
Normal file
Binary file not shown.
@@ -43,12 +43,10 @@ class Ride(models.Model):
|
||||
default='OT'
|
||||
)
|
||||
manufacturer = models.ForeignKey(
|
||||
'companies.Manufacturer',
|
||||
on_delete=models.SET_NULL,
|
||||
related_name='rides',
|
||||
null=True,
|
||||
blank=True
|
||||
)
|
||||
'companies.manufacturer', on_delete=models.CASCADE, null=False, blank=False
|
||||
)
|
||||
# other fields...
|
||||
|
||||
model_name = models.CharField(max_length=255, blank=True)
|
||||
status = models.CharField(
|
||||
max_length=20,
|
||||
|
||||
@@ -1,5 +1,8 @@
|
||||
from django.views.generic import DetailView, ListView
|
||||
from django.shortcuts import get_object_or_404
|
||||
from django.core.serializers.json import DjangoJSONEncoder
|
||||
from django.urls import reverse
|
||||
from django.db.models import Q
|
||||
from .models import Ride, RollerCoasterStats
|
||||
from parks.models import Park
|
||||
from core.views import SlugRedirectMixin
|
||||
@@ -40,31 +43,56 @@ class RideListView(ListView):
|
||||
model = Ride
|
||||
template_name = 'rides/ride_list.html'
|
||||
context_object_name = 'rides'
|
||||
paginate_by = 12
|
||||
|
||||
def get_queryset(self):
|
||||
queryset = Ride.objects.select_related('park', 'coaster_stats')
|
||||
queryset = Ride.objects.select_related('park', 'coaster_stats', 'manufacturer').prefetch_related('photos')
|
||||
|
||||
# Filter by category if specified
|
||||
category = self.request.GET.get('category')
|
||||
search = self.request.GET.get('search', '').strip() or None
|
||||
category = self.request.GET.get('category', '').strip() or None
|
||||
status = self.request.GET.get('status', '').strip() or None
|
||||
manufacturer = self.request.GET.get('manufacturer', '').strip() or None
|
||||
|
||||
if search:
|
||||
queryset = queryset.filter(
|
||||
Q(name__icontains=search) |
|
||||
Q(park__name__icontains=search)
|
||||
)
|
||||
if category:
|
||||
queryset = queryset.filter(category=category)
|
||||
|
||||
# Filter by status if specified
|
||||
status = self.request.GET.get('status')
|
||||
if status:
|
||||
queryset = queryset.filter(status=status)
|
||||
|
||||
# Filter by manufacturer if specified
|
||||
manufacturer = self.request.GET.get('manufacturer')
|
||||
if manufacturer:
|
||||
queryset = queryset.filter(manufacturer=manufacturer)
|
||||
|
||||
return queryset.order_by('name')
|
||||
# Example: Exclude null manufacturers in RideListView
|
||||
queryset = Ride.objects.exclude(manufacturer__isnull=True)
|
||||
|
||||
return queryset
|
||||
|
||||
def get_context_data(self, **kwargs):
|
||||
context = super().get_context_data(**kwargs)
|
||||
context['manufacturers'] = Ride.objects.values_list(
|
||||
'manufacturer', flat=True
|
||||
).distinct().order_by('manufacturer')
|
||||
|
||||
# Exclude cases where manufacturer is null or an empty string
|
||||
context['manufacturers'] = list(
|
||||
Ride.objects.exclude(manufacturer__isnull=True)
|
||||
.exclude(manufacturer__isnull=True)
|
||||
.values_list('manufacturer__name', flat=True)
|
||||
.distinct().order_by('manufacturer__name')
|
||||
)
|
||||
|
||||
# Add current filter values to context
|
||||
context['current_filters'] = {
|
||||
'search': self.request.GET.get('search', ''),
|
||||
'category': self.request.GET.get('category', ''),
|
||||
'status': self.request.GET.get('status', ''),
|
||||
'manufacturer': self.request.GET.get('manufacturer', '')
|
||||
}
|
||||
|
||||
return context
|
||||
|
||||
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
# Check if this is an HTMX request
|
||||
if request.htmx:
|
||||
# If it is, return just the rides list partial
|
||||
self.template_name = 'rides/partials/ride_list.html'
|
||||
return super().get(request, *args, **kwargs)
|
||||
|
||||
Reference in New Issue
Block a user