Gab's Notes backend https://gabnotes.org
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

145 lines
4.5 KiB

from django.contrib import admin, messages
from django.contrib.admin import register
from django.contrib.auth.admin import UserAdmin
from django.shortcuts import redirect
from .models import Article, Tag, User
admin.site.register(User, UserAdmin)
@register(Article)
class ArticleAdmin(admin.ModelAdmin):
ordering = ["status", "-published_at"]
list_display = [
"title",
"status",
"keywords",
"created_at",
"published_at",
"updated_at",
"views_count",
"has_code",
"is_home",
"has_custom_css",
"read_time",
]
list_display_links = ["title"]
list_filter = [
"status",
"has_code",
"status",
"is_home",
]
date_hierarchy = "created_at"
fieldsets = [
(
"Metadata",
{
"fields": [
("title", "slug"),
("author", "tags"),
("status", "published_at"),
("created_at", "updated_at"),
("views_count", "read_time"),
("has_code", "has_custom_css"),
]
},
),
(
"Content",
{"fields": ("content",)},
),
(
"Custom CSS",
{
"fields": ("custom_css",),
"classes": ("collapse",),
},
),
]
readonly_fields = [
"created_at",
"updated_at",
"views_count",
"status",
"published_at",
"read_time",
"has_custom_css",
]
prepopulated_fields = {"slug": ("title",)}
change_form_template = "articles/article_change_form.html"
search_fields = ["title", "content", "tags__name"]
autocomplete_fields = ["tags"]
show_full_result_count = False
def get_queryset(self, request):
queryset = super().get_queryset(request)
queryset = queryset.prefetch_related("tags")
return queryset
@admin.action(description="Publish selected articles")
def publish(self, request, queryset):
if not request.user.has_perm("articles.change_article"):
messages.warning(request, "You're not allowed to do this.")
return
for article in queryset:
article.publish()
messages.success(request, f"{len(queryset)} articles published.")
@admin.action(description="Unpublish selected articles")
def unpublish(self, request, queryset):
if not request.user.has_perm("articles.change_article"):
messages.warning(request, "You're not allowed to do this.")
return
for article in queryset:
article.unpublish()
messages.success(request, f"{len(queryset)} articles unpublished.")
@admin.action(description="Refresh draft key of selected articles")
def refresh_draft_key(self, request, queryset):
if not request.user.has_perm("articles.change_article"):
messages.warning(request, "You're not allowed to do this.")
return
for article in queryset:
article.refresh_draft_key()
messages.success(request, f"{len(queryset)} draft keys refreshed.")
actions = [publish, unpublish, refresh_draft_key]
class Media:
css = {"all": ("admin_articles.css",)}
def response_post_save_add(self, request, obj: Article):
if "_preview" in request.POST:
return redirect("article-detail", slug=obj.slug)
return super().response_post_save_add(request, obj)
def response_change(self, request, obj: Article):
if "_preview" in request.POST:
obj.save()
return redirect("article-detail", slug=obj.slug)
if "_publish" in request.POST:
obj.publish()
messages.success(request, "Item has been published")
return redirect(".")
if "_unpublish" in request.POST:
obj.unpublish()
messages.success(request, "Item has been unpublished")
return redirect(".")
return super().response_change(request, obj)
def read_time(self, instance: Article):
return f"{instance.get_read_time()} min"
@admin.display(boolean=True)
def has_custom_css(self, instance: Article):
return bool(instance.custom_css)
@register(Tag)
class TagAdmin(admin.ModelAdmin):
list_display = ["name", "slug"]
search_fields = ["slug", "name"]
list_display_links = ["slug", "name"]
prepopulated_fields = {"slug": ("name",)}