summaryrefslogtreecommitdiffstats
path: root/askbot/middleware/view_log.py
blob: cf612ad21a54734c24538f8d435f4fe040d39418 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
import logging
from django.conf import settings
from askbot.views.readers import questions as questions_view
from askbot.views.commands import vote
from django.views.static import serve
from askbot.views.writers import delete_comment, question_comments, answer_comments
from askbot.views.readers import question_revisions, answer_revisions

#todo: the list is getting bigger and bigger - maybe there is a better way to
#trigger reset of sarch state?
IGNORED_VIEWS = (serve, vote, delete_comment, 
                question_comments, answer_comments,
                question_revisions, answer_revisions)

class ViewLog(object):
    """must be modified only in this middlware
    however, can be read anywhere else
    """
    def __init__(self):
        self.views = []
        self.depth = 3 #todo maybe move this to const.py

    def get_previous(self, num):
        if num > self.depth - 1:
            raise Exception("view log depth exceeded")
        elif num < 0:
            raise Exception("num must be positive");
        elif num <= len(self.views) - 1:
            return self.views[num]
        else:
            return None

    def set_current(self, view_name):
        self.views.insert(0, view_name)
        if len(self.views) > self.depth:
            self.views.pop()

    def __str__(self):
        return str(self.views) + ' depth=%d' % self.depth

class ViewLogMiddleware(object):
    def process_view(self, request, view_func, view_args, view_kwargs):
        if view_func == questions_view:
            view_str = 'questions'
        elif view_func in IGNORED_VIEWS:
            return
        else:
            view_str = view_func.__name__
            if view_str == 'wrap':
                return

        if settings.DEBUG == True:
            #todo: dependency!
            from debug_toolbar.views import debug_media as debug_media_view
            if view_func == debug_media_view:
                return
            else:
                view_str = view_func.__name__

        if request.user.is_authenticated():
            user_name = request.user.username
        else:
            user_name = request.META['REMOTE_ADDR']
        logging.debug('user %s, view %s' % (request.user.username, view_str))
        logging.debug('next url is %s' % request.REQUEST.get('next','nothing'))

        if 'view_log' in request.session:
            view_log = request.session['view_log']
        else:
            view_log = ViewLog()

        view_log.set_current(view_str)
        request.session['view_log'] = view_log