This repository has been archived on 2023-05-31. You can view files and clone it, but cannot push or open issues or pull requests.
python-blog/src/attachments/admin.py
2021-12-31 12:08:35 +01:00

80 lines
2.6 KiB
Python

from django.contrib import admin, messages
from django.contrib.admin import register
from django.db.models import QuerySet
from django.http import HttpRequest
from django.utils.html import format_html
from attachments.models import Attachment
@register(Attachment)
class AttachmentAdmin(admin.ModelAdmin):
list_display = [
"description",
"original_file",
"original_file_url",
"processed_file",
"processed_file_url",
"open_graph_image",
]
list_display_links = ["description"]
fields = [
"description",
"original_file",
"original_file_url",
"processed_file",
"processed_file_url",
"open_graph_image",
]
readonly_fields = [
"original_file_url",
"processed_file_url",
"open_graph_image",
]
actions = [
"set_as_open_graph_image",
"reprocess_selected_attachments",
]
search_fields = ["description", "original_file", "processed_file"]
class Media:
js = ["attachments/js/copy_url.js"]
def processed_file_url(self, instance: Attachment) -> str:
if instance.processed_file:
return format_html(
'{0} <a class="copy-button" data-to-copy="{1}" href="#">&#128203;</a>',
instance.processed_file.url,
instance.processed_file.url,
)
return ""
def original_file_url(self, instance: Attachment) -> str:
if instance.original_file:
return format_html(
'{0} <a class="copy-button" data-to-copy="{1}" href="#">&#128203;</a>',
instance.original_file.url,
instance.original_file.url,
)
return ""
@admin.action(description="Set as open graph image")
def set_as_open_graph_image(self, request: HttpRequest, queryset: QuerySet) -> None:
if len(queryset) != 1:
messages.error(request, "You must select only one attachment")
return
Attachment.objects.update(open_graph_image=False)
queryset.update(open_graph_image=True)
messages.success(request, "Done")
@admin.action(description="Reprocess selected attachments")
def reprocess_selected_attachments(
self, request: HttpRequest, queryset: QuerySet
) -> None:
if len(queryset) == 0:
messages.error(request, "You must select at least one attachment")
return
for attachment in queryset:
attachment.reprocess()
messages.success(request, "Attachments were successfully reprocessed.")