
# Copyright (c) 2006 Duncan Cragg

from django.conf import settings
from django.shortcuts import render_to_response
from django.template import Context, loader
from django.http import HttpResponse, HttpResponseRedirect
from dbc.blog.models import BlogPost, Keyword, Comment

# --------------------------------------------------

def render_base(request, template, parameters, type=None):
    posts = BlogPost.objects.filter(visible__exact=True).order_by('-created')[:15]
    parameters.update( { 'settings': settings, 'blogposts': posts, 'keywords': Keyword.objects.all() } )
    t = loader.get_template(template)
    c = Context(parameters)
    s = t.render(c)
    return HttpResponse(s, type)

# ------------------- from urls --------------------

ATOM_MIME = 'application/xml; charset=utf-8'
ATOMJSON_MIME = 'application/javascript; charset=utf-8'

def front(request):
    return render_base(request, 'home.html', { })

def post(request, slugurl):
    post = BlogPost.objects.get(slug__exact=slugurl)
    if request.method == "POST":
        postdata = request.POST.copy()
        strip_whitespace(postdata)
        comment=attach_comment(request.META, post, postdata)
        if comment:
            return HttpResponseRedirect(comment.get_absolute_url())
    return render_base(request, 'post.html', { 'post': post })

def history(request):
    title = 'Post history'
    posts = BlogPost.objects.filter(visible__exact=True).order_by('-created')
    return render_base(request, 'history.html', { 'title': title, 'feedname': '', 'posts': posts })
    
def keyword(request, keyword):
    title = 'Posts tagged \'%s\'' % keyword
    key=Keyword.objects.get(name__iexact=keyword)
    posts=key.blogpost_set.filter(visible__exact=True).order_by('-created')
    return render_base(request, 'history.html', { 'title': title, 'feedname': keyword+'/', 'posts': posts })

def atom(request):
    title = ''
    posts = BlogPost.objects.filter(visible__exact=True).order_by('-created')[:3]
    return render_base(request, 'atom.html', { 'title': title, 'feedname': '', 'posts': posts }, ATOM_MIME)

def keyword_atom(request, keyword):
    title = 'Posts tagged \'%s\'' % keyword
    key=Keyword.objects.get(name__iexact=keyword)
    posts=key.blogpost_set.filter(visible__exact=True).order_by('-created')[:7]
    return render_base(request, 'atom.html', { 'title': title, 'feedname': keyword+'/', 'posts': posts }, ATOM_MIME)

def atomjson(request):
    title = ''
    posts = BlogPost.objects.filter(visible__exact=True).order_by('-created')[:7]
    return render_base(request, 'atomjson.html', { 'title': title, 'feedname': '', 'posts': posts }, ATOMJSON_MIME)

def postjson(request, slugurl):
    post = BlogPost.objects.get(slug__exact=slugurl)
    return render_base(request, 'postjson.html', { 'post': post }, ATOMJSON_MIME)

def atom_unpublished(request):
    title = ''
    posts = BlogPost.objects.filter(visible__exact=False).order_by('-created')
    return render_base(request, 'atom.html', { 'title': title, 'feedname': '', 'posts': posts }, ATOM_MIME)

# --------------------------------------------------

def attach_comment(meta, post, postdata):
    if not postdata['reader_name']:
        postdata['reader_name'] = 'an anonymous correspondent'
    if len(postdata['content']) > 4000:
        postdata['content'] = postdata['content'][:4000]
    if not postdata['reader_url'].startswith('http://'):
        postdata['reader_url'] = 'http://' + postdata['reader_url']
    if postdata['reader_url'] == 'http://':
        postdata['reader_url'] = ''
    if is_muppet(postdata):
        return None
    comment = Comment(comment_on  =post,
                      reader_name =postdata['reader_name'],
                      reader_url  =postdata['reader_url'],
                      reader_email=postdata['reader_email'],
                      content     =postdata['content'])
    comment.reader_ip = meta.get('REMOTE_ADDR', '') + '|' + meta.get('HTTP_X_FORWARDED_FOR','')
    comment.save()
    return comment

def is_muppet(postdata):
    return not postdata['quest'] == '5'
    
def strip_whitespace(postdata):
    for key in postdata.keys():
        if type(postdata[key]) is str:
            postdata[key] = postdata[key].strip()

# --------------------------------------------------




