Add caching for submenus
[sommitrealweird.git] / sommitrealweird / bpcms / context_processors.py
1 from bpcms.models import Document, Folder
2 from django.conf import settings
3 from django.core.cache import cache
4 import re
5
6 def content_menu(request):
7     menu_items = cache.get('bpcms_mainmenu')
8
9     if not menu_items:
10         items = Document.objects.filter(folder__isnull=True, islive__exact=True)
11         menu_items = []
12         for item in items:
13             if item.slug != 'index':
14                 menu_items.append(
15                     {
16                         'title': item.title,
17                         'url': item.get_basic_url(),
18                     }
19                 )
20         folders = Folder.objects.filter(parent__isnull=True)
21         for folder in folders:
22             try:
23                 items = Document.objects.filter(folder__exact=folder, islive__exact=True, slug__exact='index')
24                 item = items[0]
25                 menu_items.append(
26                     {
27                         'title': item.title,
28                         'url': folder.get_basic_url(),
29                     }
30                 )
31             except:
32                 pass
33
34         menu_items.sort( \
35             cmp=lambda x,y: cmp(x['title'].lower(), y['title'].lower()))
36         cache.set('bpcms_mainmenu', menu_items, 3600)
37
38     return {
39         'content_menu': menu_items,
40     }
41
42 def content_submenu(request):
43     # find where we are in the tree first
44     folderpath = request.path
45     folderpath = re.sub(u'^%s' %(settings.BPCMS_ROOT), '', folderpath)
46     # right - that should be any prefix got rid of, now traverse the tree till
47     # we've got something
48     menu_items = cache.get('bpcms_contentmenu_%s' %(folderpath))
49
50     if not menu_items:
51         folder = None
52         folderpath = folderpath.split('/')
53         for part in folderpath:
54             try:
55                 if folder:
56                     f = Folder.objects.get(parent__exact=folder, slug__exact=part)
57                 else:
58                     f = Folder.objects.get(parent__isnull=True, slug__exact=part)
59                 folder = f
60             except:
61                 break
62
63         # We have the folder (in theory)
64         menu_items = []
65         if folder:
66             items = Document.objects.filter(folder__exact=folder, \
67                 islive__exact=True)
68             for item in items:
69                 if item.slug != 'index':
70                     menu_items.append(
71                         {
72                             'title': item.title,
73                             'url': item.get_basic_url(),
74                         }
75                     )
76             try:
77                 folders = Folder.objects.filter(parent__exact=folder)
78             except:
79                 pass
80             for folder in folders:
81                 try:
82                     items = Document.objects.filter(folder__exact=folder, \
83                         islive__exact=True, slug__exact='index')
84                     for item in items:
85                         menu_items.append(
86                             {
87                                 'title': item.title,
88                                 'url': folder.get_basic_url(),
89                             }
90                         )
91                 except:
92                     pass
93
94         menu_items.sort( \
95             cmp=lambda x,y: cmp(x['title'].lower(), y['title'].lower()))
96
97     return {
98         'content_submenu': menu_items,
99     }
100
101 def content_breadcrumb(request):
102     breadcrumb = [{'url': settings.BPCMS_ROOT, 'title': settings.BPCMS_ROOT},]
103     # find where we are in the tree first
104     folderpath = request.path
105     folderpath = re.sub(u'^%s' %(settings.BPCMS_ROOT), '', folderpath)
106     # right - that should be any prefix got rid of, now traverse the tree till
107     # we've got something
108     folder = None
109     folderpath = folderpath.split('/')
110     for part in folderpath:
111         try:
112             if folder:
113                 f = Folder.objects.get(parent__exact=folder, slug__exact=part)
114             else:
115                 f = Folder.objects.get(parent__isnull=True, slug__exact=part)
116             folder = f
117             try:
118                 item = Document.objects.get(folder__exact=folder,
119                     slug__exact=u'index', islive__exact=True)
120                 breadcrumb.append({'url': folder.get_basic_url(),
121                     'title': item.title})
122             except:
123                 breadcrumb.append({'url': folder.get_basic_url(),
124                     'title': folder.title})
125         except:
126             # must have hit the end of the tree, lets see if we can get an
127             # item...
128             try:
129                 if folder:
130                     item = Document.objects.get(folder__exact=folder, \
131                         slug__exact=part, islive__exact=True)
132                 else:
133                     item = Document.objects.get(folder__isnull=True, \
134                         slug__exact=part, islive__exact=True)
135                 breadcrumb.append({'url': item.get_basic_url(), 'title': item.title})
136             except:
137                 pass
138             break
139
140     return {
141         'content_breadcrumb': breadcrumb,
142     }