import datetime import os import tempfile from collections import defaultdict import mongoengine as mongo from django.contrib.auth.models import User from django.core.paginator import Paginator from django.db import models from apps.reader.models import UserSubscription, UserSubscriptionFolders from apps.rss_feeds.models import Feed from utils import json_functions as json class RecommendedFeed(models.Model): feed = models.ForeignKey(Feed, related_name="recommendations", on_delete=models.CASCADE) user = models.ForeignKey(User, related_name="recommendations", on_delete=models.CASCADE) description = models.TextField(null=True, blank=True) is_public = models.BooleanField(default=False) created_date = models.DateField(auto_now_add=True) approved_date = models.DateField(null=True) declined_date = models.DateField(null=True) twitter = models.CharField(max_length=50, null=True, blank=True) def __str__(self): return "%s (%s)" % (self.feed, self.approved_date or self.created_date) class Meta: ordering = ["-approved_date", "-created_date"] class RecommendedFeedUserFeedback(models.Model): recommendation = models.ForeignKey(RecommendedFeed, related_name="feedback", on_delete=models.CASCADE) user = models.ForeignKey(User, related_name="feed_feedback", on_delete=models.CASCADE) score = models.IntegerField(default=0) created_date = models.DateField(auto_now_add=True) class MFeedFolder(mongo.Document): feed_id = mongo.IntField() folder = mongo.StringField() count = mongo.IntField() meta = { "collection": "feed_folders", "indexes": ["feed_id", "folder"], "allow_inheritance": False, } def __str__(self): feed = Feed.get_by_id(self.feed_id) return "%s - %s (%s)" % (feed, self.folder, self.count) @classmethod def count_feed(cls, feed_id): feed = Feed.get_by_id(feed_id) print(feed) found_folders = defaultdict(int) user_ids = [sub["user_id"] for sub in UserSubscription.objects.filter(feed=feed).values("user_id")] usf = UserSubscriptionFolders.objects.filter(user_id__in=user_ids) for sub in usf: user_sub_folders = json.decode(sub.folders) folder_title = cls.feed_folder_parent(user_sub_folders, feed.pk) if not folder_title: continue found_folders[folder_title.lower()] += 1 # print "%-20s - %s" % (folder_title if folder_title != '' else '[Top]', sub.user_id) print(sorted(list(found_folders.items()), key=lambda f: f[1], reverse=True)) @classmethod def feed_folder_parent(cls, folders, feed_id, folder_title=""): for item in folders: if isinstance(item, int) and item == feed_id: return folder_title elif isinstance(item, dict): for f_k, f_v in list(item.items()): sub_folder_title = cls.feed_folder_parent(f_v, feed_id, f_k) if sub_folder_title: return sub_folder_title