summaryrefslogtreecommitdiff
path: root/postgresqleu/newsevents/feeds.py
blob: 57c8b21c13280d37d5208fe1d98f7b79db591ae4 (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
from django.contrib.syndication.views import Feed
from django.http import Http404
from django.template.defaultfilters import slugify
from django.shortcuts import get_object_or_404
from django.conf import settings

from .models import NewsPosterProfile

from postgresqleu.util.db import exec_to_dict, ensure_conference_timezone


class LatestNews(Feed):
    title = "News - %s" % settings.ORG_NAME
    link = "/"
    description_template = "pieces/news_description.html"

    def get_object(self, request, what):
        if what == 'news':
            return None
        elif what.startswith('user/'):
            a = get_object_or_404(NewsPosterProfile, urlname=what.split('/')[1])
            return a
        raise Http404("Feed not found")

    def description(self, obj):
        if obj:
            return "The latest news from {0} by {1}".format(settings.ORG_NAME, obj.fullname)
        else:
            return "The latest news from {0}".format(settings.ORG_NAME)

    def items(self, obj):
        # Front page news is a mix of global and conference news, possibly
        # filtered by NewsPosterProfile.
        if obj is None:
            extrafilter = ""
            params = {}
        else:
            extrafilter = " AND p.author_id=%(authorid)s"
            params = {
                'authorid': obj.pk,
            }

        with ensure_conference_timezone(None):
            return exec_to_dict("""WITH main AS (
  SELECT id, NULL::text as urlname, datetime, title, summary, p.fullname
  FROM newsevents_news
  LEFT JOIN newsevents_newsposterprofile p ON p.author_id=newsevents_news.author_id
  WHERE datetime<CURRENT_TIMESTAMP AND inrss {0}
  ORDER BY datetime DESC LIMIT 10),
conf AS (
  SELECT n.id, c.urlname, datetime, c.conferencename || ' - ' || title AS title, summary, p.fullname
  FROM confreg_conferencenews n
  INNER JOIN confreg_conference c ON c.id=conference_id
  LEFT JOIN newsevents_newsposterprofile p ON p.author_id=n.author_id
  WHERE datetime<CURRENT_TIMESTAMP AND inrss {0}
  ORDER BY datetime DESC LIMIT 10)
SELECT id, urlname, datetime, title, summary, fullname, true AS readmore FROM main
UNION ALL
SELECT id, urlname, datetime, title, summary, fullname, false FROM conf
ORDER BY datetime DESC LIMIT 10""".format(extrafilter), params)

    def item_title(self, news):
        return news['title']

    def item_link(self, news):
        if news['urlname']:
            return '{0}/events/{1}/news/{2}-{3}/'.format(
                settings.SITEBASE,
                news['urlname'],
                slugify(news['title']),
                news['id'],
            )
        else:
            return '{0}/news/{1}-{2}/'.format(
                settings.SITEBASE,
                slugify(news['title']),
                news['id'],
            )

    def item_pubdate(self, news):
        return news['datetime']

    def item_author_name(self, news):
        return news['fullname']