mirror of
https://github.com/daniviga/django-ram.git
synced 2025-08-04 13:17:50 +02:00
Rename DCC project into RAM
RAM: Railroad Assets Manager
This commit is contained in:
0
ram/metadata/__init__.py
Normal file
0
ram/metadata/__init__.py
Normal file
60
ram/metadata/admin.py
Normal file
60
ram/metadata/admin.py
Normal file
@@ -0,0 +1,60 @@
|
||||
from django.contrib import admin
|
||||
from metadata.models import (
|
||||
Property,
|
||||
Decoder,
|
||||
Scale,
|
||||
Manufacturer,
|
||||
Company,
|
||||
Tag,
|
||||
RollingStockType,
|
||||
)
|
||||
|
||||
|
||||
@admin.register(Property)
|
||||
class PropertyAdmin(admin.ModelAdmin):
|
||||
search_fields = ("name",)
|
||||
|
||||
|
||||
@admin.register(Decoder)
|
||||
class DecoderAdmin(admin.ModelAdmin):
|
||||
readonly_fields = ("image_thumbnail",)
|
||||
list_display = ("__str__", "interface")
|
||||
list_filter = ("manufacturer", "interface")
|
||||
search_fields = ("__str__",)
|
||||
|
||||
|
||||
@admin.register(Scale)
|
||||
class ScaleAdmin(admin.ModelAdmin):
|
||||
list_display = ("scale", "ratio", "gauge")
|
||||
list_filter = ("ratio", "gauge")
|
||||
search_fields = list_display
|
||||
|
||||
|
||||
@admin.register(Company)
|
||||
class CompanyAdmin(admin.ModelAdmin):
|
||||
readonly_fields = ("logo_thumbnail",)
|
||||
list_display = ("name", "country")
|
||||
list_filter = list_display
|
||||
search_fields = ("name",)
|
||||
|
||||
|
||||
@admin.register(Manufacturer)
|
||||
class ManufacturerAdmin(admin.ModelAdmin):
|
||||
readonly_fields = ("logo_thumbnail",)
|
||||
list_display = ("name", "category")
|
||||
list_filter = ("category",)
|
||||
search_fields = ("name",)
|
||||
|
||||
|
||||
@admin.register(Tag)
|
||||
class TagAdmin(admin.ModelAdmin):
|
||||
readonly_fields = ("slug",)
|
||||
list_display = ("name", "slug")
|
||||
search_fields = ("name",)
|
||||
|
||||
|
||||
@admin.register(RollingStockType)
|
||||
class RollingStockTypeAdmin(admin.ModelAdmin):
|
||||
list_display = ("__str__",)
|
||||
list_filter = ("type", "category")
|
||||
search_fields = list_display
|
6
ram/metadata/apps.py
Normal file
6
ram/metadata/apps.py
Normal file
@@ -0,0 +1,6 @@
|
||||
from django.apps import AppConfig
|
||||
|
||||
|
||||
class MetadataConfig(AppConfig):
|
||||
default_auto_field = "django.db.models.BigAutoField"
|
||||
name = "metadata"
|
98
ram/metadata/migrations/0001_initial.py
Normal file
98
ram/metadata/migrations/0001_initial.py
Normal file
@@ -0,0 +1,98 @@
|
||||
# Generated by Django 4.0.3 on 2022-04-07 09:25
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import django_countries.fields
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
initial = True
|
||||
|
||||
dependencies = [
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.CreateModel(
|
||||
name='Company',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=64, unique=True)),
|
||||
('extended_name', models.CharField(blank=True, max_length=128)),
|
||||
('country', django_countries.fields.CountryField(max_length=2)),
|
||||
('freelance', models.BooleanField(default=False)),
|
||||
('logo', models.ImageField(blank=True, null=True, upload_to='images/')),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'Companies',
|
||||
'ordering': ['name'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Manufacturer',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=128, unique=True)),
|
||||
('category', models.CharField(choices=[('model', 'Model'), ('real', 'Real')], max_length=64)),
|
||||
('website', models.URLField(blank=True)),
|
||||
('logo', models.ImageField(blank=True, null=True, upload_to='images/')),
|
||||
],
|
||||
options={
|
||||
'ordering': ['category', 'name'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Property',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=128, unique=True)),
|
||||
],
|
||||
options={
|
||||
'verbose_name_plural': 'Properties',
|
||||
'ordering': ['name'],
|
||||
},
|
||||
),
|
||||
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)),
|
||||
],
|
||||
options={
|
||||
'ordering': ['scale'],
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Tag',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=128, unique=True)),
|
||||
('slug', models.CharField(max_length=128, unique=True)),
|
||||
],
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='RollingStockType',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('type', models.CharField(max_length=64)),
|
||||
('category', models.CharField(choices=[('engine', 'Engine'), ('car', 'Car'), ('railcar', 'Railcar'), ('equipment', 'Equipment'), ('other', 'Other')], max_length=64)),
|
||||
],
|
||||
options={
|
||||
'unique_together': {('category', 'type')},
|
||||
},
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name='Decoder',
|
||||
fields=[
|
||||
('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||
('name', models.CharField(max_length=128, unique=True)),
|
||||
('version', models.CharField(blank=True, max_length=64)),
|
||||
('interface', models.PositiveSmallIntegerField(blank=True, choices=[(1, 'NEM651'), (2, 'NEM652'), (3, 'PluX'), (4, '21MTC'), (5, 'Next18/Next18S')], null=True)),
|
||||
('sound', models.BooleanField(default=False)),
|
||||
('image', models.ImageField(blank=True, null=True, upload_to='images/')),
|
||||
('manufacturer', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='metadata.manufacturer')),
|
||||
],
|
||||
),
|
||||
]
|
0
ram/metadata/migrations/__init__.py
Normal file
0
ram/metadata/migrations/__init__.py
Normal file
114
ram/metadata/models.py
Normal file
114
ram/metadata/models.py
Normal file
@@ -0,0 +1,114 @@
|
||||
from django.db import models
|
||||
from django.conf import settings
|
||||
from django.dispatch.dispatcher import receiver
|
||||
from django_countries.fields import CountryField
|
||||
|
||||
from ram.utils import get_image_preview, slugify
|
||||
|
||||
|
||||
class Property(models.Model):
|
||||
name = models.CharField(max_length=128, unique=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = "Properties"
|
||||
ordering = ["name"]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
class Manufacturer(models.Model):
|
||||
name = models.CharField(max_length=128, unique=True)
|
||||
category = models.CharField(
|
||||
max_length=64, choices=settings.MANUFACTURER_TYPES
|
||||
)
|
||||
website = models.URLField(blank=True)
|
||||
logo = models.ImageField(upload_to="images/", null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
ordering = ["category", "name"]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def logo_thumbnail(self):
|
||||
return get_image_preview(self.logo.url)
|
||||
|
||||
logo_thumbnail.short_description = "Preview"
|
||||
|
||||
|
||||
class Company(models.Model):
|
||||
name = models.CharField(max_length=64, unique=True)
|
||||
extended_name = models.CharField(max_length=128, blank=True)
|
||||
country = CountryField()
|
||||
freelance = models.BooleanField(default=False)
|
||||
logo = models.ImageField(upload_to="images/", null=True, blank=True)
|
||||
|
||||
class Meta:
|
||||
verbose_name_plural = "Companies"
|
||||
ordering = ["name"]
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
def logo_thumbnail(self):
|
||||
return get_image_preview(self.logo.url)
|
||||
|
||||
logo_thumbnail.short_description = "Preview"
|
||||
|
||||
|
||||
class Decoder(models.Model):
|
||||
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=settings.DECODER_INTERFACES, null=True, blank=True
|
||||
)
|
||||
sound = models.BooleanField(default=False)
|
||||
image = models.ImageField(upload_to="images/", null=True, blank=True)
|
||||
|
||||
def __str__(self):
|
||||
return "{0} - {1}".format(self.manufacturer, self.name)
|
||||
|
||||
def image_thumbnail(self):
|
||||
return get_image_preview(self.image.url)
|
||||
|
||||
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)
|
||||
|
||||
class Meta:
|
||||
ordering = ["scale"]
|
||||
|
||||
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)
|
||||
|
||||
def __str__(self):
|
||||
return self.name
|
||||
|
||||
|
||||
@receiver(models.signals.pre_save, sender=Tag)
|
||||
def tag_pre_save(sender, instance, **kwargs):
|
||||
instance.slug = slugify(instance.name)
|
||||
|
||||
|
||||
class RollingStockType(models.Model):
|
||||
type = models.CharField(max_length=64)
|
||||
category = models.CharField(
|
||||
max_length=64, choices=settings.ROLLING_STOCK_TYPES
|
||||
)
|
||||
|
||||
class Meta(object):
|
||||
unique_together = ("category", "type")
|
||||
|
||||
def __str__(self):
|
||||
return "{0} {1}".format(self.type, self.category)
|
47
ram/metadata/serializers.py
Normal file
47
ram/metadata/serializers.py
Normal file
@@ -0,0 +1,47 @@
|
||||
from rest_framework import serializers
|
||||
from metadata.models import (
|
||||
RollingStockType,
|
||||
Scale,
|
||||
Manufacturer,
|
||||
Company,
|
||||
Decoder,
|
||||
Tag,
|
||||
)
|
||||
|
||||
|
||||
class RollingStockTypeSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = RollingStockType
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class ManufacturerSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Manufacturer
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class ScaleSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Scale
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class CompanySerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Company
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class DecoderSerializer(serializers.ModelSerializer):
|
||||
manufacturer = serializers.StringRelatedField()
|
||||
|
||||
class Meta:
|
||||
model = Decoder
|
||||
fields = "__all__"
|
||||
|
||||
|
||||
class TagSerializer(serializers.ModelSerializer):
|
||||
class Meta:
|
||||
model = Tag
|
||||
fields = "__all__"
|
3
ram/metadata/tests.py
Normal file
3
ram/metadata/tests.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.test import TestCase
|
||||
|
||||
# Create your tests here.
|
3
ram/metadata/views.py
Normal file
3
ram/metadata/views.py
Normal file
@@ -0,0 +1,3 @@
|
||||
from django.shortcuts import render
|
||||
|
||||
# Create your views here.
|
Reference in New Issue
Block a user