def get_feed(feed_id): """ Retrieve a feed from memcache or generate it if it does not exist """ xml = memcache.get(feed_id) # In memcache? if xml is None: feed = Feed.get_by_id(int(feed_id)) rss = None if feed: if feed.public_board: rss = TrelloRSS( constants.KEY, channel_title=feed.channel_title, rss_channel_link=feed.channel_link, description=feed.channel_description) else: user = feed.user.get() rss = TrelloRSS( constants.KEY, token=user.auth_token, channel_title=feed.channel_title, rss_channel_link=feed.channel_link, description=feed.channel_description) if feed.get_all: if feed.actions: rss.get_all(items=feed.actions) else: rss.get_all() else: if feed.actions: rss.get_from(feed.board_id,public_board=feed.public_board,items=feed.actions) else: rss.get_from(feed.board_id,public_board=feed.public_board) xml = rss.rss memcache.add(key=feed_id, value=xml, time=1800) # Expire after 30 minutes return xml
def get(self): feed_id, feed_url = self.request.get('feed_id'), \ self.request.get('feed_url') url_result = urllib2.urlopen(feed_url) feed_result = fd.parse(url_result) if feed_result.bozo == 1: logging.error('fetch error, id: %s, url: %s, error: %s', feed_id, feed_url, feed_result.bozo_exception) return feed_update_time = feed_result.get('updated', datetime.utcnow) has_update = True f = Feed.get_by_id(int(feed_id)) if f.is_allow_fetch(feed_update_time): for entry in feed_result.entries: if entry.published_parsed <= f.lastedPublishedTime: logging.info('no updated, id: %s, url: %s', feed_id, feed_url) has_update = False break e = Entry(title = entry.title, url = entry.link, author = entry.author, content = entry.content), publishedTime = entry.published_parsed) e.put() logging.debug('fetch entry, url: %s', entry.link)
def published_entries_for_feed(feed_id): feed = Feed.get_by_id(feed_id, parent=g.user.key) if not feed: return jsonify_error(message="Can't find that feed") feed_data = feed.to_json() entries = [entry.to_json(include=['title', 'link', 'published', 'published_at']) for entry in Entry.latest_published(feed).fetch(20)] feed_data['entries'] = entries return jsonify(status='ok', data=feed_data)
def delete_feed(feed_id): """Get a feed""" feed = Feed.get_by_id(feed_id, parent=g.user.key) if not feed: return jsonify_error(message="Can't find that feed") Entry.delete_for_feed(feed) feed.key.delete() return jsonify(status='ok')
def feed(feed_id): """Get a feed""" feed = Feed.get_by_id(feed_id, parent=g.user.key) if not feed: return jsonify_error(message="Can't find that feed") feed_data = feed.to_json() entries = [entry.to_dict(include=['guid', 'published', 'extra_info']) for entry in Entry.latest_for_feed(feed).fetch(10)] feed_data['entries'] = entries return jsonify(status='ok', data=feed_data)
def admin_feed_form(request, feed_id=None): if feed_id: feed = Feed.get_by_id(int(feed_id)) else: feed = None if request.method == "POST": form = FeedForm(request.POST, instance=feed) if form.is_valid(): feed = form.save(commit=False) feed.save() return HttpResponseRedirect("../") else: form = FeedForm(instance=feed) return render_to_response("planet/admin_feed_form.html", {"feed_id": feed_id, "form": form})
def save_feed_preview(feed_id): """preview a saved feed""" form = FeedUpdate(request.args) if not form.validate(): return jsonify_error(message="Invalid update data") feed = Feed.get_by_id(feed_id, parent=g.user.key) if not feed: return jsonify_error(message="Can't find that feed") form.populate_obj(feed) feed.preview = True preview_entries = Entry.entry_preview(Entry.latest_published(feed).fetch(3), feed, format=True) return jsonify(status='ok', data=preview_entries)
def feed_entry_publish(feed_id, entry_id): """Get a feed""" logger.info('Manually publishing Feed:%s Entry: %s', feed_id, entry_id) feed = Feed.get_by_id(feed_id, parent=g.user.key) if not feed: return jsonify_error(message="Can't find that feed") entry = Entry.get_by_id(entry_id, parent=feed.key) if not entry: return jsonify_error(message="Can't find that entry") entry.publish_entry(feed) entry.overflow = False entry.put() return jsonify(status='ok')
def admin_feed_form(request, feed_id=None): if feed_id: feed = Feed.get_by_id(int(feed_id)) else: feed = None if request.method == 'POST': form = FeedForm(request.POST, instance=feed) if form.is_valid(): feed = form.save(commit=False) feed.save() return HttpResponseRedirect('../') else: form = FeedForm(instance=feed) return render_to_response('planet/admin_feed_form.html', { 'feed_id': feed_id, 'form': form })
def feed_change(feed_id): """Get a feed""" form = FeedUpdate(request.form) if not form.validate(): return jsonify_error(message="Invalid update data") feed = Feed.get_by_id(feed_id, parent=g.user.key) if not feed: return jsonify_error(message="Can't find that feed") form.populate_obj(feed) feed.put() feed_data = feed.to_json() entries = [entry.to_dict(include=['title', 'link', 'published', 'published_at']) for entry in Entry.latest_for_feed(feed).fetch(10)] feed_data['entries'] = entries return jsonify(status='ok', data=feed_data)
def feed_entry_publish(feed_id, entry_id): """Get a feed""" logger.info('Manually publishing Feed:%s Entry: %s', feed_id, entry_id) key = ndb.Key(urlsafe=entry_id) feed = Feed.get_by_id(feed_id, parent=g.user.key) if not (feed and key.parent() == feed.key): return jsonify_error(message="Can't find that feed") entry = key.get() if not entry: return jsonify_error(message="Can't find that entry") entry.publish_entry(feed).get_result() entry.overflow = False entry.put() return jsonify(status='ok')
def admin_feed_delete(request, feed_id): feed = Feed.get_by_id(int(feed_id)) for e in db.Query(Entry).filter("feed", feed): e.delete() feed.delete() return HttpResponseRedirect('../')
def admin_feed_cleanup(request, feed_id): feed = Feed.get_by_id(int(feed_id)) for e in db.Query(Entry).filter("feed", feed): e.delete() return HttpResponseRedirect("../")