diff --git a/ram/consist/admin.py b/ram/consist/admin.py index e480318..33df151 100644 --- a/ram/consist/admin.py +++ b/ram/consist/admin.py @@ -1,11 +1,26 @@ +import html + +from django.conf import settings from django.contrib import admin -from django.utils.html import format_html -from adminsortable2.admin import SortableAdminBase, SortableInlineAdminMixin +# from django.forms import BaseInlineFormSet # for future reference +from django.utils.html import format_html, strip_tags +from adminsortable2.admin import ( + SortableAdminBase, + SortableInlineAdminMixin, + # CustomInlineFormSetMixin, # for future reference +) from ram.admin import publish, unpublish +from ram.utils import generate_csv from consist.models import Consist, ConsistItem +# for future reference +# class ConsistItemInlineFormSet(CustomInlineFormSetMixin, BaseInlineFormSet): +# def clean(self): +# super().clean() + + class ConsistItemInline(SortableInlineAdminMixin, admin.TabularInline): model = ConsistItem min_num = 1 @@ -14,10 +29,11 @@ class ConsistItemInline(SortableInlineAdminMixin, admin.TabularInline): readonly_fields = ( "preview", "published", - "address", - "type", + "scale", "company", + "type", "era", + "address", ) @@ -46,10 +62,10 @@ class ConsistAdmin(SortableAdminBase, admin.ModelAdmin): "fields": ( "published", "identifier", - "consist_address", "company", - "era", "scale", + "era", + "consist_address", "description", "image", "tags", @@ -71,4 +87,55 @@ class ConsistAdmin(SortableAdminBase, admin.ModelAdmin): }, ), ) - actions = [publish, unpublish] + + def download_csv(modeladmin, request, queryset): + header = [ + "ID", + "Name", + "Published", + "Company", + "Country", + "Address", + "Scale", + "Era", + "Description", + "Tags", + "Length", + "Composition", + "Item name", + "Item type", + "Item ID", + ] + data = [] + for obj in queryset: + for item in obj.consist_item.all(): + types = " + ".join( + "{}x {}".format(t["count"], t["type"]) + for t in obj.get_type_count() + ) + data.append( + [ + obj.uuid, + obj.__str__(), + "X" if obj.published else "", + obj.company.name, + obj.company.country, + obj.consist_address, + obj.scale.scale, + obj.era, + html.unescape(strip_tags(obj.description)), + settings.CSV_SEPARATOR_ALT.join( + t.name for t in obj.tags.all() + ), + obj.length, + types, + item.rolling_stock.__str__(), + item.type, + item.rolling_stock.uuid, + ] + ) + + return generate_csv(header, data, "consists.csv") + download_csv.short_description = "Download selected items as CSV" + + actions = [publish, unpublish, download_csv] diff --git a/ram/consist/models.py b/ram/consist/models.py index 01e842e..7dfd464 100644 --- a/ram/consist/models.py +++ b/ram/consist/models.py @@ -107,6 +107,10 @@ class ConsistItem(models.Model): def preview(self): return self.rolling_stock.image.first().image_thumbnail(100) + @property + def scale(self): + return self.rolling_stock.scale + @property def type(self): return self.rolling_stock.rolling_class.type diff --git a/ram/roster/admin.py b/ram/roster/admin.py index 7c79b75..9aabe52 100644 --- a/ram/roster/admin.py +++ b/ram/roster/admin.py @@ -140,6 +140,7 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin): "rolling_class__identifier", "rolling_class__company__name", "manufacturer__name", + "scale", "road_number", "address", "item_number", @@ -229,9 +230,12 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin): def download_csv(modeladmin, request, queryset): header = [ + "ID", "Name", + "Class", + "Type", "Company", - "Identifier", + "Country", "Road Number", "Manufacturer", "Scale", @@ -258,9 +262,12 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin): ) data.append( [ + obj.uuid, obj.__str__(), - obj.rolling_class.company.name, obj.rolling_class.identifier, + obj.rolling_class.type, + obj.rolling_class.company.name, + obj.rolling_class.company.country, obj.road_number, obj.manufacturer.name, obj.scale.scale,