view news/admin.py @ 1001:c6c3ba5cf6eb

V2 news stories use forums for comments.
author Brian Neal <bgneal@gmail.com>
date Thu, 26 Nov 2015 00:27:42 -0600
parents 8386a8ebcbc7
children 9fc12bbc8c81
line wrap: on
line source
"""
This file contains the automatic admin site definitions for the News models.
"""
from django.contrib import admin
from django.conf import settings

from forums.tools import create_topic
from news.models import PendingStory
from news.models import Story
from news.models import Category

import ftfy


COMMENT_THREAD_BODY = ("This topic was automatically created to discuss the "
        "news story [{title}]({url}).")


class CategoryAdmin(admin.ModelAdmin):
    prepopulated_fields = {'slug': ("title", )}
    list_display = ['title', 'slug', 'forum_slug']
    list_editable = ['forum_slug']


class PendingStoryAdmin(admin.ModelAdmin):
    list_display = ['title', 'date_submitted', 'submitter']
    list_filter = ['date_submitted']
    search_fields = ['title', 'short_text', 'long_text']
    date_hierarchy = 'date_submitted'
    actions = ['approve_stories']
    readonly_fields = ['update_date', 'version']
    raw_id_fields = ['submitter']

    fieldsets = [
        (None, {
            'fields': ['title', 'submitter', 'category'],
            }),
        ('New Markdown Fields', {
            'fields': ['short_markup', 'long_markup'],
            }),
        ('HTML Fields', {
            'fields': ['short_text', 'long_text', 'admin_content'],
            'classes': ['collapse'],
            }),
        ('Meta Fields', {
            'fields': [
                'date_submitted', 'allow_comments', 'tags',
                'front_page_expiration', 'priority', 'meta_description',
                ]
            }),
        ('Read-Only Fields', {
            'fields': ['update_date', 'version'],
            'classes': ['collapse'],
            }),
    ]

    def approve_stories(self, request, qs):
        for pending_story in qs:
            self._approve_story(pending_story)

        count = len(qs)
        msg = "1 story" if count == 1 else "%d stories" % count
        self.message_user(request, "%s approved." % msg)

    approve_stories.short_description = "Approve selected pending stories"

    def _approve_story(self, pending_story):
        story = Story(
                title=pending_story.title,
                submitter=pending_story.submitter,
                category=pending_story.category,
                short_text=pending_story.short_text,
                long_text=pending_story.long_text,
                date_submitted=pending_story.date_submitted,
                allow_comments=pending_story.allow_comments,
                tags=pending_story.tags,
                front_page_expiration=pending_story.front_page_expiration,
                priority=pending_story.priority,
                meta_description=pending_story.meta_description,
                short_markup=pending_story.short_markup,
                long_markup=pending_story.long_markup,
                admin_content=pending_story.admin_content)
        story.save()
        pending_story.delete()

        # Create comment thread if configured to do so.
        forum_slug = story.category.forum_slug
        if story.allow_comments and forum_slug:
            post_body = COMMENT_THREAD_BODY.format(title=story.title,
                                                   url=story.get_absolute_url())
            topic = create_topic(forum_slug, story.submitter, story.title, post_body)
            story.forums_topic = topic
            story.save()

    class Media:
        js = ['js/news_admin.js'] + settings.GPP_THIRD_PARTY_JS['tiny_mce']


class StoryAdmin(admin.ModelAdmin):
    list_display = ['title', 'date_submitted', 'submitter', 'category']
    list_filter = ['date_submitted', 'category']
    search_fields = ['title', 'short_text', 'long_text']
    date_hierarchy = 'date_submitted'
    readonly_fields = ['update_date', 'version']
    raw_id_fields = ['submitter']
    actions = ['fix_text']

    fieldsets = PendingStoryAdmin.fieldsets

    def fix_text(self, request, qs):
        for story in qs:
            story.title = ftfy.fix_text(story.title)
            story.short_text = ftfy.fix_text(story.short_text)
            story.long_text = ftfy.fix_text(story.long_text)
            story.save()

        count = len(qs)
        msg = "1 story" if count == 1 else "%d stories" % count
        self.message_user(request, "Text fixed on {}".format(msg))

    fix_text.short_description = "Fix text on selected stories"

    class Media:
        js = ['js/news_admin.js'] + settings.GPP_THIRD_PARTY_JS['tiny_mce']


admin.site.register(Category, CategoryAdmin)
admin.site.register(Story, StoryAdmin)
admin.site.register(PendingStory, PendingStoryAdmin)