Пример #1
0
def test_get_or_immediate_create_by_url(ctx):
    """
    test that get_or_immediate_create_by_url retrieves existing feeds by url
    if they in fact exist, and creates them if they don't.
    """
    from datetime import datetime, timedelta
    from eventlet import sleep
    from melkman.db.remotefeed import RemoteFeed, get_or_immediate_create_by_url

    feed_url = 'http://example.org/1'
    # make sure it doesn't exist yet
    feed = RemoteFeed.get_by_url(feed_url, ctx)
    assert feed is None

    # this should result in its immediate creation
    creationdt = datetime.utcnow()
    feed = get_or_immediate_create_by_url(feed_url, ctx)
    assert feed is not None
    assert feed.last_modification_date - creationdt < timedelta(seconds=1)

    sleep(1)
    
    # this should retrieve the existing feed, not create a new one
    now = datetime.utcnow()
    samefeed = get_or_immediate_create_by_url(feed_url, ctx)
    assert samefeed.id == feed.id
    assert samefeed.last_modification_date == feed.last_modification_date
    assert now - samefeed.last_modification_date >= timedelta(seconds=1)
Пример #2
0
    def set_opml(self, id):
        composite = Composite.get(id, ctx)
        if composite is None:
            abort(404)

        opml_data = get_posted_data()
        try:
            feeds = set(feeds_in_opml(opml_data))
        except:
            import traceback

            log.error(traceback.format_exc())
            abort(400)

        result = defaultdict(list)
        oldfeeds = set(i.url for i in composite.subscriptions.itervalues())
        remove = oldfeeds - feeds
        for url in remove:
            feed = RemoteFeed.get_by_url(url, ctx)
            if feed is not None:
                composite.unsubscribe(feed)
                result["unsubscribed"].append(url)
                log.debug('Unsubscribed composite "%s" from %s' % (id, url))
            else:
                result["unsubscribe_failed"].append(url)
                log.error('Expected composite "%s" to have RemoteFeed for %s' % (id, url))

        for url in feeds:
            if url not in oldfeeds:
                feed = get_or_immediate_create_by_url(url, ctx)
                if feed is None:
                    result["subscribe_failed"].append(url)
                    log.warn("Could not get or create feed for %s" % url)
                    continue
                composite.subscribe(feed)
                result["subscribed"].append(url)
                log.debug('Subscribed composite "%s" to %s' % (id, url))
            else:
                result["unchanged"].append(url)

        composite.save()
        log.debug('Composite "%s" saved' % id)
        return json_response(result)