NewsBlur/apps/recommendations/models.py
2024-07-06 08:01:28 -04:00

80 lines
3 KiB
Python

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