Added slug to the context for ajax searches.
[philo.git] / contrib / penfield / admin.py
1 from django import forms
2 from django.contrib import admin
3 from django.core.urlresolvers import reverse
4 from django.http import HttpResponseRedirect, QueryDict
5 from philo.admin import EntityAdmin, AddTagAdmin, COLLAPSE_CLASSES
6 from philo.contrib.penfield.models import BlogEntry, Blog, BlogView, Newsletter, NewsletterArticle, NewsletterIssue, NewsletterView
7
8
9 class DelayedDateForm(forms.ModelForm):
10         date_field = 'date'
11         
12         def __init__(self, *args, **kwargs):
13                 super(DelayedDateForm, self).__init__(*args, **kwargs)
14                 self.fields[self.date_field].required = False
15
16
17 class TitledAdmin(EntityAdmin):
18         prepopulated_fields = {'slug': ('title',)}
19         list_display = ('title', 'slug')
20
21
22 class BlogAdmin(TitledAdmin):
23         pass
24
25
26 class BlogEntryAdmin(TitledAdmin, AddTagAdmin):
27         form = DelayedDateForm
28         filter_horizontal = ['tags']
29         list_filter = ['author', 'blog']
30         date_hierarchy = 'date'
31         search_fields = ('content',)
32         list_display = ['title', 'date', 'author']
33         raw_id_fields = ('author',)
34         fieldsets = (
35                 (None, {
36                         'fields': ('title', 'author', 'blog')
37                 }),
38                 ('Content', {
39                         'fields': ('content', 'excerpt', 'tags'),
40                 }),
41                 ('Advanced', {
42                         'fields': ('slug', 'date'),
43                         'classes': COLLAPSE_CLASSES
44                 })
45         )
46         related_lookup_fields = {'fk': raw_id_fields}
47
48
49 class BlogViewAdmin(EntityAdmin):
50         fieldsets = (
51                 (None, {
52                         'fields': ('blog',)
53                 }),
54                 ('Pages', {
55                         'fields': ('index_page', 'entry_page', 'tag_page')
56                 }),
57                 ('Archive Pages', {
58                         'fields': ('entry_archive_page', 'tag_archive_page')
59                 }),
60                 ('General Settings', {
61                         'fields': ('entry_permalink_style', 'entry_permalink_base', 'tag_permalink_base', 'entries_per_page'),
62                         'classes': COLLAPSE_CLASSES
63                 }),
64                 ('Feed Settings', {
65                         'fields': ( 'feeds_enabled', 'feed_suffix', 'feed_type', 'feed_length', 'item_title_template', 'item_description_template',),
66                         'classes': COLLAPSE_CLASSES
67                 })
68         )
69         raw_id_fields = ('index_page', 'entry_page', 'tag_page', 'entry_archive_page', 'tag_archive_page', 'item_title_template', 'item_description_template',)
70         related_lookup_fields = {'fk': raw_id_fields}
71
72
73 class NewsletterAdmin(TitledAdmin):
74         pass
75
76
77 class NewsletterArticleAdmin(TitledAdmin, AddTagAdmin):
78         form = DelayedDateForm
79         filter_horizontal = ('tags', 'authors')
80         list_filter = ('newsletter',)
81         date_hierarchy = 'date'
82         search_fields = ('title', 'authors__name',)
83         list_display = ['title', 'date', 'author_names']
84         fieldsets = (
85                 (None, {
86                         'fields': ('title', 'authors', 'newsletter')
87                 }),
88                 ('Content', {
89                         'fields': ('full_text', 'lede', 'tags')
90                 }),
91                 ('Advanced', {
92                         'fields': ('slug', 'date'),
93                         'classes': COLLAPSE_CLASSES
94                 })
95         )
96         actions = ['make_issue']
97         
98         def author_names(self, obj):
99                 return ', '.join([author.get_full_name() for author in obj.authors.all()])
100         author_names.short_description = "Authors"
101         
102         def make_issue(self, request, queryset):
103                 opts = NewsletterIssue._meta
104                 info = opts.app_label, opts.module_name
105                 url = reverse("admin:%s_%s_add" % info)
106                 return HttpResponseRedirect("%s?articles=%s" % (url, ",".join([str(a.pk) for a in queryset])))
107         make_issue.short_description = u"Create issue from selected %(verbose_name_plural)s"
108
109
110 class NewsletterIssueAdmin(TitledAdmin):
111         filter_horizontal = TitledAdmin.filter_horizontal + ('articles',)
112
113
114 class NewsletterViewAdmin(EntityAdmin):
115         fieldsets = (
116                 (None, {
117                         'fields': ('newsletter',)
118                 }),
119                 ('Pages', {
120                         'fields': ('index_page', 'article_page', 'issue_page')
121                 }),
122                 ('Archive Pages', {
123                         'fields': ('article_archive_page', 'issue_archive_page')
124                 }),
125                 ('Permalinks', {
126                         'fields': ('article_permalink_style', 'article_permalink_base', 'issue_permalink_base'),
127                         'classes': COLLAPSE_CLASSES
128                 }),
129                 ('Feeds', {
130                         'fields': ( 'feeds_enabled', 'feed_suffix', 'feed_type', 'feed_length', 'item_title_template', 'item_description_template',),
131                         'classes': COLLAPSE_CLASSES
132                 })
133         )
134         raw_id_fields = ('index_page', 'article_page', 'issue_page', 'article_archive_page', 'issue_archive_page', 'item_title_template', 'item_description_template',)
135         related_lookup_fields = {'fk': raw_id_fields}
136
137
138 admin.site.register(Blog, BlogAdmin)
139 admin.site.register(BlogEntry, BlogEntryAdmin)
140 admin.site.register(BlogView, BlogViewAdmin)
141 admin.site.register(Newsletter, NewsletterAdmin)
142 admin.site.register(NewsletterArticle, NewsletterArticleAdmin)
143 admin.site.register(NewsletterIssue, NewsletterIssueAdmin)
144 admin.site.register(NewsletterView, NewsletterViewAdmin)