mirror of
https://github.com/samuelclay/NewsBlur.git
synced 2025-04-13 09:42:01 +00:00
179 lines
6.2 KiB
Python
179 lines
6.2 KiB
Python
import redis
|
|
from django.conf import settings
|
|
from django.shortcuts import get_object_or_404, render
|
|
from django.views.decorators.http import require_POST
|
|
from mongoengine.queryset import NotUniqueError
|
|
|
|
from apps.analyzer.forms import PopularityQueryForm
|
|
from apps.analyzer.models import (
|
|
MClassifierAuthor,
|
|
MClassifierFeed,
|
|
MClassifierTag,
|
|
MClassifierTitle,
|
|
MPopularityQuery,
|
|
get_classifiers_for_user,
|
|
)
|
|
from apps.reader.models import UserSubscription
|
|
from apps.rss_feeds.models import Feed
|
|
from apps.social.models import MSocialSubscription
|
|
from utils import json_functions as json
|
|
from utils import log as logging
|
|
from utils.user_functions import ajax_login_required, get_user
|
|
|
|
|
|
def index(requst):
|
|
pass
|
|
|
|
|
|
@require_POST
|
|
@ajax_login_required
|
|
@json.json_view
|
|
def save_classifier(request):
|
|
post = request.POST
|
|
feed_id = post["feed_id"]
|
|
feed = None
|
|
social_user_id = None
|
|
if feed_id.startswith("social:"):
|
|
social_user_id = int(feed_id.replace("social:", ""))
|
|
feed_id = None
|
|
else:
|
|
feed_id = int(feed_id)
|
|
feed = get_object_or_404(Feed, pk=feed_id)
|
|
code = 0
|
|
message = "OK"
|
|
payload = {}
|
|
|
|
logging.user(request, "~FGSaving classifier: ~SB%s~SN ~FW%s" % (feed, post))
|
|
|
|
# Mark subscription as dirty, so unread counts can be recalculated
|
|
usersub = None
|
|
socialsub = None
|
|
if social_user_id:
|
|
socialsub = MSocialSubscription.objects.get(
|
|
user_id=request.user.pk, subscription_user_id=social_user_id
|
|
)
|
|
if not socialsub.needs_unread_recalc:
|
|
socialsub.needs_unread_recalc = True
|
|
socialsub.save()
|
|
else:
|
|
try:
|
|
usersub = UserSubscription.objects.get(user=request.user, feed=feed)
|
|
except UserSubscription.DoesNotExist:
|
|
pass
|
|
if usersub and (not usersub.needs_unread_recalc or not usersub.is_trained):
|
|
usersub.needs_unread_recalc = True
|
|
usersub.is_trained = True
|
|
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:
|
|
if not post_content:
|
|
continue
|
|
classifier_dict = {
|
|
"user_id": request.user.pk,
|
|
"feed_id": feed_id or 0,
|
|
"social_user_id": social_user_id or 0,
|
|
}
|
|
if content_type in ("author", "tag", "title"):
|
|
max_length = ClassifierCls._fields[content_type].max_length
|
|
classifier_dict.update({content_type: post_content[:max_length]})
|
|
if content_type == "feed":
|
|
if not post_content.startswith("social:"):
|
|
classifier_dict["feed_id"] = post_content
|
|
try:
|
|
classifier = ClassifierCls.objects.get(**classifier_dict)
|
|
except ClassifierCls.DoesNotExist:
|
|
classifier = None
|
|
if not classifier:
|
|
try:
|
|
classifier_dict.update(dict(score=score))
|
|
classifier = ClassifierCls.objects.create(**classifier_dict)
|
|
except NotUniqueError:
|
|
continue
|
|
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, "feed")
|
|
|
|
r = redis.Redis(connection_pool=settings.REDIS_PUBSUB_POOL)
|
|
r.publish(request.user.username, "feed:%s" % feed_id)
|
|
|
|
response = dict(code=code, message=message, payload=payload)
|
|
return response
|
|
|
|
|
|
@json.json_view
|
|
def get_classifiers_feed(request, feed_id):
|
|
user = get_user(request)
|
|
code = 0
|
|
|
|
payload = get_classifiers_for_user(user, feed_id=feed_id)
|
|
|
|
response = dict(code=code, payload=payload)
|
|
|
|
return response
|
|
|
|
|
|
def popularity_query(request):
|
|
if request.method == "POST":
|
|
form = PopularityQueryForm(request.POST)
|
|
if form.is_valid():
|
|
logging.user(
|
|
request.user,
|
|
'~BC~FRPopularity query: ~SB%s~SN requests "~SB~FM%s~SN~FR"'
|
|
% (request.POST["email"], request.POST["query"]),
|
|
)
|
|
query = MPopularityQuery.objects.create(email=request.POST["email"], query=request.POST["query"])
|
|
query.queue_email()
|
|
|
|
response = render(
|
|
request,
|
|
"analyzer/popularity_query.xhtml",
|
|
{
|
|
"success": True,
|
|
"popularity_query_form": form,
|
|
},
|
|
)
|
|
response.set_cookie("newsblur_popularity_query", request.POST["query"])
|
|
|
|
return response
|
|
else:
|
|
logging.user(
|
|
request.user,
|
|
'~BC~FRFailed popularity query: ~SB%s~SN requests "~SB~FM%s~SN~FR"'
|
|
% (request.POST["email"], request.POST["query"]),
|
|
)
|
|
else:
|
|
logging.user(request.user, "~BC~FRPopularity query form loading")
|
|
form = PopularityQueryForm(initial={"query": request.COOKIES.get("newsblur_popularity_query", "")})
|
|
|
|
response = render(
|
|
request,
|
|
"analyzer/popularity_query.xhtml",
|
|
{
|
|
"popularity_query_form": form,
|
|
},
|
|
)
|
|
|
|
return response
|