from django.db import models from django.contrib.auth.models import User import datetime from apps.rss_feeds.models import Feed, Story, StoryAuthor, Tag from utils import json class FeatureCategory(models.Model): user = models.ForeignKey(User) feed = models.ForeignKey(Feed) feature = models.CharField(max_length=255) category = models.CharField(max_length=255) count = models.IntegerField(default=0) def __unicode__(self): return '%s - %s (%s)' % (self.feature, self.category, self.count) class Category(models.Model): user = models.ForeignKey(User) feed = models.ForeignKey(Feed) category = models.CharField(max_length=255) count = models.IntegerField(default=0) def __unicode__(self): return '%s (%s)' % (self.category, self.count) class ClassifierTitle(models.Model): user = models.ForeignKey(User) score = models.SmallIntegerField() title = models.CharField(max_length=255) feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story, null=True) creation_date = models.DateTimeField(auto_now=True) unique_together = (('user', 'feed', 'title'),) def __unicode__(self): return '%s: %s (%s)' % (self.user, self.title, self.feed) class ClassifierAuthor(models.Model): user = models.ForeignKey(User) score = models.SmallIntegerField() author = models.ForeignKey(StoryAuthor) feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story, null=True) creation_date = models.DateTimeField(auto_now=True) unique_together = (('user', 'feed', 'author'),) def __unicode__(self): return '%s: %s (%s)' % (self.user, self.author.author_name, self.feed) def apply_classifier(self, story): if story['author'] == self.author: return True return False class ClassifierFeed(models.Model): user = models.ForeignKey(User) score = models.SmallIntegerField() feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story, null=True) creation_date = models.DateTimeField(auto_now=True) unique_together = (('user', 'feed'),) def __unicode__(self): return '%s: %s' % (self.user, self.feed) def apply_classifier(self, story): if self.feed == story.feed: return True return False class ClassifierTag(models.Model): user = models.ForeignKey(User) score = models.SmallIntegerField() tag = models.ForeignKey(Tag) feed = models.ForeignKey(Feed) original_story = models.ForeignKey(Story, null=True) creation_date = models.DateTimeField(auto_now=True) unique_together = (('user', 'feed', 'tag'),) def __unicode__(self): return '%s: %s (%s)' % (self.user, self.tag.name, self.feed) def apply_classifier_titles(classifiers, story): for classifier in classifiers: if classifier.title.lower() in story['story_title'].lower(): # print 'Titles: (%s) %s -- %s' % (classifier.title in story['story_title'], classifier.title, story['story_title']) return classifier.score return 0 def apply_classifier_feeds(classifiers, feed): for classifier in classifiers: if classifier.feed == feed: # print 'Feeds: %s -- %s' % (classifier.feed, feed) return classifier.score return 0 def apply_classifier_authors(classifiers, story): for classifier in classifiers: if story.get('story_authors') and classifier.author.author_name in story.get('story_authors'): # print 'Authors: %s -- %s' % (classifier.author.id, story['story_author_id']) return classifier.score return 0 def apply_classifier_tags(classifiers, story): for classifier in classifiers: if story['story_tags'] and classifier.tag.name in json.decode(story['story_tags']): # print 'Tags: (%s) %s -- %s' % (classifier.tag.name in story['story_tags'], classifier.tag.name, story['story_tags']) return classifier.score return 0 def get_classifiers_for_user(user, feed, classifier_feeds=None, classifier_authors=None, classifier_titles=None, classifier_tags=None): if not classifier_feeds: classifier_feeds = ClassifierFeed.objects.filter(user=user, feed=feed) if not classifier_authors: classifier_authors = ClassifierAuthor.objects.filter(user=user, feed=feed) if not classifier_titles: classifier_titles = ClassifierTitle.objects.filter(user=user, feed=feed) if not classifier_tags: classifier_tags = ClassifierTag.objects.filter(user=user, feed=feed) payload = { 'feeds': dict((f.feed.feed_link, { 'feed_title': f.feed.feed_title, 'feed_link': f.feed.feed_link, 'score': f.score }) for f in classifier_feeds), 'authors': dict([(a.author.author_name, a.score) for a in classifier_authors]), 'titles': dict([(t.title, t.score) for t in classifier_titles]), 'tags': dict([(t.tag.name, t.score) for t in classifier_tags]), } return payload