def getAttachUrl(pagename, filename, request, addts=0, do='get'): """ Get URL that points to attachment `filename` of page `pagename`. For upload url, call with do='upload_form'. Returns the URL to do the specified "do" action or None, if this action is not supported. """ action = get_action(request, filename, do) if action: args = dict(action=action, do=do, target=filename) if do not in [ 'get', 'view', # harmless 'modify', # just renders the applet html, which has own ticket 'move', # renders rename form, which has own ticket ]: # create a ticket for the not so harmless operations # we need action= here because the current action (e.g. "show" page # with a macro AttachList) may not be the linked-to action, e.g. # "AttachFile". Also, AttachList can list attachments of another page, # thus we need to give pagename= also. args['ticket'] = wikiutil.createTicket(request, pagename=pagename, action=action_name) url = request.href(pagename, **args) return url
def create_form(self, create_only=False, recover_only=False): """ Create the complete HTML form code. """ _ = self._ form = self.make_form( html.Text( _("To change your password, " "enter a new password twice."))) self.make_row(_('Password'), [html.INPUT(type="password", size=36, name="password1")]) self.make_row(_('Password repeat'), [html.INPUT(type="password", size=36, name="password2")]) ticket = wikiutil.createTicket(self.request) form.append( html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) # Add buttons self.make_row('', [ html.INPUT(type="submit", name='save', value=_("Change password")), ' ', html.INPUT(type="submit", name='cancel', value=_("Cancel")), ]) return unicode(form)
def image_dialog(request): _ = request.getText url_prefix_static = request.cfg.url_prefix_static # wiki url requestUrl = request.url if requestUrl.find('?') == -1: requestUrl = requestUrl + '?action=fckdialog&dialog=image' action = requestUrl.split('?')[0] ticket = wikiutil.createTicket(request, pagename=request.page.page_name, action='AttachFile') redirectUrl = requestUrl attachmentsPagename = request.page.page_name attachments = _get_files(request, attachmentsPagename) attachments = filter( lambda attachment: attachment.endswith('.gif') or attachment.endswith( '.png') or attachment.endswith('.jpg') or attachment.endswith( '.jpeg'), attachments) attachments.sort() attachment_urls = {} for attachment in attachments: attachment_urls[attachment] = getAttachUrl(request.page.page_name, attachment, request, do='get') engine = tenjin.Engine(path=[os.path.dirname(__file__) + '/views']) html = engine.render('image_dialog.pyhtml', locals()) request.write(html)
def create_form(self): """ Create the complete HTML form code. """ _ = self._ form = self.make_form( html.Text( _('As a superuser, you can temporarily ' 'assume the identity of another user.'))) ticket = wikiutil.createTicket(self.request) self.make_row(_('Select User'), [self._user_select()], valign="top") form.append( html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) if not self._only: buttons = [ html.INPUT(type="submit", name="select_user", value=_('Select User')), ' ', ] else: buttons = [] buttons.append( html.INPUT(type="submit", name="cancel", value=_('Cancel'))) self.make_row('', buttons) return unicode(form)
def _make_form(self): action = "%s%s" % (self.request.script_root, self.request.path) _form = html.FORM(action=action) _form.append(html.INPUT(type="hidden", name="action", value="userprefs")) _form.append(html.INPUT(type="hidden", name="handler", value="oid")) ticket = wikiutil.createTicket(self.request) _form.append(html.INPUT(type="hidden", name="ticket", value=ticket)) return _form
def _make_form(self): action = "%s%s" % (self.request.script_root, self.request.path) _form = html.FORM(action=action) _form.append(html.INPUT(type="hidden", name="action", value="userprefs")) _form.append(html.INPUT(type="hidden", name="handler", value="oid")) ticket = wikiutil.createTicket(self.request) _form.append(html.INPUT(type="hidden", name="ticket", value=ticket)) return _form
def render(self): request = self.request _ = request.getText pagename = self.pagename target = self.target if not request.user.may.read(pagename): return _('You are not allowed to view attachments of this page.') if not request.user.may.write(pagename): # note: "recycled" a already existing translated string, so we do not need a new string: return _('You are not allowed to save a drawing on this page.') if not target: return _("Empty target name given.") ci = AttachFile.ContainerItem(request, pagename, target) if ci.exists(): drawurl = ci.member_url('drawing.draw') pngurl = ci.member_url('drawing.png') else: drawurl = 'drawing.draw' pngurl = 'drawing.png' pageurl = request.href(pagename) saveurl = request.href(pagename, action=action_name, do='save', target=target, ticket=wikiutil.createTicket(request)) helpurl = request.href("HelpOnActions/AttachFile") html = """ <p> <applet code="CH.ifa.draw.twiki.TWikiDraw.class" archive="%(htdocs)s/applets/TWikiDrawPlugin/twikidraw.jar" width="640" height="480"> <param name="drawpath" value="%(drawurl)s"> <param name="pngpath" value="%(pngurl)s"> <param name="savepath" value="%(saveurl)s"> <param name="basename" value="%(basename)s"> <param name="viewpath" value="%(pageurl)s"> <param name="helppath" value="%(helpurl)s"> <strong>NOTE:</strong> You need a Java enabled browser to edit the drawing. </applet> </p> """ % dict( htdocs=request.cfg.url_prefix_static, basename=wikiutil.escape(target, 1), drawurl=wikiutil.escape(drawurl, 1), pngurl=wikiutil.escape(pngurl, 1), pageurl=wikiutil.escape(pageurl, 1), saveurl=wikiutil.escape(saveurl, 1), helpurl=wikiutil.escape(helpurl, 1), ) title = "%s %s:%s" % (_("Edit drawing"), pagename, target) request.theme.send_title(title, page=request.page, pagename=pagename) request.write(request.formatter.startContent("content")) request.write(request.formatter.rawHTML(html)) request.write(request.formatter.endContent()) request.theme.send_footer(pagename) request.theme.send_closing_html()
def execute(pagename, request): _ = request.getText actname = __name__.split('.')[-1] # Create a page editor that does not do edior backups, becuase # delete generate "deleted" version, of the page. page = PageEditor(request, pagename, do_editor_backup=0) # be extra paranoid in dangerous actions if actname in request.cfg.excluded_actions \ or not request.user.may.write(pagename) \ or not request.user.may.delete(pagename): return page.send_page(request, msg = _('You are not allowed to delete this page.')) # check whether page exists at all if not page.exists(): return page.send_page(request, msg = _('This page is already deleted or was never created!')) # check whether the user clicked the delete button if request.form.has_key('button') and request.form.has_key('ticket'): # check whether this is a valid deletion request (make outside # attacks harder by requiring two full HTTP transactions) if not wikiutil.checkTicket(request.form['ticket'][0]): return page.send_page(request, msg = _('Please use the interactive user interface to delete pages!')) # Delete the page page.deletePage(request.form.get('comment', [u''])[0]) return page.send_page(request, msg = _('Page "%s" was successfully deleted!') % (pagename,)) # send deletion form ticket = wikiutil.createTicket() querytext = _('Really delete this page?') button = _('Delete') comment_label = _("Optional reason for the deletion") # TODO: this form suck, redesign like RenamePage formhtml = ''' <form method="post" action=""> <strong>%(querytext)s</strong> <input type="hidden" name="action" value="%(actname)s"> <input type="hidden" name="ticket" value="%(ticket)s"> <input type="submit" name="button" value="%(button)s"> <p> %(comment_label)s<br> <input type="text" name="comment" size="60" maxlength="80"> </form>''' % { 'querytext': querytext, 'actname': actname, 'ticket': ticket, 'button': button, 'comment_label': comment_label, } return page.send_page(request, msg=formhtml)
def testTickets(self): from MoinMoin.Page import Page # page name with double quotes self.request.page = Page(self.request, u'bla"bla') ticket1 = wikiutil.createTicket(self.request) assert wikiutil.checkTicket(self.request, ticket1) # page name with non-ASCII chars self.request.page = Page(self.request, u'\xc4rger') ticket2 = wikiutil.createTicket(self.request) assert wikiutil.checkTicket(self.request, ticket2) # same page with another action self.request.page = Page(self.request, u'\xc4rger') self.request.action = 'another' ticket3 = wikiutil.createTicket(self.request) assert wikiutil.checkTicket(self.request, ticket3) assert ticket1 != ticket2 assert ticket2 != ticket3
def macro_PhotoUpload(macro): """ Send the HTML code for the list of already stored attachments and the file upload form. """ request = macro.request pagename = request.page.page_name _ = request.getText if not request.user.may.read(pagename): request.write('<p>%s</p>' % _('You are not allowed to view this page.')) return writeable = request.user.may.write(pagename) # First send out the upload new attachment form on top of everything else. # This avoids usability issues if you have to scroll down a lot to upload # a new file when the page already has lots of attachments: if writeable: request.write('<h2>' + u"새로운 사진 올리기" + '</h2>') request.write(""" <form action="%(url)s?action=PhotoUpload" method="POST" enctype="multipart/form-data"> <dl> <dt>%(upload_label_file)s <input type="file" name="file" size="50"></dt> <dd></dd> </dl> %(textcha)s <p> <input type="hidden" name="action" value="%(action_name)s"> <input type="submit" value="%(upload_button)s"> </p> </form> """ % { 'url': request.href(pagename), 'action_name': 'PhotoUpload', 'upload_label_file': u'좋은사진 이쁜사진 고릅시다.', 'upload_label_target': _('Sequence'), # 'target': wikiutil.escape(request.values.get('target', ''), 1), # 'target': '00001.jpg', 'upload_label_overwrite': _('Overwrite existing attachment of same name'), 'overwrite_checked': ('', 'checked')[request.form.get('overwrite', '0') == '1'], 'upload_button': _('Upload'), 'textcha': TextCha(request).render(), 'ticket': wikiutil.createTicket(request), }) # request.write('<h2>' + _("Attached Files") + '</h2>') # #request.write(_get_filelist(request, pagename)) # if not writeable: # request.write('<p>%s</p>' % _('You are not allowed to attach a file to this page.')) #send_photouploadform('FrontPage', request) return ""
def _do_move(pagename, request): _ = request.getText pagename, filename, fpath = _access_file(pagename, request) if not request.user.may.delete(pagename): return _('You are not allowed to move attachments from this page.') if not filename: return # error msg already sent in _access_file # move file d = {'action': action_name, 'baseurl': request.getScriptname(), 'do': 'attachment_move', 'ticket': wikiutil.createTicket(request), 'pagename': pagename, 'pagename_quoted': wikiutil.quoteWikinameURL(pagename), 'attachment_name': filename, 'move': _('Move'), 'cancel': _('Cancel'), 'newname_label': _("New page name"), 'attachment_label': _("New attachment name"), } formhtml = ''' <form action="%(baseurl)s/%(pagename_quoted)s" method="POST"> <input type="hidden" name="action" value="%(action)s"> <input type="hidden" name="do" value="%(do)s"> <input type="hidden" name="ticket" value="%(ticket)s"> <table> <tr> <td class="label"><label>%(newname_label)s</label></td> <td class="content"> <input type="text" name="newpagename" value="%(pagename)s" size="80"> </td> </tr> <tr> <td class="label"><label>%(attachment_label)s</label></td> <td class="content"> <input type="text" name="newattachmentname" value="%(attachment_name)s" size="80"> </td> </tr> <tr> <td></td> <td class="buttons"> <input type="hidden" name="oldattachmentname" value="%(attachment_name)s"> <input type="submit" name="move" value="%(move)s"> <input type="submit" name="cancel" value="%(cancel)s"> </td> </tr> </table> </form>''' % d thispage = Page(request, pagename) request.theme.add_msg(formhtml, "dialog") return thispage.send_page()
def _do_move(pagename, request): _ = request.getText pagename, filename, fpath = _access_file(pagename, request) if not request.user.may.delete(pagename): return _('You are not allowed to move attachments from this page.') if not filename: return # error msg already sent in _access_file # move file d = { 'action': action_name, 'url': request.href(pagename), 'do': 'attachment_move', 'ticket': wikiutil.createTicket(request), 'pagename': wikiutil.escape(pagename, 1), 'attachment_name': wikiutil.escape(filename, 1), 'move': _('Move'), 'cancel': _('Cancel'), 'newname_label': _("New page name"), 'attachment_label': _("New attachment name"), } formhtml = ''' <form action="%(url)s" method="POST"> <input type="hidden" name="action" value="%(action)s"> <input type="hidden" name="do" value="%(do)s"> <input type="hidden" name="ticket" value="%(ticket)s"> <table> <tr> <td class="label"><label>%(newname_label)s</label></td> <td class="content"> <input type="text" name="newpagename" value="%(pagename)s" size="80"> </td> </tr> <tr> <td class="label"><label>%(attachment_label)s</label></td> <td class="content"> <input type="text" name="newattachmentname" value="%(attachment_name)s" size="80"> </td> </tr> <tr> <td></td> <td class="buttons"> <input type="hidden" name="oldattachmentname" value="%(attachment_name)s"> <input type="submit" name="move" value="%(move)s"> <input type="submit" name="cancel" value="%(cancel)s"> </td> </tr> </table> </form>''' % d thispage = Page(request, pagename) request.theme.add_msg(formhtml, "dialog") return thispage.send_page()
def send_uploadform(pagename, request): """ Send the HTML code for the list of already stored attachments and the file upload form. """ _ = request.getText if not request.user.may.read(pagename): request.write('<p>%s</p>' % _('You are not allowed to view this page.')) return writeable = request.user.may.write(pagename) # First send out the upload new attachment form on top of everything else. # This avoids usability issues if you have to scroll down a lot to upload # a new file when the page already has lots of attachments: if writeable: request.write('<h2>' + _("New Attachment") + '</h2>') request.write(""" <form action="%(url)s" method="POST" enctype="multipart/form-data"> <dl> <dt>%(upload_label_file)s</dt> <dd><input type="file" name="file" size="50"></dd> <dt>%(upload_label_target)s</dt> <dd><input type="text" name="target" size="50" value="%(target)s"></dd> <dt>%(upload_label_overwrite)s</dt> <dd><input type="checkbox" name="overwrite" value="1" %(overwrite_checked)s></dd> </dl> %(textcha)s <p> <input type="hidden" name="action" value="%(action_name)s"> <input type="hidden" name="do" value="upload"> <input type="hidden" name="ticket" value="%(ticket)s"> <input type="submit" value="%(upload_button)s"> </p> </form> """ % { 'url': request.href(pagename), 'action_name': action_name, 'upload_label_file': _('File to upload'), 'upload_label_target': _('Rename to'), 'target': wikiutil.escape(request.values.get('target', ''), 1), 'upload_label_overwrite': _('Overwrite existing attachment of same name'), 'overwrite_checked': ('', 'checked')[request.form.get('overwrite', '0') == '1'], 'upload_button': _('Upload'), 'textcha': TextCha(request).render(), 'ticket': wikiutil.createTicket(request), }) request.write('<h2>' + _("Attached Files") + '</h2>') request.write(_get_filelist(request, pagename)) if not writeable: request.write('<p>%s</p>' % _('You are not allowed to attach a file to this page.'))
def render(self): request = self.request _ = request.getText pagename = self.pagename target = self.target if not request.user.may.read(pagename): return _('You are not allowed to view attachments of this page.') if not target: return _("Empty target name given.") ci = AttachFile.ContainerItem(request, pagename, target) if ci.exists(): drawurl = ci.member_url('drawing.draw') pngurl = ci.member_url('drawing.png') else: drawurl = 'drawing.draw' pngurl = 'drawing.png' pageurl = request.href(pagename) saveurl = request.href(pagename, action=action_name, do='save', target=target, ticket=wikiutil.createTicket(request)) helpurl = request.href("HelpOnActions/AttachFile") html = """ <p> <applet code="CH.ifa.draw.twiki.TWikiDraw.class" archive="%(htdocs)s/applets/TWikiDrawPlugin/twikidraw.jar" width="640" height="480"> <param name="drawpath" value="%(drawurl)s"> <param name="pngpath" value="%(pngurl)s"> <param name="savepath" value="%(saveurl)s"> <param name="basename" value="%(basename)s"> <param name="viewpath" value="%(pageurl)s"> <param name="helppath" value="%(helpurl)s"> <strong>NOTE:</strong> You need a Java enabled browser to edit the drawing. </applet> </p> """ % dict( htdocs=request.cfg.url_prefix_static, basename=wikiutil.escape(target, 1), drawurl=wikiutil.escape(drawurl, 1), pngurl=wikiutil.escape(pngurl, 1), pageurl=wikiutil.escape(pageurl, 1), saveurl=wikiutil.escape(saveurl, 1), helpurl=wikiutil.escape(helpurl, 1), ) title = "%s %s:%s" % (_("Edit drawing"), pagename, target) request.theme.send_title(title, page=request.page, pagename=pagename) request.write(request.formatter.startContent("content")) request.write(request.formatter.rawHTML(html)) request.write(request.formatter.endContent()) request.theme.send_footer(pagename) request.theme.send_closing_html()
def create_form(self): """ Create the complete HTML form code. """ _ = self._ self._form = self.make_form(_("Select the events you want to be notified about.")) self._form.append(html.INPUT(type="hidden", name="action", value="userprefs")) self._form.append(html.INPUT(type="hidden", name="handler", value="prefs")) ticket = wikiutil.createTicket(self.request) self._form.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) if not (self.cfg.mail_enabled and self.request.user.email) and not ( self.cfg.jabber_enabled and self.request.user.jid ): self.make_row( "", [ html.Text( _( "Before you can be notified, you need to provide a way" " to contact you in the general preferences." ) ) ], ) self.make_row("", [html.INPUT(type="submit", name="cancel", value=_("Cancel"))]) return unicode(self._form) self.make_row(_("Subscribed events"), [self._event_select()]) # Get list of subscribe pages, DO NOT sort! it should # stay in the order the user entered it in his input # box. notifylist = self.request.user.getSubscriptionList() self.make_row( html.Raw(_("Subscribed wiki pages<<BR>>(one regex per line)", wiki=True)), [html.TEXTAREA(name="subscribed_pages", rows="6", cols="50").append("\n".join(notifylist))], valign="top", ) # Add buttons self.make_row( "", [ html.INPUT(type="submit", name="save", value=_("Save")), " ", html.INPUT(type="submit", name="cancel", value=_("Cancel")), ], ) return unicode(self._form)
def makeform(self): """ Display a rename page form The form might contain an error that happened when trying to rename. """ from MoinMoin.widget.dialog import Dialog _ = self.request.getText error = '' if self.error: error = u'<p class="error">%s</p>\n' % self.error d = { 'error': error, 'action': self.__class__.__name__, 'ticket': wikiutil.createTicket(), 'pagename': self.pagename, 'rename': _('Rename Page'), 'cancel': _('Cancel'), 'newname_label': _("New name"), 'comment_label': _("Optional reason for the renaming"), } form = ''' %(error)s <form method="post" action=""> <input type="hidden" name="action" value="%(action)s"> <input type="hidden" name="ticket" value="%(ticket)s"> <table> <tr> <td class="label"><label>%(newname_label)s</label></td> <td class="content"> <input type="text" name="newpagename" value="%(pagename)s"> </td> </tr> <tr> <td class="label"><label>%(comment_label)s</label></td> <td class="content"> <input type="text" name="comment" maxlength="80"> </td> </tr> <tr> <td></td> <td class="buttons"> <input type="submit" name="rename" value="%(rename)s"> <input type="submit" name="cancel" value="%(cancel)s"> </td> </tr> </table> </form>''' % d return Dialog(self.request, content=form)
def create_form(self): """ Create the complete HTML form code. """ _ = self._ self._form = self.make_form( _('Select the events you want to be notified about.')) self._form.append( html.INPUT(type="hidden", name="action", value="userprefs")) self._form.append( html.INPUT(type="hidden", name="handler", value="prefs")) ticket = wikiutil.createTicket(self.request) self._form.append( html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) if (not (self.cfg.mail_enabled and self.request.user.email) and not (self.cfg.jabber_enabled and self.request.user.jid)): self.make_row('', [ html.Text( _("Before you can be notified, you need to provide a way" " to contact you in the general preferences.")) ]) self.make_row( '', [html.INPUT(type="submit", name="cancel", value=_("Cancel"))]) return unicode(self._form) self.make_row(_('Subscribed events'), [self._event_select()]) # Get list of subscribe pages, DO NOT sort! it should # stay in the order the user entered it in his input # box. notifylist = self.request.user.getSubscriptionList() self.make_row(html.Raw( _('Subscribed wiki pages<<BR>>(one regex per line)', wiki=True)), [ html.TEXTAREA(name="subscribed_pages", rows="6", cols="50").append('\n'.join(notifylist)), ], valign="top") # Add buttons self.make_row('', [ html.INPUT(type="submit", name="save", value=_("Save")), ' ', html.INPUT(type="submit", name="cancel", value=_("Cancel")) ]) return unicode(self._form)
def send_moveform(pagename, request): _ = request.getText filename, fpath = _access_file(pagename, request) if not filename: return # error msg already sent in _access_file # move file d = {'action': 'AttachFile', 'do': 'attachment_move', 'ticket': wikiutil.createTicket(request), 'pagename': pagename, 'attachment_name': filename, 'move': _('Move'), 'cancel': _('Cancel'), 'newname_label': _("New page name"), 'attachment_label': _("New attachment name"), } formhtml = ''' <form method="post" action=""> <input type="hidden" name="action" value="%(action)s"> <input type="hidden" name="do" value="%(do)s"> <input type="hidden" name="ticket" value="%(ticket)s"> <table> <tr> <td class="label"><label>%(newname_label)s</label></td> <td class="content"> <input type="text" name="newpagename" value="%(pagename)s"> </td> </tr> <tr> <td class="label"><label>%(attachment_label)s</label></td> <td class="content"> <input type="text" name="newattachmentname" value="%(attachment_name)s"> </td> </tr> <tr> <td></td> <td class="buttons"> <input type="hidden" name="oldattachmentname" value="%(attachment_name)s"> <input type="submit" name="move" value="%(move)s"> <input type="submit" name="cancel" value="%(cancel)s"> </td> </tr> </table> </form>''' % d thispage = Page(request, pagename) return thispage.send_page(request, msg=formhtml)
def make_form(self): """ Make some form html for later display. The form might contain an error that happened when trying to do the action. """ from MoinMoin.widget.dialog import Dialog _ = self._ if self.error: error_html = u'<p class="error">%s</p>\n' % self.error else: error_html = '' buttons = self.make_buttons() buttons_html = [] for button in buttons: buttons_html.append('<input type="submit" name="%s" value="%s">' % button) buttons_html = "".join(buttons_html) if self.use_ticket: ticket_html = '<input type="hidden" name="ticket" value="%s">' % wikiutil.createTicket(self.request) else: ticket_html = '' d = { 'method': self.method, 'baseurl': self.request.getScriptname(), 'enctype': self.enctype, 'error_html': error_html, 'actionname': self.actionname, 'pagename': self.pagename, 'pagename_quoted': wikiutil.quoteWikinameURL(self.pagename), 'ticket_html': ticket_html, 'user_html': self.get_form_html(buttons_html), } form_html = ''' %(error_html)s <form action="%(baseurl)s/%(pagename_quoted)s" method="%(method)s" enctype="%(enctype)s"> <div> <input type="hidden" name="action" value="%(actionname)s"> %(ticket_html)s %(user_html)s </div> </form>''' % d return Dialog(self.request, content=form_html)
def make_form(self): """ Make some form html for later display. The form might contain an error that happened when trying to do the action. """ from MoinMoin.widget.dialog import Dialog _ = self._ if self.error: error_html = u'<p class="error">%s</p>\n' % self.error else: error_html = '' buttons = self.make_buttons() buttons_html = [] for button in buttons: buttons_html.append('<input type="submit" name="%s" value="%s">' % button) buttons_html = "".join(buttons_html) if self.use_ticket: ticket_html = '<input type="hidden" name="ticket" value="%s">' % wikiutil.createTicket( self.request) else: ticket_html = '' d = { 'method': self.method, 'url': self.request.href(self.pagename), 'enctype': self.enctype, 'error_html': error_html, 'actionname': self.actionname, 'ticket_html': ticket_html, 'user_html': self.get_form_html(buttons_html), } form_html = ''' %(error_html)s <form action="%(url)s" method="%(method)s" enctype="%(enctype)s"> <div> <input type="hidden" name="action" value="%(actionname)s"> %(ticket_html)s %(user_html)s </div> </form>''' % d return Dialog(self.request, content=form_html)
def create_form(self): """ Create the complete HTML form code. """ _ = self._ form = self.make_form( html.Text(_("As a superuser, you can temporarily " "assume the identity of another user.")) ) ticket = wikiutil.createTicket(self.request) self.make_row(_("Select User"), [self._user_select()], valign="top") form.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) if not self._only: buttons = [html.INPUT(type="submit", name="select_user", value=_("Select User")), " "] else: buttons = [] buttons.append(html.INPUT(type="submit", name="cancel", value=_("Cancel"))) self.make_row("", buttons) return unicode(form)
def show_password_form(self, name, password): _ = self.request.getText d = { "message": _(r"Please enter your password of your account at the remote wiki below. <<BR>> /!\ You should trust both wikis because the password could be read by the particular administrators.", wiki=True), "namelabel": _("Name"), "name": name, "passwordlabel": _("Password"), "password": password, "ticket": wikiutil.createTicket(self.request), "submit": _("Login"), "cancel": _("Cancel"), } html_form = """ %(message)s <form method="post"> <div> <input type="hidden" name="action" value="SyncPages"> <input type="hidden" name="ticket" value="%(ticket)s"> <label for="iName" style="font-weight: bold;">%(namelabel)s:</label> <input type="text" name="name" id="iName" size="32" value="%(name)s"> </div> <div> <label for="iPassword" style="font-weight: bold;">%(passwordlabel)s:</label> <input type="password" name="password" id="iPassword" size="32" value="%(password)s"> </div> <div style="margin-top:1em; margin-bottom:1em;"> <div style="float:left"> <input type="submit" value="%(submit)s"> </div> <div style="margin-left: 10em; margin-right: 10em;"> <input type="submit" value="%(cancel)s" name="cancel"> </div> </div> </form> """ % d self.request.theme.add_msg(html_form, "dialog") self.page.send_page()
def show_pages(request, pagename, editor, timestamp): _ = request.getText timestamp = int(timestamp * 1000000) log = editlog.EditLog(request) pages = {} # mimic macro object for use of RecentChanges subfunctions macro = tmp() macro.request = request macro.formatter = request.html_formatter request.write("<table>") for line in log.reverse(): if line.ed_time_usecs < timestamp: break if not request.user.may.read(line.pagename): continue if not line.pagename in pages: pages[line.pagename] = 1 if repr(line.getInterwikiEditorData(request)) == editor: line.time_tuple = request.user.getTime(wikiutil.version2timestamp(line.ed_time_usecs)) request.write(RecentChanges.format_page_edits(macro, [line], timestamp)) request.write( """ </table> <p> <form method="post" action="%(url)s"> <input type="hidden" name="action" value="Despam"> <input type="hidden" name="ticket" value="%(ticket)s"> <input type="hidden" name="editor" value="%(editor)s"> <input type="submit" name="ok" value="%(label)s"> </form> </p> """ % dict( url=request.href(pagename), ticket=wikiutil.createTicket(request), editor=wikiutil.url_quote(editor), label=_("Revert all!"), ) )
def create_form(self, create_only=False, recover_only=False): r = self.request ss = self.cfg.session_service format_time = lambda x: self.request.user.getFormattedDateTime( x) if x else x form = self.make_form(html.Text("Active sessions for your account")) ticket = wikiutil.createTicket(self.request) form.append( html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) self._table.append(html.TR().extend([ html.TD().extend([""]), html.TD().extend([html.B().append("From IP")]), html.TD().extend([html.B().append("Login Date")]), html.TD().extend([html.B().append("Expiration")]), html.TD().extend([html.B().append("User Agent")]), ])) for sid in ss.get_all_session_ids(r): session = ss.get_session(r, sid) if session.get("user.id") != r.user.id: continue self._table.append(html.TR().extend([ html.TD().extend( [html.INPUT(type="checkbox", name="session.%s" % sid)]), html.TD().extend([session.get("from_ip")]), html.TD().extend([format_time(session.get("started"))]), html.TD().extend([format_time(session.get("expires"))]), html.TD().extend([session.get("from_ua")]), ])) form.append( unicode( html.INPUT(type="submit", name='save', value="Delete Sessions"))) form.append( unicode(html.INPUT(type="submit", name='cancel', value="Cancel"))) #form.append(repr(r.in_headers)) return unicode(form)
def show_pages(request, pagename, editor, timestamp): _ = request.getText timestamp = int(timestamp * 1000000) log = editlog.EditLog(request) pages = {} # mimic macro object for use of RecentChanges subfunctions macro = tmp() macro.request = request macro.formatter = request.html_formatter request.write("<table>") for line in log.reverse(): if line.ed_time_usecs < timestamp: break if not request.user.may.read(line.pagename): continue if not line.pagename in pages: pages[line.pagename] = 1 if repr(line.getInterwikiEditorData(request)) == editor: line.time_tuple = request.user.getTime(wikiutil.version2timestamp(line.ed_time_usecs)) request.write(RecentChanges.format_page_edits(macro, [line], timestamp)) request.write(''' </table> <p> <form method="post" action="%(url)s"> <input type="hidden" name="action" value="Despam"> <input type="hidden" name="ticket" value="%(ticket)s"> <input type="hidden" name="editor" value="%(editor)s"> <input type="submit" name="ok" value="%(label)s"> </form> </p> ''' % dict( url=request.href(pagename), ticket=wikiutil.createTicket(request), editor=wikiutil.url_quote(editor), label=_("Revert all!"), ))
def create_form(self, create_only=False, recover_only=False): """ Create the complete HTML form code. """ _ = self._ form = self.make_form(html.Text(_("To change your password, " "enter a new password twice."))) self.make_row(_('Password'), [html.INPUT(type="password", size=36, name="password1")]) self.make_row(_('Password repeat'), [html.INPUT(type="password", size=36, name="password2")]) ticket = wikiutil.createTicket(self.request) form.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) # Add buttons self.make_row('', [ html.INPUT(type="submit", name='save', value=_("Change password")), ' ', html.INPUT(type="submit", name='cancel', value=_("Cancel")), ]) return unicode(form)
def getAttachUrl(pagename, filename, request, addts=0, do='get'): """ Get URL that points to attachment `filename` of page `pagename`. For upload url, call with do='upload_form'. Returns the URL to do the specified "do" action or None, if this action is not supported. """ action = get_action(request, filename, do) if action: args = dict(action=action, do=do, target=filename) if do not in ['get', 'view', # harmless 'modify', # just renders the applet html, which has own ticket 'move', # renders rename form, which has own ticket ]: # create a ticket for the not so harmless operations # we need action= here because the current action (e.g. "show" page # with a macro AttachList) may not be the linked-to action, e.g. # "AttachFile". Also, AttachList can list attachments of another page, # thus we need to give pagename= also. args['ticket'] = wikiutil.createTicket(request, pagename=pagename, action=action_name) url = request.href(pagename, **args) return url
def show_password_form(self, name, password): _ = self.request.getText d = {"message": _(r"Please enter your password of your account at the remote wiki below. <<BR>> /!\ You should trust both wikis because the password could be read by the particular administrators.", wiki=True), "namelabel": _("Name"), "name": name, "passwordlabel": _("Password"), "password": password, "ticket": wikiutil.createTicket(self.request), "submit": _("Login"), "cancel": _("Cancel"), } html_form = """ %(message)s <form method="post"> <div> <input type="hidden" name="action" value="SyncPages"> <input type="hidden" name="ticket" value="%(ticket)s"> <label for="iName" style="font-weight: bold;">%(namelabel)s:</label> <input type="text" name="name" id="iName" size="32" value="%(name)s"> </div> <div> <label for="iPassword" style="font-weight: bold;">%(passwordlabel)s:</label> <input type="password" name="password" id="iPassword" size="32" value="%(password)s"> </div> <div style="margin-top:1em; margin-bottom:1em;"> <div style="float:left"> <input type="submit" value="%(submit)s"> </div> <div style="margin-left: 10em; margin-right: 10em;"> <input type="submit" value="%(cancel)s" name="cancel"> </div> </div> </form> """ % d self.request.theme.add_msg(html_form, "dialog") self.page.send_page()
def sendEditor(self, **kw): """ Send the editor form page. @keyword preview: if given, show this text in preview mode @keyword staytop: don't go to #preview @keyword comment: comment field (when preview is true) """ from MoinMoin import i18n from MoinMoin.action import SpellCheck request = self.request form = request.form _ = self._ raw_body = '' msg = None conflict_msg = None edit_lock_message = None preview = kw.get('preview', None) staytop = kw.get('staytop', 0) # check edit permissions if not request.user.may.write(self.page_name): msg = _('You are not allowed to edit this page.') elif not self.isWritable(): msg = _('Page is immutable!') elif self.rev: # Trying to edit an old version, this is not possible via # the web interface, but catch it just in case... msg = _('Cannot edit old revisions!') else: # try to acquire edit lock ok, edit_lock_message = self.lock.acquire() if not ok: # failed to get the lock if preview is not None: edit_lock_message = _('The lock you held timed out. Be prepared for editing conflicts!' ) + "<br>" + edit_lock_message else: msg = edit_lock_message # Did one of the prechecks fail? if msg: request.theme.add_msg(msg, "error") self.send_page() return # Emit http_headers after checks (send_page) request.disableHttpCaching(level=2) # check if we want to load a draft use_draft = None if 'button_load_draft' in form: wanted_draft_timestamp = int(form.get('draft_ts', '0')) if wanted_draft_timestamp: draft = self._load_draft() if draft is not None: draft_timestamp, draft_rev, draft_text = draft if draft_timestamp == wanted_draft_timestamp: use_draft = draft_text # Check for draft / normal / preview submit if use_draft is not None: title = _('Draft of "%(pagename)s"') # Propagate original revision rev = int(form['draft_rev']) self.set_raw_body(use_draft, modified=1) preview = use_draft elif preview is None: title = _('Edit "%(pagename)s"') else: title = _('Preview of "%(pagename)s"') # Propagate original revision rev = request.rev self.set_raw_body(preview, modified=1) # send header stuff lock_timeout = self.lock.timeout / 60 lock_page = wikiutil.escape(self.page_name, quote=1) lock_expire = _("Your edit lock on %(lock_page)s has expired!") % {'lock_page': lock_page} lock_mins = _("Your edit lock on %(lock_page)s will expire in # minutes.") % {'lock_page': lock_page} lock_secs = _("Your edit lock on %(lock_page)s will expire in # seconds.") % {'lock_page': lock_page} # get request parameters try: text_rows = int(form['rows']) except StandardError: text_rows = self.cfg.edit_rows if request.user.valid: text_rows = int(request.user.edit_rows) if preview is not None: # Check for editing conflicts if not self.exists(): # page does not exist, are we creating it? if rev: conflict_msg = _('Someone else deleted this page while you were editing!') elif rev != self.current_rev(): conflict_msg = _('Someone else changed this page while you were editing!') if self.mergeEditConflict(rev): conflict_msg = _("""Someone else saved this page while you were editing! Please review the page and save then. Do not save this page as it is!""") rev = self.current_rev() if conflict_msg: # We don't show preview when in conflict preview = None elif self.exists(): # revision of existing page rev = self.current_rev() else: # page creation rev = 0 self.setConflict(bool(conflict_msg)) # Page editing is done using user language request.setContentLanguage(request.lang) # Get the text body for the editor field. # TODO: what about deleted pages? show the text of the last revision or use the template? if preview is not None: raw_body = self.get_raw_body() if use_draft: request.write(_("[Content loaded from draft]"), '<br>') elif self.exists(): # If the page exists, we get the text from the page. # TODO: maybe warn if template argument was ignored because the page exists? raw_body = self.get_raw_body() elif 'template' in request.values: # If the page does not exist, we try to get the content from the template parameter. template_page = wikiutil.unquoteWikiname(request.values['template']) template_page_escaped = wikiutil.escape(template_page) if request.user.may.read(template_page): raw_body = Page(request, template_page).get_raw_body() if raw_body: request.write(_("[Content of new page loaded from %s]") % (template_page_escaped, ), '<br>') else: request.write(_("[Template %s not found]") % (template_page_escaped, ), '<br>') else: request.write(_("[You may not read %s]") % (template_page_escaped, ), '<br>') # Make backup on previews - but not for new empty pages if not use_draft and preview and raw_body: self._save_draft(raw_body, rev) draft_message = None loadable_draft = False if preview is None: draft = self._load_draft() if draft is not None: draft_timestamp, draft_rev, draft_text = draft if draft_text != raw_body: loadable_draft = True page_rev = rev draft_timestamp_str = request.user.getFormattedDateTime(draft_timestamp) draft_message = _(u"'''<<BR>>Your draft based on revision %(draft_rev)d (saved %(draft_timestamp_str)s) can be loaded instead of the current revision %(page_rev)d by using the load draft button - in case you lost your last edit somehow without saving it.''' A draft gets saved for you when you do a preview, cancel an edit or unsuccessfully save.", wiki=True, percent=True) % locals() # Setup status message status = [kw.get('msg', ''), conflict_msg, edit_lock_message, draft_message] status = [msg for msg in status if msg] status = ' '.join(status) status = Status(request, content=status) request.theme.add_msg(status, "error") request.theme.send_title( title % {'pagename': self.split_title(), }, page=self, html_head=self.lock.locktype and ( PageEditor._countdown_js % { 'countdown_script': request.theme.externalScript('countdown'), 'lock_timeout': lock_timeout, 'lock_expire': lock_expire, 'lock_mins': lock_mins, 'lock_secs': lock_secs, }) or '', editor_mode=1, allow_doubleclick=1, ) request.write(request.formatter.startContent("content")) # Generate default content for new pages if not raw_body: raw_body = _('Describe %s here.') % (self.page_name, ) # send form request.write('<form id="editor" method="post" action="%s#preview">' % ( request.href(self.page_name) )) # yet another weird workaround for broken IE6 (it expands the text # editor area to the right after you begin to type...). IE sucks... # http://fplanque.net/2003/Articles/iecsstextarea/ request.write('<fieldset style="border:none;padding:0;">') request.write(unicode(html.INPUT(type="hidden", name="action", value="edit"))) # Send revision of the page our edit is based on request.write('<input type="hidden" name="rev" value="%d">' % (rev, )) # Add src format (e.g. 'wiki') into a hidden form field, so that # we can load the correct converter after POSTing. request.write('<input type="hidden" name="format" value="%s">' % self.pi['format']) # Create and send a ticket, so we can check the POST request.write('<input type="hidden" name="ticket" value="%s">' % wikiutil.createTicket(request)) # Save backto in a hidden input backto = request.values.get('backto') if backto: request.write(unicode(html.INPUT(type="hidden", name="backto", value=backto))) # button bar button_spellcheck = '<input class="button" type="submit" name="button_spellcheck" value="%s">' % _('Check Spelling') save_button_text = _('Save Changes') cancel_button_text = _('Cancel') if self.cfg.page_license_enabled: request.write('<p><em>', _( """By hitting '''%(save_button_text)s''' you put your changes under the %(license_link)s. If you don't want that, hit '''%(cancel_button_text)s''' to cancel your changes.""", wiki=True) % { 'save_button_text': save_button_text, 'cancel_button_text': cancel_button_text, 'license_link': wikiutil.getLocalizedPage(request, self.cfg.page_license_page).link_to(request), }, '</em></p>') request.write(''' <input class="button" type="submit" name="button_save" value="%s"> <input class="button" type="submit" name="button_preview" value="%s"> <input class="button" type="submit" name="button_switch" value="%s"> ''' % (save_button_text, _('Preview'), _('Text mode'), )) if loadable_draft: request.write(''' <input class="button" type="submit" name="button_load_draft" value="%s" onClick="flgChange = false;"> <input type="hidden" name="draft_ts" value="%d"> <input type="hidden" name="draft_rev" value="%d"> ''' % (_('Load Draft'), draft_timestamp, draft_rev)) request.write(''' %s <input class="button" type="submit" name="button_cancel" value="%s"> <input type="hidden" name="editor" value="gui"> ''' % (button_spellcheck, cancel_button_text, )) if self.cfg.mail_enabled: request.write(''' <script type="text/javascript"> function toggle_trivial(CheckedBox) { TrivialBoxes = document.getElementsByName("trivial"); for (var i = 0; i < TrivialBoxes.length; i++) TrivialBoxes[i].checked = CheckedBox.checked; } </script> <input type="checkbox" name="trivial" id="chktrivialtop" value="1" %(checked)s onclick="toggle_trivial(this)"> <label for="chktrivialtop">%(label)s</label> ''' % { 'checked': ('', 'checked')[form.get('trivial', '0') == '1'], 'label': _("Trivial change"), }) from MoinMoin.security.textcha import TextCha request.write(TextCha(request).render()) self.sendconfirmleaving() # TODO update state of flgChange to make this work, see PageEditor # Add textarea with page text lang = self.pi.get('language', request.cfg.language_default) contentlangdirection = i18n.getDirection(lang) # 'ltr' or 'rtl' uilanguage = request.lang url_prefix_static = request.cfg.url_prefix_static url_prefix_local = request.cfg.url_prefix_local wikipage = wikiutil.quoteWikinameURL(self.page_name) fckbasepath = request.cfg.url_prefix_fckeditor wikiurl = request.script_root + '/' themepath = '%s/%s' % (url_prefix_static, request.theme.name) smileypath = themepath + '/img' # auto-generating a list for SmileyImages does NOT work from here! text_rows = int(request.user.edit_rows) if not text_rows: # if no specific value is given for editor height, but 0, we # compute the rows from the raw_body line count plus some # extra rows for adding new text in the editor. Maybe this helps # with the "double slider" usability issue, esp. for devices like # the iphone where you can't operate both sliders. current_rows = len(raw_body.split('\n')) text_rows = max(10, int(current_rows * 1.5)) editor_size = text_rows * 22 # 22 height_pixels/line word_rule = self.word_rule() request.write(""" <script type="text/javascript" src="%(fckbasepath)s/fckeditor.js"></script> <script type="text/javascript"> <!-- var oFCKeditor = new FCKeditor( 'savetext', '100%%', %(editor_size)s, 'MoinDefault' ) ; oFCKeditor.BasePath= '%(fckbasepath)s/' ; oFCKeditor.Config['WikiBasePath'] = '%(wikiurl)s' ; oFCKeditor.Config['WikiPage'] = '%(wikipage)s' ; oFCKeditor.Config['PluginsPath'] = '%(url_prefix_local)s/applets/moinFCKplugins/' ; oFCKeditor.Config['CustomConfigurationsPath'] = '%(url_prefix_local)s/applets/moinfckconfig.js' ; oFCKeditor.Config['WordRule'] = %(word_rule)s ; oFCKeditor.Config['SmileyPath'] = '%(smileypath)s/' ; oFCKeditor.Config['EditorAreaCSS'] = '%(themepath)s/css/common.css' ; oFCKeditor.Config['SkinPath'] = '%(fckbasepath)s/editor/skins/silver/' ; oFCKeditor.Config['AutoDetectLanguage'] = false ; oFCKeditor.Config['DefaultLanguage'] = '%(uilanguage)s' ; oFCKeditor.Config['ContentLangDirection'] = '%(contentlangdirection)s' ; oFCKeditor.Value= """ % locals()) from MoinMoin.formatter.text_gedit import Formatter self.formatter = Formatter(request) self.formatter.page = self output = request.redirectedOutput(self.send_page_content, request, raw_body, format=self.pi['format'], do_cache=False) output = repr(output) if output[0] == 'u': output = output[1:] request.write(output) request.write(""" ; oFCKeditor.Create() ; //--> </script> """) request.write("<p>") request.write(_("Comment:"), ' <input id="editor-comment" type="text" name="comment" value="%s" size="80" maxlength="200">' % ( wikiutil.escape(kw.get('comment', ''), 1), )) request.write("</p>") # Category selection filterfn = self.cfg.cache.page_category_regexact.search cat_pages = request.rootpage.getPageList(filter=filterfn) cat_pages.sort() cat_pages = [wikiutil.pagelinkmarkup(p) for p in cat_pages] cat_pages.insert(0, ('', _('<No addition>'))) request.write("<p>") request.write(_('Add to: %(category)s') % { 'category': unicode(web.makeSelection('category', cat_pages)), }) if self.cfg.mail_enabled: request.write(''' <input type="checkbox" name="trivial" id="chktrivial" value="1" %(checked)s onclick="toggle_trivial(this)"> <label for="chktrivial">%(label)s</label> ''' % { 'checked': ('', 'checked')[form.get('trivial', '0') == '1'], 'label': _("Trivial change"), }) request.write(''' <input type="checkbox" name="rstrip" id="chkrstrip" value="1" %(checked)s> <label for="chkrstrip">%(label)s</label> </p> ''' % { 'checked': ('', 'checked')[form.get('rstrip', '0') == '1'], 'label': _('Remove trailing whitespace from each line') }) request.write("</p>") badwords_re = None if preview is not None: if 'button_spellcheck' in form or 'button_newwords' in form: badwords, badwords_re, msg = SpellCheck.checkSpelling(self, request, own_form=0) request.write("<p>%s</p>" % msg) request.write('</fieldset>') request.write("</form>") if preview is not None: if staytop: content_id = 'previewbelow' else: content_id = 'preview' self.send_page(content_id=content_id, content_only=1, hilite_re=badwords_re) request.write(request.formatter.endContent()) # end content div request.theme.send_footer(self.page_name) request.theme.send_closing_html()
def render(self): request = self.request _ = request.getText pagename = self.pagename target = self.target if not request.user.may.read(pagename): return _('You are not allowed to view attachments of this page.') if not target: return _("Empty target name given.") ci = AttachFile.ContainerItem(request, pagename, target) if ci.exists(): drawurl = ci.member_url('drawing.svg') else: drawurl = '' pageurl = request.href(pagename) saveurl = request.href(pagename, action=action_name, do='save', target=target, ticket=wikiutil.createTicket(request)) helpurl = request.href("HelpOnActions/AttachFile") html = """ <p> <applet code="org.anywikidraw.moinmoin.MoinMoinDrawingApplet.class" codebase="." archive="%(htdocs)s/applets/anywikidraw/lib/AnyWikiDrawForMoinMoin.jar" width="800" height="620"> <!-- The following parameters are used to tell AnyWikiDraw how to communicate with MoinMoin. --> <param name="DrawingName" value="%(basename)s.svg"> <param name="DrawingURL" value="%(drawurl)s"> <param name="PageURL" value="%(pageurl)s"> <param name="UploadURL" value="%(saveurl)s"> <!-- The following parameters are used to configure the drawing applet --> <param name="Locale" value="en"> <!-- The following parameters are used to configure Sun's Java Plug-In --> <param name="codebase_lookup" value="false"> <param name="classloader_cache" value="false"> <!-- The following makes trouble with FF3 on Ubuntu 9.04 as client and Apache2 / mod_wsgi on Debian Lenny as server, it seems to confuse .gz files with gzip content-encoding and fails miserably somehow: param name="java_arguments" value="-Djnlp.packEnabled=true" --> <param name="boxborder" value="false"> <param name="centerimage" value="true"> <strong>NOTE:</strong> You need a Java enabled browser to edit the drawing. </applet> </p> """ % dict( htdocs=request.cfg.url_prefix_static, basename=wikiutil.escape(target, 1), drawurl=wikiutil.escape(drawurl, 1), pageurl=wikiutil.escape(pageurl, 1), saveurl=wikiutil.escape(saveurl, 1), ) title = '%s %s:%s' % (_('Edit drawing'), pagename, target) request.theme.send_title(title, page=request.page, pagename=pagename) request.write(request.formatter.startContent("content")) request.write(request.formatter.rawHTML(html)) request.write(request.formatter.endContent()) request.theme.send_footer(pagename) request.theme.send_closing_html()
def do_user_browser(request): """ Browser for SystemAdmin macro. """ _ = request.getText groups = request.groups data = TupleDataset() data.columns = [ Column('name', label=_('Username')), Column('groups', label=_('Member of Groups')), Column('email', label=_('Email')), Column('jabber', label=_('Jabber')), Column('action', label=_('Action')), ] class UserAccount(object): # namedtuple is >= 2.6 :-( def __init__(self, **kw): for k, v in kw.items(): setattr(self, k, v) def __repr__(self): return "<UserAccount %r>" % self.__dict__ accounts = [] for uid in user.getUserList(request): # be careful and just create a list of what we really need, # not sure if we can keep lots of User objects instantiated # in parallel (open files? too big?) u = user.User(request, uid) accounts.append(UserAccount(name=u.name, email=u.email, jid=u.jid, disabled=u.disabled)) def sortkey(account): # enabled accounts at top, sorted by name return (account.disabled, account.name) # Iterate over user accounts for account in sorted(accounts, key=sortkey): account_groups = set(groups.groups_with_member(account.name)) wiki_groups = set([group for group in account_groups if isinstance(groups[group], WikiGroup)]) other_groups = list(account_groups - wiki_groups) # First show groups that are defined in wikipages linking to it # after show groups from other backends. grouppage_links = ', '.join([Page(request, group_name).link_to(request) for group_name in wiki_groups] + other_groups) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) # creates the POST data for account disable/enable val = "1" text=_('Disable user') if account.disabled: text=_('Enable user') val = "0" namelink += " (%s)" % _("disabled") url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='userprofile')) ticket = wikiutil.createTicket(request, action='userprofile') ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) ret.append(html.INPUT(type='hidden', name='name', value=account.name)) ret.append(html.INPUT(type='hidden', name='key', value="disabled")) ret.append(html.INPUT(type='hidden', name='val', value=val)) ret.append(html.INPUT(type='submit', name='userprofile', value=text)) enable_disable_link = unicode(unicode(ret)) # creates the POST data for recoverpass url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='recoverpass')) ret.append(html.INPUT(type='hidden', name='email', value=account.email)) ret.append(html.INPUT(type='hidden', name='account_sendmail', value="1")) ret.append(html.INPUT(type='hidden', name='sysadm', value="users")) ret.append(html.INPUT(type='submit', name='recoverpass', value=_('Mail account data'))) recoverpass_link = unicode(unicode(ret)) if account.email: email_link = (request.formatter.url(1, 'mailto:' + account.email, css='mailto') + request.formatter.text(account.email) + request.formatter.url(0)) else: email_link = '' if account.jid: jabber_link = (request.formatter.url(1, 'xmpp:' + account.jid, css='mailto') + request.formatter.text(account.jid) + request.formatter.url(0)) else: jabber_link = '' data.addRow(( (request.formatter.rawHTML(namelink), account.name), request.formatter.rawHTML(grouppage_links), email_link, jabber_link, recoverpass_link + enable_disable_link )) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data) return browser.render() # No data return ''
def _create_form(request): _ = request.getText url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='newaccount')) ticket = wikiutil.createTicket(request) ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) lang_attr = request.theme.ui_lang_attr() ret.append(html.Raw('<div class="userpref"%s>' % lang_attr)) tbl = html.TABLE(border="0") ret.append(tbl) ret.append(html.Raw('</div>')) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append(html.Text(_("Name"))))) cell = html.TD() row.append(cell) cell.append(html.INPUT(type="text", size="36", name="name")) cell.append(html.Text(' ' + _("(Use FirstnameLastname)"))) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append(html.Text( _("Password"))))) row.append(html.TD().append( html.INPUT(type="password", size="36", name="password1"))) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append( html.Text(_("Password repeat"))))) row.append(html.TD().append( html.INPUT(type="password", size="36", name="password2"))) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append(html.Text(_("Email"))))) row.append(html.TD().append( html.INPUT(type="text", size="36", name="email"))) textcha = TextCha(request) if textcha.is_enabled(): row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append( html.Text(_('TextCha (required)'))))) td = html.TD() if textcha: td.append(textcha.render()) row.append(td) row = html.TR() tbl.append(row) row.append(html.TD()) td = html.TD() row.append(td) td.append( html.INPUT(type="submit", name="create", value=_('Create Profile'))) return unicode(ret)
def do_user_browser(request): """ Browser for SystemAdmin macro. """ _ = request.getText groups = request.groups data = TupleDataset() data.columns = [ Column('name', label=_('Username')), Column('groups', label=_('Member of Groups')), Column('email', label=_('Email')), Column('jabber', label=_('Jabber')), Column('action', label=_('Action')), ] # Iterate over users for uid in user.getUserList(request): account = user.User(request, uid) account_groups = set(groups.groups_with_member(account.name)) wiki_groups = set([group for group in account_groups if isinstance(groups[group], WikiGroup)]) other_groups = list(account_groups - wiki_groups) # First show groups that are defined in wikipages linking to it # after show groups from other backends. grouppage_links = ', '.join([Page(request, group_name).link_to(request) for group_name in wiki_groups] + other_groups) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) # creates the POST data for account disable/enable val = "1" text=_('Disable user') if account.disabled: text=_('Enable user') val = "0" namelink += " (%s)" % _("disabled") url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='userprofile')) ticket = wikiutil.createTicket(request, action='userprofile') ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) ret.append(html.INPUT(type='hidden', name='name', value=account.name)) ret.append(html.INPUT(type='hidden', name='key', value="disabled")) ret.append(html.INPUT(type='hidden', name='val', value=val)) ret.append(html.INPUT(type='submit', name='userprofile', value=text)) enable_disable_link = unicode(unicode(ret)) # creates the POST data for recoverpass url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='recoverpass')) ret.append(html.INPUT(type='hidden', name='email', value=account.email)) ret.append(html.INPUT(type='hidden', name='account_sendmail', value="1")) ret.append(html.INPUT(type='hidden', name='sysadm', value="users")) ret.append(html.INPUT(type='submit', name='recoverpass', value=_('Mail account data'))) recoverpass_link = unicode(unicode(ret)) if account.email: email_link = (request.formatter.url(1, 'mailto:' + account.email, css='mailto') + request.formatter.text(account.email) + request.formatter.url(0)) else: email_link = '' if account.jid: jabber_link = (request.formatter.url(1, 'xmpp:' + account.jid, css='mailto') + request.formatter.text(account.jid) + request.formatter.url(0)) else: jabber_link = '' data.addRow(( (request.formatter.rawHTML(namelink), account.name), request.formatter.rawHTML(grouppage_links), email_link, jabber_link, recoverpass_link + enable_disable_link )) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data, sort_columns=[0]) return browser.render() # No data return ''
def _create_form(request): _ = request.getText url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type='hidden', name='action', value='newaccount')) ticket = wikiutil.createTicket(request) ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) lang_attr = request.theme.ui_lang_attr() ret.append(html.Raw('<div class="userpref"%s>' % lang_attr)) tbl = html.TABLE(border="0") ret.append(tbl) ret.append(html.Raw('</div>')) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append( html.Text(_("Name"))))) cell = html.TD() row.append(cell) cell.append(html.INPUT(type="text", size="36", name="name")) cell.append(html.Text(' ' + _("(Use FirstnameLastname)"))) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append( html.Text(_("Password"))))) row.append(html.TD().append(html.INPUT(type="password", size="36", name="password1"))) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append( html.Text(_("Password repeat"))))) row.append(html.TD().append(html.INPUT(type="password", size="36", name="password2"))) row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append(html.Text(_("Email"))))) row.append(html.TD().append(html.INPUT(type="text", size="36", name="email"))) textcha = TextCha(request) if textcha.is_enabled(): row = html.TR() tbl.append(row) row.append(html.TD().append(html.STRONG().append( html.Text(_('TextCha (required)'))))) td = html.TD() if textcha: td.append(textcha.render()) row.append(td) row = html.TR() tbl.append(row) row.append(html.TD()) td = html.TD() row.append(td) td.append(html.INPUT(type="submit", name="create", value=_('Create Profile'))) return unicode(ret)
def do_user_browser(request): """ Browser for SystemAdmin macro. """ _ = request.getText groups = request.groups data = TupleDataset() data.columns = [ Column("name", label=_("Username")), Column("groups", label=_("Member of Groups")), Column("email", label=_("Email")), Column("jabber", label=_("Jabber")), Column("action", label=_("Action")), ] class UserAccount(object): # namedtuple is >= 2.6 :-( def __init__(self, **kw): for k, v in kw.items(): setattr(self, k, v) def __repr__(self): return "<UserAccount %r>" % self.__dict__ accounts = [] for uid in user.getUserList(request): # be careful and just create a list of what we really need, # not sure if we can keep lots of User objects instantiated # in parallel (open files? too big?) u = user.User(request, uid) accounts.append(UserAccount(name=u.name, email=u.email, jid=u.jid, disabled=u.disabled)) def sortkey(account): # enabled accounts at top, sorted by name return (account.disabled, account.name) # Iterate over user accounts for account in sorted(accounts, key=sortkey): account_groups = set(groups.groups_with_member(account.name)) wiki_groups = set([group for group in account_groups if isinstance(groups[group], WikiGroup)]) other_groups = list(account_groups - wiki_groups) # First show groups that are defined in wikipages linking to it # after show groups from other backends. grouppage_links = ", ".join( [Page(request, group_name).link_to(request) for group_name in wiki_groups] + other_groups ) userhomepage = Page(request, account.name) if userhomepage.exists(): namelink = userhomepage.link_to(request) else: namelink = wikiutil.escape(account.name) # creates the POST data for account disable/enable val = "1" text = _("Disable user") if account.disabled: text = _("Enable user") val = "0" namelink += " (%s)" % _("disabled") url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type="hidden", name="action", value="userprofile")) ticket = wikiutil.createTicket(request, action="userprofile") ret.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) ret.append(html.INPUT(type="hidden", name="name", value=account.name)) ret.append(html.INPUT(type="hidden", name="key", value="disabled")) ret.append(html.INPUT(type="hidden", name="val", value=val)) ret.append(html.INPUT(type="submit", name="userprofile", value=text)) enable_disable_link = unicode(unicode(ret)) # creates the POST data for recoverpass url = request.page.url(request) ret = html.FORM(action=url) ret.append(html.INPUT(type="hidden", name="action", value="recoverpass")) ret.append(html.INPUT(type="hidden", name="email", value=account.email)) ret.append(html.INPUT(type="hidden", name="account_sendmail", value="1")) ret.append(html.INPUT(type="hidden", name="sysadm", value="users")) ret.append(html.INPUT(type="submit", name="recoverpass", value=_("Mail account data"))) recoverpass_link = unicode(unicode(ret)) if account.email: email_link = ( request.formatter.url(1, "mailto:" + account.email, css="mailto") + request.formatter.text(account.email) + request.formatter.url(0) ) else: email_link = "" if account.jid: jabber_link = ( request.formatter.url(1, "xmpp:" + account.jid, css="mailto") + request.formatter.text(account.jid) + request.formatter.url(0) ) else: jabber_link = "" data.addRow( ( (request.formatter.rawHTML(namelink), account.name), request.formatter.rawHTML(grouppage_links), email_link, jabber_link, recoverpass_link + enable_disable_link, ) ) if data: from MoinMoin.widget.browser import DataBrowserWidget browser = DataBrowserWidget(request) browser.setData(data) return browser.render() # No data return ""
def send_uploadform(pagename, request): """ Send the HTML code for the list of already stored attachments and the file upload form. """ _ = request.getText if not request.user.may.read(pagename): request.write('<p>%s</p>' % _('You are not allowed to view this page.')) return writeable = request.user.may.write(pagename) # First send out the upload new attachment form on top of everything else. # This avoids usability issues if you have to scroll down a lot to upload # a new file when the page already has lots of attachments: if writeable: request.write('<h2>' + _("New Attachment") + '</h2>') request.write( """ <form action="%(url)s" method="POST" enctype="multipart/form-data"> <dl> <dt>%(upload_label_file)s</dt> <dd><input type="file" name="file" size="50"></dd> <dt>%(upload_label_target)s</dt> <dd><input type="text" name="target" size="50" value="%(target)s"></dd> <dt>%(upload_label_overwrite)s</dt> <dd><input type="checkbox" name="overwrite" value="1" %(overwrite_checked)s></dd> </dl> %(textcha)s <p> <input type="hidden" name="action" value="%(action_name)s"> <input type="hidden" name="do" value="upload"> <input type="hidden" name="ticket" value="%(ticket)s"> <input type="submit" value="%(upload_button)s"> </p> </form> """ % { 'url': request.href(pagename), 'action_name': action_name, 'upload_label_file': _('File to upload'), 'upload_label_target': _('Rename to'), 'target': wikiutil.escape(request.values.get('target', ''), 1), 'upload_label_overwrite': _('Overwrite existing attachment of same name'), 'overwrite_checked': ('', 'checked')[request.form.get('overwrite', '0') == '1'], 'upload_button': _('Upload'), 'textcha': TextCha(request).render(), 'ticket': wikiutil.createTicket(request), }) request.write('<h2>' + _("Attached Files") + '</h2>') request.write(_get_filelist(request, pagename)) if not writeable: request.write('<p>%s</p>' % _('You are not allowed to attach a file to this page.'))
def render(self): request = self.request _ = request.getText pagename = self.pagename target = self.target if not request.user.may.read(pagename): return _('You are not allowed to view attachments of this page.') if not target: return _("Empty target name given.") ci = AttachFile.ContainerItem(request, pagename, target) if ci.exists(): drawurl = ci.member_url('drawing.svg') else: drawurl = '' pageurl = request.href(pagename) saveurl = request.href(pagename, action=action_name, do='save', target=target, ticket=wikiutil.createTicket(request)) helpurl = request.href("HelpOnActions/AttachFile") html = """ <p> <applet code="org.anywikidraw.moinmoin.MoinMoinDrawingApplet.class" codebase="." archive="%(htdocs)s/applets/anywikidraw/lib/AnyWikiDrawForMoinMoin.jar" width="800" height="620"> <!-- The following parameters are used to tell AnyWikiDraw how to communicate with MoinMoin. --> <param name="DrawingName" value="%(basename)s.svg"> <param name="DrawingURL" value="%(drawurl)s"> <param name="PageURL" value="%(pageurl)s"> <param name="UploadURL" value="%(saveurl)s"> <!-- The following parameters are used to configure the drawing applet --> <param name="Locale" value="en"> <!-- The following parameters are used to configure Sun's Java Plug-In --> <param name="codebase_lookup" value="false"> <param name="classloader_cache" value="false"> <!-- The following makes trouble with FF3 on Ubuntu 9.04 as client and Apache2 / mod_wsgi on Debian Lenny as server, it seems to confuse .gz files with gzip content-encoding and fails miserably somehow: param name="java_arguments" value="-Djnlp.packEnabled=true" --> <param name="boxborder" value="false"> <param name="centerimage" value="true"> <strong>NOTE:</strong> You need a Java enabled browser to edit the drawing. </applet> </p> """ % dict( htdocs=request.cfg.url_prefix_static, basename=wikiutil.escape(target, 1), drawurl=wikiutil.escape(drawurl, 1), pageurl=wikiutil.escape(pageurl, 1), saveurl=wikiutil.escape(saveurl, 1), ) title = '%s %s:%s' % (_('Edit drawing'), pagename, target) request.theme.send_title(title, page=request.page, pagename=pagename) request.write(request.formatter.startContent("content")) request.write(request.formatter.rawHTML(html)) request.write(request.formatter.endContent()) request.theme.send_footer(pagename) request.theme.send_closing_html()
def sendEditor(self, **kw): """ Send the editor form page. @keyword preview: if given, show this text in preview mode @keyword staytop: don't go to #preview @keyword comment: comment field (when preview is true) """ from MoinMoin import i18n try: from MoinMoin.action import SpellCheck except ImportError: SpellCheck = None request = self.request form = self.request.form _ = self._ self.request.disableHttpCaching(level=2) self.request.http_headers() raw_body = '' msg = None conflict_msg = None edit_lock_message = None preview = kw.get('preview', None) staytop = kw.get('staytop', 0) # check edit permissions if not self.request.user.may.write(self.page_name): msg = _('You are not allowed to edit this page.') elif not self.isWritable(): msg = _('Page is immutable!') elif self.rev: # Trying to edit an old version, this is not possible via # the web interface, but catch it just in case... msg = _('Cannot edit old revisions!') else: # try to acquire edit lock ok, edit_lock_message = self.lock.acquire() if not ok: # failed to get the lock if preview is not None: edit_lock_message = _('The lock you held timed out. Be prepared for editing conflicts!' ) + "<br>" + edit_lock_message else: msg = edit_lock_message # Did one of the prechecks fail? if msg: self.send_page(self.request, msg=msg) return # Check for preview submit if preview is None: title = _('Edit "%(pagename)s"') else: title = _('Preview of "%(pagename)s"') self.set_raw_body(preview, modified=1) # send header stuff lock_timeout = self.lock.timeout / 60 lock_page = wikiutil.escape(self.page_name, quote=1) lock_expire = _("Your edit lock on %(lock_page)s has expired!") % {'lock_page': lock_page} lock_mins = _("Your edit lock on %(lock_page)s will expire in # minutes.") % {'lock_page': lock_page} lock_secs = _("Your edit lock on %(lock_page)s will expire in # seconds.") % {'lock_page': lock_page} # get request parameters try: text_rows = int(form['rows'][0]) except StandardError: text_rows = self.cfg.edit_rows if self.request.user.valid: text_rows = int(self.request.user.edit_rows) if preview is not None: # Propagate original revision rev = int(form['rev'][0]) # Check for editing conflicts if not self.exists(): # page does not exist, are we creating it? if rev: conflict_msg = _('Someone else deleted this page while you were editing!') elif rev != self.current_rev(): conflict_msg = _('Someone else changed this page while you were editing!') if self.mergeEditConflict(rev): conflict_msg = _("""Someone else saved this page while you were editing! Please review the page and save then. Do not save this page as it is! Have a look at the diff of %(difflink)s to see what has been changed.""") % { 'difflink': self.link_to(self.request, querystr='action=diff&rev=%d' % rev) } rev = self.current_rev() if conflict_msg: # We don't show preview when in conflict preview = None elif self.exists(): # revision of existing page rev = self.current_rev() else: # page creation rev = 0 # Page editing is done using user language self.request.setContentLanguage(self.request.lang) # Setup status message status = [kw.get('msg', ''), conflict_msg, edit_lock_message] status = [msg for msg in status if msg] status = ' '.join(status) status = Status(self.request, content=status) wikiutil.send_title(self.request, title % {'pagename': self.split_title(self.request),}, page=self, pagename=self.page_name, msg=status, html_head=self.lock.locktype and ( PageEditor._countdown_js % { 'countdown_script': self.request.theme.externalScript('countdown'), 'lock_timeout': lock_timeout, 'lock_expire': lock_expire, 'lock_mins': lock_mins, 'lock_secs': lock_secs, }) or '', editor_mode=1, ) self.request.write(self.request.formatter.startContent("content")) # Get the text body for the editor field. # TODO: what about deleted pages? show the text of the last revision or use the template? if preview is not None: raw_body = self.get_raw_body() elif self.exists(): # If the page exists, we get the text from the page. # TODO: maybe warn if template argument was ignored because the page exists? raw_body = self.get_raw_body() elif form.has_key('template'): # If the page does not exists, we try to get the content from the template parameter. template_page = wikiutil.unquoteWikiname(form['template'][0]) if self.request.user.may.read(template_page): raw_body = Page(self.request, template_page).get_raw_body() if raw_body: self.request.write(_("[Content of new page loaded from %s]") % (template_page,), '<br>') else: self.request.write(_("[Template %s not found]") % (template_page,), '<br>') else: self.request.write(_("[You may not read %s]") % (template_page,), '<br>') # Make backup on previews - but not for new empty pages if preview and raw_body: self._make_backup(raw_body) # Generate default content for new pages if not raw_body: raw_body = _('Describe %s here.') % (self.page_name,) # send form self.request.write('<form id="editor" method="post" action="%s/%s#preview">' % ( self.request.getScriptname(), wikiutil.quoteWikinameURL(self.page_name), )) # yet another weird workaround for broken IE6 (it expands the text # editor area to the right after you begin to type...). IE sucks... # http://fplanque.net/2003/Articles/iecsstextarea/ self.request.write('<fieldset style="border:none;padding:0;">') self.request.write(unicode(html.INPUT(type="hidden", name="action", value="edit"))) # Send revision of the page our edit is based on self.request.write('<input type="hidden" name="rev" value="%d">' % (rev,)) # Create and send a ticket, so we can check the POST self.request.write('<input type="hidden" name="ticket" value="%s">' % wikiutil.createTicket(self.request)) # Save backto in a hidden input backto = form.get('backto', [None])[0] if backto: self.request.write(unicode(html.INPUT(type="hidden", name="backto", value=backto))) # button bar button_spellcheck = (SpellCheck and '<input class="button" type="submit" name="button_spellcheck" value="%s">' % _('Check Spelling')) or '' save_button_text = _('Save Changes') cancel_button_text = _('Cancel') if self.cfg.page_license_enabled: self.request.write('<p><em>', _( """By hitting '''%(save_button_text)s''' you put your changes under the %(license_link)s. If you don't want that, hit '''%(cancel_button_text)s''' to cancel your changes.""") % { 'save_button_text': save_button_text, 'cancel_button_text': cancel_button_text, 'license_link': wikiutil.getSysPage(self.request, self.cfg.page_license_page).link_to(self.request), }, '</em></p>') self.request.write(''' <input class="button" type="submit" name="button_save" value="%s"> <input class="button" type="submit" name="button_preview" value="%s"> <input class="button" type="submit" name="button_switch" value="%s"> %s <input class="button" type="submit" name="button_cancel" value="%s"> <input type="hidden" name="editor" value="gui"> ''' % (save_button_text, _('Preview'), _('Text mode'), button_spellcheck, cancel_button_text,)) self.sendconfirmleaving() # TODO update state of flgChange to make this work, see PageEditor # Add textarea with page text # TODO: currently self.language is None at this point. We have # to do processing instructions parsing earlier, or move page # language into meta file. lang = self.language or self.request.cfg.language_default contentlangdirection = i18n.getDirection(lang) # 'ltr' or 'rtl' uilanguage = self.request.lang url_prefix = self.request.cfg.url_prefix wikipage = wikiutil.quoteWikinameURL(self.page_name) fckbasepath = url_prefix + '/applets/FCKeditor' wikiurl = request.getScriptname() if not wikiurl or wikiurl[-1] != '/': wikiurl += '/' themepath = '%s/%s' % (url_prefix, self.request.theme.name) smileypath = themepath + '/img' # auto-generating a list for SmileyImages does NOT work from here! editor_size = int(request.user.edit_rows) * 22 # 22 height_pixels/line word_rule = self.word_rule() self.request.write(""" <script type="text/javascript" src="%(fckbasepath)s/fckeditor.js"></script> <script type="text/javascript"> <!-- var oFCKeditor = new FCKeditor( 'savetext', '100%%', %(editor_size)s, 'MoinDefault' ) ; oFCKeditor.BasePath= '%(fckbasepath)s/' ; oFCKeditor.Config['WikiBasePath'] = '%(wikiurl)s' ; oFCKeditor.Config['WikiPage'] = '%(wikipage)s' ; oFCKeditor.Config['PluginsPath'] = '%(url_prefix)s/applets/moinFCKplugins/' ; oFCKeditor.Config['CustomConfigurationsPath'] = '%(url_prefix)s/applets/moinfckconfig.js' ; oFCKeditor.Config['WordRule'] = %(word_rule)s ; oFCKeditor.Config['SmileyPath'] = '%(smileypath)s/' ; oFCKeditor.Config['EditorAreaCSS'] = '%(themepath)s/css/common.css' ; oFCKeditor.Config['SkinPath'] = '%(fckbasepath)s/editor/skins/silver/' ; oFCKeditor.Config['AutoDetectLanguage'] = false ; oFCKeditor.Config['DefaultLanguage'] = '%(uilanguage)s' ; oFCKeditor.Config['ContentLangDirection'] = '%(contentlangdirection)s' ; oFCKeditor.Value= """ % locals()) from MoinMoin.formatter.text_gedit import Formatter self.formatter = Formatter(request) self.formatter.page = self output = request.redirectedOutput(self.send_page_content, request, Parser, raw_body, do_cache=False) output = repr(output) if output[0] == 'u': output = output[1:] request.write(output) self.request.write(""" ; oFCKeditor.Create() ; //--> </script> """) self.request.write("<p>") self.request.write(_("Comment:"), ' <input id="editor-comment" type="text" name="comment" value="%s" maxlength="200">' % ( wikiutil.escape(kw.get('comment', ''), 1), )) self.request.write("</p>") # Category selection filter = re.compile(self.cfg.page_category_regex, re.UNICODE).search cat_pages = self.request.rootpage.getPageList(filter=filter) cat_pages.sort() cat_pages = [wikiutil.pagelinkmarkup(p) for p in cat_pages] cat_pages.insert(0, ('', _('<No addition>', formatted=False))) self.request.write("<p>") self.request.write(_('Add to: %(category)s') % { 'category': unicode(util.web.makeSelection('category', cat_pages)), }) if self.cfg.mail_enabled: self.request.write(''' <input type="checkbox" name="trivial" id="chktrivial" value="1" %(checked)s> <label for="chktrivial">%(label)s</label> ''' % { 'checked': ('', 'checked')[form.get('trivial',['0'])[0] == '1'], 'label': _("Trivial change"), }) self.request.write(''' <input type="checkbox" name="rstrip" id="chkrstrip" value="1" %(checked)s> <label for="chkrstrip">%(label)s</label> </p> ''' % { 'checked': ('', 'checked')[form.get('rstrip',['0'])[0] == '1'], 'label': _('Remove trailing whitespace from each line') }) self.request.write("</p>") badwords_re = None if preview is not None: if SpellCheck and ( form.has_key('button_spellcheck') or form.has_key('button_newwords')): badwords, badwords_re, msg = SpellCheck.checkSpelling(self, self.request, own_form=0) self.request.write("<p>%s</p>" % msg) self.request.write('</fieldset>') self.request.write("</form>") if preview is not None: if staytop: content_id = 'previewbelow' else: content_id = 'preview' self.send_page(self.request, content_id=content_id, content_only=1, hilite_re=badwords_re) self.request.write(self.request.formatter.endContent()) # end content div wikiutil.send_footer(self.request, self.page_name)
def create_form(self): """ Create the complete HTML form code. """ _ = self._ request = self.request self._form = self.make_form() if request.user.valid: buttons = [('save', _('Save')), ('cancel', _('Cancel')), ] uf_remove = self.cfg.user_form_remove uf_disable = self.cfg.user_form_disable for attr in request.user.auth_attribs: uf_disable.append(attr) for key, label, type, length, textafter in self.cfg.user_form_fields: default = self.cfg.user_form_defaults[key] if not key in uf_remove: if key in uf_disable: self.make_row(_(label), [html.INPUT(type=type, size=length, name=key, disabled="disabled", value=getattr(request.user, key)), ' ', _(textafter), ]) else: self.make_row(_(label), [html.INPUT(type=type, size=length, name=key, value=getattr(request.user, key)), ' ', _(textafter), ]) if not self.cfg.theme_force and not "theme_name" in self.cfg.user_form_remove: self.make_row(_('Preferred theme'), [self._theme_select()]) if not self.cfg.editor_force: if not "editor_default" in self.cfg.user_form_remove: self.make_row(_('Editor Preference'), [self._editor_default_select()]) if not "editor_ui" in self.cfg.user_form_remove: self.make_row(_('Editor shown on UI'), [self._editor_ui_select()]) if not "tz_offset" in self.cfg.user_form_remove: self.make_row(_('Time zone'), [ _('Your time is'), ' ', self._tz_select(), html.BR(), _('Server time is'), ' ', time.strftime(self.cfg.datetime_fmt, util.timefuncs.tmtuple()), ' (UTC)', ]) if not "datetime_fmt" in self.cfg.user_form_remove: self.make_row(_('Date format'), [self._dtfmt_select()]) if not "language" in self.cfg.user_form_remove: self.make_row(_('Preferred language'), [self._lang_select()]) # boolean user options bool_options = [] checkbox_fields = self.cfg.user_checkbox_fields checkbox_fields.sort(lambda a, b: cmp(a[1](_), b[1](_))) for key, label in checkbox_fields: if not key in self.cfg.user_checkbox_remove: bool_options.extend([ html.INPUT(type="checkbox", name=key, value="1", checked=getattr(request.user, key, 0), disabled=key in self.cfg.user_checkbox_disable and True or None), ' ', label(_), html.BR(), ]) self.make_row(_('General options'), bool_options, valign="top") self.make_row(_('Quick links'), [ html.TEXTAREA(name="quicklinks", rows="6", cols="50") .append('\n'.join(request.user.getQuickLinks())), ], valign="top") self._form.append(html.INPUT(type="hidden", name="action", value="userprefs")) self._form.append(html.INPUT(type="hidden", name="handler", value="prefs")) ticket = wikiutil.createTicket(request) self._form.append(html.INPUT(type="hidden", name="ticket", value="%s" % ticket)) # Add buttons button_cell = [] for name, label in buttons: if not name in self.cfg.user_form_remove: button_cell.extend([ html.INPUT(type="submit", name=name, value=label), ' ', ]) self.make_row('', button_cell) return unicode(self._form)