Attachment 'RecommendPage-1.3.5-6.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 2005-09-07 : Version 1.3.5-6
43 text box changed to a selection menu for the user names (sorted by name)
44
45 """
46
47 import string
48 from MoinMoin import config, wikiutil, user, wikiacl, search
49 from MoinMoin.Page import Page
50 from MoinMoin.PageEditor import PageEditor
51
52
53 def ACLparse(request, body):
54 """
55 taken from wikiacl and simply changed to return acl text and body without acl definition
56 renamed from parseACL to ACLparse
57 """
58
59 if not request.cfg.acl_enabled:
60 return AccessControlList(request),body
61
62
63 acl_lines = []
64 while body and body[0] == '#':
65 # extract first line
66 try:
67 line, body = body.split('\n', 1)
68 except ValueError:
69 line = body
70 body = ''
71
72 # end parsing on empty (invalid) PI
73 if line == "#":
74 break
75
76 # skip comments (lines with two hash marks)
77 if line[1] == '#':
78 continue
79
80 tokens = line.split(None, 1)
81 if tokens[0].lower() == "#acl":
82 if len(tokens) == 2:
83 args = tokens[1].rstrip()
84 else:
85 args = ""
86 acl_lines.append(args)
87 return acl_lines,body
88
89 def RecommendPage(request,pagename,username):
90
91 if config.allow_subpages:
92 delimiter = "/"
93 else:
94 delimiter = ""
95
96
97 name = "%(username)s%(delimiter)sRecommendedPage" % {"username": username, "delimiter": delimiter}
98 page = PageEditor(request,name)
99 if request.user.may.write(name):
100
101 if user.getUserId(request, username) != None:
102 uid = user.getUserId(request, username)
103 recom_user = user.User (request, id = uid)
104
105 subscription_list = recom_user.getSubscriptionList()
106 isSubscribedTo = 0
107 for test in subscription_list :
108 if test == name :
109 isSubsribedTo = 1
110
111 if isSubscribedTo == 0:
112 recom_user.subscribePage(name)
113 recom_user.save()
114
115 newtext = u" * %(pagename)s %(about)s ...\n %(username)s\n" % {
116 "pagename": '["'+pagename+'"]',
117 "about":"[[ShortText(%(pagename)s)]]" % {
118 "pagename": pagename},
119 "username":"@SIG@"}
120
121 rev = page.current_rev()
122 if not page.exists() :
123 if request.cfg.acl_enabled:
124 if user.getUserId(request, username) != None :
125 acl="#acl %(username)s:admin,read,write,delete All:read,write\n" % {
126 "username":username}
127 else:
128 acl="#acl All:read,write\n"
129 else:
130 acl=""
131 PageEditor.saveText(page,acl+newtext,rev)
132
133 else:
134 body = page.get_raw_body()
135 given_acl,body = ACLparse(request, body)
136
137 if len(string.join(given_acl,"")) > 0:
138 acl = "#acl %(given_acl)s \n" % {
139 "given_acl":string.join(given_acl,"\n")}
140 else:
141 acl=""
142
143 PageEditor.saveText(page,acl+newtext+body,rev)
144
145 msg = "recommended to read %(pagename)s to %(username)s" % {
146 "pagename": pagename,
147 "username":username}
148 Page(request, pagename).send_page(request, msg=msg)
149
150 else:
151 Page(request, pagename).send_page(request, msg="You are not allowed to recommend pages")
152
153
154 def execute(pagename, request):
155
156
157 _ = request.getText
158 actname = __name__.split('.')[-1]
159
160 if request.user.may.read(pagename) :
161
162 thispage = Page(request,pagename)
163
164 if request.form.has_key('button') and request.form.has_key('ticket'):
165 # check whether this is a valid recommention request (make outside
166 # attacks harder by requiring two full HTTP transactions)
167 if not wikiutil.checkTicket(request.form['ticket'][0]) :
168 return thispage.send_page(request,
169 msg = _('Please use the interactive user interface to recommend pages!'))
170
171 username = request.form.get('username', [u''])[0]
172 if len(username.strip()) == 0 :
173 username = request.user.name
174 return RecommendPage(request,pagename,username)
175
176 users = user.getUserList(request)
177
178
179 html=[]
180 html.append("<OPTION> </OPTION>")
181 for uid in users:
182 name = user.User(request, id=uid).name
183 html.append("<OPTION>%(name)s</OPTION>" % { "name":name})
184
185 html.sort()
186 formhtml = '''
187 <form method="post" action="">
188 <strong>%(querytext)s</strong><BR>
189 <select name="username" size="1">
190 %(option)s
191 </select>
192 <input type="hidden" name="action" value="%(actname)s">
193 <input type="submit" name="button" value="%(button)s">
194
195 <BR>
196 (no selection recommends to: %(user)s)
197
198 <input type="hidden" name="ticket" value="%(ticket)s">
199 <p>
200 </form>''' % {
201 'querytext': 'Recommend page to',
202 'actname': 'RecommendPage',
203 'ticket' : wikiutil.createTicket(),
204 'option': string.join(html),
205 'user' : request.user.name,
206 'button': 'Recommend'}
207
208
209 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.