Source code for django_help.admin

"""Admin configuration for django_help."""

import logging

from django.conf import settings
from django.contrib import admin
from django.urls import path
from django.utils.translation import get_language
from django.utils.translation import gettext_lazy as _
from markdownx.admin import MarkdownxModelAdmin
from translated_fields import TranslatedFieldAdmin

from django_help.models import DjangoHelpArticle
from django_help.models import DjangoHelpCategory
from django_help.models import RelevantPath
from django_help.models import TaggedArticles
from django_help.utils.exporting import export_articles_to_markdown_or_zip
from django_help.utils.importing import upload_articles


logger = logging.getLogger(__name__)

installed_languages = [lang_code for lang_code, _ in settings.LANGUAGES]


[docs]@admin.register(TaggedArticles) class TaggedArticlesAdmin(admin.ModelAdmin): """Admin configuration for TaggedArticles instances.""" list_display = ("tag",) search_fields = ("tag",)
[docs]class RelevantPathInline(admin.TabularInline): """Inline for RelevantPath instances.""" model = RelevantPath extra = 0
[docs]@admin.action(description="Export selected articles to Markdown (.md) and/or ZIP") def export_articles(modeladmin, request, queryset): """Action to export the selected articles to Markdown (.md) and/or ZIP.""" return export_articles_to_markdown_or_zip(queryset)
[docs]@admin.register(DjangoHelpCategory) class DjangoHelpCategoryAdmin(TranslatedFieldAdmin, admin.ModelAdmin): """Admin configuration for DjangoHelpCategory instances.""" list_display = ( f"title_{get_language()}", "slug", f"subtitle_{get_language()}", "icon", "intended_entity_type", "public", "created", "modified", ) list_filter = ("public", "intended_entity_type") search_fields = ( *[f"title_{lang_code}" for lang_code in installed_languages], *[f"subtitle_{lang_code}" for lang_code in installed_languages], *[f"description_{lang_code}" for lang_code in installed_languages], "slug", ) readonly_fields = ("created", "modified") fieldsets = ( (_("title"), {"fields": DjangoHelpCategory.title.fields}), (_("subtitle"), {"fields": DjangoHelpCategory.subtitle.fields}), (_("description"), {"fields": DjangoHelpCategory.description.fields}), (_(""), {"fields": ["slug", "icon", "intended_entity_type", "public", "created", "modified"]}), ) prepopulated_fields = {"slug": (f"title_{get_language()}",)}
[docs]@admin.register(DjangoHelpArticle) class DjangoHelpArticleAdmin(TranslatedFieldAdmin, MarkdownxModelAdmin): """Admin configuration for DjangoHelpArticle instances.""" list_display = ( f"title_{get_language()}", "slug", f"subtitle_{get_language()}", "category", "icon", "public", "highlighted", "intended_entity_type", "views", "tag_list", "created", "modified", ) list_filter = ("public", "category", "intended_entity_type", "highlighted") search_fields = ( *[f"title_{lang_code}" for lang_code in installed_languages], *[f"subtitle_{lang_code}" for lang_code in installed_languages], *[f"article_content_{lang_code}" for lang_code in installed_languages], "slug", "tags", ) readonly_fields = ("created", "modified") inlines = [RelevantPathInline] actions = [export_articles] fieldsets = ( (_("title"), {"fields": DjangoHelpArticle.title.fields}), (_("subtitle"), {"fields": DjangoHelpArticle.subtitle.fields}), (_("article_content"), {"fields": DjangoHelpArticle.article_content.fields}), (_(""), {"fields": ["category", "slug", "icon", "public", "highlighted", "intended_entity_type", "tags"]}), ) prepopulated_fields = {"slug": (f"title_{get_language()}",)}
[docs] def changelist_view(self, request, extra_context=None): """Add the upload button to the changelist view.""" extra_context = extra_context or {} extra_context["show_upload_button"] = True extra_context["upload_url"] = "upload/" return super().changelist_view(request, extra_context=extra_context)
[docs] def get_urls(self): """Add the upload view to the admin.""" urls = super().get_urls() my_urls = [ path("upload/", self.admin_site.admin_view(upload_articles), name="upload_articles"), ] return my_urls + urls
[docs] def get_queryset(self, request): """Prefetch tags for the queryset.""" return super().get_queryset(request).prefetch_related("tags")
[docs] def tag_list(self, obj): """Return a comma-separated list of tags for the object.""" return ", ".join(o.name for o in obj.tags.all())