From 4c58206fbc310cf40855de6929ddf5ec1a546c4f Mon Sep 17 00:00:00 2001 From: Johannes Schriewer Date: Mon, 6 Jan 2025 01:00:12 +0100 Subject: [PATCH] Sort with custom collation that sorts numbers in natural order --- .../0005_alter_sorting_collation.py | 44 +++++++++++++++++++ inventory/models/form_factor.py | 4 +- inventory/models/item.py | 4 +- inventory/models/tag.py | 4 +- 4 files changed, 50 insertions(+), 6 deletions(-) create mode 100644 inventory/migrations/0005_alter_sorting_collation.py diff --git a/inventory/migrations/0005_alter_sorting_collation.py b/inventory/migrations/0005_alter_sorting_collation.py new file mode 100644 index 0000000..06ef1c9 --- /dev/null +++ b/inventory/migrations/0005_alter_sorting_collation.py @@ -0,0 +1,44 @@ +# Generated by Django 5.1.4 on 2025-01-05 23:09 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('inventory', '0004_alter_default_ordering'), + ] + + operations = [ + migrations.RunSQL("CREATE COLLATION IF NOT EXISTS numeric (provider = icu, locale = 'en@colNumeric=yes');"), + migrations.AlterField( + model_name='formfactor', + name='description', + field=models.CharField(db_collation='numeric', max_length=4096), + ), + migrations.AlterField( + model_name='formfactor', + name='name', + field=models.CharField(db_collation='numeric', max_length=255, unique=True), + ), + migrations.AlterField( + model_name='item', + name='description', + field=models.CharField(db_collation='numeric', max_length=4096), + ), + migrations.AlterField( + model_name='item', + name='name', + field=models.TextField(db_collation='numeric', max_length=255), + ), + migrations.AlterField( + model_name='tag', + name='description', + field=models.CharField(db_collation='numeric', max_length=4096), + ), + migrations.AlterField( + model_name='tag', + name='name', + field=models.CharField(db_collation='numeric', max_length=255, unique=True), + ), + ] diff --git a/inventory/models/form_factor.py b/inventory/models/form_factor.py index 84c7182..767ada2 100644 --- a/inventory/models/form_factor.py +++ b/inventory/models/form_factor.py @@ -2,8 +2,8 @@ from django.db import models class FormFactor(models.Model): - name = models.CharField(max_length=255, unique=True) - description = models.CharField(max_length=4096) + name = models.CharField(max_length=255, unique=True, db_collation="numeric") + description = models.CharField(max_length=4096, db_collation="numeric") icon = models.ImageField(null=True, blank=True) datasheet = models.FileField(null=True, blank=True) diff --git a/inventory/models/item.py b/inventory/models/item.py index 018df90..96d1bf8 100644 --- a/inventory/models/item.py +++ b/inventory/models/item.py @@ -4,8 +4,8 @@ from .container import CanBeContained class Item(CanBeContained): - name = models.TextField(max_length=255) - description = models.CharField(max_length=4096) + name = models.TextField(max_length=255, db_collation="numeric") + description = models.CharField(max_length=4096, db_collation="numeric") size = models.PositiveIntegerField(default=1, help_text="Number of sub-compartments this item takes up") form_factor = models.ForeignKey('inventory.FormFactor', null=True, blank=True, on_delete=models.PROTECT) manufacturer = models.ForeignKey('inventory.Manufacturer', null=True, blank=True, on_delete=models.PROTECT) diff --git a/inventory/models/tag.py b/inventory/models/tag.py index bf33826..895db0d 100644 --- a/inventory/models/tag.py +++ b/inventory/models/tag.py @@ -2,8 +2,8 @@ from django.db import models class Tag(models.Model): - name = models.CharField(max_length=255, unique=True) - description = models.CharField(max_length=4096) + name = models.CharField(max_length=255, unique=True, db_collation="numeric") + description = models.CharField(max_length=4096, db_collation="numeric") created_at = models.DateTimeField(auto_now_add=True) changed_at = models.DateTimeField(auto_now=True)