summaryrefslogtreecommitdiff
path: root/pgweb/news/models.py
blob: 2be3962c31ba46d168bab8aa06018a554a59e3e9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
from django.db import models
from datetime import date
from pgweb.core.models import Organisation, OrganisationEmail
from pgweb.core.text import ORGANISATION_HINT_TEXT
from pgweb.util.moderation import TristateModerateModel, ModerationState, TwoModeratorsMixin
from django.template.defaultfilters import slugify

from .util import send_news_email, render_news_template, embed_images_in_html


class NewsTag(models.Model):
    urlname = models.CharField(max_length=20, null=False, blank=False, unique=True)
    name = models.CharField(max_length=32, null=False, blank=False)
    description = models.CharField(max_length=200, null=False, blank=False)
    allowed_orgs = models.ManyToManyField(Organisation, blank=True,
                                          help_text="Organisations allowed to use this tag")
    sortkey = models.IntegerField(null=False, blank=False, default=100)

    def purge_urls(self):
        yield '/about/news/taglist.json/'

    def __str__(self):
        return self.name

    class Meta:
        ordering = ('sortkey', 'urlname', )


class NewsArticle(TwoModeratorsMixin, TristateModerateModel):
    org = models.ForeignKey(Organisation, null=False, blank=False, verbose_name="Organisation", help_text=ORGANISATION_HINT_TEXT, on_delete=models.CASCADE)
    email = models.ForeignKey(OrganisationEmail, null=True, blank=True, verbose_name="Reply email", on_delete=models.PROTECT)
    date = models.DateField(null=False, blank=False, default=date.today, db_index=True)
    title = models.CharField(max_length=200, null=False, blank=False)
    content = models.TextField(null=False, blank=False)
    tweeted = models.BooleanField(null=False, blank=False, default=False)
    tags = models.ManyToManyField(NewsTag, blank=False, help_text="Select the tags appropriate for this post")

    account_edit_suburl = 'news'
    markdown_fields = ('content',)
    moderation_fields = ('permanenturl', 'org', 'sentfrom', 'email', 'date', 'title', 'content', 'taglist')
    preview_fields = ('title', 'sentfrom', 'email', 'content', 'taglist')
    notify_fields = ('org', 'email', 'date', 'title', 'content', 'tags')
    rendered_preview_fields = ('content', )
    extramodnotice = "In particular, note that news articles will be sent by email to subscribers, and therefor cannot be recalled in any way once sent."

    def purge_urls(self):
        yield '/about/news/%s/' % self.pk
        yield '/about/news/.*-%s/' % self.pk
        yield '/about/newsarchive/'
        yield '/news.rss'
        yield '/news/.*.rss'
        # FIXME: when to expire the front page?
        yield '/$'

    def __str__(self):
        return "%s: %s" % (self.date, self.title)

    @property
    def permanenturl(self):
        return '/about/news/{}-{}/'.format(slugify(self.title), self.id)

    def verify_submitter(self, user):
        return (len(self.org.managers.filter(pk=user.pk)) == 1)

    def is_migrated(self):
        if self.org.pk == 0:
            return True
        return False

    @property
    def taglist(self):
        return ", ".join([t.name for t in self.tags.all()])

    @property
    def sentfrom(self):
        return self.org.fromnameoverride if self.org.fromnameoverride else '{} via PostgreSQL Announce'.format(self.org.name)

    @property
    def displaydate(self):
        return self.date.strftime("%Y-%m-%d")

    class Meta:
        ordering = ('-date',)

    @classmethod
    def get_formclass(self):
        from pgweb.news.forms import NewsArticleForm
        return NewsArticleForm

    @property
    def block_edit(self):
        # Don't allow editing of news articles that have been published
        return self.modstate in (ModerationState.PENDING, ModerationState.APPROVED)

    def on_approval(self, request):
        send_news_email(self)

    def render_preview_field(self, fieldname, val):
        if fieldname == 'content':
            html, attachments = render_news_template(self)
            return embed_images_in_html(html, attachments)

    def get_field_description(self, f):
        if f == 'title':
            return 'Title/subject'
        elif f == 'sentfrom':
            return 'Sent from'
        elif f == 'email':
            return 'Direct replies to'
        elif f == 'taglist':
            return 'List of tags'
        elif f == 'content':
            return 'Content preview'
        elif f == 'permanenturl':
            return 'Permanent URL'