mirror of
https://github.com/daniviga/django-ram.git
synced 2025-08-04 13:17:50 +02:00
Add documents to decoders (#22)
* Add decoder documents support * Use abstract model for Documents * Increase version * Code cleanup
This commit is contained in:
@@ -4,6 +4,7 @@ from adminsortable2.admin import SortableAdminMixin
|
||||
from metadata.models import (
|
||||
Property,
|
||||
Decoder,
|
||||
DecoderDocument,
|
||||
Scale,
|
||||
Manufacturer,
|
||||
Company,
|
||||
@@ -17,8 +18,16 @@ class PropertyAdmin(admin.ModelAdmin):
|
||||
search_fields = ("name",)
|
||||
|
||||
|
||||
class DecoderDocInline(admin.TabularInline):
|
||||
model = DecoderDocument
|
||||
min_num = 0
|
||||
extra = 0
|
||||
classes = ["collapse"]
|
||||
|
||||
|
||||
@admin.register(Decoder)
|
||||
class DecoderAdmin(admin.ModelAdmin):
|
||||
inlines = (DecoderDocInline,)
|
||||
readonly_fields = ("image_thumbnail",)
|
||||
list_display = ("__str__", "sound")
|
||||
list_filter = ("manufacturer", "sound")
|
||||
|
@@ -0,0 +1,59 @@
|
||||
# Generated by Django 4.2 on 2023-09-30 21:54
|
||||
|
||||
from django.db import migrations, models
|
||||
import django.db.models.deletion
|
||||
import ram.utils
|
||||
|
||||
|
||||
class Migration(migrations.Migration):
|
||||
|
||||
dependencies = [
|
||||
("metadata", "0011_company_slug_and_more"),
|
||||
]
|
||||
|
||||
operations = [
|
||||
migrations.AlterField(
|
||||
model_name="decoder",
|
||||
name="manufacturer",
|
||||
field=models.ForeignKey(
|
||||
limit_choices_to={"category": "accessory"},
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
to="metadata.manufacturer",
|
||||
),
|
||||
),
|
||||
migrations.CreateModel(
|
||||
name="DecoderDocument",
|
||||
fields=[
|
||||
(
|
||||
"id",
|
||||
models.BigAutoField(
|
||||
auto_created=True,
|
||||
primary_key=True,
|
||||
serialize=False,
|
||||
verbose_name="ID",
|
||||
),
|
||||
),
|
||||
("description", models.CharField(blank=True, max_length=128)),
|
||||
(
|
||||
"file",
|
||||
models.FileField(
|
||||
blank=True,
|
||||
null=True,
|
||||
storage=ram.utils.DeduplicatedStorage(),
|
||||
upload_to="files/",
|
||||
),
|
||||
),
|
||||
(
|
||||
"decoder",
|
||||
models.ForeignKey(
|
||||
on_delete=django.db.models.deletion.CASCADE,
|
||||
related_name="document",
|
||||
to="metadata.decoder",
|
||||
),
|
||||
),
|
||||
],
|
||||
options={
|
||||
"unique_together": {("decoder", "file")},
|
||||
},
|
||||
),
|
||||
]
|
@@ -1,11 +1,10 @@
|
||||
from urllib.parse import quote
|
||||
|
||||
from django.db import models
|
||||
from django.urls import reverse
|
||||
from django.conf import settings
|
||||
from django.dispatch.dispatcher import receiver
|
||||
from django_countries.fields import CountryField
|
||||
|
||||
from ram.models import Document
|
||||
from ram.utils import DeduplicatedStorage, get_image_preview, slugify
|
||||
|
||||
|
||||
@@ -88,7 +87,7 @@ class Decoder(models.Model):
|
||||
manufacturer = models.ForeignKey(
|
||||
Manufacturer,
|
||||
on_delete=models.CASCADE,
|
||||
limit_choices_to={"category": "model"},
|
||||
limit_choices_to={"category": "accessory"},
|
||||
)
|
||||
version = models.CharField(max_length=64, blank=True)
|
||||
sound = models.BooleanField(default=False)
|
||||
@@ -105,6 +104,15 @@ class Decoder(models.Model):
|
||||
image_thumbnail.short_description = "Preview"
|
||||
|
||||
|
||||
class DecoderDocument(Document):
|
||||
decoder = models.ForeignKey(
|
||||
Decoder, on_delete=models.CASCADE, related_name="document"
|
||||
)
|
||||
|
||||
class Meta:
|
||||
unique_together = ("decoder", "file")
|
||||
|
||||
|
||||
class Scale(models.Model):
|
||||
scale = models.CharField(max_length=32, unique=True)
|
||||
slug = models.CharField(max_length=32, unique=True, editable=False)
|
||||
@@ -167,7 +175,6 @@ class Tag(models.Model):
|
||||
)
|
||||
|
||||
|
||||
|
||||
@receiver(models.signals.pre_save, sender=Manufacturer)
|
||||
@receiver(models.signals.pre_save, sender=Company)
|
||||
@receiver(models.signals.pre_save, sender=Scale)
|
||||
|
Reference in New Issue
Block a user