from collections import defaultdict import mongoengine as mongo from django.contrib.auth.models import User 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