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