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
|
from django.shortcuts import get_object_or_404
from django.http import HttpResponse, Http404, HttpResponsePermanentRedirect
from django.template.defaultfilters import slugify
from pgweb.util.contexts import render_pgweb
from pgweb.util.moderation import ModerationState
from .models import NewsArticle, NewsTag
import datetime
import json
# Number of items per page in the news archive
NEWS_ITEMS_PER_PAGE = 10
def archive(request, tag=None, paginator=None):
if tag and tag.strip('/') != '-':
tag = get_object_or_404(NewsTag, urlname=tag.strip('/'))
news = NewsArticle.objects.select_related('org').filter(modstate=ModerationState.APPROVED, tags=tag)
else:
tag = None
news = NewsArticle.objects.select_related('org').filter(modstate=ModerationState.APPROVED)
if paginator and paginator.strip('/'):
news = news.filter(date__lte=datetime.datetime.strptime(paginator.strip('/'), '%Y%m%d'))
allnews = list(news.prefetch_related('tags').order_by('-date')[:NEWS_ITEMS_PER_PAGE + 1])
if len(allnews) == NEWS_ITEMS_PER_PAGE + 1:
# 11 means we have a second page, so set a paginator link
paginator = allnews[NEWS_ITEMS_PER_PAGE - 1].date.strftime("%Y%m%d")
else:
paginator = None
return render_pgweb(request, 'about', 'news/newsarchive.html', {
'news': allnews[:NEWS_ITEMS_PER_PAGE],
'paginator': paginator,
'tag': tag,
'newstags': NewsTag.objects.all(),
})
def item(request, itemid, slug=None):
news = get_object_or_404(NewsArticle, pk=itemid)
if news.modstate != ModerationState.APPROVED:
raise Http404
fullurl = '/about/news/{}-{}/'.format(slugify(news.title), news.id)
if slug != slugify(news.title):
return HttpResponsePermanentRedirect(fullurl)
return render_pgweb(request, 'about', 'news/item.html', {
'obj': news,
'newstags': NewsTag.objects.all(),
'og': {
'url': fullurl,
'author': news.org.name if news.org.name != '_migrated' else '',
'time': datetime.datetime.combine(news.date, datetime.datetime.min.time()),
'title': news.title,
'description': news.content,
'noimage': news.org.mailtemplate == 'default', # For now, control image by "using a custom logo"
'sitename': 'PostgreSQL News',
}
})
def taglist_json(request):
return HttpResponse(json.dumps({
'tags': [{
'urlname': t.urlname,
'name': t.name,
'description': t.description,
'sortkey': t.sortkey,
} for t in NewsTag.objects.order_by('urlname').distinct('urlname')],
}), content_type='application/json')
|