from django.conf import settings
from django.core.cache import cache
from django.http import HttpResponseRedirect
from django.http import HttpResponse, Http404
from django.shortcuts import *
from django.template import loader
from django.db.models import Q
from django.template import RequestContext
from django.views.generic.list_detail import object_list, object_detail
from django.views.generic.create_update import create_object, update_object
from django.contrib.auth.decorators import user_passes_test
from django.contrib.auth.models import Group
from pycon.features.decorators import *
from pycon.features.templatetags.features import feature_is_enabled
from pycon.core import get_object_relations_or_404
from models import *
from forms import *

@login_required
@feature_required("SubmitPoster", auto_create_feat=True)
def submit(request):

    form = PosterForm(request)
    has_errors = form.is_bound and not form.is_valid()
    if 'submit' in request.POST and form.is_valid():
        poster = form.save()
        return HttpResponseRedirect(reverse('poster-view',None,(),{'pid': poster.id}))
    extra_context = {}
    extra_context['form'] = form
    extra_context['had_errors'] = has_errors
    extra_context['title'] = "Submit Poster"

    return render_to_response('poster/submit.html', extra_context,
                              context_instance=RequestContext(request))


@login_required
@feature_required("ViewPoster", auto_create_feat=True)
def list(request):
    if not request.user.has_perm('poster.can_view_all_posters'):
        return render_to_response('poster/lack_permissions.html',
                                      {'operation': 'view posters',
                                       'title': 'Poster Listing'},
                              context_instance=RequestContext(request))
    posters = Poster.objects.all()
    changed = 0
    for poster in posters:
        poster.form = StatusForm(poster, request.POST and request.POST or None)
    if 'save' in request.POST:
        changed = sum(poster.form.save() for poster in posters)
        for poster in posters:
            poster.form = StatusForm(poster)

    extra_context = {
        'title': 'Poster Listing',
        'changed': changed,
        'posters' : posters
    }
    return render_to_response('poster/list.html', extra_context,
                              context_instance=RequestContext(request))

@login_required
@feature_required("ViewPoster", auto_create_feat=True)
def view(request, pid):
    poster = get_object_relations_or_404(Poster, pk=pid)
    if  (request.user.id != poster.author.id and
         not request.user.has_perm('poster.can_view_all_posters')):
        return render_to_response('poster/lack_permissions.html',
                                      {'operation': 'view this poster',
                                       'title': 'View Poster'},
                              context_instance=RequestContext(request))
    extra_context = {
        'title': unicode(poster),
        'poster' : poster
    }
    return render_to_response('poster/view.html', extra_context,
                              context_instance=RequestContext(request))


@login_required
@feature_required("EditPoster", auto_create_feat=True)
def edit(request, pid):
    poster = get_object_relations_or_404(Poster, pk=pid)
    if  (request.user.id != poster.author.id and
         not request.user.has_perm('poster.change_poster')):
        return render_to_response('poster/lack_permissions.html',
                                      {'operation': 'view this poster',
                                       'title': 'View Poster'},
                              context_instance=RequestContext(request))

    form = PosterForm(request, poster)
    has_errors = form.is_bound and not form.is_valid()
    if 'save' in request.POST and form.is_valid():
        poster = form.save()
        return HttpResponseRedirect(reverse('poster-view',None,(),{'pid': poster.id}))
    extra_context = {}
    extra_context['form'] = form
    extra_context['had_errors'] = has_errors
    extra_context['title'] = "Edit Poster"

    return render_to_response('poster/edit.html', extra_context,
                              context_instance=RequestContext(request))


@login_required
@feature_required("EditPoster", auto_create_feat=True)
def attach(request, pid):
    poster = get_object_relations_or_404(Poster, pk=pid)
    if  (request.user.id != poster.author.id and
         not request.user.has_perm('poster.change_poster')):
        return render_to_response('poster/lack_permissions.html',
                                      {'operation': 'attach a file',
                                       'title': 'Attach File'},
                              context_instance=RequestContext(request))

    form = AttachmentForm(poster, request)
    has_errors = form.is_bound and not form.is_valid()
    if 'attach' in request.POST and form.is_valid():
        attachment = form.save()
        return HttpResponseRedirect(reverse('poster-view',None,(),{'pid': attachment.poster.id}))
    extra_context = {}
    extra_context['form'] = form
    extra_context['had_errors'] = has_errors
    extra_context['title'] = "Attach File"

    return render_to_response('poster/attach.html', extra_context,
                              context_instance=RequestContext(request))


@login_required
@feature_required("CommentOnPoster", auto_create_feat=True)
def comment(request, pid):
    poster = get_object_relations_or_404(Poster, pk=pid)
    if  (request.user.id != poster.author.id and
         not request.user.has_perm('poster.change_poster')):
        return render_to_response('poster/lack_permissions.html',
                                      {'operation': 'comment on this poster',
                                       'title': 'Comment on Poster'},
                              context_instance=RequestContext(request))

    form = CommentForm(poster, request)
    has_errors = form.is_bound and not form.is_valid()
    if 'send' in request.POST and form.is_valid():
        comment = form.save()
        return HttpResponseRedirect(reverse('poster-view',None,(),{'pid': comment.poster.id}))
    extra_context = {}
    extra_context['form'] = form
    extra_context['had_errors'] = has_errors
    extra_context['title'] = "Comment on Poster"

    return render_to_response('poster/comment.html', extra_context,
                              context_instance=RequestContext(request))
