Attachment 'Editor.py'
Download 1 # -*- coding: iso-8859-1 -*-
2 """
3 MoinMoin - Editor Action
4 Version 0.1
5
6 ?action=Editor
7
8 Edits a page.
9
10 @copyright: 2007 by Kenneth Bull
11 @license: GNU GPL, see COPYING for details.
12
13 """
14
15 import os, codecs
16 from MoinMoin import config, wikiutil
17 from MoinMoin.util import filesys
18 from MoinMoin.Page import Page
19 from MoinMoin.widget import html
20 from MoinMoin.widget.dialog import Status
21 from MoinMoin.logfile import editlog, eventlog
22
23 def execute(pagename, request):
24 _ = request.getText
25 pg = Page(request,pagename)
26 backto = request.form.get('backto', [None])[0]
27 page = backto and Page(request, backto) or pg
28 rev = pg.exists() and pg.current_rev() or 0
29
30 if not request.user.may.write(pagename):
31 page.send_page(request, msg = _('You are not allowed to edit this page.'))
32 return
33 if not pg.isWritable():
34 page.send_page(request, msg = _('Page is immutable!'))
35 return
36
37 if 'button_cancel' in request.form:
38 page.send_page(request, msg = _('Edit Cancelled'));
39 return
40 if 'button_save' in request.form:
41 savetext = '\n'.join(request.form.get('savetext',[''])[0].splitlines())
42 if savetext[-1] != '\n':
43 savetext += '\n'
44
45 action = "SAVE" if pg.exists() else "SAVENEW"
46
47 from MoinMoin.wikiacl import parseACL
48 #from MoinMoin.security import parseACL
49 if (not request.user.may.admin(pagename) and
50 parseACL(request, savetext).acl != acl.acl):
51 page.send_page(msg = _("You can't change ACLs on this page since you have no admin rights on it!"))
52 return
53
54 pagedir = pg.getPagePath(use_underlay=0, check_create=1)
55 revdir = os.path.join(pagedir, 'revisions')
56 cfn = os.path.join(pagedir, 'current')
57 clfn = os.path.join(pagedir, 'current-locked')
58 pagelog = pg.getPagePath('edit-log', use_underlay=0, isfile=1)
59 llog = editlog.EditLog(request, filename=pagelog,
60 uid_override=None)
61 glog = editlog.EditLog(request, uid_override=None)
62 if not os.path.exists(revdir):
63 os.mkdir(revdir)
64 f = file(cfn, 'w')
65 f.write('%08d\n' % 0)
66 f.close()
67
68 got_lock = False
69 retry = 0
70
71 try:
72 while not got_lock and retry < 100:
73 retry += 1
74 try:
75 filesys.rename(cfn, clfn)
76 got_lock = True
77 except OSError, err:
78 got_lock = False
79 if err.errno == 2: # there was no 'current' file
80 time.sleep(0.1)
81 else:
82 page.send_page(request, msg = _("Page could not get locked. Unexpected error (errno=%d).") % err.errno)
83
84 if not got_lock:
85 page.send_page(request, msg = _("Page could not get locked. Missing 'current' file?"))
86
87 # increment rev number of current(-locked) page
88 f = file(clfn)
89 revstr = f.read()
90 f.close()
91 rev = int(revstr)
92 if rev == 0:
93 rev += 1
94 revstr = '%08d' % rev
95 f = file(clfn, 'w')
96 f.write(revstr+'\n')
97 f.close()
98
99 # save to page file
100 pagefile = os.path.join(revdir, revstr)
101 f = codecs.open(pagefile, 'wb', config.charset)
102 # Write the file using text/* mime type
103 f.write(pg.encodeTextMimeType(savetext))
104 f.close()
105 mtime_usecs = wikiutil.timestamp2version(os.path.getmtime(pagefile))
106 # set in-memory content
107 pg.set_raw_body(savetext)
108
109 # reset page object
110 pg.reset()
111
112
113 # write the editlog entry
114 # for now simply make 2 logs, better would be some multilog stuff maybe
115 glog.add(request, mtime_usecs, rev, action, pg.page_name, None, u'', u'')
116 llog.add(request, mtime_usecs, rev, action, pg.page_name, None, u'', u'')
117 finally:
118 if got_lock:
119 filesys.rename(clfn, cfn)
120
121 # add event log entry
122 elog = eventlog.EventLog(request)
123 elog.add(request, 'SAVEPAGE', {'pagename': pg.page_name}, 1, mtime_usecs)
124
125 pg.clean_acl_cache()
126 page.send_page(request)
127 return
128
129 raw_body = pg.get_raw_body() if pg.exists() else _('Describe %s here.') % (pg.page_name,)
130 wikiutil.send_title(request,
131 _('Edit "%(pagename)s"') % {'pagename': pg.split_title(request), },
132 page = pg, pagename = pagename,
133 msg = Status(request, content=''),
134 html_head = '',
135 editor_mode = 1)
136 request.write(request.formatter.startContent("content"))
137
138 request.write('<form id="editor" method="post" action="%s/%s" onSubmit="flgChange = false;">' % (
139 request.getScriptname(),
140 wikiutil.quoteWikinameURL(pagename)))
141 request.write('<fieldset style="border:none;padding:0;">')
142 request.write(unicode(html.INPUT(type="hidden", name="action", value="Editor")))
143 request.write(unicode(html.INPUT(type="hidden", name="do", value="submit")))
144 request.write(unicode(html.INPUT(type="hidden", name="backto", value=backto)))
145 request.write(unicode(html.INPUT(type="hidden", name="rev", value=str(rev))))
146
147 save_button_text = _('Save Changes')
148 cancel_button_text = _('Cancel')
149
150 if pg.cfg.page_license_enabled:
151 request.write('<p><em>', _(
152 """By hitting '''%(save_button_text)s''' you put your changes under the %(license_link)s.
153 If you don't want that, hit '''%(cancel_button_text)s''' to cancel your changes.""") % {
154 'save_button_text': save_button_text,
155 'cancel_button_text': cancel_button_text,
156 'license_link': wikiutil.getLocalizedPage(request, pg.cfg.page_license_page).link_to(request),
157 }, '</em></p>')
158
159 request.write('''<input class="button" type="submit" name="button_save" value="%s">''' % save_button_text);
160 request.write('''<input class="button" type="submit" name="button_cancel" value="%s">''' % cancel_button_text);
161
162 try:
163 text_rows = int(form['rows'][0])
164 except StandardError:
165 text_rows = pg.cfg.edit_rows
166 if request.user.valid:
167 text_rows = int(request.user.edit_rows)
168
169 request.write(u'''
170 <textarea id="editor-textarea" name="savetext" rows="%(rows)d" cols="80"
171 onChange="flgChange = true;" onKeyPress="flgChange = true;">%(text)s</textarea>
172 ''' % {'rows': text_rows, 'text': wikiutil.escape(raw_body)})
173
174 request.write('</fieldset>')
175 request.write("</form>")
176
177 request.write(request.formatter.endContent())
178 wikiutil.send_footer(request,pagename)
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.