def relative_date_format(dt): diff = datetime.now() - dt s = diff.seconds if diff.days > 30 or diff.days < 0: return format_datetime(dt, "dd MMM yyyy HH:mm") elif diff.days == 1: return ngettext("%(days)d day ago", "%(days)d days ago", 1, days=1) elif diff.days > 1: return ngettext("%(days)d day ago", "%(days)d days ago", diff.days, days=diff.days) elif s <= 1: return gettext("just now") elif s < 60: return ngettext("%(seconds)d second ago", "%(seconds)d seconds ago", s, seconds=s) elif s < 120: return ngettext("%(minutes)d minute ago", "%(minutes)d minutes ago", 1, minutes=1) elif s < 3600: return ngettext("%(minutes)d minute ago", "%(minutes)d minutes ago", s / 60, minutes=(s / 60)) elif s < 7200: return ngettext("%(hours)d hour ago", "%(hours)d hours ago", 1, hours=1) else: return ngettext("%(hours)d hour ago", "%(hours)d hours ago", s / 3600, hours=(s / 3600))
def generate_stats(self): feed_ids = self._get_feed_ids() from rdr.modules.feeds.models import Article articles = Article.query.filter((Article.feed_id.in_(feed_ids))) if self.dates == StatsGenerator.DATES_LAST_WEEK: days_count = 7 elif self.dates == StatsGenerator.DATES_LAST_MONTH: days_count = 30 else: raise Exception('Unknown date format') end_date = datetime.now() start_date = end_date - timedelta(days=days_count) articles = articles.filter((Article.published >= start_date) & (Article.published <= end_date)) stats = {} dates = OrderedDict() days_of_week = self._get_days_of_week() for day in days_of_week: dates[day] = { 'count': 0, 'read': 0, 'articles': [] } articles = articles.all() for article in articles: if article.published: date = article.published.strftime('%a') if date in dates: dates[date]['count'] += 1 dates[date]['articles'].append(article.id) from rdr.modules.feeds.models import ArticleStatus graph = [] for (day, dat) in dates.items(): articles_for_date = dat['articles'] del dat['articles'] if dat['count'] > 0: count = ArticleStatus.query.filter((ArticleStatus.user_id == self.user.id) & (ArticleStatus.article_id.in_(articles_for_date)) & (ArticleStatus.status == ArticleStatus.STATUS_READ)).count() dat['read'] = int(count) day = gettext(day) graph.append([day, dat['count'], dat['read']]) stats['graph'] = graph # fetch read table date from rdr.modules.feeds.models import Feed reading_stats = db.session.query(Feed, db.func.count(ArticleStatus.id).label('total')) \ .join(ArticleStatus.article) \ .join(Article.feed) \ .group_by(Feed.id) \ .filter((ArticleStatus.status == ArticleStatus.STATUS_READ) & (ArticleStatus.user_id == self.user.id) & (ArticleStatus.read_date >= start_date) & (ArticleStatus.read_date <= end_date)) \ .order_by(db.desc('total')).limit(self.tables_limit) reading_table = [] for (feed, count) in reading_stats: overall_count = Article.query.filter((Article.feed_id == feed.id) & (Article.fetched >= start_date) & (Article.fetched <= end_date)).count() if overall_count > 0: read_percent = (float(count) * 100) / overall_count if read_percent > 100: read_percent = 100 read_percent = ('%.2f' % read_percent).rstrip('0').rstrip('.') else: read_percent = '-' reading_table.append({ 'id': feed.id, 'title': feed.title, 'icon': feed.small_icon_src, 'read_count': int(count), 'all_count': int(overall_count), 'read_percent': read_percent }) stats['readingTable'] = reading_table # fetch subscriptions table data overall_stats = db.session.query(Feed, db.func.count(Article.id).label('total')) \ .join(Article.feed) \ .group_by(Feed.id) \ .filter((Article.fetched >= start_date) & (Article.fetched <= end_date) & (Article.feed_id.in_(feed_ids))) \ .order_by(db.desc('total')).limit(self.tables_limit) overall_table = [] for (feed, count) in overall_stats: read_count = ArticleStatus.query.join(ArticleStatus.article) \ .filter((ArticleStatus.user_id == self.user.id) & (ArticleStatus.status == ArticleStatus.STATUS_READ) & (Article.feed_id == feed.id) & (ArticleStatus.read_date >= start_date) & (ArticleStatus.read_date <= end_date)).count() read_percent = (float(read_count) * 100) / count if read_percent > 100: read_percent = 100 read_percent = ('%.2f' % read_percent).rstrip('0').rstrip('.') if read_percent == '0': read_percent = '-' overall_table.append({ 'id': feed.id, 'title': feed.title, 'icon': feed.small_icon_src, 'published_count': int(count), 'items_per_day': ('%.2f' % (float(count) / days_count)).rstrip('0').rstrip('.'), 'read_count': int(read_count), 'read_percent': read_percent }) stats['subscriptionsTable'] = overall_table read_count = ArticleStatus.query.filter((ArticleStatus.user_id == self.user.id) & (ArticleStatus.status == ArticleStatus.STATUS_READ)) \ .join(ArticleStatus.article) \ .filter((Article.feed_id.in_(feed_ids) & (ArticleStatus.read_date >= start_date) & (ArticleStatus.read_date <= end_date))).count() from rdr.modules.feeds.models import ArticleFavorite fav_count = ArticleFavorite.query.join(ArticleFavorite.article) \ .filter((ArticleFavorite.user_id == self.user.id) & (Article.feed_id.in_(feed_ids)) & (ArticleFavorite.fav_date >= start_date) & (ArticleFavorite.fav_date <= end_date)).count() stats['subscriptionsCount'] = len(feed_ids) stats['publishedCount'] = len(articles) stats['readCount'] = read_count stats['favCount'] = fav_count return stats