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.
  • [get | view] (2007-08-27 06:16:11, 0.5 KB) [[attachment:Clear.py]]
  • [get | view] (2007-08-28 23:30:49, 6.8 KB) [[attachment:Editor.py]]
  • [get | view] (2007-08-31 16:21:54, 6.5 KB) [[attachment:ImageBrowser.inc]]
  • [get | view] (2007-08-17 18:41:06, 23.6 KB) [[attachment:ImageBrowser.zip]]
  • [get | view] (2007-08-27 06:15:30, 12.1 KB) [[attachment:ImageBrowserContent.py]]
  • [get | view] (2007-08-17 20:07:21, 51.1 KB) [[attachment:ImageBrowserContent.zip]]
  • [get | view] (2007-08-27 22:38:27, 51.5 KB) [[attachment:ImageBrowserContent_0-2.zip]]
  • [get | view] (2007-08-28 19:24:15, 51.5 KB) [[attachment:ImageBrowserContent_0-3.zip]]
  • [get | view] (2007-08-30 21:15:21, 51.5 KB) [[attachment:ImageBrowserContent_0-4.zip]]
  • [get | view] (2007-08-30 22:05:48, 3.5 KB) [[attachment:ImageBrowserGenerator.zip]]
  • [get | view] (2007-08-17 18:41:18, 28.6 KB) [[attachment:ImageBrowserNoLoad.zip]]
  • [get | view] (2007-08-10 22:00:23, 23.1 KB) [[attachment:MacroMarket-ImageBrowser.zip]]
  • [get | view] (2007-08-14 18:43:08, 23.4 KB) [[attachment:MacroMarket-ImageBrowserNoLoad.zip]]
  • [get | view] (2007-08-28 23:30:19, 2.9 KB) [[attachment:SimpleInclude.py]]
  • [get | view] (2007-08-28 23:30:27, 0.2 KB) [[attachment:Test.py]]
  • [get | view] (2007-08-28 23:29:51, 0.9 KB) [[attachment:Thumbnail.py]]
  • [get | view] (2007-08-28 23:29:31, 5.2 KB) [[attachment:Thumbnail_action.py]]
  • [get | view] (2007-08-17 18:26:12, 160.3 KB) [[attachment:imagebrowser.png]]
  • [get | view] (2007-08-17 17:13:09, 39.0 KB) [[attachment:imagebrowsercontent.png]]
  • [get | view] (2007-08-17 17:55:36, 37.2 KB) [[attachment:imagebrowsercontent_closed.png]]
  • [get | view] (2007-08-22 16:42:34, 491.5 KB) [[attachment:imgbrwsr_images.zip]]
  • [get | view] (2007-08-28 23:28:39, 3.8 KB) [[attachment:imgbrwsrgen.py]]
 All files | Selected Files: delete move to page copy to page

You are not allowed to attach a file to this page.