#settings.py

#Should we log full HTML responses?
LOGALL_LOG_HTML_RESPONSE = True

# If we how do we recognized a full HTML response 
LOGALL_HTML_START = "<!DOCTYPE html"


#logAll.models.py
from django.db import models

from django.contrib.auth.models import User

class Record(models.Model):
    """
    Basic log record describing all user interaction with the UI.
    Will be propagated by a middle ware.
    This will be one BIG DB table!
    """
    created_at = models.DateTimeField(auto_now_add = True)
    sessionId = models.CharField(max_length=256)

    requestUser = models.ForeignKey(User)
    requestPath  = models.TextField()
    requestQueryString = models.TextField()
    requestVars = models.TextField()
    requestMethod = models.CharField(max_length=4)
    requestSecure = models.BooleanField(default=False)
    requestAjax = models.BooleanField(default=False)
    requestMETA = models.TextField(null=True, blank=True)
    requestAddress = models.IPAddressField()

    viewFunction = models.CharField(max_length=256)
    viewDocString = models.TextField(null=True, blank=True)
    viewArgs = models.TextField()

    responseCode = models.CharField(max_length=3)
    responseContent = models.TextField()




#logAll.middleware.py

import time
import simplejson as json

from django.core.exceptions import ObjectDoesNotExist

from logAll.models import Record
from settings import LOGALL_LOG_HTML_RESPONSE, LOGALL_HTML_START

class LogAllMiddleware(object):

    def process_request(self,request):
        # Only log requests of authinticate users                                                                                                                                                               
        try:
            if not request.user.is_authenticated():
                return None
        except AttributeError:
            return None

        # Skip favicon requests cause I do not care about them
        if request.path =="/favicon.ico":
            return None

        newRecord = Record(
            created_at = str(time.time()),
            sessionId = request.session.session_key,

            requestUser = request.user,
            requestPath  = request.path,
            requestQueryString = request.META["QUERY_STRING"],
            requestVars = json.dumps(request.REQUEST.__dict__),
            requestMethod = request.method,
            requestSecure = request.is_secure(),
            requestAjax = request.is_ajax(),
            requestMETA = request.META.__str__(),
            requestAddress = request.META["REMOTE_ADDR"],
            )

        newRecord.save()

        return None

    def process_view(self, request, view_func, view_args, view_kwargs):
        try:
            if not request.user.is_authenticated():
                return None
        except AttributeError:
            return None

        # Fix the issue with the authrization request                                                                                                                                                        
        try:
            theRecord  = Record.objects.get(
                sessionId = request.session.session_key,
                requestUser = request.user,
                requestPath  = request.path,
                requestMethod = request.method,
                requestSecure = request.is_secure(),
                requestAjax = request.is_ajax(),
                requestMETA = request.META.__str__()
                )
            theRecord.viewFunction = view_func.func_name
            theRecord.viewDocString = view_func.func_doc
            theRecord.viewArgs = json.dumps(view_kwargs)

            theRecord.save()
        except  ObjectDoesNotExist:
            pass

        return None


    def process_response(self, request, response):

        # Only log autherized requests
        try:
            if not request.user.is_authenticated():
                return response
        except AttributeError:
            return response

        # Skip favicon requests cause I do not care about them
        if request.path =="/favicon.ico":
            return response


        # Fix the issue with the authorization request                                                                                                                                                                          
        try:
            theRecord  = Record.objects.get(
                sessionId = request.session.session_key,
                requestUser = request.user,
                requestPath  = request.path,
                requestMethod = request.method,
                requestSecure = request.is_secure(),
                requestAjax = request.is_ajax(),
                requestMETA = request.META.__str__()
                )

            theRecord.responseCode = response.status_code

            # Decidce wether we want to log the a full html response
            # as this will probabaly will take a LOT of space.
            #
            # In my case most of the replies I want to catch happen
            # to be plain text ajax replies

            if LOGALL_LOG_HTML_RESPONSE:
                # IF set to true then log the respoce regardless                                                                                                                                                               
                theRecord.responseContent = response.content
            elif response.content.startswith(LOGALL_HTML_START):
                theRecord.responseContent = "FULL HTML RESPONSE"
            else:
                theRecord.responseContent = response.content

            theRecord.save()

        except  ObjectDoesNotExist:
            pass

        return response