diff --git a/ram/consist/models.py b/ram/consist/models.py index 831ed59..15e3ae2 100644 --- a/ram/consist/models.py +++ b/ram/consist/models.py @@ -23,7 +23,7 @@ class Consist(models.Model): updated_time = models.DateTimeField(auto_now=True) def __str__(self): - return "{0}".format(self.identifier) + return "{0} {1}".format(self.company, self.identifier) def get_absolute_url(self): return reverse("consist", kwargs={"uuid": self.uuid}) diff --git a/ram/metadata/admin.py b/ram/metadata/admin.py index b0d0922..c9f7bf9 100644 --- a/ram/metadata/admin.py +++ b/ram/metadata/admin.py @@ -1,4 +1,6 @@ from django.contrib import admin +from adminsortable2.admin import SortableAdminMixin + from metadata.models import ( Property, Decoder, @@ -54,7 +56,7 @@ class TagAdmin(admin.ModelAdmin): @admin.register(RollingStockType) -class RollingStockTypeAdmin(admin.ModelAdmin): +class RollingStockTypeAdmin(SortableAdminMixin, admin.ModelAdmin): list_display = ("__str__",) list_filter = ("type", "category") search_fields = list_display diff --git a/ram/metadata/migrations/0004_alter_rollingstocktype_options_and_more.py b/ram/metadata/migrations/0004_alter_rollingstocktype_options_and_more.py new file mode 100644 index 0000000..3e01d81 --- /dev/null +++ b/ram/metadata/migrations/0004_alter_rollingstocktype_options_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.0.6 on 2022-07-14 14:46 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('metadata', '0003_property_private'), + ] + + operations = [ + migrations.AlterModelOptions( + name='rollingstocktype', + options={'ordering': ['order']}, + ), + migrations.AddField( + model_name='rollingstocktype', + name='order', + field=models.PositiveSmallIntegerField(default=0), + preserve_default=False, + ), + ] diff --git a/ram/metadata/models.py b/ram/metadata/models.py index 7abf8be..bbbeb3e 100644 --- a/ram/metadata/models.py +++ b/ram/metadata/models.py @@ -108,12 +108,14 @@ def tag_pre_save(sender, instance, **kwargs): class RollingStockType(models.Model): type = models.CharField(max_length=64) + order = models.PositiveSmallIntegerField() category = models.CharField( max_length=64, choices=settings.ROLLING_STOCK_TYPES ) class Meta(object): unique_together = ("category", "type") + ordering = ["order"] def __str__(self): return "{0} {1}".format(self.type, self.category) diff --git a/ram/portal/migrations/0007_siteconfiguration_items_ordering.py b/ram/portal/migrations/0007_siteconfiguration_items_ordering.py new file mode 100644 index 0000000..b04e32e --- /dev/null +++ b/ram/portal/migrations/0007_siteconfiguration_items_ordering.py @@ -0,0 +1,18 @@ +# Generated by Django 4.0.6 on 2022-07-15 12:07 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('portal', '0006_alter_siteconfiguration_site_name'), + ] + + operations = [ + migrations.AddField( + model_name='siteconfiguration', + name='items_ordering', + field=models.CharField(choices=[('type', 'By rolling stock type'), ('company', 'By company name'), ('identifier', 'By rolling stock class')], default='type', max_length=10), + ), + ] diff --git a/ram/portal/models.py b/ram/portal/models.py index 8732a33..7b15cc8 100644 --- a/ram/portal/models.py +++ b/ram/portal/models.py @@ -14,7 +14,14 @@ class SiteConfiguration(SingletonModel): items_per_page = models.CharField( max_length=2, choices=[(str(x * 3), str(x * 3)) for x in range(2, 11)], - default="6", + default="6" + ) + items_ordering = models.CharField( + max_length=10, + choices=[("type", "By rolling stock type"), + ("company", "By company name"), + ("identifier", "By rolling stock class")], + default="type" ) footer = models.TextField(blank=True) footer_extended = models.TextField(blank=True) diff --git a/ram/portal/templates/consists.html b/ram/portal/templates/consists.html index 139ff33..02b20fb 100644 --- a/ram/portal/templates/consists.html +++ b/ram/portal/templates/consists.html @@ -10,7 +10,7 @@
{% if c.image %}Card image cap{% endif %}
-

{{ c.identifier }}

+

{{ c }}

{% if c.tags.all %}

Tags: {% for t in c.tags.all %} diff --git a/ram/portal/views.py b/ram/portal/views.py index f741ea6..8469407 100644 --- a/ram/portal/views.py +++ b/ram/portal/views.py @@ -13,10 +13,26 @@ from roster.models import RollingStock from consist.models import Consist +def order_by_fields(): + order_by = get_site_conf().items_ordering + fields = ["rolling_class__type", + "rolling_class__company", + "rolling_class__identifier", + "road_number"] + + if order_by == "type": + return (fields[0], fields[1], fields[2], fields[3]) + elif order_by == "company": + return (fields[1], fields[0], fields[2], fields[3]) + elif order_by == "identifier": + return (fields[2], fields[0], fields[1], fields[3]) + + class GetHome(View): def get(self, request, page=1): site_conf = get_site_conf() - rolling_stock = RollingStock.objects.all() + rolling_stock = RollingStock.objects.order_by(*order_by_fields()) + paginator = Paginator(rolling_stock, site_conf.items_per_page) try: @@ -59,7 +75,9 @@ class GetHomeFiltered(View): query = Q(scale__scale__icontains=search) else: raise Http404 - rolling_stock = RollingStock.objects.filter(query) + rolling_stock = ( + RollingStock.objects.filter(query).order_by(*order_by_fields()) + ) matches = len(rolling_stock) paginator = Paginator(rolling_stock, site_conf.items_per_page) diff --git a/ram/roster/migrations/0007_alter_rollingclass_company_alter_rollingclass_type.py b/ram/roster/migrations/0007_alter_rollingclass_company_alter_rollingclass_type.py new file mode 100644 index 0000000..e992d62 --- /dev/null +++ b/ram/roster/migrations/0007_alter_rollingclass_company_alter_rollingclass_type.py @@ -0,0 +1,25 @@ +# Generated by Django 4.0.6 on 2022-07-15 15:24 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('metadata', '0004_alter_rollingstocktype_options_and_more'), + ('roster', '0006_alter_rollingclassproperty_rolling_class_and_more'), + ] + + operations = [ + migrations.AlterField( + model_name='rollingclass', + name='company', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='metadata.company'), + ), + migrations.AlterField( + model_name='rollingclass', + name='type', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='metadata.rollingstocktype'), + ), + ] diff --git a/ram/roster/models.py b/ram/roster/models.py index 3aab500..5a83c20 100644 --- a/ram/roster/models.py +++ b/ram/roster/models.py @@ -25,12 +25,8 @@ from metadata.models import ( class RollingClass(models.Model): identifier = models.CharField(max_length=128, unique=False) - type = models.ForeignKey( - RollingStockType, on_delete=models.CASCADE, null=True, blank=True - ) - company = models.ForeignKey( - Company, on_delete=models.CASCADE, null=True, blank=True - ) + type = models.ForeignKey(RollingStockType, on_delete=models.CASCADE) + company = models.ForeignKey(Company, on_delete=models.CASCADE) description = models.CharField(max_length=256, blank=True) manufacturer = models.ForeignKey( Manufacturer,