Use int sort for road numbers

This commit is contained in:
2022-07-16 17:48:04 +02:00
parent 65b615ae63
commit 7d3f29e734
4 changed files with 51 additions and 5 deletions

View File

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

View File

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