1 from __future__
import unicode_literals
3 from django
.utils
.html
import format_html
4 from django
.utils
.translation
import ugettext
as _
5 from django
.contrib
import admin
6 from django
.contrib
.contenttypes
.admin
import GenericTabularInline
7 from mygpo
.podcasts
.models
import (Podcast
, Episode
, URL
, Slug
, Tag
,
8 MergedUUID
, PodcastGroup
)
9 from mygpo
.utils
import edit_link
12 class AdminLinkMixin(object):
13 """ Adds an Admin link """
15 def admin_link(self
, instance
):
16 """ Link to the admin page """
21 url
= edit_link(instance
)
22 return format_html('<a href="{}">{}</a>', url
, _('Edit'))
24 readonly_fields
= ('admin_link',)
27 class AdminLinkInline(AdminLinkMixin
, admin
.TabularInline
):
28 """ TabularInline that adds an Admin link for the inlined model """
31 class GenericAdminLinkInline(AdminLinkMixin
, GenericTabularInline
):
32 """ TabularInline that adds an Admin link for the inlined model """
36 class URLAdmin(admin
.ModelAdmin
):
38 list_display
= ('url', 'content_type', 'object_id')
39 list_filter
= ('content_type', )
42 class URLInline(GenericAdminLinkInline
):
44 fields
= ('order', 'url', 'admin_link', )
47 class SlugInline(GenericTabularInline
):
51 class TagInline(GenericTabularInline
):
55 class MergedUUIDInline(GenericTabularInline
):
59 class PodcastInline(AdminLinkInline
):
62 fields
= ('id', 'title', 'group_member_name', 'admin_link')
64 readonly_fields
= ('id', ) + AdminLinkInline
.readonly_fields
68 def has_add_permission(self
, request
):
69 """ Podcasts must be created and then added to the group """
73 @admin.register(Podcast
)
74 class PodcastAdmin(admin
.ModelAdmin
):
75 """ Admin page for podcasts """
77 # configuration for the list view
78 list_display
= ('title', 'main_url', )
80 # fetch the podcast's URL for the fields in list_display
81 list_select_related
= ('urls', )
83 list_filter
= ('language', )
84 search_fields
= ('title', 'twitter', '^urls__url', )
86 # configuration for the create / edit view
89 'fields': ('id', 'title', 'subtitle', 'description', 'link',
92 ('Additional information', {
93 'fields': ('created', 'license', 'flattr_url', 'author', 'twitter',
97 'fields': ('group', 'group_member_name',)
100 'fields': ('common_episode_title', 'latest_episode_timestamp',
104 'fields': ('outdated', 'new_location', 'last_update', )
107 'fields': ('restrictions', 'hub', )
118 raw_id_fields
= ('related_podcasts', )
120 readonly_fields
= ('id', 'created', 'last_update', )
122 def main_url(self
, podcast
):
123 url
= podcast
.urls
.first()
130 @admin.register(Episode
)
131 class EpisodeAdmin(admin
.ModelAdmin
):
132 """ Admin page for episodes """
134 # configuration for the list view
135 list_display
= ('title', 'podcast_title', 'main_url', )
137 # fetch the episode's podcast and URL for the fields in list_display
138 list_select_related
= ('podcast', 'urls', )
140 list_filter
= ('language', )
141 search_fields
= ('title', '^urls__url')
143 # configuration for the create / edit view
146 'fields': ('id', 'title', 'subtitle', 'description', 'link',
147 'language', 'guid', 'released', 'podcast', )
149 ('Additional information', {
150 'fields': ('created', 'license', 'flattr_url', 'author', 'content',
154 'fields': ('duration', 'filesize', 'content_types', 'mimetypes', )
157 'fields': ('outdated', 'last_update', )
167 raw_id_fields
= ('podcast', )
169 readonly_fields
= ('id', 'created', 'last_update', )
171 def podcast_title(self
, episode
):
172 return episode
.podcast
.title
174 def main_url(self
, episode
):
175 return episode
.urls
.first().url
178 @admin.register(PodcastGroup
)
179 class PodcastGroupAdmin(admin
.ModelAdmin
):
180 """ Admin page for podcast groups """
182 # configuration for the list view
183 list_display
= ('title', )
185 search_fields
= ('title', )