Improve ordering

This commit is contained in:
2026-01-03 00:54:21 +01:00
parent c95064ddec
commit 2ab2d00585
4 changed files with 76 additions and 23 deletions

View File

@@ -20,6 +20,7 @@ class SiteConfigurationAdmin(SingletonModelAdmin):
"about", "about",
"items_per_page", "items_per_page",
"items_ordering", "items_ordering",
"featured_items_ordering",
"currency", "currency",
"footer", "footer",
"footer_extended", "footer_extended",

View File

@@ -0,0 +1,43 @@
# Generated by Django 6.0 on 2026-01-02 23:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("portal", "0020_alter_flatpage_options"),
]
operations = [
migrations.AddField(
model_name="siteconfiguration",
name="featured_items_ordering",
field=models.CharField(
choices=[
("type", "By rolling stock type and company"),
("class", "By rolling stock type and class"),
("company", "By company and type"),
("country", "By country and type"),
("cou+com", "By country and company"),
],
default="type",
max_length=11,
),
),
migrations.AlterField(
model_name="siteconfiguration",
name="items_ordering",
field=models.CharField(
choices=[
("type", "By rolling stock type and company"),
("class", "By rolling stock type and class"),
("company", "By company and type"),
("country", "By country and type"),
("cou+com", "By country and company"),
],
default="type",
max_length=11,
),
),
]

View File

@@ -22,14 +22,17 @@ class SiteConfiguration(SingletonModel):
default="6", default="6",
) )
items_ordering = models.CharField( items_ordering = models.CharField(
max_length=10, max_length=11,
choices=[ choices=[
("type", "By rolling stock type"), ("type", "By rolling stock type and company"),
("company", "By company name"), ("class", "By rolling stock type and class"),
("identifier", "By rolling stock class"), ("company", "By company and type"),
("country", "By country and type"),
("cou+com", "By country and company"),
], ],
default="type", default="type",
) )
featured_items_ordering = items_ordering.clone()
currency = models.CharField(max_length=3, default="EUR") currency = models.CharField(max_length=3, default="EUR")
footer = tinymce.HTMLField(blank=True) footer = tinymce.HTMLField(blank=True)
footer_extended = tinymce.HTMLField(blank=True) footer_extended = tinymce.HTMLField(blank=True)

View File

@@ -36,25 +36,29 @@ def get_items_per_page():
return int(items_per_page) return int(items_per_page)
def get_order_by_field(): def get_items_ordering(config="items_ordering"):
try: try:
order_by = get_site_conf().items_ordering order_by = getattr(get_site_conf(), config)
except (OperationalError, ProgrammingError): except (OperationalError, ProgrammingError):
order_by = "type" order_by = "type"
fields = [ fields = [
"rolling_class__type", "rolling_class__type", # 0
"rolling_class__company", "rolling_class__company", # 1
"rolling_class__identifier", "rolling_class__company__country", # 2
"road_number_int", "rolling_class__identifier", # 3
"road_number_int", # 4
] ]
if order_by == "type": order_map = {
return (fields[0], fields[1], fields[2], fields[3]) "type": (0, 1, 3, 4),
elif order_by == "company": "company": (1, 0, 3, 4),
return (fields[1], fields[0], fields[2], fields[3]) "country": (2, 0, 1, 3, 4),
elif order_by == "identifier": "cou+com": (2, 1, 0, 3, 4),
return (fields[2], fields[0], fields[1], fields[3]) "class": (0, 3, 1, 4),
}
return tuple(fields[i] for i in order_map.get(order_by, "type"))
class Render404(View): class Render404(View):
@@ -70,7 +74,7 @@ class GetData(View):
def get_data(self, request): def get_data(self, request):
return ( return (
RollingStock.objects.get_published(request.user) RollingStock.objects.get_published(request.user)
.order_by(*get_order_by_field()) .order_by(*get_items_ordering())
.filter(self.filter) .filter(self.filter)
) )
@@ -107,7 +111,9 @@ class GetHome(GetData):
return ( return (
RollingStock.objects.get_published(request.user) RollingStock.objects.get_published(request.user)
.filter(featured=True) .filter(featured=True)
.order_by(*get_order_by_field())[:max_items] .order_by(*get_items_ordering(config="featured_items_ordering"))[
:max_items
]
) or super().get_data(request) ) or super().get_data(request)
@@ -174,7 +180,7 @@ class SearchObjects(View):
RollingStock.objects.get_published(request.user) RollingStock.objects.get_published(request.user)
.filter(query) .filter(query)
.distinct() .distinct()
.order_by(*get_order_by_field()) .order_by(*get_items_ordering())
) )
data = list(roster) data = list(roster)
@@ -301,7 +307,7 @@ class GetManufacturerItem(View):
if search != "all": if search != "all":
roster = get_list_or_404( roster = get_list_or_404(
RollingStock.objects.get_published(request.user).order_by( RollingStock.objects.get_published(request.user).order_by(
*get_order_by_field() *get_items_ordering()
), ),
Q( Q(
Q(manufacturer=manufacturer) Q(manufacturer=manufacturer)
@@ -323,7 +329,7 @@ class GetManufacturerItem(View):
| Q(rolling_class__manufacturer=manufacturer) | Q(rolling_class__manufacturer=manufacturer)
) )
.distinct() .distinct()
.order_by(*get_order_by_field()) .order_by(*get_items_ordering())
) )
catalogs = Catalog.objects.get_published(request.user).filter( catalogs = Catalog.objects.get_published(request.user).filter(
manufacturer=manufacturer manufacturer=manufacturer
@@ -376,7 +382,7 @@ class GetObjectsFiltered(View):
RollingStock.objects.get_published(request.user) RollingStock.objects.get_published(request.user)
.filter(query) .filter(query)
.distinct() .distinct()
.order_by(*get_order_by_field()) .order_by(*get_items_ordering())
) )
data = list(roster) data = list(roster)
@@ -480,7 +486,7 @@ class GetRollingStock(View):
& Q(set=True) & Q(set=True)
) )
) )
.order_by(*get_order_by_field()) .order_by(*get_items_ordering())
) )
return render( return render(