Source code for literature.admin

from django.contrib import admin, messages
from django.http import HttpResponseRedirect
from django.template.defaultfilters import pluralize
from django.template.response import TemplateResponse
from django.urls import path, reverse
from django.utils.translation import gettext as _
from rest_framework.permissions import DjangoModelPermissions, IsAdminUser

from .csl_map import fields as csl_fields
from .drf import DataTableMixin
from .forms import BibFileUploadForm, OnlineSearchForm
from .models import Author, Collection, Identifier, Literature, SupplementaryMaterial


[docs]class SupplementaryInline(admin.TabularInline): model = SupplementaryMaterial
[docs]class AuthorInline(admin.TabularInline): model = Author.literature.through
[docs]@admin.register(Literature) class LiteratureAdmin(DataTableMixin, admin.ModelAdmin): """Django Admin setup for the `literature.Work` model.""" change_list_template = "literature/admin/change_list.html" inlines = [SupplementaryInline, AuthorInline] fieldsets = [ ( _("Basic"), { "fields": [ "citation_key", "pdf", "type", "title", "language", "created", "modified", ] }, ), ( _("Recommended"), { "fields": [ "container_title", "abstract", "collections", # "keywords", ] }, ), ( _("Comment"), { "fields": [ "comment", ] }, ), # ( # _("Administrative"), # { # "fields": [ # "language", # "source", # "comment", # "created", # "modified", # "last_synced", # ] # }, # ), ] endpoint = { "fields": "__all__", "page_size": 1000, "permission_classes": [IsAdminUser, DjangoModelPermissions], }
[docs] def get_dt_fields(self): new_dict = {} for field, value in sorted(csl_fields.items()): new_dict[field] = value | {"title": field.replace("_", " ").replace("-", " ")} return new_dict
def _pdf(self, obj): if obj.pdf: return obj.pdf.url
[docs] def edit(self, obj): return reverse( "admin:{app_label}_{model_name}_change".format( app_label=obj._meta.app_label, model_name=obj._meta.model_name ), args=[obj.id], )
[docs] def get_urls(self): return [ path("search/", self.admin_site.admin_view(self.search_online), name="search"), path("upload/", self.admin_site.admin_view(self.upload), name="upload"), *super().get_urls(), ]
[docs] def search_online(self, request, *args, **kwargs): """Admin view that handles user-uploaded bibtex files Returns: HttpResponseRedirect: redirects to model admins change_list """ if request.method == "POST": form = OnlineSearchForm(request.POST) if form.is_valid(): bibliography = form.cleaned_data["CSL"] imported, updated = 0, 0 for item in bibliography: imported += 1 Literature.objects.create(CSL=item) self.message_user( request, level=messages.SUCCESS, message=( f"{imported} literature item{pluralize(imported)} {pluralize(imported,'was,were')} succesfully" f" imported and {updated} {pluralize(updated,'has,have')} been updated." ), ) return HttpResponseRedirect("../") else: form = OnlineSearchForm(request.GET) # return TemplateResponse(request, 'admin/change_form.html', {form: form}) return TemplateResponse( request, "literature/admin/search.html", { "form": form, "opts": self.opts, }, )
[docs] def upload(self, request, *args, **kwargs): """Admin view that handles user-uploaded bibtex files Returns: HttpResponseRedirect: redirects to model admins change_list """ if request.method == "POST": form = BibFileUploadForm(request.POST) if form.is_valid(): bibliography = form.cleaned_data["CSL"] imported, updated = 0, 0 for item in bibliography: imported += 1 Literature.objects.create(CSL=item) self.message_user( request, level=messages.SUCCESS, message=( f"{imported} literature item{pluralize(imported)} {pluralize(imported,'was,were')} succesfully" f" imported and {updated} {pluralize(updated,'has,have')} been updated." ), ) return HttpResponseRedirect("../") else: form = BibFileUploadForm(request.GET) # return TemplateResponse(request, 'admin/change_form.html', {form: form}) return TemplateResponse( request, "literature/admin/search.html", { "form": form, "opts": self.opts, }, )
[docs]@admin.register(Identifier) class IdentifierAdmin(admin.ModelAdmin): list_filter = ["type"] search_fields = ["ID", "literature__title"]
# list_display = ['type', 'ID'] # list_display_links = ['ID']
[docs]@admin.register(Collection) class CollectionAdmin(admin.ModelAdmin): pass
[docs]@admin.register(Author) class AuthorAdmin(admin.ModelAdmin): list_display = ["family", "given", "ORCID", "created", "modified"]