mirror of
https://github.com/daniviga/django-ram.git
synced 2025-12-26 23:38:32 +01:00
Merge branch 'master' into asset-mqtt
This commit is contained in:
@@ -2,7 +2,7 @@ import html
|
||||
|
||||
from django.conf import settings
|
||||
from django.contrib import admin
|
||||
from django.utils.html import format_html, strip_tags
|
||||
from django.utils.html import format_html, format_html_join, strip_tags
|
||||
|
||||
from adminsortable2.admin import SortableAdminBase, SortableInlineAdminMixin
|
||||
|
||||
@@ -37,6 +37,7 @@ class RollingClass(admin.ModelAdmin):
|
||||
search_fields = (
|
||||
"identifier",
|
||||
"company__name",
|
||||
"company__slug",
|
||||
"type__type",
|
||||
)
|
||||
save_as = True
|
||||
@@ -44,7 +45,7 @@ class RollingClass(admin.ModelAdmin):
|
||||
@admin.display(description="Country")
|
||||
def country_flag(self, obj):
|
||||
return format_html(
|
||||
'<img src="{}" /> {}'.format(obj.country.flag, obj.country)
|
||||
'<img src="{}" /> {}', obj.country.flag, obj.country.name
|
||||
)
|
||||
|
||||
|
||||
@@ -140,7 +141,9 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin):
|
||||
search_fields = (
|
||||
"rolling_class__identifier",
|
||||
"rolling_class__company__name",
|
||||
"rolling_class__company__slug",
|
||||
"manufacturer__name",
|
||||
"scale__scale",
|
||||
"road_number",
|
||||
"address",
|
||||
"item_number",
|
||||
@@ -150,7 +153,7 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin):
|
||||
@admin.display(description="Country")
|
||||
def country_flag(self, obj):
|
||||
return format_html(
|
||||
'<img src="{}" /> {}'.format(obj.country.flag, obj.country)
|
||||
'<img src="{}" /> {}', obj.country.flag, obj.country.name
|
||||
)
|
||||
|
||||
fieldsets = (
|
||||
@@ -220,19 +223,23 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin):
|
||||
@admin.display(description="Invoices")
|
||||
def invoices(self, obj):
|
||||
if obj.invoice.exists():
|
||||
html = "<br>".join(
|
||||
"<a href=\"{}\" target=\"_blank\">{}</a>".format(
|
||||
i.file.url, i
|
||||
) for i in obj.invoice.all())
|
||||
html = format_html_join(
|
||||
"<br>",
|
||||
"<a href=\"{}\" target=\"_blank\">{}</a>",
|
||||
((i.file.url, i) for i in obj.invoice.all())
|
||||
)
|
||||
else:
|
||||
html = "-"
|
||||
return format_html(html)
|
||||
return html
|
||||
|
||||
def download_csv(modeladmin, request, queryset):
|
||||
header = [
|
||||
"ID",
|
||||
"Name",
|
||||
"Class",
|
||||
"Type",
|
||||
"Company",
|
||||
"Identifier",
|
||||
"Country",
|
||||
"Road Number",
|
||||
"Manufacturer",
|
||||
"Scale",
|
||||
@@ -259,9 +266,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,
|
||||
@@ -274,11 +284,11 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin):
|
||||
settings.CSV_SEPARATOR_ALT.join(
|
||||
t.name for t in obj.tags.all()
|
||||
),
|
||||
obj.decoder_interface,
|
||||
obj.get_decoder_interface_display(),
|
||||
obj.decoder,
|
||||
obj.address,
|
||||
obj.purchase_date,
|
||||
obj.shop,
|
||||
obj.purchase_date,
|
||||
obj.price,
|
||||
properties,
|
||||
]
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
# Generated by Django 5.1.4 on 2025-05-04 17:11
|
||||
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("roster", "0036_delete_rollingstockdocument"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="rollingstock",
|
||||
name="road_number_int",
|
||||
field=models.PositiveIntegerField(default=0),
|
||||
),
|
||||
]
|
||||
@@ -0,0 +1,24 @@
|
||||
# Generated by Django 5.1.4 on 2025-05-24 12:56
|
||||
|
||||
import django.db.models.deletion
|
||||
from django.db import migrations, models
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("roster", "0037_alter_rollingstock_road_number_int"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="rollingstock",
|
||||
name="rolling_class",
|
||||
field=models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="rolling_stock",
|
||||
to="roster.rollingclass",
|
||||
verbose_name="Class",
|
||||
),
|
||||
),
|
||||
]
|
||||
@@ -63,11 +63,11 @@ class RollingStock(BaseModel):
|
||||
on_delete=models.CASCADE,
|
||||
null=False,
|
||||
blank=False,
|
||||
related_name="rolling_class",
|
||||
related_name="rolling_stock",
|
||||
verbose_name="Class",
|
||||
)
|
||||
road_number = models.CharField(max_length=128, unique=False)
|
||||
road_number_int = models.PositiveSmallIntegerField(default=0, unique=False)
|
||||
road_number_int = models.PositiveIntegerField(default=0, unique=False)
|
||||
manufacturer = models.ForeignKey(
|
||||
Manufacturer,
|
||||
on_delete=models.CASCADE,
|
||||
@@ -135,9 +135,23 @@ class RollingStock(BaseModel):
|
||||
def get_decoder_interface(self):
|
||||
return str(
|
||||
dict(settings.DECODER_INTERFACES).get(self.decoder_interface)
|
||||
or "-"
|
||||
or "No interface"
|
||||
)
|
||||
|
||||
def dcc(self):
|
||||
if self.decoder:
|
||||
dcc = (
|
||||
'<i class="bi bi-volume-up-fill"></i>'
|
||||
if self.decoder.sound
|
||||
else '<i class="bi bi-cpu-fill"></i>'
|
||||
)
|
||||
dcc = f'<abbr title="{self.decoder} ({self.get_decoder_interface()})">{dcc}</abbr>' # noqa: E501
|
||||
elif self.decoder_interface:
|
||||
dcc = f'<abbr title="{self.get_decoder_interface()}"><i class="bi bi-cpu"></i></abbr>' # noqa: E501
|
||||
else:
|
||||
dcc = f'<abbr title="{self.get_decoder_interface()}"><i class="bi bi-ban"></i></abbr>' # noqa: E501
|
||||
return dcc
|
||||
|
||||
@property
|
||||
def country(self):
|
||||
return self.rolling_class.company.country
|
||||
|
||||
Reference in New Issue
Block a user