mirror of
https://github.com/daniviga/django-ram.git
synced 2025-08-04 13:17:50 +02:00
Add support for generic documents (admin only) (#44)
* Add support for generic documents * Add publish / unpublish actions * Minor improvements to models properties
This commit is contained in:
@@ -263,10 +263,6 @@ class CatalogAdmin(SortableAdminBase, admin.ModelAdmin):
|
|||||||
)
|
)
|
||||||
return form
|
return form
|
||||||
|
|
||||||
@admin.display(description="Scales")
|
|
||||||
def get_scales(self, obj):
|
|
||||||
return "/".join(s.scale for s in obj.scales.all())
|
|
||||||
|
|
||||||
def download_csv(modeladmin, request, queryset):
|
def download_csv(modeladmin, request, queryset):
|
||||||
header = [
|
header = [
|
||||||
"Catalog",
|
"Catalog",
|
||||||
@@ -292,10 +288,10 @@ class CatalogAdmin(SortableAdminBase, admin.ModelAdmin):
|
|||||||
for property in obj.property.all()
|
for property in obj.property.all()
|
||||||
)
|
)
|
||||||
data.append([
|
data.append([
|
||||||
obj.__str__,
|
obj.__str__(),
|
||||||
obj.manufacturer.name,
|
obj.manufacturer.name,
|
||||||
obj.years,
|
obj.years,
|
||||||
obj.get_scales,
|
obj.get_scales(),
|
||||||
obj.ISBN,
|
obj.ISBN,
|
||||||
dict(settings.LANGUAGES)[obj.language],
|
dict(settings.LANGUAGES)[obj.language],
|
||||||
obj.number_of_pages,
|
obj.number_of_pages,
|
||||||
|
@@ -35,6 +35,7 @@ class Author(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.last_name}, {self.first_name}"
|
return f"{self.last_name}, {self.first_name}"
|
||||||
|
|
||||||
|
@property
|
||||||
def short_name(self):
|
def short_name(self):
|
||||||
return f"{self.last_name} {self.first_name[0]}."
|
return f"{self.last_name} {self.first_name[0]}."
|
||||||
|
|
||||||
@@ -131,7 +132,7 @@ class Book(BaseBook):
|
|||||||
|
|
||||||
@property
|
@property
|
||||||
def authors_list(self):
|
def authors_list(self):
|
||||||
return ", ".join(a.short_name() for a in self.authors.all())
|
return ", ".join(a.short_name for a in self.authors.all())
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return reverse(
|
return reverse(
|
||||||
@@ -152,7 +153,7 @@ class Catalog(BaseBook):
|
|||||||
ordering = ["manufacturer", "publication_year"]
|
ordering = ["manufacturer", "publication_year"]
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
scales = self.get_scales
|
scales = self.get_scales()
|
||||||
return "%s %s %s" % (self.manufacturer.name, self.years, scales)
|
return "%s %s %s" % (self.manufacturer.name, self.years, scales)
|
||||||
|
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
@@ -161,6 +162,6 @@ class Catalog(BaseBook):
|
|||||||
kwargs={"selector": "catalog", "uuid": self.uuid}
|
kwargs={"selector": "catalog", "uuid": self.uuid}
|
||||||
)
|
)
|
||||||
|
|
||||||
@property
|
|
||||||
def get_scales(self):
|
def get_scales(self):
|
||||||
return "/".join([s.scale for s in self.scales.all()])
|
return "/".join([s.scale for s in self.scales.all()])
|
||||||
|
get_scales.short_description = "Scales"
|
||||||
|
@@ -79,15 +79,19 @@ class ConsistItem(models.Model):
|
|||||||
def preview(self):
|
def preview(self):
|
||||||
return self.rolling_stock.image.first().image_thumbnail(100)
|
return self.rolling_stock.image.first().image_thumbnail(100)
|
||||||
|
|
||||||
|
@property
|
||||||
def type(self):
|
def type(self):
|
||||||
return self.rolling_stock.rolling_class.type
|
return self.rolling_stock.rolling_class.type
|
||||||
|
|
||||||
|
@property
|
||||||
def address(self):
|
def address(self):
|
||||||
return self.rolling_stock.address
|
return self.rolling_stock.address
|
||||||
|
|
||||||
|
@property
|
||||||
def company(self):
|
def company(self):
|
||||||
return self.rolling_stock.company()
|
return self.rolling_stock.company
|
||||||
|
|
||||||
|
@property
|
||||||
def era(self):
|
def era(self):
|
||||||
return self.rolling_stock.era
|
return self.rolling_stock.era
|
||||||
|
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
from django.contrib import admin
|
from django.contrib import admin
|
||||||
from adminsortable2.admin import SortableAdminMixin
|
from adminsortable2.admin import SortableAdminMixin
|
||||||
|
|
||||||
|
from ram.admin import publish, unpublish
|
||||||
from metadata.models import (
|
from metadata.models import (
|
||||||
Property,
|
Property,
|
||||||
Decoder,
|
Decoder,
|
||||||
@@ -10,6 +11,7 @@ from metadata.models import (
|
|||||||
Company,
|
Company,
|
||||||
Tag,
|
Tag,
|
||||||
RollingStockType,
|
RollingStockType,
|
||||||
|
GenericDocument,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
@@ -70,3 +72,20 @@ class RollingStockTypeAdmin(SortableAdminMixin, admin.ModelAdmin):
|
|||||||
list_display = ("__str__",)
|
list_display = ("__str__",)
|
||||||
list_filter = ("type", "category")
|
list_filter = ("type", "category")
|
||||||
search_fields = ("type", "category")
|
search_fields = ("type", "category")
|
||||||
|
|
||||||
|
|
||||||
|
@admin.register(GenericDocument)
|
||||||
|
class GenericDocumentAdmin(admin.ModelAdmin):
|
||||||
|
readonly_fields = ("size",)
|
||||||
|
list_display = (
|
||||||
|
"__str__",
|
||||||
|
"description",
|
||||||
|
"private",
|
||||||
|
"size",
|
||||||
|
"download",
|
||||||
|
)
|
||||||
|
search_fields = (
|
||||||
|
"description",
|
||||||
|
"file",
|
||||||
|
)
|
||||||
|
actions = [publish, unpublish]
|
||||||
|
40
ram/metadata/migrations/0021_genericdocument.py
Normal file
40
ram/metadata/migrations/0021_genericdocument.py
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Generated by Django 5.1.4 on 2025-01-17 09:31
|
||||||
|
|
||||||
|
import ram.utils
|
||||||
|
from django.db import migrations, models
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
("metadata", "0020_alter_decoderdocument_unique_together_and_more"),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.CreateModel(
|
||||||
|
name="GenericDocument",
|
||||||
|
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(
|
||||||
|
storage=ram.utils.DeduplicatedStorage(), upload_to="files/"
|
||||||
|
),
|
||||||
|
),
|
||||||
|
("private", models.BooleanField(default=False)),
|
||||||
|
("tags", models.ManyToManyField(blank=True, to="metadata.tag")),
|
||||||
|
],
|
||||||
|
options={
|
||||||
|
"verbose_name_plural": "Generic Documents",
|
||||||
|
},
|
||||||
|
),
|
||||||
|
]
|
@@ -236,6 +236,13 @@ class Tag(models.Model):
|
|||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
class GenericDocument(Document):
|
||||||
|
tags = models.ManyToManyField(Tag, blank=True)
|
||||||
|
|
||||||
|
class Meta:
|
||||||
|
verbose_name_plural = "Generic Documents"
|
||||||
|
|
||||||
|
|
||||||
@receiver(models.signals.pre_save, sender=Manufacturer)
|
@receiver(models.signals.pre_save, sender=Manufacturer)
|
||||||
@receiver(models.signals.pre_save, sender=Company)
|
@receiver(models.signals.pre_save, sender=Company)
|
||||||
@receiver(models.signals.pre_save, sender=Scale)
|
@receiver(models.signals.pre_save, sender=Scale)
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
from ram.utils import git_suffix
|
from ram.utils import git_suffix
|
||||||
|
|
||||||
__version__ = "0.15.6"
|
__version__ = "0.16.0"
|
||||||
__version__ += git_suffix(__file__)
|
__version__ += git_suffix(__file__)
|
||||||
|
@@ -37,9 +37,19 @@ class Document(models.Model):
|
|||||||
def __str__(self):
|
def __str__(self):
|
||||||
return "{0}".format(os.path.basename(self.file.name))
|
return "{0}".format(os.path.basename(self.file.name))
|
||||||
|
|
||||||
|
@property
|
||||||
def filename(self):
|
def filename(self):
|
||||||
return self.__str__()
|
return self.__str__()
|
||||||
|
|
||||||
|
@property
|
||||||
|
def size(self):
|
||||||
|
kb = self.file.size / 1024.0
|
||||||
|
if kb < 1024:
|
||||||
|
size = "{0} KB".format(round(kb))
|
||||||
|
else:
|
||||||
|
size = "{0} MB".format(round(kb / 1024.0))
|
||||||
|
return size
|
||||||
|
|
||||||
def download(self):
|
def download(self):
|
||||||
return mark_safe(
|
return mark_safe(
|
||||||
'<a href="{0}" target="_blank">Link</a>'.format(self.file.url)
|
'<a href="{0}" target="_blank">Link</a>'.format(self.file.url)
|
||||||
|
@@ -72,11 +72,13 @@ class RollingStockJournalInline(admin.TabularInline):
|
|||||||
|
|
||||||
@admin.register(RollingStockDocument)
|
@admin.register(RollingStockDocument)
|
||||||
class RollingStockDocumentAdmin(admin.ModelAdmin):
|
class RollingStockDocumentAdmin(admin.ModelAdmin):
|
||||||
|
readonly_fields = ("size",)
|
||||||
list_display = (
|
list_display = (
|
||||||
"__str__",
|
"__str__",
|
||||||
"rolling_stock",
|
"rolling_stock",
|
||||||
"description",
|
"description",
|
||||||
"private",
|
"private",
|
||||||
|
"size",
|
||||||
"download",
|
"download",
|
||||||
)
|
)
|
||||||
search_fields = (
|
search_fields = (
|
||||||
@@ -213,6 +215,7 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin):
|
|||||||
|
|
||||||
def download_csv(modeladmin, request, queryset):
|
def download_csv(modeladmin, request, queryset):
|
||||||
header = [
|
header = [
|
||||||
|
"Name",
|
||||||
"Company",
|
"Company",
|
||||||
"Identifier",
|
"Identifier",
|
||||||
"Road Number",
|
"Road Number",
|
||||||
@@ -239,6 +242,7 @@ class RollingStockAdmin(SortableAdminBase, admin.ModelAdmin):
|
|||||||
for property in obj.property.all()
|
for property in obj.property.all()
|
||||||
)
|
)
|
||||||
data.append([
|
data.append([
|
||||||
|
obj.__str__(),
|
||||||
obj.rolling_class.company.name,
|
obj.rolling_class.company.name,
|
||||||
obj.rolling_class.identifier,
|
obj.rolling_class.identifier,
|
||||||
obj.road_number,
|
obj.road_number,
|
||||||
|
@@ -125,9 +125,11 @@ class RollingStock(BaseModel):
|
|||||||
def preview(self):
|
def preview(self):
|
||||||
return self.image.first().image_thumbnail(350)
|
return self.image.first().image_thumbnail(350)
|
||||||
|
|
||||||
|
@property
|
||||||
def country(self):
|
def country(self):
|
||||||
return str(self.rolling_class.company.country)
|
return str(self.rolling_class.company.country)
|
||||||
|
|
||||||
|
@property
|
||||||
def company(self):
|
def company(self):
|
||||||
return str(self.rolling_class.company)
|
return str(self.rolling_class.company)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user