root/bitstructures/trunk/substructure/views.py

Revision 79, 4.8 kB (checked in by simon, 3 months ago)

Sort the entries on the tagged_with page by date, with the most recently published first.

Line 
1from django.http import Http404, HttpResponse, HttpResponseRedirect
2from django.shortcuts import get_object_or_404, render_to_response
3from django.template import Context, loader
4from django.template.loader import render_to_string
5from django.contrib.sites.models import Site
6from django.conf import settings
7from bitstructures.substructure.models import Entry, Tag, EntryTag
8from bitstructures.substructure.codeblocks import MarkdownCodeblocksParser
9
10DEFAULT_SUBSTRUCTURE_NUM_ENTRIES_PER_PAGE = 5
11
12def blog(request):
13    page = 1
14    if ('page' in request.GET) and (int(request.GET['page']) > 0):
15        page = int(request.GET['page'])
16    if hasattr(settings, 'SUBSTRUCTURE_NUM_ENTRIES_PER_PAGE'):
17        num_entries_per_page = settings.SUBSTRUCTURE_NUM_ENTRIES_PER_PAGE
18    else:
19        num_entries_per_page = DEFAULT_SUBSTRUCTURE_NUM_ENTRIES_PER_PAGE
20    skip = (page - 1) * num_entries_per_page
21    skip_to = skip + num_entries_per_page
22    data = get_context_data(request)
23    data['entry_list'] = get_published_entries().order_by('-date_published')[skip:skip_to]
24    data['next_page'] = skip_to < data['num_published_entries']
25    data['next_page_num'] = page + 1
26    data['previous_page'] = page > 1
27    data['previous_page_first_page'] = page == 2
28    data['previous_page_num'] = page - 1
29    return render_to_response('substructure/blog.html', data)
30
31def entry_page(request, year, month, slug):
32    entry = get_object_or_404(Entry, slug=slug)
33    check_view_entry(entry, year, month)
34    data = get_context_data(request)
35    data['entry'] = entry
36    return render_to_response('substructure/entry_page.html', data)
37
38def entry_codeblock(request, year, month, slug, num, filename):
39    entry = get_object_or_404(Entry, slug=slug)
40    check_view_entry(entry, year, month)
41    return get_codeblock_response(entry, num, filename)
42
43def check_view_entry(entry, year, month):
44    if not entry.is_published():
45        raise Http404
46    if int(year) != entry.date_published.year:
47        raise Http404
48    if int(month) != entry.date_published.month:
49        raise Http404
50
51def draft_page(request, slug):
52    entry = get_object_or_404(Entry, slug=slug)
53    check_view_draft(request, entry)
54    data = get_context_data(request)
55    data['entry'] = entry
56    return render_to_response('substructure/entry_page.html', data)
57
58def draft_codeblock(request, slug, num, filename):
59    entry = get_object_or_404(Entry, slug=slug)
60    check_view_draft(request, entry)
61    return get_codeblock_response(entry, num, filename)
62
63def check_view_draft(request, entry):
64    if not entry.is_draft():
65        raise Http404
66
67def get_codeblock_response(entry, num, filename):
68    parser = MarkdownCodeblocksParser()
69    codeblock = parser.get_codeblock(entry.text, int(num))
70    if codeblock:
71        if filename.lower().endswith('html'):
72            return HttpResponse(codeblock.get_code(), mimetype='text/html')
73        else:
74            return HttpResponse(codeblock.get_code(), mimetype='text/plain')
75    else:
76        raise Http404
77
78def atom_feed(request):
79    t = loader.get_template('substructure/atom_feed.xml')
80    current_site = Site.objects.get_current()
81    entry_list = Entry.objects.filter(date_published__isnull=False).order_by('-date_published')
82    c = Context({
83        'site_name': current_site.name,
84        'site_domain': current_site.domain,
85        'entry_list': entry_list
86    })
87    if len(entry_list) > 0:
88        c['most_recent_date_published'] = entry_list[0].date_published
89    return HttpResponse(t.render(c), mimetype='application/atom+xml')
90
91def all(request):
92    data = get_context_data(request)
93    data['entry_list'] = get_published_entries().order_by('-date_published')
94    return render_to_response('substructure/all.html', data)
95
96def tagged_with(request, tag_name):
97    tag = get_object_or_404(Tag, name=tag_name)
98    data = get_context_data(request)
99    data['tag'] = tag
100    entry_list = get_published_entries_with_tag(tag)
101    entry_list.sort(key=get_entry_date_published,reverse=True)
102    data['entry_list'] = entry_list
103    return render_to_response('substructure/tagged-with.html', data)
104
105def get_published_entries_with_tag(tag):
106    entrytags = EntryTag.objects.select_related().filter(tag=tag)
107    entry_list = []
108    for entrytag in entrytags:
109        entry = entrytag.entry
110        if entry.is_published:
111            entry_list.append(entry)
112    return entry_list
113
114def get_entry_date_published(entry):
115    return entry.date_published
116
117def robots_txt(request):
118    return HttpResponse(render_to_string('substructure/robots.txt'),
119        mimetype='text/plain')
120
121def get_published_entries():
122    return Entry.objects.filter(date_published__isnull=False)
123
124def redirect_to_feedburner(request):
125    return HttpResponseRedirect(settings.SUBSTRUCTURE_FEEDBURNER_REDIRECT_URL)
126
127def get_context_data(request):
128    data = { 'MEDIA_URL': settings.MEDIA_URL }
129    data['num_published_entries'] = get_published_entries().count()
130    return data
Note: See TracBrowser for help on using the browser.