def make_form(self, html_class="settings_form"): """ Create the FORM, and the DIVs with the input fields """ if config.use_ssl: action = self.request.getScriptname() + self.request.getPathinfo() if config.wiki_farm: action = "%s%s" % (farm.getBaseFarmURL( self.request, force_ssl=config.use_ssl), wikiutil.quoteWikiname( config.page_user_preferences)) else: action = '%s/%s' % (self.request.getQualifiedURL( self.request.getScriptname(), force_ssl=config.use_ssl), wikiutil.quoteWikiname( config.page_user_preferences)) else: action = self.request.getScriptname() + self.request.getPathinfo() self._form = html.FORM(action=action) self._inner = html.DIV(html_class=html_class) # Use the user interface language and direction lang_attr = self.request.theme.ui_lang_attr() self._form.append(html.Raw("<div %s>" % lang_attr)) self._form.append(html.INPUT(type="hidden", name="action", value="userform")) if self.from_wiki: self._form.append(html.INPUT(type="hidden", name="from_wiki", value=self.from_wiki)) self._form.append(self._inner) self._form.append(html.Raw("</div>"))
def navbar(self, d): """ Assemble the new nav bar @param d: parameter dictionary @rtype: string @return: navibar html """ _ = self.request.getText lower_page_name = d['page_name'].lower() if self.request.user.valid: html = ['<div class="tabArea">'] in_preset_tab = False for tab in self.request.config.tabs_user: tabclass = 'tab' lower_tab = tab.lower() if lower_tab == lower_page_name: tabclass = '%s activeTab' % tabclass in_preset_tab = True if (lower_tab == 'bookmarks' and self.request.user.hasUnseenFavorite()): tabclass = '%s notice' % tabclass elif (lower_tab == 'interwiki bookmarks' and self.request.user.hasUnseenFavorite(wiki_global=True)): tabclass = '%s notice' % tabclass html.append(('<a href="%(script_name)s/%%s" class="%%s">%%s</a>' % d) % (wikiutil.quoteWikiname(tab), tabclass, tab)) if not in_preset_tab and d['page_name']: html.append('<a href="%(script_name)s/%(q_page_name)s" ' 'class="tab activeTab">%(page_name)s</a>' % d) else: html = ['<div class="tabArea">'] in_preset_tab = False for tab in self.request.config.tabs_nonuser: tabclass = 'tab' lower_tab = tab.lower() if lower_tab == lower_page_name: tabclass = '%s activeTab' % tabclass in_preset_tab = True html.append( ('<a href="%(script_name)s/%%s" class="%%s">%%s</a>' % d) % (wikiutil.quoteWikiname(tab), tabclass, tab)) if not in_preset_tab and d['page_name']: html.append(('<a href="%(script_name)s/%(q_page_name)s" ' 'class="tab activeTab">%(page_name)s</a>' % d)) html.append('</div>') html = ''.join(html) return html
def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter action = 'Files' pagename = formatter.page.page_name baseurl = macro.request.getScriptname() urlpagename = wikiutil.quoteWikiname(formatter.page.proper_name()) if not args: return formatter.rawHTML('<b>Please supply at least a file name, ' 'e.g. [[File(filename.txt)]], where ' 'filename.txt is a file that\'s been ' 'uploaded to this page.</b>') filename = args macro.request.cursor.execute("""SELECT name FROM files WHERE name=%(filename)s and attached_to_pagename=%(pagename)s and wiki_id=%(wiki_id)s""", {'filename':filename, 'pagename':pagename.lower(), 'wiki_id':macro.request.config.wiki_id}) result = macro.request.cursor.fetchone() file_exists = result urlfile = urllib.quote(filename) if not file_exists: #lets make a link telling them they can upload the file linktext = 'Upload new file "%s"' % (filename) return wikiutil.attach_link_tag( macro.request, '%s?action=Files&rename=%s%s#uploadFileArea' % ( wikiutil.quoteWikiname(formatter.page.proper_name()), urlfile, ''), linktext) urlfile = urllib.quote(filename) html = ('<span class="fileLink"><img src="%(icon)s"/>' '<a href="%(baseurl)s/%(urlpagename)s?action=%(action)s&' 'do=view&target=%(urlfile)s">' '%(file)s' '</a></span>' % {'icon':Files.get_icon(filename, macro.request), 'baseurl':baseurl, 'urlpagename':urlpagename, 'urlfile':urlfile, 'file':filename, 'action':action}) return html
def _macro_titleindex(self, args, formatter=None): if not formatter: formatter = self.formatter _ = self._ html = [] index_letters = [] allpages = int(self.form.get('allpages', [0])[0]) != 0 pages = wikiutil.getPageList(self.request, alphabetize=False) pages_deco = [ (pagename.lower(), pagename) for pagename in pages ] pages_deco.sort() pages = [ word for lower_word, word in pages_deco ] current_letter = None for name in pages: if 1: #self.request.user.may.read(name): letter = name[0].upper() # XXX UNICODE - fix here, too? if wikiutil.isUnicodeName(letter): try: letter = wikiutil.getUnicodeIndexGroup( unicode(name, config.charset)) if letter: letter = letter.encode(config.charset) except UnicodeError: letter = None if not letter: letter = "~" if letter not in index_letters: index_letters.append(letter) if letter <> current_letter: html.append('<a name="%s"><h3>%s</h3></a>' % ( wikiutil.quoteWikiname(letter), letter.replace('~', 'Others'))) current_letter = letter else: html.append('<br>') html.append('<a href="%s%s">%s</a>\n' % (self.request.getScriptname(), wikiutil.quoteWikiname(name), name)) index = '' qpagename = wikiutil.quoteWikiname(self.formatter.page.page_name) index = index + _make_index_key(index_letters) return '%s%s' % (index, ''.join(html))
def username(self, d): """ Assemble the username / userprefs link @param d: parameter dictionary @rtype: string @return: username html """ html = '<div id="username">%s</div>' % wikiutil.link_tag( self.request, wikiutil.quoteWikiname(d['page_user_prefs']), wikiutil.escape(d['user_prefs'])) return html
def talkicon(self, d): if not self.request.config.talk_pages: return '' if d['page'].isTalkPage(): article_name = wikiutil.talk_to_article_pagename(d['page_name']) icon = self.get_editable_icon('articleicon.png', 'Article') return ('<td class="pageIcon"><span id="articleIcon">' '%s</span></td>' % (wikiutil.link_tag_explicit( 'style="text-decoration: none;"', self.request, wikiutil.quoteWikiname(article_name), icon, script_name=d['script_name']))) else: talk_page = Page(wikiutil.article_to_talk_pagename(d['page_name']), self.request) icon = self.get_editable_icon('talkicon.png', 'Talk') if talk_page.exists(): return ('<td class="pageIcon"><span id="talkIcon">' '%s</span></td>' % (wikiutil.link_tag_explicit( 'style="text-decoration: none;"', self.request, wikiutil.quoteWikiname(d['page_name'])+'/Talk', icon, script_name=d['script_name']))) else: # if the viewer can't edit the talk page, let's spare them # from looking at a useless link to an empty page: if not self.request.user.may.edit(talk_page): return '' return ('<td class="pageIcon"><span id="talkIcon">' '%s</span></td>' % (wikiutil.link_tag_explicit( 'class="tinyNonexistent"', self.request, wikiutil.quoteWikiname(d['page_name'])+'/Talk', icon, script_name=d['script_name'])))
def infoicon(self, d): if self.isInfo(): status = 'Selected' else: status = '' icon = self.get_editable_icon('infoicon.png', 'Info') return '<td class="pageIcon%s"><span id="infoIcon">%s</span></td>' % ( status, wikiutil.link_tag_explicit('style="text-decoration: none;"', self.request, wikiutil.quoteWikiname(d['page_name'])+ '?action=info', icon, script_name=d['script_name']))
def logo(self, d): """ Assemble the logo @param d: parameter dictionary @rtype: string @return: logo html """ if d['logo_string']: html = '<div id="logo">%s</div>' % wikiutil.link_tag( self.request, wikiutil.quoteWikiname(d['page_front_page']), d['logo_string']) else: html = '' return html
def interwikiurl(self, url, **kw): """ Return the URL and status information for the interwiki page. @rtype: tuple containing: (page url, wikitag, wikiurl, wikitail, wikitag_bad, wikitype) """ wikitag, wikiurl, wikitail, wikitag_bad, wikitype = \ wikiutil.resolve_wiki(self.request, url, force_farm=kw.get('force_farm')) wikiurl = wikiutil.mapURL(wikiurl) if wikitype == wikiutil.INTERWIKI_FARM_TYPE: wikitail = wikiutil.quoteWikiname(wikitail) href = wikiutil.join_wiki(wikiurl, wikitail) return (href, wikitag, wikiurl, wikitail, wikitag_bad, wikitype)
def editicon(self,d): editable = self.request.user.may.edit(d['page']) if editable: icon = self.get_editable_icon('editicon.png', 'Edit') if self.isEdit(): return ('<td class="pageIconSelected">' '<span id="editIcon">%s</span></td>' % icon) else: return ('<td class="pageIcon"><span id="editIcon">' '%s</span></td>' % (wikiutil.link_tag_explicit( 'style="text-decoration: none;"', self.request, wikiutil.quoteWikiname(d['page_name']) + '?action=edit', '%s' % icon, script_name=d['script_name']))) return ''
def _macro_search(self, arg, formatter=None): if not formatter: formatter = self.formatter alt, img_url, x, y = self.request.theme.get_icon('searchbutton') d = {'img_url':img_url, 'alt':alt, 'q_pagename':wikiutil.quoteWikiname(formatter.page.page_name)} if arg and arg.lower() == 'global': d['search_action'] = 'global_search' else: d['search_action'] = 'search' search_html = ( '<span><form method="GET" action="%(q_pagename)s" ' 'style="display:inline !important;">' '<input type="hidden" name="action" value="%(search_action)s">' '<input class="formfields" type="text" name="inline_string" ' 'value="" size="25" maxlength="50"> ' '<input type="image" src="%(img_url)s" alt="%(alt)s"> ' '</form></span>' % d) return formatter.rawHTML(search_html)
def execute(macro, args, formatter=None): request = macro.request before_form, after_form = '', '' if args and len(args.split(',')) == 2: before_form, after_form = args.split(',') if not formatter: formatter = macro.formatter if not config.allow_web_based_wiki_creation: return ('<i>This wiki farm does not have web-based wiki creation ' 'enabled.</i>') if request.user.valid: d = {'form_action': formatter.page.url(), 'wikiname_length': farm.WIKINAME_MAX_LENGTH, 'create_wiki_button': 'send_email', 'after_form': after_form, 'before_form': before_form, } wiki_create_form = ( '<form action="%(form_action)s" method="POST">\n' '<span class="wikiNameArea">' '<input type="hidden" name="action" value="new_wiki">\n' '%(before_form)s' '<input type="text" class="wikiname" name="wikiname" ' 'size="15" value="shortname" ' 'maxlength="%(wikiname_length)s" ' 'onFocus="this.value=\'\';this.style.color=\'black\';return false;">\n' '<input type="hidden" name="%(create_wiki_button)s" ' 'value="1">\n' '<span class="description">%(after_form)s</span>' '</span>' '<span class="submit"><input type="submit" value="Create wiki"></span>\n' '</form>\n' % d) else: new_user_link = ('%s%s?new_user=1' % (farm.getBaseFarmURL(request), wikiutil.quoteWikiname( config.page_user_preferences))) wiki_create_form = ('You must be logged in to create a wiki! ' 'To create an account, go ' '<a href="%s">here</a>.' % new_user_link) return formatter.rawHTML('<span id="wikiCreateForm">%s</span>' % wiki_create_form)
def full_events(events, are_events_today, htmltext, macro): old_date = '' event_timezone = macro.request.config.tz # clear events that have passed yesterday_struct = time.gmtime(time.time()-60*60*24) yesterday = list(yesterday_struct[0:3]) + [0,0,0,0,0,0] yesterday = calendar.timegm(yesterday) macro.request.cursor.execute("""SELECT event_name, event_time FROM events WHERE event_time<%(yesterday)s and wiki_id=%(wiki_id)s""", {'yesterday':yesterday, 'wiki_id':macro.request.config.wiki_id}) macro.request.cursor.execute("""DELETE FROM events WHERE event_time<%(yesterday)s and wiki_id=%(wiki_id)s""", {'yesterday':yesterday, 'wiki_id':macro.request.config.wiki_id}) macro.request.cursor.execute( """SELECT uid, event_time, posted_by, text, location, event_name FROM events WHERE wiki_id=%(wiki_id)s ORDER BY event_time""", {'wiki_id':macro.request.config.wiki_id}) result = macro.request.cursor.fetchone() while result: events.append(result) result = macro.request.cursor.fetchone() current_time = macro.request.user.getFormattedDateTime(time.time()) year_cut = string.split(current_time," ")[0] current_year = string.split(year_cut, "-")[0] month_cut = string.split(current_time," ")[0] current_month = string.split(month_cut,"-")[1] day_cut = string.split(current_time," ")[0] current_day = string.split(day_cut,"-")[2] hour_cut = string.split(current_time," ")[1] current_hour = string.split(hour_cut,":")[0] minute_cut = string.split(current_time," ")[1] current_minute = string.split(minute_cut,":")[1] for event in events: event_name = event[5] # we store it as a general time and we convert it to a local time.. event_time_unix = event[1] event_time_struct = wikiutil.timeInUnixToLocal( macro.request.config.tz, event_time_unix) year = event_time_struct[0] month = event_time_struct[1] day = event_time_struct[2] hour = event_time_struct[3] minute = event_time_struct[4] posted_by = event[2] id = event[0] date = str(month) + " " + str(day) if int(hour) > 12 : read_hour = int(hour) - 12 if not int(minute) == 0: ptime = str(read_hour) + ":" + str(minute) + " PM" else: ptime = str(read_hour) + ":00" + " PM" elif int(hour) == 0: if not int(minute) == 0: ptime = "12:" + str(minute) + " AM" else: ptime = "12:00 AM" elif int(hour) == 12: if not int(minute) == 0: ptime = "12:" + str(minute) + " PM" else: ptime = "12:00 PM" else: if not int(minute) == 0: ptime = str(hour) + ":" + str(minute) + " AM" else: ptime = str(hour) + ":00 AM" ptime = "%s (%s)" % (ptime, macro.request.config.tz) # This is where we want to run through the wiki processor text = event[3] event_location = event[4] processed_text = doParse(text,macro,keep_outer_paragraph=True) processed_location = doParse(event_location,macro) processed_name = doParse(event_name,macro) month_dict = {1:'January', 2:'February', 3:'March', 4:'April', 5:'May', 6:'June', 7:'July', 8:'August', 9:'September', 10:'October', 11:'November', 12:'December'} string_month = month_dict[month] events_page = Page("Events Board", macro.request) posted_by_user = user.User(macro.request, name=posted_by) user_link = user.getUserLink(macro.request, posted_by_user) if (macro.request.user.may.admin(events_page) or posted_by == macro.request.user.propercased_name): if date == old_date: htmltext.append( '<ul>\n<h4 id="head-%s">%s</h4>\n' '<a href="%s/Events_Board?action=events&uid=%s&' 'del=1">[delete]</a>' ' <b>Time:</b> %s<br>\n' '<b>Location:</b> %s<br>\n' '%s(Posted by %s)\n</ul>\n' % (id, processed_name, macro.request.getScriptname(), id, ptime, processed_location, processed_text, user_link)) else: string_day = datetoday(int(day),int(month),int(year)) old_date = date htmltext.append( '<h2>%s, %s %s, %s</h2>\n' '<ul><h4 id="head-%s">%s</h4>\n' '<a href="%s/Events_Board?action=events&uid=%s&' 'del=1">[delete]</a>' ' <b>Time:</b> ' '%s \n' '<b>Location:</b> %s<br>\n' '%s(Posted by %s)\n</ul>\n' % (string_day, string_month, day, year, id, processed_name,macro.request.getScriptname(), id, ptime, processed_location, processed_text, user_link)) else: if date == old_date: htmltext.append( '<ul>\n<h4 id="head-%s">%s</h4>\n' '<b>Time:</b> %s<br>\n' '<b>Location:</b> %s<br>\n' '%s(Posted by %s)\n</ul>\n' % (id, processed_name, ptime, processed_location, processed_text, user_link)) else: string_day = datetoday(int(day),int(month),int(year)) old_date = date htmltext.append( '<h2>%s, %s %s</h2>\n' '<ul>\n<h4 id="head-%s">%s</h4>\n' '<b>Time:</b> %s \n' '<b>Location:</b> %s<br>\n' '%s(Posted by %s)\n</ul>\n' % (string_day, string_month, day, id, processed_name, ptime, processed_location, processed_text, user_link)) title = "Post a new event:" htmltext.append( '<h3>%s</h3>\n' '<table border="0" cellspacing="0" cellpadding="3">\n' '<tr><td><form method="POST" action="%s/%s">\n' '<input type="hidden" name="action" value="events">\n' '<input type="hidden" name="ticket" value="%s">\n' 'Event name: <input class="formfields" type="text" name="event_name"' 'size="30" maxlength="100"> \n' 'Location: <input class="formfields" type="text" ' 'name="event_location" size="25" maxlength="100">' '<br><br>\n' % (title, macro.request.getScriptname(), wikiutil.quoteWikiname(macro.formatter.page.proper_name()), createTicket())) monthstring = ('<p>Date: <select name="month">\n' '<option value="1">January</option>\n' '<option value="2">February</option>\n' '<option value="3">March</option>\n' '<option value="4">April</option>\n' '<option value="5">May</option>\n' '<option value="6">June</option>\n' '<option value="7">July</option>\n ' '<option value="8">August</option>\n' '<option value="9">September</option>\n' '<option value="10">October</option>\n' '<option value="11">November</option>\n' '<option value="12">December</option>\n</select>\n') newmonthstring = monthstring.replace( 'value="%s"' % str(int(current_month)), 'value="%s" selected' % str(int(current_month))) htmltext.append(newmonthstring) daystring = ('<select name="day">\n ' '<option>1</option>\n ' '<option>2</option>\n ' '<option>3</option>\n ' '<option>4</option>\n ' '<option>5</option>\n ' '<option>6</option>\n ' '<option>7</option>\n ' '<option>8</option>\n ' '<option>9</option>\n ' '<option>10</option>\n ' '<option>11</option>\n ' '<option>12</option>\n ' '<option>13</option>\n ' '<option>14</option>\n ' '<option>15</option>\n ' '<option>16</option>\n ' '<option>17</option>\n ' '<option>18</option>\n ' '<option>19</option>\n ' '<option>20</option>\n ' '<option>21</option>\n ' '<option>22</option>\n ' '<option>23</option>\n ' '<option>24</option>\n ' '<option>25</option>\n ' '<option>26</option>\n ' '<option>27</option>\n ' '<option>28</option>\n ' '<option>29</option>\n ' '<option>30</option>\n ' '<option>31</option>\n ' '</select>\n') newdaystring = daystring.replace(">"+str(int(current_day))+"<", " selected>"+str(int(current_day))+"<") htmltext.append(newdaystring) yearstring = '<select name="year">\n' for year in yearList(): yearstring += '<option>%s</option>\n' % year yearstring += '</select>' newyearstring = yearstring.replace(">" + current_year + "<", " selected>" + current_year + "<") htmltext.append(newyearstring) hourstring = ('Time: <select name="hour">\n ' '<option value="0">12AM</option>\n ' '<option value="1">1AM</option>\n ' '<option value="2">2AM</option>\n ' '<option value="3">3AM</option>\n ' '<option value="4">4AM</option>\n ' '<option value="5">5AM</option>\n ' '<option value="6">6AM</option>\n ' '<option value="7">7AM</option>\n ' '<option value="8">8AM</option>\n ' '<option value="9">9AM</option>\n ' '<option value="10">10AM</option>\n ' '<option value="11">11AM</option>\n ' '<option value="12">12PM</option>\n ' '<option value="13">1PM</option>\n ' '<option value="14">2PM</option>\n ' '<option value="15">3PM</option>\n ' '<option value="16">4PM</option>\n ' '<option value="17">5PM</option>\n ' '<option value="18">6PM</option>\n ' '<option value="19">7PM</option>\n ' '<option value="20">8PM</option>\n ' '<option value="21">9PM</option>\n ' '<option value="22">10PM</option>\n ' '<option value="23">11PM</option>\n ' '</select>\n') newhourstring = hourstring.replace('value="%s"' % str(int(current_hour)), 'value="%s" selected' % str(int(current_hour))) htmltext.append(newhourstring) if not str(int(int(current_minute)/10)) == 0: rounded_min = str(int(int(current_minute)/10)) + "0" else: rounded_min = "0" minutestring = (' : <select name="minute">\n ' '<option value="0">00</option>\n ' '<option value="10">10</option>\n ' '<option value="20">20</option>\n ' '<option value="30">30</option>\n ' '<option value="40">40</option>\n ' '<option value="50">50</option>\n ' '</select> (in %s)</p>\n' % event_timezone) newminutestring = minutestring.replace('value="%s"' % rounded_min, 'value="%s" selected' % rounded_min) htmltext.append(newminutestring) htmltext.append( '<textarea name="event_text" rows="5" cols="67" wrapping=yes>' 'Describe event</textarea><br>\n' '<input class="formbutton" type="submit" name="button" ' 'value="Add Event">\n' '</form></td></tr></table>')
def execute(macro, args, formatter=None, **kw): if not formatter: formatter = macro.formatter request = macro.request _ = request.getText pagename = macro.formatter.page.page_name pagename_propercased = macro.formatter.page.proper_name() cursor = request.cursor tnow = time.time() msg = "" pages = {} ignore_pages = {} today = request.user.getTime(tnow)[0:3] this_day = today day_count = 0 local_favoriteList = [] if not request.user.id: # not logged in user request.write('<p>You must be logged in to use the bookmarks ' 'functionality. Bookmarks let you easily keep track of ' 'pages you think are interesting.</p>') return '' if args and args == 'global': wiki_global = True else: wiki_global = False all_favorites = request.user.getFavoriteList(wiki_global=wiki_global) changed_favorites = wikidb.getRecentChanges( request, per_page_limit=1, userFavoritesFor=request.user.id, wiki_global=wiki_global) local_favoriteList = groupFavorites(changed_favorites, all_favorites) from Sycamore.formatter.text_html import Formatter from Sycamore import user formatter = Formatter(request) if not wiki_global: rss_html = ( '<link rel=alternate type="application/rss+xml" ' 'href="%s/%s?action=rss_rc&bookmarks=1&user=%s" ' 'title="Recent Changes on %s\'s bookmarks">' '<div style="float:right;">' '<a title="%s\'s Bookmarks RSS Feed" ' 'href="%s/%s?action=rss_rc&bookmarks=1&user=%s" ' 'style="border:1px solid;border-color:#FC9 #630 #330 #F96;' 'padding:0 3px;font:bold 10px verdana,sans-serif;' 'color:#FFF!important;background:#F60;text-decoration:none;' 'margin:0;">' 'RSS</a></div>' % (request.getScriptname(), wikiutil.quoteWikiname(pagename_propercased), urllib.quote_plus(request.user.propercased_name), request.user.propercased_name, request.user.propercased_name, request.getScriptname(), wikiutil.quoteWikiname(pagename_propercased), urllib.quote_plus(request.user.propercased_name))) else: rss_html = ( '<link rel=alternate type="application/rss+xml" ' 'href="%s/%s?action=rss_rc&bookmarks=1&user=%s" ' 'title="Recent Changes on %s\'s bookmarks">' '<div style="float:right;">' '<a title="%s\'s Interwiki Bookmarks RSS Feed" ' 'href="%s/%s?action=rss_rc&bookmarks=1&user=%s&' 'global=1" ' 'style="border:1px solid;border-color:#FC9 #630 #330 #F96;' 'padding:0 3px;font:bold 10px verdana,sans-serif;' 'color:#FFF;background:#F60;text-decoration:none;' 'margin:0;">' 'RSS</a></div>' % (request.getScriptname(), wikiutil.quoteWikiname(pagename_propercased), urllib.quote_plus(request.user.propercased_name), request.user.propercased_name, request.user.propercased_name, request.getScriptname(), wikiutil.quoteWikiname(pagename_propercased), urllib.quote_plus(request.user.propercased_name))) request.write(rss_html) request.write('<div class="bookmarks">') if not local_favoriteList: request.write('<p>Bookmarks let you easily keep track of pages you ' 'think are interesting.</p>') if wiki_global: request.write('<p>This page will show you all of your bookmarks, ' 'even if your bookmarks are on different wikis!</p>') request.write('<p><i>You have no Bookmarks. To add a page click ' '"Bookmark this page" at the bottom of the page.' '</i></p>') user_pages, other_pages = grab_user_pages(local_favoriteList, request) rendered_bookmarks = render_favorites(other_pages, request, formatter, macro, wiki_global) for pagename, line in rendered_bookmarks: request.write(line) if user_pages: rendered_profile_bookmarks = render_favorites(user_pages, request, formatter, macro, wiki_global) request.write('<h3 id="profiles">Your wiki profiles:</h3>') for pagename, line in rendered_profile_bookmarks: request.write(line) request.write('</div>') return ''
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) @keyword had_conflict: we had an edit conflict on a save. """ import re try: from Sycamore.action import SpellCheck except ImportError: SpellCheck = None form = self.request.form _ = self._ self.request.http_headers([("Content-Type", "text/html; charset=%s" % config.charset)] + self.request.nocache) msg = None preview = kw.get('preview', None) emit_anchor = not kw.get('staytop', 0) proper_name = self.proper_name() from Sycamore.formatter.text_html import Formatter self.request.formatter = Formatter(self.request, store_pagelinks=1, preview=preview) base_uri = "%s/%s?action=edit" % (self.request.getScriptname(), wikiutil.quoteWikiname( self.proper_name())) backto = form.get('backto', [None])[0] if backto: base_uri += '&' + util.web.makeQueryString(backto=backto) # check edit permissions if not self.request.user.may.edit(self): msg = _('You are not allowed to edit this page.') elif self.prev_date: # 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!') # Is the IP address a Tor exit note? if config.block_tor_edits: tor = torcheck.torcheck() if tor.query(self.request.remote_addr): msg = _('You are not allowed to edit this page, %s.' % self.request.remote_addr) # Test against a number of DNSBLs if config.block_dnsbl_edits: # Test: is this an IP address? re1='((?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?))(?![\\d])' rg = re.compile(re1,re.IGNORECASE|re.DOTALL) m = rg.search(self.request.remote_addr) if m: # this is an IP address # reverse IP address octets dq = self.request.remote_addr.split('.') dq.reverse() for dnsbl in config.block_dnsbl_edits: querystring = '.'.join(dq) querystring += '.' + dnsbl + '.' try: result = socket.gethostbyname(querystring) except socket.gaierror: # probably nxdomain result = '0.0.0.0' if result.startswith('127.0.0'): # utoh msg = _('You are not allowed to edit this page: %s listed on %s' % (self.request.remote_addr, dnsbl)) # Did one of the prechecks fail? if msg and not kw.get('had_conflict', None): self.send_page(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.replace("\r", ""), 1) page_needle = self.page_name if config.allow_subpages and page_needle.count('/'): page_needle = '/' + page_needle.split('/')[-1] wikiutil.send_title(self.request, self.proper_name(), pagename=self.proper_name(), has_link=True, strict_title='Editing "%s"' % self.proper_name(), body_onload = "sizeForIE('savetext', 100, 'editorComment', 99);" ) # start content div self.request.write('<div id="content" class="content">\n') # get request parameters text_rows = None if form.has_key('rows'): text_rows = int(form['rows'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_rows = config.edit_rows if self.request.user.valid: text_rows = int(self.request.user.edit_rows) if form.has_key('cols'): text_cols = int(form['cols'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_cols = 80 if self.request.user.valid: text_cols = int(self.request.user.edit_cols) # check datestamp (version) of the page our edit is based on if preview is not None: # propagate original datestamp mtime = float(form['datestamp'][0]) # did someone else change the page while we were editing? conflict_msg = None if not self.exists(): # page does not exist, are we creating it? if mtime: conflict_msg = _('<p>Someone else <b>deleted</b> this ' 'page while you were editing!') elif mtime != self.mtime(): conflict_msg = _('<p>Someone else changed this page while ' 'you were editing.') # merge conflicting versions allow_conflicts = 1 from Sycamore.util import diff3 savetext = self.get_raw_body() oldpg = Page(self.page_name, self.request, prev_date=mtime) original_text = oldpg.get_raw_body() saved_text = Page(self.page_name, self.request).get_raw_body() verynewtext, had_conflict = diff3.text_merge( original_text, saved_text, savetext, marker1='----- /!\ Edit conflict! Your version: -----\n', marker2='----- /!\ Edit conflict! Other version: -----\n', marker3='----- /!\ End of edit conflict -----\n') if had_conflict and self.request.user.valid and ( self.request.user.id == self.last_edit_info()[1]): # user pressed back button or did something weird conflict_msg =None elif had_conflict: conflict_msg = _(conflict_msg + 'There was an <b>edit conflict between ' 'your changes!</b></p>' '<p>Please review the conflicts and ' 'merge the changes.</p>') mtime = self.mtime() self.set_raw_body(verynewtext, 1) else: conflict_msg = _(conflict_msg + 'Your changes were sucessfully merged!') mtime = self.mtime() self.set_raw_body(verynewtext) if conflict_msg: self.request.write('<div id="message"><div>%s' '</div></div>'% conflict_msg) emit_anchor = 0 # make this msg visible! elif self.exists(): # datestamp of existing page mtime = self.mtime() else: # page creation mtime = 0 # output message message = kw.get('msg', '') if message: self.request.write('<div id="message">%s</div>' % (message)) # get the text body for the editor field if form.has_key('template'): # "template" parameter contains the name of the template page template_page = wikiutil.unquoteWikiname(form['template'][0]) raw_body = Page(template_page, self.request).get_raw_body() else: raw_body = self.get_raw_body() # send text above text area # button toolbar self.request.write('<div id="editArea">') self.request.write("<script type=\"text/javascript\">" "var buttonRoot = '%s';</script>" % ( os.path.join(config.url_prefix, self.request.theme.name, 'img', 'buttons'))) if self.request.user.name: if config.user_page_prefix: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '[\"%s%s\"]';</script>" % ( config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '[\"%s\"]';</script>" % ( config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '%s';</script>" % ( self.request.remote_addr)) if config.wiki_farm: self.request.write("<script type=\"text/javascript\" " "src=\"http://%s%s%s/edit.js\"></script>\n" % ( config.wiki_base_domain, config.web_dir, config.url_prefix)) else: self.request.write("<script type=\"text/javascript\" " "src=\"%s%s/edit.js\"></script>\n" % ( config.web_dir, config.url_prefix)) # send form self.request.write('<form name="editform" id="editform" ' 'method="post" action="%s/%s#preview">' % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name))) self.request.write(str(html.INPUT(type="hidden", name="action", value="savepage"))) if backto: self.request.write(str(html.INPUT(type="hidden", name="backto", value=backto))) # generate default content if not raw_body: if self.isTalkPage(): raw_body = _('This page is for discussing the ' 'contents of ["%s"].') % self.proper_name()[:-5] else: raw_body = _('Describe %s here.') % (self.proper_name(),) # replace CRLF with LF raw_body = self._normalize_text(raw_body) # send datestamp (version) of the page our edit is based on self.request.write('<input type="hidden" name="datestamp" ' 'value="%s">' % repr(mtime)) # Print the editor textarea and the save button self.request.write('<textarea id="savetext" name="savetext" ' 'rows="%d" cols="%d" style="width:100%%;">%s' '</textarea>' % (text_rows, text_cols, wikiutil.escape(raw_body))) # make sure we keep the template notice on a resize of the editor template_param = '' if form.has_key('template'): template_param = '&template=' + form['template'][0] # draw edit size links self.request.write(_('<div class="pageEditInfo" id="editorSize">' 'editor size:')) self.request.write('<a href="#" onclick="return sizeEditor(\'bigger\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '+')) self.request.write(',<a href="#" onclick="return sizeEditor(\'smaller\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '-')) self.request.write('</div>') self.request.write('</p>') # close textarea self.request.write('<div id="editComment" id="editorResizeButtons"> ' '%s<br><input type="text" class="formfields" ' 'name="comment" id="editorComment" value="%s" ' 'size="%d" maxlength="80" style="width:99%%;">' '</div>' % (_("<font size=\"+1\">Please comment " "about this change:</font>"), wikiutil.escape(kw.get('comment', ''), 1), text_cols)) spam_catch_button = ( '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' 'dont enter into this box:' '<input type="text" name="text_dont"/>' '</span>' '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont" ' 'value="Dont press me">\n' '</span>') self.request.write(spam_catch_button) # button bar button_spellcheck = (SpellCheck and '<input type="submit" class="formbutton" name="button_spellcheck"' ' value="%s">' % _('Check Spelling')) or '' save_button_text = _('Save Changes') cancel_button_text = _('Cancel') self.request.write("</div>") if self.request.user.may.admin(self): security_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=Security\'" ' 'value="Security">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) else: security_button = '' if self.request.user.may.delete(self): delete_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=DeletePage\'" value="Delete">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) rename_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=\'%s/%s?action=Rename\'"' ' value="Rename">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) else: delete_button = '' rename_button = '' self.request.write('<div id="editButtonRow">' '<span>' '<input type="submit" class="formbutton" ' 'name="button_preview" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_save" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_cancel" value="%s"> ' '</span>' '<span class="editActions">' '<input type="button" class="formbutton" ' 'onClick="window.open(\'%s/%s?action=Files\', ' '\'files\', \'width=800,height=600,' 'scrollbars=1\')" value="Upload Files"> ' '%s ' '%s ' '%s ' '%s</span>' '</div>' % ( _('Preview'), save_button_text, cancel_button_text, self.request.getScriptname(), wikiutil.quoteWikiname(proper_name), button_spellcheck, delete_button, rename_button, security_button)) if self.request.config.edit_agreement_text: self.request.write(self.request.config.edit_agreement_text) 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("</form>") if config.wiki_farm: from Sycamore import farm help_link = farm.link_to_page(farm.getBaseWikiName(), "Help with Editing", self.request.formatter, force_farm=True) else: help_link = Page("Help with Editing", self.request).link_to() # QuickHelp originally by Georg Mischler <*****@*****.**> self.request.write('<h2>Editing quick-help</h2>\n' '<dl><div style="float: right; margin: 10px; border: 1px solid; ' 'padding: 3pt;">See <b>%s</b> for more information.</div>' % ( help_link) + _("<dt>Emphasis:</dt>\n" "<dd>''<em>italics</em>''; '''<strong>bold</strong>''';" "'''''<strong><em>bold italics</em></strong>''''';" "''<em>mixed '''<strong>bold</strong>''' and " "italics</em>''; ---- horizontal rule.</dd>" "<dt>Headings:</dt>" "<dd>= Title 1 =; == Title 2 ==; === Title 3 ===;" "==== Title 4 ====; ===== Title 5 =====.</dd>" "<dt>Lists:</dt>" "<dd>space and one of * bullets; 1., a., A., i., I. " "numbered items;" " 1.#n start numbering at n; space alone indents.</dd>" "<dt>Links:</dt>" "<dd>[\"brackets and double quotes\"]; [\"the exact " "page name\" label];" " url; [url]; [url label].</dd>" "<dt>Tables:</dt>" "<dd>|| cell text |||| cell text spanning two columns ||;" " no trailing white space allowed after tables or titles." "</dd></dl>")) if preview is not None: if not emit_anchor: preview_name = "previewHide" else: preview_name = "preview" self.request.write('<div id="%s" class="preview">' % preview_name) self.send_page(content_only=1, hilite_re=badwords_re, preview=preview) self.request.write('</div>') self.request.write('</div>\n') # end content div wikiutil.send_after_content(self.request) self.request.theme.emit_custom_html(config.page_footer1) self.request.theme.emit_custom_html(config.page_footer2) self.request.write('</body></html>')
def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter macro.parser.inhibit_br += 2 text = [] if args: title = args else: title = "Comments:" if not macro.request.user.may.edit(macro.formatter.page): text.append("<h3>%s</h3>\n" "<p><strong>Note: You must be logged in to add " "comments</strong></p>\n" % title) else: text.append( "<h3>%(title)s</h3>\n" '<form method="POST" action="%(scriptname)s/%(q_pagename)s">\n' '<p><input type="hidden" name="action" value="comments">\n' '<textarea id="comment_text" name="comment_text_%(pghash)s" rows="1" ' 'style="width:100%%" ' 'onSelect="sizeTextField(this.id,event)" ' 'onPaste="sizeTextField(this.id,event)" ' 'onFocus="sizeTextField(this.id,event)" ' 'onKeyPress="sizeTextField(this.id,event)">' "</textarea>\n" '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' "dont enter into this box:" '<input type="text" name="comment_dont_%(pghash)s"/>' "</span>" '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont1_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' "</span>" '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont2_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' "</span>" '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont3_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' "</span>" '<input class="formbutton" type="submit" name="button_do_%(pghash)s" ' 'value="Add Comment">\n' '<i>Friendly reminder: Please read <a href="http://rocwiki.org/Wiki_Community/Etiquette" target="_blank">Wiki Community/Etiquette</a> before commenting.</i>' '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont4_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' "</span>" "</p>\n" "</form>" % { "title": title, "scriptname": macro.request.getScriptname(), "pghash": hash(macro.formatter.page.page_name.lower()), "q_pagename": wikiutil.quoteWikiname(macro.formatter.page.proper_name()), } ) # we want to print a paragraph after the comments area if there's # anything following it macro.parser.force_print_p = True return formatter.rawHTML("".join(text))
def execute(pagename, request): _ = request.getText actname = __name__.split('.')[-1] page = PageEditor(pagename, request) pagetext = page.get_raw_body() msg = '' # be extra paranoid in dangerous actions if (actname in config.excluded_actions or not request.user.may.edit(page) or not request.user.may.delete(page)): msg = _('You are not allowed to rename pages in this wiki!') # check whether page exists at all elif not page.exists(): msg = _('This page is already deleted or was never created!') # check whether the user clicked the delete button elif (request.form.has_key('button') and request.form.has_key('newpagename') and request.form.has_key('ticket')): # check whether this is a valid renaming request (make outside # attacks harder by requiring two full HTTP transactions) if not _checkTicket(request.form['ticket'][0]): msg = _('Please use the interactive user ' 'interface to rename pages!') else: renamecomment = request.form.get('comment', [''])[0] # strip to ensure naming consistency newpagename = request.form.get('newpagename')[0].strip() if newpagename == pagename: return Page(pagename, request).send_page( msg="You can't rename a page to the name it already has!") try: newpage = PageEditor(newpagename, request) except Page.ExcessiveLength, msg: return Page(pagename, request).send_page(msg=msg) if len(renamecomment) > wikiaction.MAX_COMMENT_LENGTH: msg = _('Comments must be less than %s characters long.' % wikiaction.MAX_COMMENT_LENGTH) elif len(newpagename) > MAX_PAGENAME_LENGTH: msg = _('Page names must be less than %s characters long.' % MAX_PAGENAME_LENGTH) # check whether a page with the new name already exists elif (newpage.exists() and not (newpagename.lower() == pagename.lower())): msg = _('A page with the name "%s" already exists!') % ( newpagename) elif not wikiaction.isValidPageName(newpagename): msg = _('Invalid pagename: Only the characters A-Z, a-z, 0-9, ' '"$", "&", ",", ".", "!", "\'", ":", ";", " ", "/", ' '"-", "(", ")" are allowed in page names.') # we actually do a rename! else: if renamecomment: renamecomment = " (" + renamecomment + ")" if newpagename.lower() != pagename.lower(): page.saveText("#redirect %s" % newpagename, '0', comment='Renamed to "%s"' % newpagename, action='RENAME', force_save=True) # copy images over copy_files(pagename, newpagename, request) newpage.saveText(pagetext, '0', comment='Renamed from "%s"%s' % (pagename, renamecomment), action="RENAME", proper_name=newpagename) msg = _('Page "%s" was successfully renamed to "%s"!') % ( pagename, newpagename) if newpagename.lower() != pagename.lower(): # check favorites because the redirect will # process before the bookmarks get updated if request.user.valid: request.user.checkFavorites(page) request.http_redirect( '%s/%s?action=show&redirect=%s' % (request.getScriptname(), wikiutil.quoteWikiname(newpagename), urllib.quote_plus(pagename.encode(config.charset), ''))) request.req_cache['pagenames'][( newpagename.lower(), request.config.wiki_name)] = newpagename # we clear so the new page name appears caching.CacheEntry(newpagename.lower(), request).clear() return else: request.req_cache['pagenames'][( newpagename.lower(), request.config.wiki_name)] = newpagename # we clear so the new page name appears caching.CacheEntry(newpagename.lower(), request).clear() return newpage.send_page(msg)
def testUrl(self): """Test's Page.url().""" from Sycamore.Page import Page from Sycamore import farm list_of_wikis = self._get_list_of_wikis() # relative, w/o query string for trial in xrange(0, 200): pagename = make_random_string(MAX_PAGENAME_LENGTH) page = Page(pagename, self.request) pagename = page.proper_name() pagename_encoded = wikiutil.quoteWikiname(pagename) proper_url = '/%s' % pagename_encoded self.assertEqual(proper_url, page.url()) # relative, w/ query string for trial in xrange(0, 200): pagename = make_random_string(MAX_PAGENAME_LENGTH) query = '?' the_range = random.randint(0, 10) for i in xrange(0, the_range): if i < (the_range-1): amperstand = '&' else: amperstand = '' query += ('%s=%s%s' % (make_random_string(50, alphanum_only=True), make_random_string(50, alphanum_only=True), amperstand)) page = Page(pagename, self.request) pagename = page.proper_name() pagename_encoded = wikiutil.quoteWikiname(pagename) proper_url = '/%s?%s' % (pagename_encoded, query) self.assertEqual(proper_url, page.url(querystr = query)) original_wiki_name = self.request.config.wiki_name # absolute url, switched request for wiki_trial in xrange(0, 10): self.request.switch_wiki(random.choice(list_of_wikis)) for trial in xrange(0, 200): pagename = make_random_string(MAX_PAGENAME_LENGTH) farm_url = farm.getWikiURL(self.request.config.wiki_name, self.request) page = Page(pagename, self.request) pagename = page.proper_name() pagename_encoded = wikiutil.quoteWikiname(pagename) proper_url = '%s%s' % (farm_url, pagename_encoded) self.assertEqual(proper_url, page.url(relative=False)) for trial in xrange(0, 200): pagename = make_random_string(MAX_PAGENAME_LENGTH) farm_url = farm.getWikiURL(self.request.config.wiki_name, self.request) query = '?' the_range = random.randint(0, 10) for i in xrange(0, the_range): if i < (the_range-1): amperstand = '&' else: amperstand = '' query += ('%s=%s%s' % (make_random_string(50, alphanum_only=True), make_random_string(50, alphanum_only=True), amperstand)) page = Page(pagename, self.request) pagename = page.proper_name() pagename_encoded = wikiutil.quoteWikiname(pagename) proper_url = '%s%s?%s' % (farm_url, pagename_encoded, query) self.assertEqual(proper_url, page.url(querystr=query, relative=False)) self.request.switch_wiki(original_wiki_name) # absolute url, non-switched request for wiki_trial in xrange(0, 10): wiki_name = random.choice(list_of_wikis) for trial in xrange(0, 200): pagename = make_random_string(MAX_PAGENAME_LENGTH) farm_url = farm.getWikiURL(wiki_name, self.request) page = Page(pagename, self.request, wiki_name=wiki_name) pagename = page.proper_name() pagename_encoded = wikiutil.quoteWikiname(pagename) proper_url = '%s%s' % (farm_url, pagename_encoded) self.assertEqual(proper_url, page.url(relative=False)) for trial in xrange(0, 200): pagename = make_random_string(MAX_PAGENAME_LENGTH) farm_url = farm.getWikiURL(wiki_name, self.request) query = '?' the_range = random.randint(0, 10) for i in xrange(0, the_range): if i < (the_range-1): amperstand = '&' else: amperstand = '' query += ('%s=%s%s' % (make_random_string(50, alphanum_only=True), make_random_string(50, alphanum_only=True), amperstand)) page = Page(pagename, self.request, wiki_name=wiki_name) pagename = page.proper_name() pagename_encoded = wikiutil.quoteWikiname(pagename) proper_url = '%s%s?%s' % (farm_url, pagename_encoded, query) self.assertEqual(proper_url, page.url(querystr = query, relative=False))
def handleData(self, new_user=None): from Sycamore.Page import MAX_PAGENAME_LENGTH as MAX_USERNAME_LENGTH _ = self._ form = self.request.form msg = '' isdisabled = False if form.get('disabled', [0])[0] == '1': isdisabled = True self.from_wiki = None if self.request.form.has_key('from_wiki'): self.from_wiki = self.request.form['from_wiki'][0].lower().strip() if not wikiutil.isInFarm(self.from_wiki, self.request): self.from_wiki = None new_user = int(form.get('new_user', [0])[0]) # wiki farm authentication # we want them to be able to sign back in right after they # click the 'logout' GET link, hence this test is_form_logout = (form.has_key('qs') and urllib.unquote(form['qs'][0]) == 'action=userform&logout=Logout') if (self.request.form.has_key('badlogin') and self.request.form['badlogin'][0]): _create_nologin_cookie(self.request) if config.wiki_farm: wiki_base_url = farm.getBaseFarmURL(self.request) else: wiki_base_url = '%s/' % self.request.getScriptname() return_string = ('Unknown username or wrong password.<br/><br/>' 'New user? <a href="%s%s?new_user=1">Click here ' 'to create an account!</a><br/><br/>' 'Forgot your password? We\'ll email it to you.' '<form action="%s" method="POST">' '<input type="hidden" name="action" ' 'value="userform">' 'Email address: <input class="formfields" ' 'type="text" name="email">' ' <input type="submit" class="formbutton" ' 'name="login_sendmail" ' 'value="Mail me my account data">' '</form>' % ( wiki_base_url, wikiutil.quoteWikiname( config.page_user_preferences), wiki_base_url)) return return_string if (form.has_key('login_check') and form['login_check'][0] and form.has_key('backto_wiki') and form.has_key('backto_page')): backto_wiki = form['backto_wiki'][0] backto_page = form['backto_page'][0].encode(config.charset) if form.has_key('qs') and not is_form_logout: q_query_string = form['qs'][0] else: q_query_string = '' if self.request.user.valid: secret, stored_expire_time, session = \ self.request.user.cookie_dough if q_query_string: url = ('%s?action=userform&backto_page=%s&qs=%s' '&secret=%s&expire_time=%s&uid=%s&session=%s' % ( backto_page, urllib.quote(backto_page), urllib.quote(q_query_string), urllib.quote(secret), stored_expire_time, self.request.user.id, urllib.quote(session))) else: url = ('%s?action=userform&backto_page=%s&secret=%s' '&expire_time=%s&uid=%s&session=%s' % ( backto_page, urllib.quote(backto_page), urllib.quote(secret), stored_expire_time, self.request.user.id, urllib.quote(session))) else: if q_query_string: url = ('%s?action=userform&backto_page=%s¬_logged_in=1' '&qs=%s' % (backto_page, urllib.quote(backto_page), urllib.quote(q_query_string))) else: url = ('%s?action=userform&backto_page=%s¬_logged_in=1' % (backto_page, urllib.quote(backto_page))) self.request.http_redirect(url) return # bounce-back wiki farm authentication if form.has_key('not_logged_in') and form.has_key('backto_page'): backto = urllib.unquote(form['backto_page'][0].encode( config.charset)) if form.has_key('qs') and not is_form_logout: query_string = '?%s' % (urllib.unquote(form['qs'][0] ).encode(config.charset)) else: query_string = '' url = '%s%s' % (backto, query_string) _create_nologin_cookie(self.request) self.request.http_redirect(url) return # bounce-back wiki farm authentication elif (form.has_key('uid') and form.has_key('secret') and form.has_key('session') and form.has_key('expire_time')): uid = form['uid'][0] secret = urllib.unquote(form['secret'][0]) session = form['session'][0] expire_time = float(form['expire_time'][0]) if form.has_key('backto_page'): backto_page = form['backto_page'][0] else: backto_page = '/' if form.has_key('qs') and not is_form_logout: query_string = '?%s' % urllib.unquote(form['qs'][0]) else: query_string = '' url = '%s%s' % (backto_page, query_string) self.request.http_redirect(url) self.request.user.sendCookie(self.request, expire=expire_time, sessionid=session, secret=secret, id=uid) self.request.user.clearNologinCookie(self.request) return if form.has_key('logout') or isdisabled: msg = '' if isdisabled: if not self.request.isPOST(): return "Use the interactive interface to change settings!" # disable the account self.request.user.disabled = 1 # save user's profile self.request.user.save() msg = '<p>%s</p>' % _("Your account has been disabled.") # clear the cookie in the browser and locally try: cookie = Cookie.SimpleCookie(self.request.saved_cookie) except Cookie.CookieError: # ignore invalid cookies cookie = None else: if config.wiki_farm: cookie_id = wikiutil.quoteCookiename( config.wiki_base_domain + ',ID') else: cookie_id = wikiutil.quoteCookiename( config.sitename + ',ID') if cookie.has_key(cookie_id): self.removeSession(cookie[cookie_id].value) cookie_dir = config.web_dir if not cookie_dir: cookie_dir = '/' domain = wikiutil.getCookieDomain(self.request) expirestr = time.strftime("%A, %d-%b-%Y %H:%M:%S GMT", time.gmtime(0)) self.request.setHttpHeader(('Set-Cookie', ('%s="%s"; domain=%s; path=%s; ' 'expires=%s' % ( (cookie_id, cookie[cookie_id].value, domain, cookie_dir, expirestr))))) self.request.saved_cookie = '' self.request.auth_username = '' self.request.user = user.User(self.request) return msg + _("Cookie deleted. You are now logged out.") if form.has_key('login_sendmail'): if not self.request.isPOST(): return "Use the interactive interface to change settings!" if not config.mail_smarthost: return _('This wiki is not enabled for mail processing. ' 'Contact the owner of the wiki, who can either enable ' 'email, or remove the "Subscribe" icon.') try: email = form['email'][0] except KeyError: return _("Please provide a valid email address!") text = '' uid = user.getUserIdByEmail(email, self.request) if uid: theuser = user.User(self.request, uid) if theuser.valid: code = self.createCode(theuser.id) sitename = farm.getBaseWikiFullName(self.request) if config.wiki_farm: url = farm.getBaseFarmURL(self.request) else: url = '%s/' % self.request.getBaseURL() text = ("Go here to automatically log into %s: " "%s%s?action=userform&uid=%s&code=%s\n" "Once you're logged in, you should change your " "password in your settings " "(you forgot your password, right?).\n\n" "(The link in this email is good for " "one use only.)" % ( sitename, url, wikiutil.quoteWikiname( config.page_user_preferences), theuser.id, code)) if not text: return _("Found no account matching the given email address " "'%(email)s'!") % {'email': email} mailok, msg = util.mail.sendmail(self.request, [email], 'Your wiki account data', text, mail_from=config.mail_from) return wikiutil.escape(msg) if form.has_key('login') or form.has_key('uid'): uid = None if form.has_key('code') and form.has_key('uid'): given_uid = form['uid'][0].strip() given_code = form['code'][0].strip() given_code if self.isValidCode(given_uid, given_code): uid = given_uid if uid: # we were given account information so let's # create an account -> log them in theuser = user.User(self.request, id=uid) msg = _("You are now logged in! " "Please change your password below!") # send the cookie theuser.sendCookie(self.request) self.request.user = theuser return msg else: # we weren't given information, so let's see # if they gave us a login/password # try to get the user name try: name = form['username'][0].replace('\t', ' ').strip() except KeyError: name = '' # try to get the password password = form.get('password',[''])[0] # load the user data and check for validness if name: theuser = user.User(self.request, name=name, password=password, is_login=True) else: theuser = user.User(self.request, id=uid, name=name, password=password, is_login=True) if config.wiki_farm: wiki_base_url = farm.getBaseFarmURL(self.request) else: wiki_base_url = '%s/' % self.request.getScriptname() if not theuser.valid: if (not self.request.form.has_key('backto_wiki') or not self.request.form['backto_wiki'][0]): return_string = ('Unknown username or wrong password.' '<br/><br/>New user? ' '<a href="%s%s?new_user=1">' 'Click here to create an account!</a>' '<br/><br/>Forgot your password? ' 'We\'ll email it to you.' '<form action="%s" method="POST">' '<input type="hidden" name="action" ' 'value="userform">' 'Email address: ' '<input class="formfields" ' 'type="text" name="email">' ' ' '<input type="submit" ' 'class="formbutton" ' 'name="login_sendmail" ' 'value="Mail me my account ' 'data">' '</form>' % ( wiki_base_url, wikiutil.quoteWikiname( config.page_user_preferences), wiki_base_url)) return return_string else: self.request.http_redirect( urllib.unquote( self.request.form['backto_page'][0].encode( config.charset)) + '?action=userform&badlogin=1') return # send the cookie theuser.sendCookie(self.request) self.request.user = theuser send_back_home(self.request, msg="You are now logged in!") else: if not self.request.isPOST(): return """Use the interactive interface to change settings!""" # save user's profile, first get user instance theuser = user.User(self.request) # try to get the name # if name is empty or missing, return an error msg if (form.has_key('username') and form['username'][0].replace('\t', '').strip()): theuser.propercased_name = \ form['username'][0].replace('\t', ' ').strip() theuser.name = theuser.propercased_name.lower() elif form.has_key('username'): raise BadData, (_("Please enter a user name!"), new_user) if (self.request.user.name and (self.request.user.name != theuser.name)): # they are still logged on and are trying to make a new account raise BadData, (_("Please log out before creating an account."), new_user) if user.getUserId(theuser.name, self.request): if theuser.name != self.request.user.name: raise BadData, (_("User name already exists!"), new_user) else: new_user = False if form.has_key('save') and form['save'][0] == 'Change password': # change password setting # try to get the password and pw repeat password = form.get('password', [''])[0] password2 = form.get('password2',[''])[0] # Check if password is given and matches with password repeat if password != password2: raise BadData, (_("Passwords don't match!"), new_user) if not password and new_user: raise BadData, (_("Please specify a password!"), new_user) if password: theuser.enc_password = user.generate_hash(password) self._clear_all_sessions_except_current() msg = _("Password changed!") else: # process general settings # tr to get the email theuser.email = form.get('email', [''])[0] if theuser.email: email_user_id = user.getUserIdByEmail(theuser.email, self.request) else: email_user_id = None if not theuser.email or not re.match(".+@.+\..{2,}", theuser.email): raise BadData, (_("Please provide your email address - " "without that you could not " "get your login data via email just in " "case you lose it."), new_user) elif email_user_id and email_user_id != theuser.id: raise BadData, (_("Somebody else has already registered " "with the email address \"%s\", please " "pick something else." % theuser.email), new_user) # editor size theuser.edit_rows = util.web.getIntegerInput(self.request, 'edit_rows', theuser.edit_rows, 10, 60) theuser.edit_cols = util.web.getIntegerInput(self.request, 'edit_cols', theuser.edit_cols, 30, 100) # time zone tz = form.get('tz', theuser.tz)[0] if tz not in pytz.common_timezones: tz = theuser.tz theuser.tz = tz wiki_for_userpage = form.get('wiki_for_userpage', [''])[0].lower() if (wiki_for_userpage and not wikiutil.isInFarm(wiki_for_userpage, self.request)): raise BadData, (_('"%s" is not the name of a wiki.' % ( wiki_for_userpage)), new_user) if wiki_for_userpage != theuser.wiki_for_userpage: # they have changed the wiki! time to do # something differently msg = _("<p>User preferences saved!</p>" "<p><strong>Note:</strong> It may take a bit for " "all links to your name to point to the " "new wiki.</p>") theuser.wiki_for_userpage = wiki_for_userpage # User CSS URL theuser.css_url = form.get('css_url', [''])[0] # try to get the (optional) preferred language #theuser.language = form.get('language', [''])[0] # checkbox options keys = [] for key in user_checkbox_fields: value = form.get(key, [0])[0] try: value = int(value) except ValueError: pass setattr(theuser, key, value) if new_user: # strip spaces, we don't allow them anyway theuser.propercased_name = theuser.propercased_name.strip() theuser.name = theuser.propercased_name.lower() if not theuser.name.strip(): raise BadData, (_("Please provide a user name!"), new_user) elif theuser.propercased_name.find(' ') != -1: raise BadData, (_("Invalid username: spaces are not " "allowed in user names"), new_user) elif re.search('[%s]' % re.escape(USER_NOT_ALLOWED_CHARS), theuser.propercased_name): raise BadData, (_("Invalid username: the characters " "%s are not allowed in usernames." % ( wikiutil.escape( USER_NOT_ALLOWED_CHARS))), new_user) # messes up subpages. # '/' isn't allowed, so we just disallow this and we're cool. elif theuser.name == '..' or theuser.name == '.': raise BadData, (_("Invalid username: okay, seriously, " "that's a pretty lame name. " "Pick something better!"), new_user) elif len(theuser.propercased_name) > MAX_USERNAME_LENGTH: raise BadData, (_("Invalid username: a username can be " "at most %s characters long." % ( MAX_USERNAME_LEGNTH)), new_user) elif (not theuser.email or not re.match(".+@.+\..{2,}", theuser.email)): raise BadData, (_("Please provide your email address - " "without that you could not get your " "login data via email just in case you " "lose it."), new_user) name_exists = user.getUserId(theuser.name, self.request) if name_exists: raise BadData, (_("This user name already belongs to " "somebody else."), new_user) email_exists = user.getUserIdByEmail(theuser.email, self.request) if email_exists: raise BadData, (_("This email already belongs to somebody " "else."), new_user) # try to get the password and pw repeat password = form.get('password', [''])[0] password2 = form.get('password2',[''])[0] # Check if password is given and matches with password repeat if password != password2: raise BadData, (_("Passwords don't match!"), new_user) if not password and new_user: raise BadData, (_("Please specify a password!"), new_user) if password: theuser.enc_password = user.generate_hash(password) theuser.anonymous = False # save data and send cookie theuser.save(new_user=new_user) theuser.sendCookie(self.request) self.request.user = theuser from Sycamore.formatter.text_html import Formatter formatter = Formatter(self.request) if not new_user: if not msg: msg = _("User preferences saved!") if self.from_wiki: go_back_to_wiki = farm.link_to_wiki(self.from_wiki, formatter) msg = ('%s<br/><br/>Wanna go ' 'back to %s?' % (msg, go_back_to_wiki)) else: msg = _("Account created! You are now logged in.") self.request.user.valid = 1 if (self.from_wiki and self.from_wiki.lower() != farm.getBaseWikiName()): go_back_to_wiki = farm.link_to_wiki(self.from_wiki, formatter) msg = ('%s<br/><br/>Head back over to %s and your new account ' 'should work there!' % (msg, go_back_to_wiki)) if _debug: msg = msg + util.dumpFormData(form) return msg
def asHTML(self): """ Create the complete HTML form code. """ _ = self._ self.make_form() # different form elements depending on login state html_uid = '' html_sendmail = '' security_pagename = "%s/%s" % (config.wiki_settings_page, config.wiki_settings_page_security_defaults) if not self.request.user.name in wikiacl.Group("Admin", self.request): return '' else: self._inner.append(html.Raw('<div class="securitySettings">')) self.make_row(_("Everybody may:"), [ html.INPUT(type="checkbox", name="All_may_read", value=1, checked=self.request.config.acl_rights_default['All'][ ACL_RIGHTS_TABLE['read']]), 'read', html.INPUT(type="checkbox", name="All_may_edit", value=1, checked=self.request.config.acl_rights_default['All'][ ACL_RIGHTS_TABLE['edit']]), 'edit', html.INPUT(type="checkbox", name="All_may_delete", value=1, checked=self.request.config.acl_rights_default['All'][ ACL_RIGHTS_TABLE['delete']]), 'delete', ]) self.make_row(_("Logged in people may:"), [ html.INPUT(type="checkbox", name="Known_may_read", value=1, checked=self.request.config.acl_rights_default['Known'][ ACL_RIGHTS_TABLE['read']]), 'read', html.INPUT(type="checkbox", name="Known_may_edit", value=1, checked=self.request.config.acl_rights_default['Known'][ ACL_RIGHTS_TABLE['edit']]), 'edit', html.INPUT(type="checkbox", name="Known_may_delete", value=1, checked=self.request.config.acl_rights_default['Known'][ ACL_RIGHTS_TABLE['delete']]), 'delete', ]) self.make_row(_("Banned people may:"), [ html.INPUT(type="checkbox", name="Banned_may_read", value=1, checked=self.request.config.acl_rights_default['Banned'][ ACL_RIGHTS_TABLE['read']]), 'read', html.INPUT(type="checkbox", name="Banned_may_edit", value=1, checked=self.request.config.acl_rights_default['Banned'][ ACL_RIGHTS_TABLE['edit']]), 'edit', html.INPUT(type="checkbox", name="Banned_may_delete", value=1, checked=self.request.config.acl_rights_default['Banned'][ ACL_RIGHTS_TABLE['delete']]), 'delete', ]) custom_groups = user.getGroupList(self.request, exclude_special_groups=True) for groupname in custom_groups: group = wikiacl.Group(groupname, self.request, fresh=True) self.make_row(_("People in the %s group may:" % ( wikiutil.escape(groupname))), [ html.INPUT(type="checkbox", name="%s_may_read" % quoteWikiname(groupname), value=1, checked=group.default_rights()[ ACL_RIGHTS_TABLE['read']]), 'read', html.INPUT(type="checkbox", name="%s_may_edit" % quoteWikiname(groupname), value=1, checked=group.default_rights()[ ACL_RIGHTS_TABLE['edit']]), 'edit', html.INPUT(type="checkbox", name="%s_may_delete" % quoteWikiname(groupname), value=1, checked=group.default_rights()[ ACL_RIGHTS_TABLE['delete']]), 'delete', html.INPUT(type="checkbox", name="%s_may_admin" % quoteWikiname(groupname), value=1, checked=group.default_rights()[ ACL_RIGHTS_TABLE['admin']]), 'change security' ]) self._inner.append(html.Raw("</div>")) # close securitySettings div buttons = [ ('save', _('Save Settings')), ] # Add buttons button_cell = [] for name, label in buttons: button_cell.extend([ html.INPUT(type="submit", name=name, value=label), ' ', ]) self.make_row('', button_cell) return str(self._form)
def execute(pagename, request): _ = request.getText page = Page(pagename, request) actname = __name__.split('.')[-1] if not request.user.may.admin(page): msg = _("You don't have admin permissions on this page, " "so you cannot change security settings.") return page.send_page(msg) if request.form.has_key('button'): # process save groups = [] groups_dict = {} for key in request.form: if key.endswith('_groupname'): groups.append(unquoteWikiname(key[:-10])) else: if key.endswith('_may_read'): dowhat = 'read' groupname = unquoteWikiname(key[:-9]) elif key.endswith('_may_edit'): dowhat = 'edit' groupname = unquoteWikiname(key[:-9]) elif key.endswith('_may_delete'): dowhat = 'delete' groupname = unquoteWikiname(key[:-11]) elif key.endswith('_may_admin'): dowhat = 'admin' groupname = unquoteWikiname(key[:-10]) else: continue if not groups_dict.has_key(groupname): groups_dict[groupname] = [False, False, False, False] groups_dict[groupname][ACL_RIGHTS_TABLE[dowhat]] = True # set groups we weren't sent any checkboxes for to # all false (nothing checked) groups_no_checks = filter(lambda(groupname): ( groupname not in groups_dict), groups) for groupname in groups_no_checks: groups_dict[groupname] = [False, False, False, False] wikiacl.setACL(pagename, groups_dict, request) return page.send_page( msg = _("Security settings sucessfully changed!")) formhtml = ['<h3>Security settings for "%s":</h3>' % pagename] button = _("Save") url = page.url() d = {'url': url, 'actname': actname, 'button': button} formhtml.append('<form method="POST" action="%(url)s">\n' '<input type="hidden" name="action" value="%(actname)s">\n' % d) custom_groups = user.getGroupList(request, exclude_special_groups=True) grouplist = ['All', 'Known'] + custom_groups for groupname in grouplist: # "All" and "Known" are a bit condense if groupname == 'All': written_groupname = 'Everybody' elif groupname == 'Known': written_groupname = 'Logged in people' else: written_groupname = groupname group = wikiacl.Group(groupname, request, fresh=True) # we want to show the 'change security' option only if # it makes some sense show_admin = groupname in custom_groups formhtml.append('<h6>%s</h6>' % written_groupname) formhtml.append('<input type="hidden" name="%s_groupname" ' 'value="1">' % quoteWikiname(groupname)) if group.may(page, 'read'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_read" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_read" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' read ') if group.may(page, 'edit'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_edit" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_edit" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' edit ') if group.may(page, 'delete'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_delete" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_delete" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' delete ') if show_admin: if group.may(page, 'admin'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_admin" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_admin" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' change security ') formhtml.append( '<p><input type="submit" name="button" value="%(button)s">\n' '</p>\n' '</form>' % d) page.send_page(msg=''.join(formhtml))
def execute(pagename, request): _ = request.getText page = Page(pagename, request) actname = __name__.split('.')[-1] if not request.user.may.admin(page): msg = _("You don't have admin permissions on this page, " "so you cannot change security settings.") return page.send_page(msg) if request.form.has_key('button'): # process save groups = [] groups_dict = {} for key in request.form: if key.endswith('_groupname'): groups.append(unquoteWikiname(key[:-10])) else: if key.endswith('_may_read'): dowhat = 'read' groupname = unquoteWikiname(key[:-9]) elif key.endswith('_may_edit'): dowhat = 'edit' groupname = unquoteWikiname(key[:-9]) elif key.endswith('_may_delete'): dowhat = 'delete' groupname = unquoteWikiname(key[:-11]) elif key.endswith('_may_admin'): dowhat = 'admin' groupname = unquoteWikiname(key[:-10]) else: continue if not groups_dict.has_key(groupname): groups_dict[groupname] = [False, False, False, False] groups_dict[groupname][ACL_RIGHTS_TABLE[dowhat]] = True # set groups we weren't sent any checkboxes for to # all false (nothing checked) groups_no_checks = filter( lambda (groupname): (groupname not in groups_dict), groups) for groupname in groups_no_checks: groups_dict[groupname] = [False, False, False, False] wikiacl.setACL(pagename, groups_dict, request) return page.send_page(msg=_("Security settings sucessfully changed!")) formhtml = ['<h3>Security settings for "%s":</h3>' % pagename] button = _("Save") url = page.url() d = {'url': url, 'actname': actname, 'button': button} formhtml.append( '<form method="POST" action="%(url)s">\n' '<input type="hidden" name="action" value="%(actname)s">\n' % d) custom_groups = user.getGroupList(request, exclude_special_groups=True) grouplist = ['All', 'Known'] + custom_groups for groupname in grouplist: # "All" and "Known" are a bit condense if groupname == 'All': written_groupname = 'Everybody' elif groupname == 'Known': written_groupname = 'Logged in people' else: written_groupname = groupname group = wikiacl.Group(groupname, request, fresh=True) # we want to show the 'change security' option only if # it makes some sense show_admin = groupname in custom_groups formhtml.append('<h6>%s</h6>' % written_groupname) formhtml.append('<input type="hidden" name="%s_groupname" ' 'value="1">' % quoteWikiname(groupname)) if group.may(page, 'read'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_read" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_read" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' read ') if group.may(page, 'edit'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_edit" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_edit" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' edit ') if group.may(page, 'delete'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_delete" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_delete" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' delete ') if show_admin: if group.may(page, 'admin'): formhtml.append('<input type="checkbox" checked ' 'name="%s_may_admin" value="1">' % quoteWikiname(groupname)) else: formhtml.append('<input type="checkbox" name="%s_may_admin" ' 'value="1">' % quoteWikiname(groupname)) formhtml.append(' change security ') formhtml.append( '<p><input type="submit" name="button" value="%(button)s">\n' '</p>\n' '</form>' % d) page.send_page(msg=''.join(formhtml))
def add_event_form_box(htmltext, macro): event_timezone = macro.request.config.tz current_time = macro.request.user.getFormattedDateTime(time.time()) year_cut = string.split(current_time, " ")[0] current_year = string.split(year_cut, "-")[0] month_cut = string.split(current_time, " ")[0] current_month = string.split(month_cut, "-")[1] day_cut = string.split(current_time, " ")[0] current_day = string.split(day_cut, "-")[2] hour_cut = string.split(current_time, " ")[1] current_hour = string.split(hour_cut, ":")[0] minute_cut = string.split(current_time, " ")[1] current_minute = string.split(minute_cut, ":")[1] title = "Post a new event:" htmltext.append( "<h3>%s</h3>\n" '<table border="0" cellspacing="0" cellpadding="3">\n' '<tr><td><form method="POST" action="%s/%s">\n' '<input type="hidden" name="action" value="events">\n' '<input type="hidden" name="ticket" value="%s">\n' 'Event name: <input class="formfields" type="text" name="event_name"' 'size="30" maxlength="100"> \n' 'Location: <input class="formfields" type="text" ' 'name="event_location" size="25" maxlength="100">' "<br><br>\n" % ( title, macro.request.getScriptname(), wikiutil.quoteWikiname(macro.formatter.page.proper_name()), createTicket(), ) ) monthstring = ( '<p>Date: <select name="month">\n' '<option value="1">January</option>\n' '<option value="2">February</option>\n' '<option value="3">March</option>\n' '<option value="4">April</option>\n' '<option value="5">May</option>\n' '<option value="6">June</option>\n' '<option value="7">July</option>\n ' '<option value="8">August</option>\n' '<option value="9">September</option>\n' '<option value="10">October</option>\n' '<option value="11">November</option>\n' '<option value="12">December</option>\n</select>\n' ) newmonthstring = monthstring.replace( 'value="%s"' % str(int(current_month)), 'value="%s" selected' % str(int(current_month)) ) htmltext.append(newmonthstring) daystring = ( '<select name="day">\n ' "<option>1</option>\n " "<option>2</option>\n " "<option>3</option>\n " "<option>4</option>\n " "<option>5</option>\n " "<option>6</option>\n " "<option>7</option>\n " "<option>8</option>\n " "<option>9</option>\n " "<option>10</option>\n " "<option>11</option>\n " "<option>12</option>\n " "<option>13</option>\n " "<option>14</option>\n " "<option>15</option>\n " "<option>16</option>\n " "<option>17</option>\n " "<option>18</option>\n " "<option>19</option>\n " "<option>20</option>\n " "<option>21</option>\n " "<option>22</option>\n " "<option>23</option>\n " "<option>24</option>\n " "<option>25</option>\n " "<option>26</option>\n " "<option>27</option>\n " "<option>28</option>\n " "<option>29</option>\n " "<option>30</option>\n " "<option>31</option>\n " "</select>\n" ) newdaystring = daystring.replace(">" + str(int(current_day)) + "<", " selected>" + str(int(current_day)) + "<") htmltext.append(newdaystring) yearstring = '<select name="year">\n' for year in yearList(): yearstring += "<option>%s</option>\n" % year yearstring += "</select>" newyearstring = yearstring.replace(">" + current_year + "<", " selected>" + current_year + "<") htmltext.append(newyearstring) hourstring = ( 'Time: <select name="hour">\n ' '<option value="0">12AM</option>\n ' '<option value="1">1AM</option>\n ' '<option value="2">2AM</option>\n ' '<option value="3">3AM</option>\n ' '<option value="4">4AM</option>\n ' '<option value="5">5AM</option>\n ' '<option value="6">6AM</option>\n ' '<option value="7">7AM</option>\n ' '<option value="8">8AM</option>\n ' '<option value="9">9AM</option>\n ' '<option value="10">10AM</option>\n ' '<option value="11">11AM</option>\n ' '<option value="12">12PM</option>\n ' '<option value="13">1PM</option>\n ' '<option value="14">2PM</option>\n ' '<option value="15">3PM</option>\n ' '<option value="16">4PM</option>\n ' '<option value="17">5PM</option>\n ' '<option value="18">6PM</option>\n ' '<option value="19">7PM</option>\n ' '<option value="20">8PM</option>\n ' '<option value="21">9PM</option>\n ' '<option value="22">10PM</option>\n ' '<option value="23">11PM</option>\n ' "</select>\n" ) newhourstring = hourstring.replace( 'value="%s"' % str(int(current_hour)), 'value="%s" selected' % str(int(current_hour)) ) htmltext.append(newhourstring) rounded_min = (int(current_minute) / 15 + 1) * 15 if rounded_min is 60: rounded_min = 0 rounded_min = str(rounded_min) minutestring = ( ' : <select name="minute">\n ' '<option value="0">00</option>\n ' '<option value="15">15</option>\n ' '<option value="30">30</option>\n ' '<option value="45">45</option>\n ' "</select> (in %s)</p>\n" % event_timezone ) newminutestring = minutestring.replace('value="%s"' % rounded_min, 'value="%s" selected' % rounded_min) htmltext.append(newminutestring) htmltext.append( "<p>Describe event:</p>" '<textarea name="event_text" rows="5" cols="67" wrapping=yes>' "</textarea><br>\n" '<input class="formbutton" type="submit" name="button" ' 'value="Add Event">\n' "</form></td></tr></table>" )
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) @keyword had_conflict: we had an edit conflict on a save. """ import re try: from Sycamore.action import SpellCheck except ImportError: SpellCheck = None form = self.request.form _ = self._ self.request.http_headers([("Content-Type", "text/html; charset=%s" % config.charset)] + self.request.nocache) msg = None preview = kw.get('preview', None) emit_anchor = not kw.get('staytop', 0) proper_name = self.proper_name() from Sycamore.formatter.text_html import Formatter self.request.formatter = Formatter(self.request, store_pagelinks=1, preview=preview) base_uri = "%s/%s?action=edit" % (self.request.getScriptname(), wikiutil.quoteWikiname( self.proper_name())) backto = form.get('backto', [None])[0] if backto: base_uri += '&' + util.web.makeQueryString(backto=backto) # check edit permissions if not self.request.user.may.edit(self): msg = _('You are not allowed to edit this page.') elif self.prev_date: # 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!') # Did one of the prechecks fail? if msg and not kw.get('had_conflict', None): self.send_page(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.replace("\r", ""), 1) page_needle = self.page_name if config.allow_subpages and page_needle.count('/'): page_needle = '/' + page_needle.split('/')[-1] wikiutil.send_title( self.request, self.proper_name(), pagename=self.proper_name(), has_link=True, strict_title='Editing "%s"' % self.proper_name(), body_onload="sizeForIE('savetext', 100, 'editorComment', 99);") # start content div self.request.write('<div id="content" class="content">\n') # get request parameters text_rows = None if form.has_key('rows'): text_rows = int(form['rows'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_rows = config.edit_rows if self.request.user.valid: text_rows = int(self.request.user.edit_rows) if form.has_key('cols'): text_cols = int(form['cols'][0]) if self.request.user.valid: # possibly update user's pref if text_rows != self.request.user.edit_rows: self.request.user.edit_rows = text_rows self.request.user.save() else: text_cols = 80 if self.request.user.valid: text_cols = int(self.request.user.edit_cols) # check datestamp (version) of the page our edit is based on if preview is not None: # propagate original datestamp mtime = float(form['datestamp'][0]) # did someone else change the page while we were editing? conflict_msg = None if not self.exists(): # page does not exist, are we creating it? if mtime: conflict_msg = _('<p>Someone else <b>deleted</b> this ' 'page while you were editing!') elif mtime != self.mtime(): conflict_msg = _('<p>Someone else changed this page while ' 'you were editing.') # merge conflicting versions allow_conflicts = 1 from Sycamore.util import diff3 savetext = self.get_raw_body() oldpg = Page(self.page_name, self.request, prev_date=mtime) original_text = oldpg.get_raw_body() saved_text = Page(self.page_name, self.request).get_raw_body() verynewtext, had_conflict = diff3.text_merge( original_text, saved_text, savetext, marker1='----- /!\ Edit conflict! Your version: -----\n', marker2='----- /!\ Edit conflict! Other version: -----\n', marker3='----- /!\ End of edit conflict -----\n') if had_conflict and self.request.user.valid and ( self.request.user.id == self.last_edit_info()[1]): # user pressed back button or did something weird conflict_msg = None elif had_conflict: conflict_msg = _(conflict_msg + 'There was an <b>edit conflict between ' 'your changes!</b></p>' '<p>Please review the conflicts and ' 'merge the changes.</p>') mtime = self.mtime() self.set_raw_body(verynewtext, 1) else: conflict_msg = _(conflict_msg + 'Your changes were sucessfully merged!') mtime = self.mtime() self.set_raw_body(verynewtext) if conflict_msg: self.request.write('<div id="message"><div>%s' '</div></div>' % conflict_msg) emit_anchor = 0 # make this msg visible! elif self.exists(): # datestamp of existing page mtime = self.mtime() else: # page creation mtime = 0 # output message message = kw.get('msg', '') if message: self.request.write('<div id="message">%s</div>' % (message)) # get the text body for the editor field if form.has_key('template'): # "template" parameter contains the name of the template page template_page = wikiutil.unquoteWikiname(form['template'][0]) raw_body = Page(template_page, self.request).get_raw_body() else: raw_body = self.get_raw_body() # send text above text area # button toolbar self.request.write('<div id="editArea">') self.request.write( "<script type=\"text/javascript\">" "var buttonRoot = '%s';</script>" % (os.path.join( config.url_prefix, self.request.theme.name, 'img', 'buttons'))) if self.request.user.name: if config.user_page_prefix: self.request.write( "<script type=\"text/javascript\">" "var userPageLink = '[\"%s%s\"]';</script>" % (config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '[\"%s\"]';</script>" % (config.user_page_prefix, self.request.user.propercased_name)) else: self.request.write("<script type=\"text/javascript\">" "var userPageLink = '%s';</script>" % (self.request.remote_addr)) if config.wiki_farm: self.request.write( "<script type=\"text/javascript\" " "src=\"http://%s%s%s/edit.js\"></script>\n" % (config.wiki_base_domain, config.web_dir, config.url_prefix)) else: self.request.write("<script type=\"text/javascript\" " "src=\"%s%s/edit.js\"></script>\n" % (config.web_dir, config.url_prefix)) # send form self.request.write('<form name="editform" id="editform" ' 'method="post" action="%s/%s#preview">' % (self.request.getScriptname(), wikiutil.quoteWikiname(proper_name))) self.request.write( str(html.INPUT(type="hidden", name="action", value="savepage"))) if backto: self.request.write( str(html.INPUT(type="hidden", name="backto", value=backto))) # generate default content if not raw_body: if self.isTalkPage(): raw_body = _('This page is for discussing the ' 'contents of ["%s"].') % self.proper_name()[:-5] else: raw_body = _('Describe %s here.') % (self.proper_name(), ) # replace CRLF with LF raw_body = self._normalize_text(raw_body) # send datestamp (version) of the page our edit is based on self.request.write('<input type="hidden" name="datestamp" ' 'value="%s">' % repr(mtime)) # Print the editor textarea and the save button self.request.write('<textarea id="savetext" name="savetext" ' 'rows="%d" cols="%d" style="width:100%%;">%s' '</textarea>' % (text_rows, text_cols, wikiutil.escape(raw_body))) # make sure we keep the template notice on a resize of the editor template_param = '' if form.has_key('template'): template_param = '&template=' + form['template'][0] # draw edit size links self.request.write( _('<div class="pageEditInfo" id="editorSize">' 'editor size:')) self.request.write('<a href="#" onclick="return sizeEditor(\'bigger\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '+')) self.request.write( ',<a href="#" onclick="return sizeEditor(\'smaller\',' '\'%s&preview=1&cols=60%s\')">%s' '</a>' % (base_uri, template_param, '-')) self.request.write('</div>') self.request.write('</p>') # close textarea self.request.write( '<div id="editComment" id="editorResizeButtons"> ' '%s<br><input type="text" class="formfields" ' 'name="comment" id="editorComment" value="%s" ' 'size="%d" maxlength="80" style="width:99%%;">' '</div>' % (_("<font size=\"+1\">Please comment " "about this change:</font>"), wikiutil.escape(kw.get('comment', ''), 1), text_cols)) spam_catch_button = ( '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' 'dont enter into this box:' '<input type="text" name="text_dont"/>' '</span>' '<span style="position: absolute; top: 0px; left: 0px;' 'height: 0px; width: 0px; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont" ' 'value="Dont press me">\n' '</span>') self.request.write(spam_catch_button) # button bar button_spellcheck = ( SpellCheck and '<input type="submit" class="formbutton" name="button_spellcheck"' ' value="%s">' % _('Check Spelling')) or '' save_button_text = _('Save Changes') cancel_button_text = _('Cancel') self.request.write("</div>") if self.request.user.may.admin(self): security_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=Security\'" ' 'value="Security">') % ( self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) else: security_button = '' if self.request.user.may.delete(self): delete_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=' '\'%s/%s?action=DeletePage\'" value="Delete">' ) % (self.request.getScriptname(), wikiutil.quoteWikiname(proper_name)) rename_button = ('<input type="button" class="formbutton" ' 'onClick="location.href=\'%s/%s?action=Rename\'"' ' value="Rename">') % (self.request.getScriptname( ), wikiutil.quoteWikiname(proper_name)) else: delete_button = '' rename_button = '' self.request.write( '<div id="editButtonRow">' '<span>' '<input type="submit" class="formbutton" ' 'name="button_preview" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_save" value="%s"> ' '<input type="submit" class="formbutton" ' 'name="button_cancel" value="%s"> ' '</span>' '<span class="editActions">' '<input type="button" class="formbutton" ' 'onClick="window.open(\'%s/%s?action=Files\', ' '\'files\', \'width=800,height=600,' 'scrollbars=1\')" value="Upload Files"> ' '%s ' '%s ' '%s ' '%s</span>' '</div>' % (_('Preview'), save_button_text, cancel_button_text, self.request.getScriptname(), wikiutil.quoteWikiname(proper_name), button_spellcheck, delete_button, rename_button, security_button)) if self.request.config.edit_agreement_text: self.request.write(self.request.config.edit_agreement_text) 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("</form>") if config.wiki_farm: from Sycamore import farm help_link = farm.link_to_page(farm.getBaseWikiName(), "Help with Editing", self.request.formatter, force_farm=True) else: help_link = Page("Help with Editing", self.request).link_to() # QuickHelp originally by Georg Mischler <*****@*****.**> self.request.write( '<h2>Editing quick-help</h2>\n' '<dl><div style="float: right; margin: 10px; border: 1px solid; ' 'padding: 3pt;">See <b>%s</b> for more information.</div>' % (help_link) + _("<dt>Emphasis:</dt>\n" "<dd>''<em>italics</em>''; '''<strong>bold</strong>''';" "'''''<strong><em>bold italics</em></strong>''''';" "''<em>mixed '''<strong>bold</strong>''' and " "italics</em>''; ---- horizontal rule.</dd>" "<dt>Headings:</dt>" "<dd>= Title 1 =; == Title 2 ==; === Title 3 ===;" "==== Title 4 ====; ===== Title 5 =====.</dd>" "<dt>Lists:</dt>" "<dd>space and one of * bullets; 1., a., A., i., I. " "numbered items;" " 1.#n start numbering at n; space alone indents.</dd>" "<dt>Links:</dt>" "<dd>[\"brackets and double quotes\"]; [\"the exact " "page name\" label];" " url; [url]; [url label].</dd>" "<dt>Tables:</dt>" "<dd>|| cell text |||| cell text spanning two columns ||;" " no trailing white space allowed after tables or titles." "</dd></dl>")) if preview is not None: if not emit_anchor: preview_name = "previewHide" else: preview_name = "preview" self.request.write('<div id="%s" class="preview">' % preview_name) self.send_page(content_only=1, hilite_re=badwords_re, preview=preview) self.request.write('</div>') self.request.write('</div>\n') # end content div wikiutil.send_after_content(self.request) self.request.theme.emit_custom_html(config.page_footer1) self.request.theme.emit_custom_html(config.page_footer2) self.request.write('</body></html>')
def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter if line_has_just_macro(macro, args, formatter): macro.parser.inhibit_br = 2 macro_text = '' baseurl = macro.request.getScriptname() action = 'Files' # name of the action that does the file stuff html = [] ticketString = None # for temporary thumbnail generation pagename = formatter.page.page_name urlpagename = wikiutil.quoteWikiname(formatter.page.proper_name()) if not args: macro_text += formatter.rawHTML( '<b>Please supply at least an image name, e.g. ' '[[Image(image.jpg)]], where image.jpg is an image that\'s been ' 'uploaded to this page.</b>') return macro_text # image.jpg, "caption, here, yes", 20, right --- in any order # (filename first) # the number is the 'max' size (width or height) in pixels # parse the arguments try: (image_name, caption, thumbnail, px_size, alignment, border) = getArguments(args) except: macro_text += formatter.rawHTML('[[Image(%s)]]' % wikiutil.escape(args)) return macro_text if not wikiutil.isImage(image_name): macro_text += "%s does not seem to be an image file." % image_name return macro_text url_image_name = urllib.quote(image_name.encode(config.charset)) if (macro.formatter.processed_thumbnails.has_key( (pagename, image_name)) and (thumbnail or caption)): macro_text += ('<em style="background-color: #ffffaa; padding: 2px;">' 'A thumbnail or caption may be displayed only once per ' 'image.</em>') return macro_text macro.formatter.processed_thumbnails[(pagename, image_name)] = True #is the original image even on the page? macro.request.cursor.execute("""SELECT name FROM files WHERE name=%(image_name)s and attached_to_pagename=%(pagename)s and wiki_id=%(wiki_id)s""", {'image_name':image_name, 'pagename':pagename.lower(), 'wiki_id':macro.request.config.wiki_id}) result = macro.request.cursor.fetchone() image_exists = result if not image_exists: # lets make a link telling them they can upload the image, # just like the normal attachment linktext = 'Upload new image "%s"' % (image_name) macro_text += wikiutil.attach_link_tag(macro.request, '%s?action=Files&rename=%s#uploadFileArea' % ( wikiutil.quoteWikiname(formatter.page.proper_name()), url_image_name), linktext) return macro_text full_size_url = (baseurl + "/" + urlpagename + "?action=" + action + "&do=view&target=" + url_image_name) # put the caption in the db if it's new and if we're not in preview mode if not formatter.isPreview(): touchCaption(pagename, pagename, image_name, caption, macro.request) if caption: # parse the caption string caption = wikiutil.stripOuterParagraph(wikiutil.wikifyString( caption, formatter.request, formatter.page, formatter=formatter)) if thumbnail: # let's generated the thumbnail or get the dimensions if it's # already been generated if not px_size: px_size = default_px_size (x, y), ticketString = touchThumbnail(macro.request, pagename, image_name, px_size, formatter) d = {'right':'floatRight', 'left':'floatLeft', '':'noFloat'} floatSide = d[alignment] if caption and border: html.append('<span class="%s thumb" style="width: %spx;">' '<a style="color: black;" href="%s">' '<img src="%s" alt="%s" style="display:block;"/></a>' '<span>%s</span>' '</span>' % (floatSide, int(x)+2, full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, thumb=True, size=px_size, ticket=ticketString), image_name, caption)) elif border: html.append('<span class="%s thumb" style="width: %spx;">' '<a style="color: black;" href="%s">' '<img src="%s" alt="%s" style="display:block;"/></a>' '</span>' % (floatSide, int(x)+2, full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, thumb=True, size=px_size, ticket=ticketString), image_name)) elif caption and not border: html.append('<span class="%s thumb noborder" style="width: %spx;">' '<a style="color: black;" href="%s">' '<img src="%s" alt="%s" style="display:block;"/></a>' '<span>%s</span></span>' % (floatSide, int(x)+2, full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, thumb=True, size=px_size, ticket=ticketString), image_name, caption)) else: html.append('<span class="%s thumb noborder" style="width: %spx;">' '<a style="color: black;" href="%s">' '<img src="%s" alt="%s" style="display:block;"/></a>' '</span>' % (floatSide, int(x)+2, full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, thumb=True, size=px_size, ticket=ticketString), image_name)) else: x, y = getImageSize(pagename, image_name, macro.request) if not x and not y: # image has no size..something went amuck setImageSize(pagename, image_name, macro.request) x, y = getImageSize(pagename, image_name, macro.request) if not border and not caption: img_string = ('<a href="%s">' '<img class="borderless" src="%s" alt="%s"/></a>' % (full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, ticket=ticketString), image_name)) elif border and not caption: img_string = ('<a href="%s">' '<img class="border" src="%s" alt="%s"/></a>' % (full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, ticket=ticketString), image_name)) elif border and caption: img_string = ('<a href="%s">' '<img class="border" src="%s" alt="%s"/></a>' '<div style="width: %spx;">' '<p class="normalCaption">%s</p></div>' % (full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, ticket=ticketString), image_name, x, caption)) elif not border and caption: img_string = ('<a href="%s">' '<img class="borderless" src="%s" alt="%s"/></a>' '<div style="width: %spx;">' '<p class="normalCaption">%s</p></div>' % (full_size_url, Files.getAttachUrl(pagename, image_name, macro.request, ticket=ticketString), image_name, x, caption)) if alignment == 'right': img_string = '<span class="floatRight">' + img_string + '</span>' elif alignment == 'left': img_string = '<span class="floatLeft">' + img_string + '</span>' html.append(img_string) macro_text += ''.join(html) return macro_text
def _make_index_key(index_letters, additional_html=""): links = map(lambda ch: '<a href="#%s">%s</a>' % (wikiutil.quoteWikiname(ch), ch.replace('~', 'Others')), index_letters) return "<p>%s%s</p>" % (' | '.join(links), additional_html)
def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter _ = macro.request.getText re_args = re.search('(?P<caption>.+)\,\s(?P<the_rest>.*)', args) pagename = re_args.group('caption') items = re_args.group('the_rest') page = Page(pagename, macro.request) try: links = max(int(items), 1) except StandardError: links = 1 raw = page.get_raw_body(fresh=macro.request.set_cache) if not macro.request.user.may.read(page): raw = "" # this selects lines looking like a list item # !!! TODO: make multi-line quotes possible # (optionally split by "----" or something) quotes = raw.splitlines() if links > 1: quotes = [quote for quote in quotes if quote.startswith(' *')] random.shuffle(quotes) while len(quotes) > links: quotes = quotes[:-1] quote = '' for name in quotes: quote = quote + name + '\n' page.set_raw_body(quote, 1) out = cStringIO.StringIO() macro.request.redirect(out) page.send_page(content_only=1, content_id="randomquote_%s" % wikiutil.quoteWikiname(page.page_name) ) quote = out.getvalue() macro.request.redirect() else: quotes = [quote.strip() for quote in quotes] quotes = [quote[2:] for quote in quotes if quote.startswith('* ')] if quotes: quote = random.choice(quotes) else: quote = '' page.set_raw_body(quote, 1) out = cStringIO.StringIO() macro.request.redirect(out) page.send_page(content_only=1, content_id="randomquote_%s" % wikiutil.quoteWikiname(page.page_name) ) quote = out.getvalue() macro.request.redirect() if not quotes: return (macro.formatter.highlight(1) + _('No quotes on %(pagename)s.') % {'pagename': pagename} + macro.formatter.highlight(0)) return quote.decode(config.charset)
def execute(macro, args, formatter=None, **kw): if not formatter: formatter = macro.formatter request = macro.request _ = request.getText # set up javascript entry grouping -- this happens when the page renders request.write('<script type="text/javascript">' 'onLoadStuff.push(\'groupAllRcChanges();\');' '</script>\n') request.write('<script type="text/javascript" src="/wiki/revipbox.js"></script>\n') pagename = formatter.page.page_name q_pagename = wikiutil.quoteWikiname(pagename) rc_page = Page(pagename, request) d = {} d['q_page_name'] = q_pagename d['page'] = rc_page if args == 'global': wiki_global = True else: wiki_global = False # set max size in days max_days = min(int(request.form.get('max_days', [0])[0]), _DAYS_SELECTION[-1]) # get bookmark from valid user bookmark = request.user.getBookmark(wiki_global=wiki_global) # default to _MAX_DAYS for users without rc bookmark if not max_days: max_days = _MAX_DAYS d['rc_max_days'] = max_days if wiki_global: watched_wikis = request.user.getWatchedWikis() lines = wikidb.getRecentChanges(request, max_days=max_days, changes_since=bookmark, wiki_global=wiki_global, on_wikis=watched_wikis) else: lines = wikidb.getRecentChanges(request, max_days=max_days, changes_since=bookmark, wiki_global=wiki_global) tnow = time.time() msg = "" do_we_show_comments = request.user.getShowComments() setup_show_comments(do_we_show_comments, rc_page, request, d) add_bookmark_link(rc_page, tnow, bookmark, wiki_global, request, d) print_rc_header(request, d) if not lines: if wiki_global: request.write('<p>This page shows you changes on ' '<strong>all</strong> of the wikis you are watching!' '</p>') if not watched_wikis: if request.user.valid: request.write('<p>You are not watching any wikis, though. ' 'To watch a wiki, simply go to the wiki you\'re ' 'interested in and click the "watch this wiki" ' 'link next to your user settings in the upper ' 'right.</p>') else: request.write('<p>You are not logged in. Please login to ' 'view changes on the wikis you are watching.' '</p>') if not wiki_global or watched_wikis: request.write("<p>No recent changes. Quick — change " "something while nobody's looking!</p>") lines_by_day = group_changes_by_day(lines, tnow, max_days, request) for day, lines in lines_by_day: print_day(day, request, d) if wiki_global and request.user.getRcGroupByWiki(): lines_grouped = group_changes_by_wiki(lines, request) wiki_names_sorted = lines_grouped.keys() wiki_names_sorted.sort() for wiki_name in wiki_names_sorted: if lines_grouped[wiki_name]: request.write('<h3 style="padding: .2em;">%s:</h3>' % farm.link_to_wiki(wiki_name, formatter)) print_changes(lines_grouped[wiki_name], bookmark, tnow, max_days, do_we_show_comments, d, wiki_global, macro, request, formatter, grouped=True) else: print_changes(lines, bookmark, tnow, max_days, do_we_show_comments, d, wiki_global, macro, request, formatter) d['rc_msg'] = msg request.write(request.theme.recentchanges_footer(d)) return ''
def username(self, d): """ Assemble the username / userprefs link @param d: parameter dictionary @rtype: string @return: username html """ _ = self.request.getText if self.request.user.valid: watch_wiki = '' if config.wiki_farm: if not self.request.user.isWatchingWiki( self.request.config.wiki_name): watch_wiki = ('| %s ' % Page(d['page_name'],self.request).link_to( know_status=True, know_status_exists=True, text='watch this wiki', querystr='action=watch_wiki&wikiname=%s' % self.request.config.wiki_name)) if config.wiki_farm: wiki_base_url = farm.getBaseFarmURL(self.request) else: wiki_base_url = '%s/' % self.request.getScriptname() if self.request.user.name in wikiacl.Group("Admin", self.request): wiki_settings_pagelink = \ Page(config.wiki_settings_page, self.request).link_to( text=config.wiki_settings_page.lower()) admin_settings = ('%s | ' % wiki_settings_pagelink) else: admin_settings = '' html = ( '<div class="user_area">' '<div class="welcome">Welcome, %s</div>' '%s' '<div class="user_items">' '(%s<a href="%s%s?from_wiki=%s">settings</a> %s| ' '<a href="%s/%s?action=userform&logout=Logout">logout</a>)' '</div></div>' % (user.getUserLink(self.request, self.request.user), self.userNotificationLink(self.request.user), admin_settings, wiki_base_url, wikiutil.quoteWikiname(config.page_user_preferences), self.request.config.wiki_name, watch_wiki, self.request.getScriptname(), d['q_page_name'])) else: if config.wiki_farm: post_url = "%s%s" % ( farm.getBaseFarmURL(self.request, force_ssl=config.use_ssl), wikiutil.quoteWikiname(config.page_user_preferences)) our_wiki_url = '%s/%s' % (self.request.getBaseURL(), d['q_page_name']) base_wiki = farm.getBaseFarmURL(self.request) farm_params = ( '<input type="hidden" name="backto_wiki" value="%s">' '<input type="hidden" name="backto_page" value="%s">' '<input type="hidden" name="qs" value="%s">' % (self.request.config.wiki_name, urllib.quote(our_wiki_url), urllib.quote(self.request.query_string))) else: farm_params = '' post_url = '%s/%s' % ( self.request.getQualifiedURL(self.request.getScriptname(), force_ssl=config.use_ssl), wikiutil.quoteWikiname(config.page_user_preferences)) base_wiki = '%s/' % self.request.getScriptname() html = ( '<form action="%s" method="POST" ' 'onsubmit="if (!canSetCookies()) { alert(\'You need ' 'cookies enabled to log in.\'); ' 'return false;}">' '<input type="hidden" name="action" value="userform">' '<div class="login_area">' '<table>' '<tr><td width="50%%" align="right" nowrap>User name:</td>' '<td colspan="2" align="left" nowrap>' '<input class="formfields" size="22" name="username" ' 'type="text"></td> </tr> <tr>' '<td align="right">Password:</td>' '<td colspan="2" align="left" nowrap> ' '<input class="formfields" size="22" type="password" ' 'name="password"> ' '<input type="hidden" name="login" value="Login">%s' '</td></tr><tr><td></td>' '<td align="left" nowrap>' '(<a href="%s%s?new_user=1&from_wiki=%s">new user</a>)' '</td><td align="right">' '<input type="submit" name="login" value="Login" alt="login">' '</td></tr></table></div></form>' % (post_url, farm_params, base_wiki, wikiutil.quoteWikiname(config.page_user_preferences), self.request.config.wiki_name)) return html
def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter macro.parser.inhibit_br += 2 text = [] if args: title = args else: title = "Comments:" if not macro.request.user.may.edit(macro.formatter.page): text.append('<h3>%s</h3>\n' '<p><strong>Note: You must be logged in to add ' 'comments</strong></p>\n' % title) else: text.append( '<h3>%(title)s</h3>\n' '<form method="POST" action="%(scriptname)s/%(q_pagename)s">\n' '<p><input type="hidden" name="action" value="comments">\n' '<textarea id="comment_text" name="comment_text_%(pghash)s" rows="1" ' 'style="width:100%%" ' 'onSelect="sizeTextField(this.id,event)" ' 'onPaste="sizeTextField(this.id,event)" ' 'onFocus="sizeTextField(this.id,event)" ' 'onKeyPress="sizeTextField(this.id,event)">' '</textarea>\n' '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' 'dont enter into this box:' '<input type="text" name="comment_dont_%(pghash)s"/>' '</span>' '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont1_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' '</span>' '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont2_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' '</span>' '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont3_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' '</span>' '<input class="formbutton" type="submit" name="button_do_%(pghash)s" ' 'value="Add Comment">\n' '<span style="position: absolute; top: 0px; left: 0px; height: 100px; width: 100px;' 'height: 0px!important; width: 0px!important; overflow: hidden;">' '<input class="formbutton" type="submit" name="button_dont4_%(pghash)s" ' 'value="Add Comment (not! Do not press!)">\n' '</span>' '</p>\n' '</form>' % {'title': title, 'scriptname': macro.request.getScriptname(), 'pghash': hash(macro.formatter.page.page_name.lower()), 'q_pagename': wikiutil.quoteWikiname(macro.formatter.page.proper_name())}) # we want to print a paragraph after the comments area if there's # anything following it macro.parser.force_print_p = True return formatter.rawHTML(''.join(text))
def render_favorites(local_favoriteList, request, formatter, macro, wiki_global): seen_list = [] line_of_text = '' for page_line in local_favoriteList: page = Page(page_line.pagename, request, wiki_name=page_line.wiki_name) page_line.comment = Comment(request, page_line.comment, page_line.action, page=page).render() bookmark = request.user.getFavBookmark(page) # in the case of uploads/deletes of images, etc we'd like to show # a useful comment page_line.time_tuple = request.user.getTime(page_line.ed_time) day = page_line.time_tuple[0:3] if not wiki_global: wiki_link = '' else: wiki_link = ('<span class="minorText">(on %s)</span>' % farm.link_to_wiki(page_line.wiki_name, formatter)) if page_line.ed_time > bookmark: # We do bold edit_icon = format_page_edit_icon(request, [page_line], page, True, bookmark, formatter) line_of_text = ('<div class="rcpagelink"><span><b>' '%s</b> %s%s<b>' % (edit_icon, page.link_to(absolute=True), wiki_link)) line_of_text = ( line_of_text + " " + '<span align="right" style="font-size: 12px;">' + 'last modified ') line_of_text = line_of_text + '%s %s' % (find_month[day[1]], day[2]) line_of_text = (line_of_text + time.strftime(" at %I:%M %p</b> by</span>", page_line.time_tuple) + '<span class="faveditor">') if page_line.comment: line_of_text = ( line_of_text + ' %s</span><span class="favcomment"> (%s)</span>' % (getEditor(page_line, request), page_line.comment)) else: line_of_text = (line_of_text + ' %s</span>' % (getEditor(page_line, request))) line_of_text = ( line_of_text + '<span style="font-size:12px;"> ' '[<a href="%s/%s?action=favorite&delete=%s&wiki_name=%s">' 'Remove</a>]</span>' % (request.getScriptname(), wikiutil.quoteWikiname( macro.formatter.page.proper_name()), wikiutil.quoteWikiname(page_line.pagename), page.wiki_name) + '</span></div>') else: edit_icon = format_page_edit_icon(request, [page_line], page, False, bookmark, formatter) # We don't do bold if page_line.ed_time: # page has been created line_of_text = ('<div class="rcpagelink"><span>' '%s %s%s <span class="favtime">' 'last modified ' % (edit_icon, page.link_to(absolute=True), wiki_link)) line_of_text = line_of_text + '%s %s' % (find_month[day[1]], day[2]) line_of_text = ( line_of_text + time.strftime(" at %I:%M %p by</span>", page_line.time_tuple) + '<span class="faveditor">') if page_line.comment: line_of_text = (line_of_text + ' %s</span><span class="favcomment"> (%s)</span>' % (getEditor(page_line, request), page_line.comment)) else: line_of_text = line_of_text + ' %s</span>' % ( getEditor(page_line, request)) line_of_text = ( line_of_text + '<span style="font-size:12px;"> ' '[<a href="%s/%s?action=favorite&delete=%s&wiki_name=%s">' 'Remove</a>]</span>' % (request.getScriptname(), wikiutil.quoteWikiname( macro.formatter.page.proper_name()), wikiutil.quoteWikiname(page_line.pagename), page.wiki_name)) line_of_text = line_of_text + '</span></div>' else: # page has NOT been created line_of_text = ('<div class="rcpagelink"><span>' '%s %s%s ' '<span align="right" class="favtime">' 'page has not been created yet</span>' % (edit_icon, page.link_to(absolute=True), wiki_link)) line_of_text = (line_of_text + '<span style="font-size:12px;"> ' '[<a href="%s/%s?action=favorite&delete=%s&wiki_name=%s">' 'Remove</a>]</span>' % (request.getScriptname(), wikiutil.quoteWikiname( macro.formatter.page.proper_name()), wikiutil.quoteWikiname(page_line.pagename), page.wiki_name)) line_of_text = line_of_text + '</span></div>' seen_list.append((page_line.pagename, line_of_text)) return seen_list
def asHTML(self): """ Create the complete HTML form code. """ _ = self._ self.make_form() # different form elements depending on login state html_uid = '' html_sendmail = '' groups_pagename = "%s/%s" % (config.wiki_settings_page, config.wiki_settings_page_security_defaults) if self.request.user.name in wikiacl.Group("Admin", self.request): group_admin = wikiacl.Group("Admin", self.request, fresh=True) self.make_row(_("Admins"), [ html.TEXTAREA(name="group_Admin", rows="6", cols="40", id="group_Admin").append( '\n'.join(map(wikiutil.escape, group_admin.users(proper_names=True)))) ], option_text=_("(one per line)")) group_banned = wikiacl.Group("Banned", self.request, fresh=True) self.make_row(_("Banned Users"), [ html.TEXTAREA(name="group_Banned", rows="6", cols="40", id="group_Banned").append( '\n'.join(map(wikiutil.escape, group_banned.users(proper_names=True)))) ], option_text=_("(one per line)")) self.make_row(_("Banned IP Addresses"), [ html.TEXTAREA(name="ips_banned", rows="6", cols="40", id="ips_banned").append( '\n'.join(map(wikiutil.escape, group_banned.get_ips().keys()))) ], option_text=_("(one per line)")) custom_groups = user.getGroupList(self.request, exclude_special_groups=True) for groupname in custom_groups: group = wikiacl.Group(groupname, self.request, fresh=True) delete_label = ('<span class="minorActionBox">[<a href="%s/' '%s?action=usergroupsettings&delete=%s">' 'delete group</a>]</span>') % ( self.request.getScriptname(), quoteWikiname(groups_pagename), quoteWikiname(groupname)) self.make_row('%s %s' % (wikiutil.escape(groupname), delete_label), [ html.TEXTAREA( name="group_%s" % quoteWikiname(groupname), rows="6", cols="40", id="group_%s" % quoteWikiname(groupname) ).append('\n'.join(map(wikiutil.escape, group.users(proper_names=True)))) ], option_text=_("(one per line)")) buttons = [ ('save', _('Save Groups')), ] # Add buttons button_cell = [] for name, label in buttons: button_cell.extend([ html.INPUT(type="submit", name=name, value=label), ' ', ]) self.make_row('', button_cell) self._inner.append(html.H2().append("Create a new group")) self.make_row(_("Group name"), [ html.INPUT(type="text", size="40", name="new_group_name"), ]) self.make_row('Group users', [ html.TEXTAREA(name="new_group_users", rows="6", cols="40") ]) buttons = [ ('save', _('Add new group')), ] # Add buttons button_cell = [] for name, label in buttons: button_cell.extend([ html.INPUT(type="submit", name=name, value=label), ' ', ]) self.make_row('', button_cell) return str(self._form)
def execute(macro, args, formatter=None): if not formatter: formatter = macro.formatter _ = macro.request.getText # prevent recursive calls global _guard if _guard: return '' html = [] # flush request output because this may take a second to generate macro.request.flush() # build a list of wanted pages tuples. # (pagename, k) where k is the number of links to pagename wanted_results = raw_wanted_results(macro) if not wanted_results: macro.request.write("<p>%s</p>" % _("No wanted pages in this wiki.")) return '' # we have wanted pages, so let's generate a list of # where the wanted pages are wanted from wanted = where_wanted_from(wanted_results, macro) # find the 'most wanted' pages wanted.sort(comparey) most_wanted = wanted[0:60] #alphabetize these most_wanted.sort(comparey_alpha) # usually 'Wanted Page' or something such pagename = macro.request.getPathinfo()[1:] if not showUsers(macro.request): html.append('<div style="float: right;">' '<div class="actionBoxes"><span>%s</span></div></div>' % wikiutil.link_tag(macro.request, pagename + "?show_users=true", "show users")) else: html.append('<div style="float: right;">' '<div class="actionBoxes"><span>%s</span></div></div>' % wikiutil.link_tag(macro.request, pagename, "hide users")) html.append( '<p>The "most" wanted pages based upon the number of links made from ' 'other pages (bigger means more wanted):</p>\n' '<div style="margin-top: 0px; margin-left: auto; margin-right: auto; ' 'width: 760px; text-align: left; vertical-align: top; ' 'padding-left: 7px; padding-right: 7px;">\n' '<p style="padding: 15px; line-height: 1.45; margin-top: 0; ' 'padding-left: 7px; padding-right: 7px; width: 760px; ' 'solid 1px #eee; background: #f5f5f5; ' 'border: 1px solid rgb(170, 170, 170); ">\n') # find the max number of links number_list = [] for name, number, source_name in most_wanted: number_list.append(number) if number_list: max_links = max(number_list) else: max_links = 0 for name, number, source_pagenames in most_wanted: print_number = ((number*1.0)/max_links) * 30 if print_number < 12: print_number = 12 html.append('<a class="nonexistent" style="font-size: %spx; ' 'margin-top: 10px; ' 'margin-bottom: 10px; ' 'margin-right: 5px; " ' 'href="%s/%s">%s</a> ' % (print_number, macro.request.getBaseURL(), wikiutil.quoteWikiname(name), name)) html.append('</p></div>') macro.request.write(''.join(html)) macro.request.write('<p>What follows is a list of all "wanted" pages. ' 'Each wanted page includes a list, following it, of ' 'all the pages where it is referred to:</p>\n') macro.request.write('<ol>\n') output_complete_wanted_list(wanted, macro) macro.request.write("</ol>") return ''