NewsBlur/apps/recommendations/models.py
2024-04-24 09:50:42 -04:00

76 lines
3 KiB
Python

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