Attachment 'RecommendPage-1.3.5-5.py'
Download 1 # -*- coding: iso-8859-1 -*-
2 """
3 MoinMoin - RecommendPage Action Macro
4
5 PURPOSE:
6 This macro is used to recommend a page to an other wiki user.
7
8 CALLING SEQUENCE:
9 http://localhost:8080/WikiName?action=RecommendPage
10
11 PROCEDURE:
12 You get an input mask to enter the username of the one where you like to send the recommendation. This is then stored on a page named WikiName/RecommendedPage as an wiki itemlist with the link and the first five lines in plain text. At the end your user SIG is written.
13 A new entry is always written on top of the page.
14 The person is informed by an email notification about the changes
15
16 If you don't enter a name the recommendation is done to your name
17
18 Please remove the version number from the filename.
19
20 MODIFICATION HISTORY:
21 @copyright: 2005 by Reimar Bauer (R.Bauer@fz-juelich.de)
22 @license: GNU GPL, see COPYING for details.
23 Version: 1.3.4-1
24
25 2005-04-19 : Version 1.3.4-2
26 acl line on top of recommendation is set for a valid user/RecommendedPage to
27 WikiName:admin,read,write,delete All:read,write
28 otherwise for All:read,write
29 If the page user/RecommendedPage already exist acl right given on that page are used.
30 output changed similiar to the search output.
31
32 2005-04-21 : Version 1.3.4-3
33 output changed into calling ShortText()
34 e.g. * ["RulesForUnzip"] [[ShortText(RulesForUnzip)]] ... @SIG@
35 it is also checked by now if acls are enabled in the config
36 2005-09-02 : Version 1.3.5-4
37 from SubscribeTo by Raphael Bossek learned to add an subscription for the email notification for a user before the new recommendation is written to the file. This means the user gots informed by an email.
38 2005-09-05 : Version 1.3.5-5
39 isSubscribedTo from user replaced because it could not destinguish between subpage and page
40 my implementation does not understand regular expressions at the moment so this gives by using regular expressions
41 one extraline in the config.
42
43 """
44
45 import string
46 from MoinMoin import config, wikiutil, user, wikiacl, search
47 from MoinMoin.Page import Page
48 from MoinMoin.PageEditor import PageEditor
49
50
51 def ACLparse(request, body):
52 """
53 taken from wikiacl and simply changed to return acl text and body without acl definition
54 renamed from parseACL to ACLparse
55 """
56
57 if not request.cfg.acl_enabled:
58 return AccessControlList(request),body
59
60
61 acl_lines = []
62 while body and body[0] == '#':
63 # extract first line
64 try:
65 line, body = body.split('\n', 1)
66 except ValueError:
67 line = body
68 body = ''
69
70 # end parsing on empty (invalid) PI
71 if line == "#":
72 break
73
74 # skip comments (lines with two hash marks)
75 if line[1] == '#':
76 continue
77
78 tokens = line.split(None, 1)
79 if tokens[0].lower() == "#acl":
80 if len(tokens) == 2:
81 args = tokens[1].rstrip()
82 else:
83 args = ""
84 acl_lines.append(args)
85 return acl_lines,body
86
87 def RecommendPage(request,pagename,username):
88
89 if config.allow_subpages:
90 delimiter = "/"
91 else:
92 delimiter = ""
93
94
95 name = "%(username)s%(delimiter)sRecommendedPage" % {"username": username, "delimiter": delimiter}
96 page = PageEditor(request,name)
97 if request.user.may.write(name):
98
99 if user.getUserId(request, username) != None:
100 uid = user.getUserId(request, username)
101 recom_user = user.User (request, id = uid)
102
103 subscription_list = recom_user.getSubscriptionList()
104 isSubscribedTo = 0
105 for test in subscription_list :
106 if test == name :
107 isSubsribedTo = 1
108
109 if isSubscribedTo == 0:
110 recom_user.subscribePage(name)
111 recom_user.save()
112
113 newtext = u" * %(pagename)s %(about)s ...\n %(username)s\n" % {
114 "pagename": '["'+pagename+'"]',
115 "about":"[[ShortText(%(pagename)s)]]" % {
116 "pagename": pagename},
117 "username":"@SIG@"}
118
119 rev = page.current_rev()
120 if not page.exists() :
121 if request.cfg.acl_enabled:
122 if user.getUserId(request, username) != None :
123 acl="#acl %(username)s:admin,read,write,delete All:read,write\n" % {
124 "username":username}
125 else:
126 acl="#acl All:read,write\n"
127 else:
128 acl=""
129 PageEditor.saveText(page,acl+newtext,rev)
130
131 else:
132 body = page.get_raw_body()
133 given_acl,body = ACLparse(request, body)
134
135 if len(string.join(given_acl,"")) > 0:
136 acl = "#acl %(given_acl)s \n" % {
137 "given_acl":string.join(given_acl,"\n")}
138 else:
139 acl=""
140
141 PageEditor.saveText(page,acl+newtext+body,rev)
142
143 msg = "recommended to read %(pagename)s to %(username)s" % {
144 "pagename": pagename,
145 "username":username}
146 Page(request, pagename).send_page(request, msg=msg)
147
148 else:
149 Page(request, pagename).send_page(request, msg="You are not allowed to recommend pages")
150
151
152 def execute(pagename, request):
153
154
155 _ = request.getText
156 actname = __name__.split('.')[-1]
157
158 if request.user.may.read(pagename) :
159
160 thispage = Page(request,pagename)
161
162 if request.form.has_key('button') and request.form.has_key('ticket'):
163 # check whether this is a valid recommention request (make outside
164 # attacks harder by requiring two full HTTP transactions)
165 if not wikiutil.checkTicket(request.form['ticket'][0]) :
166 return thispage.send_page(request,
167 msg = _('Please use the interactive user interface to recommend pages!'))
168
169 username = request.form.get('username', [u''])[0]
170 if len(username.strip()) == 0 :
171 username = request.user.name
172 return RecommendPage(request,pagename,username)
173
174 formhtml = '''
175 <form method="post" action="">
176 <strong>%(querytext)s</strong>
177 <input type="hidden" name="action" value="%(actname)s">
178 <input type="submit" name="button" value="%(button)s">
179 <input type="hidden" name="ticket" value="%(ticket)s">
180 <p>
181 Username (WikiName)<br>
182 <input type="text" name="username" size="30" maxlength="40">
183 </form>''' % {
184 'querytext': 'Recommend page to',
185 'actname': 'RecommendPage',
186 'ticket' :wikiutil.createTicket(),
187 'button': 'Recommend'}
188
189 return thispage.send_page(request, msg=formhtml)
Attached Files
To refer to attachments on a page, use attachment:filename, as shown below in the list of files. Do NOT use the URL of the [get] link, since this is subject to change and can break easily.You are not allowed to attach a file to this page.