NewsBlur-viq/apps/analyzer/views.py

89 lines
3.3 KiB
Python
Raw Normal View History

2010-08-16 12:55:45 -04:00
from utils import log as logging
from django.shortcuts import get_object_or_404
from django.views.decorators.http import require_POST
from apps.rss_feeds.models import Feed
from apps.reader.models import UserSubscription
from apps.analyzer.models import MClassifierTitle, MClassifierAuthor, MClassifierFeed, MClassifierTag
from apps.analyzer.models import get_classifiers_for_user
from utils import json
from utils.user_functions import get_user
from utils.user_functions import ajax_login_required
def index(requst):
pass
@require_POST
@ajax_login_required
@json.json_view
def save_classifier(request):
post = request.POST
logging.info(" ---> [%s] Saving classifier: %s" % (request.user, post))
feed_id = int(post['feed_id'])
feed = get_object_or_404(Feed, pk=feed_id)
code = 0
message = 'OK'
payload = {}
# Mark subscription as dirty, so unread counts can be recalculated
2010-04-09 11:59:33 -04:00
usersub = UserSubscription.objects.get(user=request.user, feed=feed)
if not usersub.needs_unread_recalc or not usersub.is_trained:
2010-04-09 11:59:33 -04:00
usersub.needs_unread_recalc = True
usersub.is_trained = True
2010-04-09 11:59:33 -04:00
usersub.save()
def _save_classifier(ClassifierCls, content_type):
classifiers = {
'like_'+content_type: 1,
'dislike_'+content_type: -1,
'remove_like_'+content_type: 0,
'remove_dislike_'+content_type: 0,
}
for opinion, score in classifiers.items():
if opinion in post:
post_contents = post.getlist(opinion)
for post_content in post_contents:
classifier_dict = {
'user_id': request.user.pk,
'feed_id': feed_id,
'defaults': {
'score': score
}
}
if content_type in ('author', 'tag', 'title'):
classifier_dict.update({content_type: post_content})
classifier, created = ClassifierCls.objects.get_or_create(**classifier_dict)
if score == 0:
classifier.delete()
elif classifier.score != score:
if score == 0:
if ((classifier.score == 1 and opinion.startswith('remove_like'))
or (classifier.score == -1 and opinion.startswith('remove_dislike'))):
classifier.delete()
else:
classifier.score = score
classifier.save()
_save_classifier(MClassifierAuthor, 'author')
_save_classifier(MClassifierTag, 'tag')
_save_classifier(MClassifierTitle, 'title')
_save_classifier(MClassifierFeed, 'publisher')
logging.info(" ---> [%s] Feed training: %s" % (request.user, feed))
response = dict(code=code, message=message, payload=payload)
return response
@json.json_view
def get_classifiers_feed(request):
feed_id = int(request.POST['feed_id'])
user = get_user(request)
code = 0
payload = get_classifiers_for_user(user, feed_id)
response = dict(code=code, payload=payload)
return response