diff --git a/dcc/consist/admin.py b/dcc/consist/admin.py index f21151d..ffa3a48 100644 --- a/dcc/consist/admin.py +++ b/dcc/consist/admin.py @@ -8,25 +8,25 @@ class ConsistItemInline(SortableInlineAdminMixin, admin.TabularInline): model = ConsistItem min_num = 1 extra = 0 - readonly_fields = ('address', 'company', 'epoch') + readonly_fields = ('address', 'type', 'company', 'era') @admin.register(Consist) class ConsistAdmin(admin.ModelAdmin): inlines = (ConsistItemInline,) readonly_fields = ('creation_time', 'updated_time',) - list_display = ('identifier', 'company', 'epoch') + list_display = ('identifier', 'company', 'era') list_filter = list_display search_fields = list_display fieldsets = ( (None, { 'fields': ('identifier', - 'address', - 'tags', + 'consist_address', 'company', - 'epoch', - 'notes') + 'era', + 'notes', + 'tags') }), ('Audit', { 'classes': ('collapse',), diff --git a/dcc/consist/migrations/0001_initial.py b/dcc/consist/migrations/0001_initial.py index 5501547..df46d20 100644 --- a/dcc/consist/migrations/0001_initial.py +++ b/dcc/consist/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.2 on 2022-04-02 09:22 +# Generated by Django 4.0.2 on 2022-04-02 14:25 from django.db import migrations, models import django.db.models.deletion @@ -10,8 +10,8 @@ class Migration(migrations.Migration): initial = True dependencies = [ + ('roster', '0001_initial'), ('metadata', '0001_initial'), - ('roster', '0005_remove_consistitem_consist_and_more'), ] operations = [ @@ -20,6 +20,7 @@ class Migration(migrations.Migration): fields=[ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ('identifier', models.CharField(max_length=128)), + ('address', models.SmallIntegerField(blank=True, default=None, null=True)), ('epoch', models.CharField(blank=True, max_length=32)), ('notes', models.TextField(blank=True)), ('creation_time', models.DateTimeField(auto_now_add=True)), @@ -32,8 +33,12 @@ class Migration(migrations.Migration): name='ConsistItem', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('order', models.PositiveIntegerField(default=0)), ('consist', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='consist.consist')), ('rolling_stock', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='roster.rollingstock')), ], + options={ + 'ordering': ['order'], + }, ), ] diff --git a/dcc/consist/migrations/0002_alter_consistitem_options_consistitem_order.py b/dcc/consist/migrations/0002_alter_consistitem_options_consistitem_order.py deleted file mode 100644 index 3f60510..0000000 --- a/dcc/consist/migrations/0002_alter_consistitem_options_consistitem_order.py +++ /dev/null @@ -1,22 +0,0 @@ -# Generated by Django 4.0.2 on 2022-04-02 09:25 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('consist', '0001_initial'), - ] - - operations = [ - migrations.AlterModelOptions( - name='consistitem', - options={'ordering': ['order']}, - ), - migrations.AddField( - model_name='consistitem', - name='order', - field=models.PositiveIntegerField(default=0), - ), - ] diff --git a/dcc/consist/migrations/0002_rename_address_consist_consist_address_and_more.py b/dcc/consist/migrations/0002_rename_address_consist_consist_address_and_more.py new file mode 100644 index 0000000..db729ca --- /dev/null +++ b/dcc/consist/migrations/0002_rename_address_consist_consist_address_and_more.py @@ -0,0 +1,23 @@ +# Generated by Django 4.0.2 on 2022-04-02 16:18 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('consist', '0001_initial'), + ] + + operations = [ + migrations.RenameField( + model_name='consist', + old_name='address', + new_name='consist_address', + ), + migrations.RenameField( + model_name='consist', + old_name='epoch', + new_name='era', + ), + ] diff --git a/dcc/consist/migrations/0003_consist_address.py b/dcc/consist/migrations/0003_consist_address.py deleted file mode 100644 index cabd1e8..0000000 --- a/dcc/consist/migrations/0003_consist_address.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.0.2 on 2022-04-02 10:36 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('consist', '0002_alter_consistitem_options_consistitem_order'), - ] - - operations = [ - migrations.AddField( - model_name='consist', - name='address', - field=models.SmallIntegerField(blank=True, default=None, null=True), - ), - ] diff --git a/dcc/consist/models.py b/dcc/consist/models.py index d45fb9a..16f4fc5 100644 --- a/dcc/consist/models.py +++ b/dcc/consist/models.py @@ -14,11 +14,12 @@ class Consist(models.Model): Tag, related_name='consist', blank=True) - address = models.SmallIntegerField(default=None, null=True, blank=True) + consist_address = models.SmallIntegerField( + default=None, null=True, blank=True) company = models.ForeignKey( Company, on_delete=models.CASCADE, null=True, blank=True) - epoch = models.CharField(max_length=32, blank=True) + era = models.CharField(max_length=32, blank=True) notes = models.TextField(blank=True) creation_time = models.DateTimeField(auto_now_add=True) updated_time = models.DateTimeField(auto_now=True) @@ -38,16 +39,16 @@ class ConsistItem(models.Model): ordering = ['order'] def __str__(self): - return "{0}".format(self.rolling_stock.identifier) + return "{0}".format(self.rolling_stock) - # def type(self): - # return self.rolling_stock.type + def type(self): + return self.rolling_stock.rolling_class.type def address(self): return self.rolling_stock.address def company(self): - return self.rolling_stock.company + return self.rolling_stock.company() - def epoch(self): - return self.rolling_stock.epoch + def era(self): + return self.rolling_stock.era diff --git a/dcc/dcc/settings.py b/dcc/dcc/settings.py index bb9408c..3475115 100644 --- a/dcc/dcc/settings.py +++ b/dcc/dcc/settings.py @@ -137,7 +137,21 @@ DEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField' MEDIA_URL = 'media/' MEDIA_ROOT = os.path.join(BASE_DIR, 'media') -ROLLING_STOCK_TYPES = [ - ("engine", "Engine"), ("car", "Car"), - ("equipment", "Equipment"), ("other", "Other") +COUNTRIES_OVERRIDE = { + 'ZZ': "Freelance", +} + +DECODER_INTERFACES = [ + (1, "NEM651"), + (2, "NEM652"), + (3, "PluX"), + (4, "21MTC"), + (5, "Next18/Next18S") +] + +ROLLING_STOCK_TYPES = [ + ("engine", "Engine"), + ("car", "Car"), + ("equipment", "Equipment"), + ("other", "Other") ] diff --git a/dcc/dcc/urls.py b/dcc/dcc/urls.py index 955fc55..fb5b669 100644 --- a/dcc/dcc/urls.py +++ b/dcc/dcc/urls.py @@ -21,6 +21,8 @@ from django.urls import include, path from roster import urls as roster_urls from driver import urls as driver_urls +admin.site.site_header = "Trains assets manager" + urlpatterns = [ path('ht/', include('health_check.urls')), path('admin/', admin.site.urls), @@ -31,7 +33,7 @@ urlpatterns = [ # if settings.DEBUG: # from django.views.generic import TemplateView # from rest_framework.schemas import get_schema_view -# +# # urlpatterns += [ # path('swagger/', TemplateView.as_view( # template_name='swagger.html', diff --git a/dcc/metadata/admin.py b/dcc/metadata/admin.py index 1c3f400..119d02b 100644 --- a/dcc/metadata/admin.py +++ b/dcc/metadata/admin.py @@ -1,6 +1,6 @@ from django.contrib import admin from metadata.models import ( - Decoder, Manufacturer, Company, Tag, RollingStockType) + Decoder, Scale, Manufacturer, Company, Tag, RollingStockType) @admin.register(Decoder) @@ -10,6 +10,12 @@ class DecoderAdmin(admin.ModelAdmin): list_filter = ('manufacturer', 'interface') +@admin.register(Scale) +class ScaleAdmin(admin.ModelAdmin): + list_display = ('scale', 'ratio', 'gauge') + list_filter = ('ratio', 'gauge') + + @admin.register(Company) class CompanyAdmin(admin.ModelAdmin): readonly_fields = ('logo_thumbnail',) diff --git a/dcc/metadata/migrations/0001_initial.py b/dcc/metadata/migrations/0001_initial.py index c3e1d3c..09ced5a 100644 --- a/dcc/metadata/migrations/0001_initial.py +++ b/dcc/metadata/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.2 on 2022-04-01 20:25 +# Generated by Django 4.0.2 on 2022-04-02 14:25 from django.db import migrations, models import django.db.models.deletion @@ -17,7 +17,8 @@ class Migration(migrations.Migration): name='Company', fields=[ ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('name', models.CharField(max_length=128, unique=True)), + ('name', models.CharField(max_length=64, unique=True)), + ('extended_name', models.CharField(max_length=128, unique=True)), ('country', django_countries.fields.CountryField(max_length=2)), ('logo', models.ImageField(blank=True, null=True, upload_to='images/')), ], diff --git a/dcc/metadata/migrations/0002_scale_manufacturer_website_and_more.py b/dcc/metadata/migrations/0002_scale_manufacturer_website_and_more.py new file mode 100644 index 0000000..8e289ad --- /dev/null +++ b/dcc/metadata/migrations/0002_scale_manufacturer_website_and_more.py @@ -0,0 +1,32 @@ +# Generated by Django 4.0.2 on 2022-04-02 16:18 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('metadata', '0001_initial'), + ] + + operations = [ + migrations.CreateModel( + name='Scale', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('scale', models.CharField(max_length=32, unique=True)), + ('ratio', models.CharField(blank=True, max_length=16)), + ('gauge', models.CharField(blank=True, max_length=16)), + ], + ), + migrations.AddField( + model_name='manufacturer', + name='website', + field=models.URLField(blank=True), + ), + migrations.AlterField( + model_name='company', + name='extended_name', + field=models.CharField(blank=True, max_length=128), + ), + ] diff --git a/dcc/metadata/models.py b/dcc/metadata/models.py index 5243bf4..47d6576 100644 --- a/dcc/metadata/models.py +++ b/dcc/metadata/models.py @@ -8,6 +8,7 @@ from dcc.utils import get_image_preview, slugify class Manufacturer(models.Model): name = models.CharField(max_length=128, unique=True) + website = models.URLField(blank=True) logo = models.ImageField( upload_to='images/', null=True, @@ -22,7 +23,8 @@ class Manufacturer(models.Model): class Company(models.Model): - name = models.CharField(max_length=128, unique=True) + name = models.CharField(max_length=64, unique=True) + extended_name = models.CharField(max_length=128, blank=True) country = CountryField() logo = models.ImageField( upload_to='images/', @@ -41,20 +43,13 @@ class Company(models.Model): class Decoder(models.Model): - class Interface(models.IntegerChoices): - NEM651 = 1, "NEM651" - NEM652 = 2, "NEM652" - NEM658 = 3, "PluX" - NEM660 = 4, "21MTC" - NEM662 = 5, "Next18/Next18S" - name = models.CharField(max_length=128, unique=True) manufacturer = models.ForeignKey( Manufacturer, on_delete=models.CASCADE) version = models.CharField(max_length=64, blank=True) interface = models.PositiveSmallIntegerField( - choices=Interface.choices, + choices=settings.DECODER_INTERFACES, null=True, blank=True ) @@ -71,6 +66,15 @@ class Decoder(models.Model): image_thumbnail.short_description = "Preview" +class Scale(models.Model): + scale = models.CharField(max_length=32, unique=True) + ratio = models.CharField(max_length=16, blank=True) + gauge = models.CharField(max_length=16, blank=True) + + def __str__(self): + return str(self.scale) + + class Tag(models.Model): name = models.CharField(max_length=128, unique=True) slug = models.CharField(max_length=128, unique=True) diff --git a/dcc/roster/admin.py b/dcc/roster/admin.py index cada57d..f295015 100644 --- a/dcc/roster/admin.py +++ b/dcc/roster/admin.py @@ -1,7 +1,13 @@ from django.contrib import admin from roster.models import ( - RollingStockImage, RollingStockDocument, Engine, Car, - Equipment, Other) + RollingClass, RollingStock, RollingStockImage, RollingStockDocument) + + +@admin.register(RollingClass) +class RollingClass(admin.ModelAdmin): + list_display = ('__str__', 'type', 'company') + list_filter = ('type', 'company') + search_fields = list_display class RollingStockDocInline(admin.TabularInline): @@ -17,50 +23,32 @@ class RollingStockImageInline(admin.TabularInline): readonly_fields = ('image_thumbnail',) +@admin.register(RollingStock) class RollingStockAdmin(admin.ModelAdmin): inlines = (RollingStockImageInline, RollingStockDocInline) - readonly_fields = ('creation_time', 'updated_time',) - list_display = ('identifier', 'manufacturer', 'sku', 'company') - list_filter = list_display + readonly_fields = ('creation_time', 'updated_time') + list_display = ( + '__str__', 'manufacturer', 'scale', 'sku', 'company', 'country') + list_filter = ('manufacturer', 'scale') search_fields = list_display fieldsets = ( (None, { - 'fields': ('identifier', - 'type', - 'tags', + 'fields': ('rolling_class', + 'road_number', 'manufacturer', + 'scale', 'sku', 'decoder', 'address', - 'company', - 'epoch', + 'era', 'production_year', 'purchase_date', - 'notes') + 'notes', + 'tags') }), ('Audit', { 'classes': ('collapse',), 'fields': ('creation_time', 'updated_time',) }), ) - - -@admin.register(Engine) -class Engine(RollingStockAdmin): - list_display = ('identifier', 'address', 'manufacturer', 'sku', 'company') - - -@admin.register(Car) -class Car(RollingStockAdmin): - pass - - -@admin.register(Equipment) -class Equipment(RollingStockAdmin): - pass - - -@admin.register(Other) -class Other(RollingStockAdmin): - pass diff --git a/dcc/roster/migrations/0001_initial.py b/dcc/roster/migrations/0001_initial.py index 2152455..9ad5c6e 100644 --- a/dcc/roster/migrations/0001_initial.py +++ b/dcc/roster/migrations/0001_initial.py @@ -1,4 +1,4 @@ -# Generated by Django 4.0.2 on 2022-04-01 20:25 +# Generated by Django 4.0.2 on 2022-04-02 14:25 from django.db import migrations, models import django.db.models.deletion @@ -14,12 +14,21 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='Class', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('identifier', models.CharField(max_length=128)), + ('company', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.company')), + ('type', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.rollingstocktype')), + ], + ), migrations.CreateModel( name='RollingStock', fields=[ ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), - ('identifier', models.CharField(max_length=128)), - ('address', models.SmallIntegerField(blank=True, default=3, null=True)), + ('road_number', models.CharField(max_length=128)), + ('address', models.SmallIntegerField(blank=True, default=None, null=True)), ('sku', models.CharField(blank=True, max_length=32)), ('epoch', models.CharField(blank=True, max_length=32)), ('production_year', models.SmallIntegerField(blank=True, null=True)), @@ -27,14 +36,13 @@ class Migration(migrations.Migration): ('notes', models.TextField(blank=True)), ('creation_time', models.DateTimeField(auto_now_add=True)), ('updated_time', models.DateTimeField(auto_now=True)), - ('company', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.company')), + ('_class', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='roster.class')), ('decoder', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.decoder')), ('manufacturer', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.manufacturer')), ('tags', models.ManyToManyField(blank=True, related_name='rolling_stock', to='metadata.Tag')), ], options={ 'verbose_name_plural': 'Rolling stock', - 'ordering': ['address', 'identifier'], }, ), migrations.CreateModel( @@ -60,36 +68,4 @@ class Migration(migrations.Migration): 'unique_together': {('rolling_stock', 'file')}, }, ), - migrations.CreateModel( - name='Other', - fields=[ - ('rollingstock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='roster.rollingstock')), - ('type', models.ForeignKey(blank=True, limit_choices_to={'category': 'other'}, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.rollingstocktype')), - ], - bases=('roster.rollingstock',), - ), - migrations.CreateModel( - name='Equipment', - fields=[ - ('rollingstock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='roster.rollingstock')), - ('type', models.ForeignKey(blank=True, limit_choices_to={'category': 'equipment'}, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.rollingstocktype')), - ], - bases=('roster.rollingstock',), - ), - migrations.CreateModel( - name='Engine', - fields=[ - ('rollingstock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='roster.rollingstock')), - ('type', models.ForeignKey(blank=True, limit_choices_to={'category': 'engine'}, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.rollingstocktype')), - ], - bases=('roster.rollingstock',), - ), - migrations.CreateModel( - name='Car', - fields=[ - ('rollingstock_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='roster.rollingstock')), - ('type', models.ForeignKey(blank=True, limit_choices_to={'category': 'car'}, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.rollingstocktype')), - ], - bases=('roster.rollingstock',), - ), ] diff --git a/dcc/roster/migrations/0002_alter_rollingstock_address.py b/dcc/roster/migrations/0002_alter_rollingstock_address.py deleted file mode 100644 index 6d4d23d..0000000 --- a/dcc/roster/migrations/0002_alter_rollingstock_address.py +++ /dev/null @@ -1,18 +0,0 @@ -# Generated by Django 4.0.2 on 2022-04-01 20:32 - -from django.db import migrations, models - - -class Migration(migrations.Migration): - - dependencies = [ - ('roster', '0001_initial'), - ] - - operations = [ - migrations.AlterField( - model_name='rollingstock', - name='address', - field=models.SmallIntegerField(blank=True, default=None, null=True), - ), - ] diff --git a/dcc/roster/migrations/0002_rename_class_rollingclass_alter_rollingclass_options_and_more.py b/dcc/roster/migrations/0002_rename_class_rollingclass_alter_rollingclass_options_and_more.py new file mode 100644 index 0000000..f1cbb85 --- /dev/null +++ b/dcc/roster/migrations/0002_rename_class_rollingclass_alter_rollingclass_options_and_more.py @@ -0,0 +1,48 @@ +# Generated by Django 4.0.2 on 2022-04-02 16:18 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('metadata', '0002_scale_manufacturer_website_and_more'), + ('roster', '0001_initial'), + ] + + operations = [ + migrations.RenameModel( + old_name='Class', + new_name='RollingClass', + ), + migrations.AlterModelOptions( + name='rollingclass', + options={'ordering': ['company', 'identifier'], 'verbose_name': 'Class', 'verbose_name_plural': 'Classes'}, + ), + migrations.AlterModelOptions( + name='rollingstock', + options={'ordering': ['rolling_class', 'road_number'], 'verbose_name_plural': 'Rolling stock'}, + ), + migrations.RenameField( + model_name='rollingstock', + old_name='epoch', + new_name='era', + ), + migrations.RemoveField( + model_name='rollingstock', + name='_class', + ), + migrations.AddField( + model_name='rollingstock', + name='rolling_class', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='roster.rollingclass', verbose_name='Class'), + preserve_default=False, + ), + migrations.AddField( + model_name='rollingstock', + name='scale', + field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='metadata.scale'), + preserve_default=False, + ), + ] diff --git a/dcc/roster/migrations/0003_consistitem_consist.py b/dcc/roster/migrations/0003_consistitem_consist.py deleted file mode 100644 index 6017596..0000000 --- a/dcc/roster/migrations/0003_consistitem_consist.py +++ /dev/null @@ -1,36 +0,0 @@ -# Generated by Django 4.0.2 on 2022-04-02 09:09 - -from django.db import migrations, models -import django.db.models.deletion -import uuid - - -class Migration(migrations.Migration): - - dependencies = [ - ('metadata', '0001_initial'), - ('roster', '0002_alter_rollingstock_address'), - ] - - operations = [ - migrations.CreateModel( - name='ConsistItem', - fields=[ - ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('rolling_stock', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='roster.rollingstock')), - ], - ), - migrations.CreateModel( - name='Consist', - fields=[ - ('uuid', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), - ('identifier', models.CharField(max_length=128)), - ('epoch', models.CharField(blank=True, max_length=32)), - ('notes', models.TextField(blank=True)), - ('creation_time', models.DateTimeField(auto_now_add=True)), - ('updated_time', models.DateTimeField(auto_now=True)), - ('company', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='metadata.company')), - ('tags', models.ManyToManyField(blank=True, related_name='consist', to='metadata.Tag')), - ], - ), - ] diff --git a/dcc/roster/migrations/0004_consistitem_consist.py b/dcc/roster/migrations/0004_consistitem_consist.py deleted file mode 100644 index 2cf1d18..0000000 --- a/dcc/roster/migrations/0004_consistitem_consist.py +++ /dev/null @@ -1,20 +0,0 @@ -# Generated by Django 4.0.2 on 2022-04-02 09:13 - -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('roster', '0003_consistitem_consist'), - ] - - operations = [ - migrations.AddField( - model_name='consistitem', - name='consist', - field=models.ForeignKey(default=None, on_delete=django.db.models.deletion.CASCADE, to='roster.consist'), - preserve_default=False, - ), - ] diff --git a/dcc/roster/migrations/0005_remove_consistitem_consist_and_more.py b/dcc/roster/migrations/0005_remove_consistitem_consist_and_more.py deleted file mode 100644 index d4be8cc..0000000 --- a/dcc/roster/migrations/0005_remove_consistitem_consist_and_more.py +++ /dev/null @@ -1,27 +0,0 @@ -# Generated by Django 4.0.2 on 2022-04-02 09:21 - -from django.db import migrations - - -class Migration(migrations.Migration): - - dependencies = [ - ('roster', '0004_consistitem_consist'), - ] - - operations = [ - migrations.RemoveField( - model_name='consistitem', - name='consist', - ), - migrations.RemoveField( - model_name='consistitem', - name='rolling_stock', - ), - migrations.DeleteModel( - name='Consist', - ), - migrations.DeleteModel( - name='ConsistItem', - ), - ] diff --git a/dcc/roster/models.py b/dcc/roster/models.py index fd062f1..2875f3c 100644 --- a/dcc/roster/models.py +++ b/dcc/roster/models.py @@ -1,12 +1,13 @@ import os from uuid import uuid4 from django.db import models +from django.urls import reverse # from django.core.files.storage import FileSystemStorage # from django.dispatch import receiver from dcc.utils import get_image_preview from metadata.models import ( - Manufacturer, Decoder, Company, Tag, RollingStockType) + Scale, Manufacturer, Decoder, Company, Tag, RollingStockType) # class OverwriteMixin(FileSystemStorage): # def get_available_name(self, name, max_length): @@ -14,67 +15,66 @@ from metadata.models import ( # return name -class RollingStock(models.Model): - uuid = models.UUIDField( - primary_key=True, default=uuid4, - editable=False) +class RollingClass(models.Model): identifier = models.CharField(max_length=128, unique=False) - tags = models.ManyToManyField( - Tag, - related_name='rolling_stock', - blank=True) - address = models.SmallIntegerField(default=None, null=True, blank=True) - manufacturer = models.ForeignKey( - Manufacturer, on_delete=models.CASCADE, - null=True, blank=True) - sku = models.CharField(max_length=32, blank=True) - decoder = models.ForeignKey( - Decoder, on_delete=models.CASCADE, + type = models.ForeignKey( + RollingStockType, on_delete=models.CASCADE, null=True, blank=True) company = models.ForeignKey( Company, on_delete=models.CASCADE, null=True, blank=True) - epoch = models.CharField(max_length=32, blank=True) + + class Meta: + ordering = ['company', 'identifier'] + verbose_name = "Class" + verbose_name_plural = "Classes" + + def __str__(self): + return "{0} {1}".format(self.company, self.identifier) + + +class RollingStock(models.Model): + uuid = models.UUIDField( + primary_key=True, default=uuid4, + editable=False) + rolling_class = models.ForeignKey( + RollingClass, on_delete=models.CASCADE, + null=False, blank=False, + verbose_name="Class") + road_number = models.CharField(max_length=128, unique=False) + manufacturer = models.ForeignKey( + Manufacturer, on_delete=models.CASCADE, + null=True, blank=True) + scale = models.ForeignKey( + Scale, on_delete=models.CASCADE) + sku = models.CharField(max_length=32, blank=True) + decoder = models.ForeignKey( + Decoder, on_delete=models.CASCADE, + null=True, blank=True) + address = models.SmallIntegerField(default=None, null=True, blank=True) + era = models.CharField(max_length=32, blank=True) production_year = models.SmallIntegerField(null=True, blank=True) purchase_date = models.DateField(null=True, blank=True) notes = models.TextField(blank=True) + tags = models.ManyToManyField( + Tag, + related_name='rolling_stock', + blank=True) creation_time = models.DateTimeField(auto_now_add=True) updated_time = models.DateTimeField(auto_now=True) class Meta: - ordering = ['address', 'identifier'] + ordering = ['rolling_class', 'road_number'] verbose_name_plural = "Rolling stock" def __str__(self): - return "{0} {1}".format(self.manufacturer, self.identifier) + return "{0} {1}".format(self.rolling_class, self.road_number) + def country(self): + return str(self.rolling_class.company.country) -class Engine(RollingStock): - type = models.ForeignKey( - RollingStockType, on_delete=models.CASCADE, - limit_choices_to={'category': 'engine'}, - null=True, blank=True) - - -class Car(RollingStock): - type = models.ForeignKey( - RollingStockType, on_delete=models.CASCADE, - limit_choices_to={'category': 'car'}, - null=True, blank=True) - - -class Equipment(RollingStock): - type = models.ForeignKey( - RollingStockType, on_delete=models.CASCADE, - limit_choices_to={'category': 'equipment'}, - null=True, blank=True) - - -class Other(RollingStock): - type = models.ForeignKey( - RollingStockType, on_delete=models.CASCADE, - limit_choices_to={'category': 'other'}, - null=True, blank=True) + def company(self): + return str(self.rolling_class.company) class RollingStockDocument(models.Model):