mirror of
https://github.com/daniviga/django-ram.git
synced 2025-10-19 09:00:32 +02:00
Improve sorting
This commit is contained in:
@@ -3,6 +3,7 @@ from django.db import models
|
||||
from django.urls import reverse
|
||||
from django.conf import settings
|
||||
from django.dispatch.dispatcher import receiver
|
||||
from django.core.exceptions import ValidationError
|
||||
from django_countries.fields import CountryField
|
||||
|
||||
from ram.models import Document
|
||||
@@ -49,10 +50,11 @@ class Manufacturer(models.Model):
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
"filtered", kwargs={
|
||||
"filtered",
|
||||
kwargs={
|
||||
"_filter": "manufacturer",
|
||||
"search": self.slug,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
def logo_thumbnail(self):
|
||||
@@ -83,10 +85,11 @@ class Company(models.Model):
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
"filtered", kwargs={
|
||||
"filtered",
|
||||
kwargs={
|
||||
"_filter": "company",
|
||||
"search": self.slug,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
def extended_name_pp(self):
|
||||
@@ -115,7 +118,7 @@ class Decoder(models.Model):
|
||||
)
|
||||
|
||||
class Meta(object):
|
||||
ordering = ["manufacturer", "name"]
|
||||
ordering = ["manufacturer__name", "name"]
|
||||
|
||||
def __str__(self):
|
||||
return "{0} - {1}".format(self.manufacturer, self.name)
|
||||
@@ -135,28 +138,49 @@ class DecoderDocument(Document):
|
||||
unique_together = ("decoder", "file")
|
||||
|
||||
|
||||
def calculate_ratio(ratio):
|
||||
try:
|
||||
num, den = ratio.split(":")
|
||||
return int(num) / float(den) * 10000
|
||||
except (ValueError, ZeroDivisionError):
|
||||
raise ValidationError("Invalid ratio format")
|
||||
|
||||
|
||||
class Scale(models.Model):
|
||||
scale = models.CharField(max_length=32, unique=True)
|
||||
slug = models.CharField(max_length=32, unique=True, editable=False)
|
||||
ratio = models.CharField(max_length=16, blank=True)
|
||||
gauge = models.CharField(max_length=16, blank=True)
|
||||
tracks = models.CharField(max_length=16, blank=True)
|
||||
ratio = models.CharField(max_length=16, validators=[calculate_ratio])
|
||||
ratio_int = models.SmallIntegerField(editable=False, default=0)
|
||||
tracks = models.FloatField(
|
||||
help_text="Distance between model tracks in mm",
|
||||
)
|
||||
gauge = models.CharField(
|
||||
max_length=16,
|
||||
blank=True,
|
||||
help_text="Distance between real tracks. Please specify the unit (mm, in, ...)", # noqa: E501
|
||||
)
|
||||
|
||||
class Meta:
|
||||
ordering = ["scale"]
|
||||
ordering = ["-ratio_int", "-tracks", "scale"]
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
"filtered", kwargs={
|
||||
"filtered",
|
||||
kwargs={
|
||||
"_filter": "scale",
|
||||
"search": self.slug,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
return str(self.scale)
|
||||
|
||||
|
||||
@receiver(models.signals.pre_save, sender=Scale)
|
||||
def scale_save(sender, instance, **kwargs):
|
||||
instance.ratio_int = calculate_ratio(instance.ratio)
|
||||
|
||||
|
||||
class RollingStockType(models.Model):
|
||||
type = models.CharField(max_length=64)
|
||||
order = models.PositiveSmallIntegerField()
|
||||
@@ -171,10 +195,11 @@ class RollingStockType(models.Model):
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
"filtered", kwargs={
|
||||
"filtered",
|
||||
kwargs={
|
||||
"_filter": "type",
|
||||
"search": self.slug,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
def __str__(self):
|
||||
@@ -193,10 +218,11 @@ class Tag(models.Model):
|
||||
|
||||
def get_absolute_url(self):
|
||||
return reverse(
|
||||
"filtered", kwargs={
|
||||
"filtered",
|
||||
kwargs={
|
||||
"_filter": "tag",
|
||||
"search": self.slug,
|
||||
}
|
||||
},
|
||||
)
|
||||
|
||||
|
||||
|
Reference in New Issue
Block a user