This commit is contained in:
pacnpal
2024-10-29 01:09:14 -04:00
parent 74a1b730b9
commit 158f25b24b
195 changed files with 5000 additions and 1213 deletions

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -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'

View File

@@ -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",
},
),
]

View 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.

View File

@@ -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,

View File

@@ -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)