diff --git a/ram/portal/templates/cards/roster.html b/ram/portal/templates/cards/roster.html index 548d49f..8cd923d 100644 --- a/ram/portal/templates/cards/roster.html +++ b/ram/portal/templates/cards/roster.html @@ -60,7 +60,7 @@ Item number - {{ d.item.item_number }}{%if d.item.set %} | SET{% endif %} + {{ d.item.item_number }}{%if d.item.set %} | SET{% endif %} diff --git a/ram/portal/templates/rollingstock.html b/ram/portal/templates/rollingstock.html index 9a9e0d3..ea89540 100644 --- a/ram/portal/templates/rollingstock.html +++ b/ram/portal/templates/rollingstock.html @@ -120,7 +120,7 @@ Item number - {{ rolling_stock.item_number }}{%if rolling_stock.set %} | SET{% endif %} + {{ rolling_stock.item_number }}{%if rolling_stock.set %} | SET{% endif %} @@ -173,7 +173,7 @@ Item number - {{ rolling_stock.item_number }}{%if rolling_stock.set %} | SET{% endif %} + {{ rolling_stock.item_number }}{%if rolling_stock.set %} | SET{% endif %} Era diff --git a/ram/portal/views.py b/ram/portal/views.py index fe6cfad..3a598e8 100644 --- a/ram/portal/views.py +++ b/ram/portal/views.py @@ -50,6 +50,15 @@ def get_order_by_field(): return (fields[2], fields[0], fields[1], fields[3]) +class Render404(View): + def get(self, request, exception): + return render( + request, + "base.html", + {"title": "404 page not found"} + ) + + class GetData(View): title = "Home" template = "roster.html" @@ -229,27 +238,33 @@ class SearchObjects(View): class GetManufacturerItem(View): def get(self, request, manufacturer, search="all", page=1): + manufacturer = get_object_or_404( + Manufacturer, + slug__iexact=manufacturer + ) + if search != "all": rolling_stock = get_list_or_404( RollingStock.objects.order_by(*get_order_by_field()), Q( - Q(manufacturer__name__iexact=manufacturer) - & Q(item_number__exact=search) + Q(manufacturer=manufacturer) + & Q(item_number_slug__exact=search) ) ) title = "{0}: {1}".format( - rolling_stock[0].manufacturer, - search + manufacturer, + # all returned records must have the same `item_number``; + # just pick it up the first result, otherwise `search` + rolling_stock[0].item_number if rolling_stock else search ) else: - rolling_stock = get_list_or_404( - RollingStock.objects.order_by(*get_order_by_field()), - Q(rolling_class__manufacturer__slug__iexact=manufacturer) - | Q(manufacturer__slug__iexact=manufacturer) - ) - title = "Manufacturer: {0}".format( - get_object_or_404(Manufacturer, slug__iexact=manufacturer) + rolling_stock = ( + RollingStock.objects.order_by(*get_order_by_field()).filter( + Q(manufacturer=manufacturer) + | Q(rolling_class__manufacturer=manufacturer) ) + ) + title = "Manufacturer: {0}".format(manufacturer) data = [] for item in rolling_stock: diff --git a/ram/ram/__init__.py b/ram/ram/__init__.py index 8930ac0..5d0a7f6 100644 --- a/ram/ram/__init__.py +++ b/ram/ram/__init__.py @@ -1,4 +1,4 @@ from ram.utils import git_suffix -__version__ = "0.12.2" +__version__ = "0.12.3" __version__ += git_suffix(__file__) diff --git a/ram/ram/urls.py b/ram/ram/urls.py index d5c851c..52e0ff4 100644 --- a/ram/ram/urls.py +++ b/ram/ram/urls.py @@ -22,6 +22,9 @@ from django.contrib import admin from django.urls import include, path from ram.views import UploadImage +from portal.views import Render404 + +handler404 = Render404.as_view() urlpatterns = [ path("", lambda r: redirect("portal/")), diff --git a/ram/roster/migrations/0026_rollingstock_item_number_slug.py b/ram/roster/migrations/0026_rollingstock_item_number_slug.py new file mode 100644 index 0000000..d2d37c7 --- /dev/null +++ b/ram/roster/migrations/0026_rollingstock_item_number_slug.py @@ -0,0 +1,31 @@ +# Generated by Django 5.0.4 on 2024-04-23 21:10 + +from django.db import migrations, models +from ram.utils import slugify + + +def gen_item_number_slug(apps, schema_editor): + RollingStock = apps.get_model('roster', 'RollingStock') + for row in RollingStock.objects.all(): + if row.item_number: + row.item_number_slug = slugify(row.item_number) + row.save(update_fields=['item_number_slug']) + + +class Migration(migrations.Migration): + + dependencies = [ + ("roster", "0025_rollingstock_set_alter_rollingstock_era_and_more"), + ] + + operations = [ + migrations.AddField( + model_name="rollingstock", + name="item_number_slug", + field=models.CharField(blank=True, editable=False, max_length=32), + ), + migrations.RunPython( + gen_item_number_slug, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/ram/roster/models.py b/ram/roster/models.py index 3cbda4e..3febde0 100644 --- a/ram/roster/models.py +++ b/ram/roster/models.py @@ -79,6 +79,11 @@ class RollingStock(models.Model): blank=True, help_text="Catalog item number or code", ) + item_number_slug = models.CharField( + max_length=32, + blank=True, + editable=False + ) set = models.BooleanField( default=False, help_text="Part of a set",