class FeedGroup(db.Model): __tablename__ = "feed_groups" id = db.Column(db.Integer(), primary_key=True) key_id = db.Column(db.Integer(), db.ForeignKey("api_keys.id")) uid = db.Column(db.String(), default=uid()) name = db.Column(db.String(80)) feeds = db.relationship('Feed', backref="group") created = db.Column(db.DateTime(timezone=True), default=db.func.now()) active = db.Column(db.Boolean(), default=True) def __repr__(self): if self.name: return '<FeedGroup "%s" with %i feeds>' % (self.name, len(self.feeds)) return "<FeedGroup>" def jsonify(self): response = {} if self.created: response['name'] = self.name response['uid'] = self.uid response['created'] = time.mktime(self.created.timetuple()) response['active'] = self.active response['feeds'] = [feed.jsonify() for feed in self.feeds] return response
class Feed(db.Model): __tablename__ = "feeds" id = db.Column(db.Integer(), primary_key=True) key_id = db.Column(db.Integer(), db.ForeignKey("api_keys.id")) group_id = db.Column(db.Integer(), db.ForeignKey("feed_groups.id")) uid = db.Column(db.String(), default=uid()) name = db.Column(db.String(80)) url = db.Column(db.String(80)) schedule = db.Column(db.String(80)) active = db.Column(db.Boolean(), default=True) created = db.Column(db.DateTime(timezone=True), default=db.func.now()) articles = db.relationship('Article', backref="feed") def __repr__(self): if self.name: return '<Feed "%s" with %i articles>' % (self.name, len(self.articles)) return "<Feed>" def is_running(self): """ Ask the feedmanager what's happening. """ if not app.inbox: return None response_queue = app.queues[-1] qid = hex(id(response_queue)) app.inbox.put([qid, "check", self]) # Wait two seconds max for a response then = time.time() while response_queue.empty(): now = time.time() if (now - then) >= 0.5: return None return response_queue.get() def jsonify(self, articles=False): response = {} if self.created: response['name'] = self.name response['uid'] = self.uid response['url'] = self.url response['created'] = time.mktime(self.created.timetuple()) response['schedule'] = self.schedule response['active'] = self.active response['article_count'] = len(self.articles) response['running'] = self.is_running() if self.group: response['group'] = self.group.name else: response['group'] = None return response
def commit_to_feed(feed, article): """ Place a new article on the api key of a feed, the feed itself, and commit changes. """ # We give articles UIDs manually to ensure unique time data is used. article.uid = uid() session = feed._sa_instance_state.session feed.articles.append(article) feed.key.articles.append(article) session.add(article) session.add(feed) session.commit()
article.content = article_content else: article.ccontent = snappy.compress( article_content.encode("utf-8", "ignore")) article.compress = True for s in app.scripts.scripts.values(): try: s.execute(env={'article': article, 'feed': None}) article = s['article'] except Exception, e: log("Error executing %s: %s" % (s.file, e.message), "error") key.articles.append(article) article.uid = uid() db.session.add(article) db.session.add(key) db.session.commit() now = int(time.time()) duration = tconv(now - then) log('%s: Stored %s "%s" (%s)' % (key.name, article.uid, article.title, duration)) return article def commit_to_feed(feed, article): """ Place a new article on the api key of a feed, the feed itself,
if not app.config['COMPRESS_ARTICLES']: article.content = article_content else: article.ccontent = snappy.compress(article_content.encode("utf-8", "ignore")) article.compress = True for s in app.scripts.scripts.values(): try: s.execute(env={'article':article, 'feed':None}) article = s['article'] except Exception, e: log("Error executing %s: %s" % (s.file, e.message), "error") key.articles.append(article) article.uid = uid() db.session.add(article) db.session.add(key) db.session.commit() now = int(time.time()) duration = tconv(now-then) log('%s: Stored %s "%s" (%s)' % (key.name, article.uid, article.title, duration)) return article def commit_to_feed(feed, article): """ Place a new article on the api key of a feed, the feed itself, and commit changes. """