Пример #1
0
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)
Пример #2
0
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 &mdash; 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 ''
Пример #3
0
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&amp;bookmarks=1&amp;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&amp;bookmarks=1&amp;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&amp;bookmarks=1&amp;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&amp;bookmarks=1&amp;user=%s&amp;'
                      '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 ''