| 1 | from django.http import Http404, HttpResponse, HttpResponseRedirect |
|---|
| 2 | from django.shortcuts import get_object_or_404, render_to_response |
|---|
| 3 | from django.template import Context, loader |
|---|
| 4 | from django.template.loader import render_to_string |
|---|
| 5 | from django.contrib.sites.models import Site |
|---|
| 6 | from django.conf import settings |
|---|
| 7 | from bitstructures.substructure.models import Entry, Tag, EntryTag |
|---|
| 8 | from bitstructures.substructure.codeblocks import MarkdownCodeblocksParser |
|---|
| 9 | |
|---|
| 10 | DEFAULT_SUBSTRUCTURE_NUM_ENTRIES_PER_PAGE = 5 |
|---|
| 11 | |
|---|
| 12 | def 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 | |
|---|
| 31 | def 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 | |
|---|
| 38 | def 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 | |
|---|
| 43 | def 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 | |
|---|
| 51 | def 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 | |
|---|
| 58 | def 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 | |
|---|
| 63 | def check_view_draft(request, entry): |
|---|
| 64 | if not entry.is_draft(): |
|---|
| 65 | raise Http404 |
|---|
| 66 | |
|---|
| 67 | def 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 | |
|---|
| 78 | def 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 | |
|---|
| 91 | def 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 | |
|---|
| 96 | def 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 | |
|---|
| 105 | def 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 | |
|---|
| 114 | def get_entry_date_published(entry): |
|---|
| 115 | return entry.date_published |
|---|
| 116 | |
|---|
| 117 | def robots_txt(request): |
|---|
| 118 | return HttpResponse(render_to_string('substructure/robots.txt'), |
|---|
| 119 | mimetype='text/plain') |
|---|
| 120 | |
|---|
| 121 | def get_published_entries(): |
|---|
| 122 | return Entry.objects.filter(date_published__isnull=False) |
|---|
| 123 | |
|---|
| 124 | def redirect_to_feedburner(request): |
|---|
| 125 | return HttpResponseRedirect(settings.SUBSTRUCTURE_FEEDBURNER_REDIRECT_URL) |
|---|
| 126 | |
|---|
| 127 | def get_context_data(request): |
|---|
| 128 | data = { 'MEDIA_URL': settings.MEDIA_URL } |
|---|
| 129 | data['num_published_entries'] = get_published_entries().count() |
|---|
| 130 | return data |
|---|