fmartingr.com-legacy/fmartingrcom/apps/blog/views.py

142 lines
4.0 KiB
Python

# -*- coding: utf-8 -*-
import json
from django.core.urlresolvers import reverse
from django.http import Http404, HttpResponseRedirect, HttpResponse
from django.shortcuts import render
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt
import fmartingrcom.apps.blog.utils as blog_utils
from .models import Entry
from fmartingrcom.apps._core.views import View
from fmartingrcom.apps.config.models import SiteConfiguration
config = SiteConfiguration.objects.get()
class ListView(View):
section = 'blog'
template = 'blog/list.jinja'
def get(self, request, page_number=1):
if 'page' in request.GET:
page_number = int(request.GET['page'])
paginator, page = blog_utils.get_paginator(request, page_number)
self.data['page'] = page
self.data['page_number'] = page_number
self.data['paginator'] = paginator
return render(request, self.template, self.data)
class EntryView(View):
section = 'blog'
template = 'blog/entry.jinja'
def get_object(self, year, month, day, slug):
try:
filters = {
'slug': slug,
'date__year': int(year),
'date__month': int(month),
'date__day': int(day),
}
return Entry.objects.get(**filters)
except Entry.DoesNotExist:
raise Http404
def get(self, request, year, month, day, slug):
item = self.get_object(year, month, day, slug)
paginator, page = blog_utils.get_paginator(request, item=item)
self.data['page'] = page
self.data['paginator'] = paginator
self.data['item'] = item
return render(request, self.template, self.data)
class EntryAttachmentView(EntryView):
def get(self, request, year, month, day, slug, filename):
item = self.get_object(year, month, day, slug)
attachment = item.attachments.get(filename=filename)
if attachment:
return HttpResponseRedirect(attachment.url)
raise Http404
class EntryLiveEditView(View):
@method_decorator(csrf_exempt)
def dispatch(self, *args, **kwargs):
return super(EntryLiveEditView, self).dispatch(*args, **kwargs)
def post(self, request, year, month, day, slug):
if not request.user.is_superuser:
return HttpResponse(status=403)
try:
filters = {
'slug': slug,
'date__year': int(year),
'date__month': int(month),
'date__day': int(day),
}
item = Entry.objects.get(**filters)
except Entry.DoesNotExist:
raise Http404
data = json.loads(request.body)
if 'markdown' in data:
item.markdown = data['markdown']
item.save()
return HttpResponse(status=200)
if 'content' in data:
item.content = data['content']
item.save()
return HttpResponse(status=200)
return HttpResponse(status=204)
class SearchView(ListView):
template = 'blog/search.jinja'
def post(self, request):
page_number = 1
if 'page' in request.GET:
page_number = int(request.GET['page'])
search_query = request.POST['query']
if not search_query:
return HttpResponseRedirect(reverse('blog:list'))
paginator, page = blog_utils.get_paginator(
request, page_number, query=search_query
)
self.data['page'] = page
self.data['page_number'] = page_number
self.data['paginator'] = paginator
self.data['search_query'] = search_query
return render(request, self.template, self.data)
class RSSView(View):
template = 'blog/rss.jinja'
def get(self, request):
limit = config.rss_items
items = blog_utils.get_posts(limit=limit)
self.data['items'] = items
return render(request, self.template, self.data,
content_type='text/xml')