proxy: Add a "proxy" theme that selects other themes based on the path.
[matthijs/projects/wipi.git] / plugin / macro / RandomPage.py
1 # -*- coding: iso-8859-1 -*-
2 """
3     MoinMoin - RandomPage Macro
4
5     @copyright: 2000 Juergen Hermann <jh@web.de>
6     @license: GNU GPL, see COPYING for details.
7 """
8
9 import random
10 random.seed()
11
12 from MoinMoin.Page import Page
13
14 Dependencies = ["time"]
15
16 # Generate links random pagelinks. If links is 1, linktext can be used to
17 # override the link text.
18 def macro_RandomPage(macro, links=1, linktext=None):
19     request = macro.request
20     links = max(links, 1) # at least 1 link
21
22     # Get full page unfiltered page list - very fast!
23     all_pages = request.rootpage.getPageList(user='', exists=0)
24
25     # Now select random page from the full list, and if it exists and we
26     # can read it, save.
27     pages = []
28     found = 0
29     while found < links and all_pages:
30         # Take one random page from the list
31         pagename = random.choice(all_pages)
32         all_pages.remove(pagename)
33
34         # Filter out deleted pages or pages the user may not read.
35         page = Page(request, pagename)
36         if page.exists() and request.user.may.read(pagename):
37             pages.append(pagename)
38             found += 1
39
40     if not pages:
41         return ''
42
43     f = macro.formatter
44
45     # return a single page link
46     if links == 1:
47         name = pages[0]
48         return (f.pagelink(1, name, generated=1) +
49                 f.text(linktext or name) +
50                 f.pagelink(0, name))
51
52     # return a list of page links
53     pages.sort()
54     result = []
55     write = result.append
56
57     write(f.bullet_list(1))
58     for name in pages:
59         write(f.listitem(1))
60         write(f.pagelink(1, name, generated=1))
61         write(f.text(name))
62         write(f.pagelink(0, name))
63         write(f.listitem(0))
64     write(f.bullet_list(0))
65
66     result = ''.join(result)
67     return result
68