From 7d3f29e7347b82359d3db58886f8df2ffcc7a385 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniele=20Vigan=C3=B2?= Date: Sat, 16 Jul 2022 17:48:04 +0200 Subject: [PATCH] Use int sort for road numbers --- ram/portal/views.py | 2 +- ram/ram/__init__.py | 2 +- ...009_alter_rollingstock_options_and_more.py | 41 +++++++++++++++++++ ram/roster/models.py | 11 +++-- 4 files changed, 51 insertions(+), 5 deletions(-) create mode 100644 ram/roster/migrations/0009_alter_rollingstock_options_and_more.py diff --git a/ram/portal/views.py b/ram/portal/views.py index be26982..8686afa 100644 --- a/ram/portal/views.py +++ b/ram/portal/views.py @@ -18,7 +18,7 @@ def order_by_fields(): fields = ["rolling_class__type", "rolling_class__company", "rolling_class__identifier", - "road_number_cleaned"] + "road_number_int"] if order_by == "type": return (fields[0], fields[1], fields[2], fields[3]) diff --git a/ram/ram/__init__.py b/ram/ram/__init__.py index ba3337b..e15a6f4 100644 --- a/ram/ram/__init__.py +++ b/ram/ram/__init__.py @@ -1,4 +1,4 @@ from ram.utils import git_suffix -__version__ = "0.0.5" +__version__ = "0.0.6" __version__ += git_suffix(__file__) diff --git a/ram/roster/migrations/0009_alter_rollingstock_options_and_more.py b/ram/roster/migrations/0009_alter_rollingstock_options_and_more.py new file mode 100644 index 0000000..a4431cc --- /dev/null +++ b/ram/roster/migrations/0009_alter_rollingstock_options_and_more.py @@ -0,0 +1,41 @@ +# Generated by Django 4.0.6 on 2022-07-16 15:38 + +import re +from django.db import migrations, models + + +def gen_road_number_cleaned(apps, schema_editor): + RollingStock = apps.get_model('roster', 'RollingStock') + for row in RollingStock.objects.all(): + try: + row.road_number_int = int(re.findall(r"\d+", row.road_number)[0]) + row.save(update_fields=['road_number_int']) + except IndexError: + pass + + +class Migration(migrations.Migration): + + dependencies = [ + ('roster', '0008_rollingstock_road_number_cleaned'), + ] + + operations = [ + migrations.AlterModelOptions( + name='rollingstock', + options={'ordering': ['rolling_class', 'road_number_int'], 'verbose_name_plural': 'Rolling stock'}, + ), + migrations.RemoveField( + model_name='rollingstock', + name='road_number_cleaned', + ), + migrations.AddField( + model_name='rollingstock', + name='road_number_int', + field=models.PositiveSmallIntegerField(default=0), + ), + migrations.RunPython( + gen_road_number_cleaned, + reverse_code=migrations.RunPython.noop + ), + ] diff --git a/ram/roster/models.py b/ram/roster/models.py index 13741be..c1a7674 100644 --- a/ram/roster/models.py +++ b/ram/roster/models.py @@ -1,4 +1,5 @@ import os +import re from uuid import uuid4 from django.db import models from django.urls import reverse @@ -75,7 +76,7 @@ class RollingStock(models.Model): verbose_name="Class", ) road_number = models.CharField(max_length=128, unique=False) - road_number_cleaned = models.CharField(max_length=128, unique=False) + road_number_int = models.PositiveSmallIntegerField(default=0, unique=False) manufacturer = models.ForeignKey( Manufacturer, on_delete=models.CASCADE, @@ -100,7 +101,7 @@ class RollingStock(models.Model): updated_time = models.DateTimeField(auto_now=True) class Meta: - ordering = ["rolling_class", "road_number_cleaned"] + ordering = ["rolling_class", "road_number_int"] verbose_name_plural = "Rolling stock" def __str__(self): @@ -118,7 +119,11 @@ class RollingStock(models.Model): @receiver(models.signals.pre_save, sender=RollingStock) def pre_save_running_number(sender, instance, *args, **kwargs): - instance.road_number_cleaned = instance.road_number.lstrip("#").lstrip("0") + try: + instance.road_number_int = int( + re.findall(r"\d+", instance.road_number)[0]) + except IndexError: + pass class RollingStockDocument(models.Model):