def execute(pagename, request): """ Send recent changes as an RSS document """ from Sycamore.formatter.text_html import Formatter formatter = Formatter(request) page = Page(pagename, request) wiki_global = False bookmarks = False theuser = None if request.form.has_key('user'): # bookmarks username = urllib.unquote_plus(request.form['user'][0]) if request.form.has_key('global') and request.form['global']: wiki_global = True theuser = user.User(request, name=username) if request.form.has_key('bookmarks') and request.form['bookmarks']: bookmarks = True if bookmarks and theuser: if not wiki_global: rss_init_text = ( '<?xml version="1.0" ?>' '<rss version="2.0" ' 'xmlns:dc="http://purl.org/dc/elements/1.1/">' '<channel><title>Bookmarks - %s @ %s</title><link>%s</link>' '<description>Bookmarks for user %s on %s.</description>' '<language>en-us</language>\n' '</channel> \n' '</rss>\n' % (username, request.config.sitename, user.getUserLinkURL(request, theuser), username, request.config.sitename)) else: rss_init_text = ( '<?xml version="1.0" ?>\n' '<rss version="2.0" ' 'xmlns:dc="http://purl.org/dc/elements/1.1/">' '<channel><title>Interwiki Bookmarks - %s</title>' '<link>%s</link>' '<description>Interwiki bookmarks for user %s</description>' '<language>en-us</language>\n' '</channel>\n' '</rss>\n' % (username, user.getUserLinkURL(request, theuser), username)) userid = theuser.id changes = wikidb.getRecentChanges(request, per_page_limit=1, userFavoritesFor=userid, wiki_global=wiki_global) elif pagename.lower() == rc_pagename.lower(): rss_init_text = ( '<?xml version="1.0" ?>\n' '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">' '<channel><title>Recent Changes - %s</title><link>%s</link>' '<description>Recent Changes on %s.</description>' '<language>en-us</language>\n' '</channel>\n' '</rss>\n' % (request.config.sitename, page.url(relative=False), request.config.sitename)) # get normal recent changes changes = wikidb.getRecentChanges(request, total_changes_limit=100) elif pagename.lower() == interwiki_rc_pagename.lower() and theuser: wiki_global = True rss_init_text = ( '<?xml version="1.0" ?>\n' '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">\n' '<channel><title>Interwiki Recent Changes for %s</title>' '<link>%s</link>' '<description>Interwiki Recent Changes for %s.</description>' '<language>en-us</language>\n' '</channel>\n' '</rss>\n' % (theuser.propercased_name, page.url(relative=False), theuser.propercased_name)) # get interwiki normal recent changes changes = wikidb.getRecentChanges(request, total_changes_limit=100, wiki_global=True, on_wikis=theuser.getWatchedWikis()) else: rss_init_text = ( '<?xml version="1.0" ?>\n' '<rss version="2.0" ' 'xmlns:dc="http://purl.org/dc/elements/1.1/">' '<channel><title>Recent Changes for "%s" - %s</title>' '<link>%s</link>' '<description>Recent Changes of the page "%s" on %s.</description>' '<language>en-us</language>\n' '</channel>\n' '</rss>\n' % (pagename, request.config.sitename, page.url(relative=False), pagename, request.config.sitename)) # get page-specific recent changes changes = wikidb.getRecentChanges(request, page=pagename.lower()) rss_dom = xml.dom.minidom.parseString(rss_init_text) channel = rss_dom.getElementsByTagName("channel")[0] original_wiki = request.config.wiki_name for line in changes: if wiki_global: request.switch_wiki(line.wiki_name) if line.ed_time == None: line.ed_time = 0 page = Page(line.pagename, request) line.comment = Comment(request, line.comment, line.action, page=page).render() item = rss_dom.createElement("item") item_link = rss_dom.createElement("link") if wiki_global: permalink = farm.page_url(line.wiki_name, line.pagename, formatter) else: permalink = page.url(relative=False) item_link.appendChild(rss_dom.createTextNode(permalink)) item.appendChild(item_link) item_description = rss_dom.createElement("description") if line.action in ['SAVE', 'SAVENEW', 'RENAME', 'COMMENT_MACRO', 'SAVE/REVERT', 'DELETE']: if not request.user.may.read(page): continue version2 = Page(line.pagename, request, prev_date=line.ed_time).get_version() version1 = version2 - 1 description = "%s %s" % ( line.comment, do_diff(line.pagename, request, in_wiki_interface=False, text_mode=True, version1=version1, version2=version2)) guid = "%s?action=diff&version1=%i&version2=%i&ts=%i" % ( permalink, version1, version2, line.ed_time) else: description = line.comment guid = "%s?action=recall&version=%i&ts=%i" % ( permalink, Page(line.pagename, request, prev_date=line.ed_time).get_version(), line.ed_time) item_guid = rss_dom.createElement("guid") item_guid.appendChild(rss_dom.createTextNode(guid)) item.appendChild(item_guid) item_description.appendChild(rss_dom.createTextNode(description)) item_title = rss_dom.createElement("title") item_title.appendChild(rss_dom.createTextNode(line.pagename)) item.appendChild(item_title) item_date = rss_dom.createElement("dc:date") item_date.appendChild(rss_dom.createTextNode( time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime(line.ed_time)))) item.appendChild(item_date) creator = rss_dom.createElement("dc:creator") creator.appendChild(rss_dom.createTextNode( user.User(request, line.userid).propercased_name)) item.appendChild(creator) item.appendChild(item_description) channel.appendChild(item) if wiki_global: request.switch_wiki(original_wiki) the_xml = rss_dom.toxml() request.http_headers() request.write(the_xml)
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 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 ''