# HG changeset patch # User Paul Boddie # Date 1368544616 -7200 # Node ID 503e7de192db1e9561a71718f1cafa20ab85d980 # Parent 8c25dd04bf78e9627a7e11d78ca1614f29096917 Changed the macro to use a sources dictionary page to obtain feed details. diff -r 8c25dd04bf78 -r 503e7de192db MoinShare.py --- a/MoinShare.py Tue May 14 01:37:22 2013 +0200 +++ b/MoinShare.py Tue May 14 17:16:56 2013 +0200 @@ -189,4 +189,48 @@ return updates +# Source management. + +def getUpdateSources(pagename, request): + + "Return the update sources from the given 'pagename' using the 'request'." + + sources = {} + + source_definitions = getWikiDict(pagename, request) + + if source_definitions: + for name, value in source_definitions.items(): + sources[name] = getSourceParameters(value) + + return sources + +def getSourceParameters(source_definition): + + "Return the parameters from the given 'source_definition' string." + + parameters = {} + unqualified = ("type", "location") + + for arg in source_definition.split(): + try: + argname, argvalue = arg.split("=", 1) + + # Detect unlikely parameter names. + + if not argname.isalpha(): + raise ValueError + + parameters[argname] = argvalue + + # Unqualified parameters are assumed to be one of a recognised set. + + except ValueError: + for argname in unqualified: + if not parameters.has_key(argname): + parameters[argname] = arg + break + + return parameters + # vim: tabstop=4 expandtab shiftwidth=4 diff -r 8c25dd04bf78 -r 503e7de192db macros/SharedContent.py --- a/macros/SharedContent.py Tue May 14 01:37:22 2013 +0200 +++ b/macros/SharedContent.py Tue May 14 17:16:56 2013 +0200 @@ -10,7 +10,7 @@ from MoinMoin.Page import Page from MoinRemoteSupport import * from MoinSupport import parseMacroArguments -from MoinShare import getUpdatesFromPage, Update +from MoinShare import getUpdateSources, getUpdatesFromPage, Update from email.utils import parsedate import xml.dom.pulldom @@ -197,16 +197,13 @@ fmt = macro.formatter _ = request.getText - feed_urls = [] - pagenames = [] + source_pages = [] show_content = None max_entries = None for arg, value in parseMacroArguments(args): - if arg == "url": - feed_urls.append(value) - elif arg == "page": - pagenames.append(value) + if arg == "sources": + source_pages.append(value) elif arg == "show": show_content = value.lower() elif arg == "limit": @@ -215,44 +212,67 @@ except ValueError: return fmt.text(_("SharedContent: limit must be set to the maximum number of entries to be shown")) - if not feed_urls and not pagenames: - return fmt.text(_("SharedContent: at least one feed URL or page must be specified")) + if not source_pages: + return fmt.text(_("SharedContent: at least one sources page must be specified")) + + sources = {} + + for source_page in source_pages: + sources.update(getUpdateSources(source_page, request)) + + if not sources: + return fmt.text(_("SharedContent: at least one update source must be specified")) show_content = show_content or False max_entries = max_entries or MAX_ENTRIES - # Retrieve updates from feeds, classifying them as missing or bad and - # excluding them if appropriate. + # Retrieve updates, classifying them as missing or bad and excluding them if + # appropriate. updates = [] feeds = [] + unspecified = [] missing = [] bad_content = [] - for feed_url in feed_urls: + for source_name, source_parameters in sources.items(): + location = source_parameters.get("location") + if not location: + unspecified.append(source_name) + continue + + show_feed_content = source_parameters.get("show", show_content) try: - feed_info, feed_updates = getUpdates(request, feed_url, max_entries, show_content) - updates += feed_updates - feeds.append((feed_url, feed_info)) - except FeedMissingError: - missing.append(feed_url) - except FeedContentTypeError: - bad_content.append(feed_url) + max_entries_for_feed = int(source_parameters["limit"]) + except (KeyError, ValueError): + max_entries_for_feed = None - # Retrieve updates from pages. + # Retrieve updates from feeds. - for pagename in pagenames: - page = Page(request, pagename) - updates += getUpdatesFromPage(page, request) + if source_parameters.get("type") == "url": + try: + feed_info, feed_updates = getUpdates(request, location, max_entries_for_feed, show_feed_content) + updates += feed_updates + feeds.append((location, feed_info)) + except FeedMissingError: + missing.append(location) + except FeedContentTypeError: + bad_content.append(location) - # Build feed-equivalent information for the update source. + # Retrieve updates from pages. - feeds.append(( - page.url(request), ( - "internal", _("Updates from page %s") % pagename, - page.url(request, {"action" : "SharedUpdates", "doit" : "1"}) - ) - )) + elif source_parameters.get("type") == "page": + page = Page(request, location) + updates += getUpdatesFromPage(page, request) + + # Build feed-equivalent information for the update source. + + feeds.append(( + page.url(request, {"action" : "SharedUpdates", "doit" : "1"}), ( + "internal", _("Updates from page %s") % location, + page.url(request) + ) + )) # Prepare the output.