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

122 lines
4.1 KiB
Python

import datetime
import re
from django.http import HttpResponse
from django.shortcuts import get_object_or_404, render
from apps.reader.models import UserSubscription
from apps.recommendations.models import RecommendedFeed
from apps.rss_feeds.models import Feed, MFeedIcon
from utils import json_functions as json
from utils import log as logging
from utils.user_functions import admin_only, ajax_login_required, get_user
def load_recommended_feed(request):
user = get_user(request)
page = max(int(request.GET.get("page", 0)), 0)
usersub = None
refresh = request.GET.get("refresh")
now = datetime.datetime.now()
unmoderated = request.GET.get("unmoderated", False) == "true"
if unmoderated:
recommended_feeds = RecommendedFeed.objects.filter(is_public=False, declined_date__isnull=True)[
page : page + 2
]
else:
recommended_feeds = RecommendedFeed.objects.filter(is_public=True, approved_date__lte=now)[
page : page + 2
]
if recommended_feeds and request.user.is_authenticated:
usersub = UserSubscription.objects.filter(user=user, feed=recommended_feeds[0].feed)
if refresh != "true" and page > 0:
logging.user(request, "~FBBrowse recommended feed: ~SBPage #%s" % (page + 1))
recommended_feed = recommended_feeds and recommended_feeds[0]
if not recommended_feeds:
return HttpResponse("")
feed_icon = MFeedIcon.objects(feed_id=recommended_feed.feed_id)
if recommended_feed:
return render(
request,
"recommendations/render_recommended_feed.xhtml",
{
"recommended_feed": recommended_feed,
"description": recommended_feed.description or recommended_feed.feed.data.feed_tagline,
"usersub": usersub,
"feed_icon": feed_icon and feed_icon[0],
"has_next_page": len(recommended_feeds) > 1,
"has_previous_page": page != 0,
"unmoderated": unmoderated,
"today": datetime.datetime.now(),
"page": page,
},
)
else:
return HttpResponse("")
@json.json_view
def load_feed_info(request, feed_id):
feed = get_object_or_404(Feed, pk=feed_id)
previous_recommendation = None
if request.user.is_authenticated:
recommended_feed = RecommendedFeed.objects.filter(user=request.user, feed=feed)
if recommended_feed:
previous_recommendation = recommended_feed[0].created_date
return {
"num_subscribers": feed.num_subscribers,
"tagline": feed.data.feed_tagline,
"previous_recommendation": previous_recommendation,
}
@ajax_login_required
@json.json_view
def save_recommended_feed(request):
feed_id = request.POST["feed_id"]
feed = get_object_or_404(Feed, pk=int(feed_id))
tagline = request.POST["tagline"]
twitter = request.POST.get("twitter")
code = 1
recommended_feed, created = RecommendedFeed.objects.get_or_create(
feed=feed, user=request.user, defaults=dict(description=tagline, twitter=twitter)
)
return dict(code=code if created else -1)
@admin_only
@ajax_login_required
def approve_feed(request):
feed_id = request.POST["feed_id"]
feed = get_object_or_404(Feed, pk=int(feed_id))
date = request.POST["date"]
recommended_feed = RecommendedFeed.objects.filter(feed=feed)[0]
year, month, day = re.search(r"(\d{4})-(\d{1,2})-(\d{1,2})", date).groups()
recommended_feed.is_public = True
recommended_feed.approved_date = datetime.date(int(year), int(month), int(day))
recommended_feed.save()
return load_recommended_feed(request)
@admin_only
@ajax_login_required
def decline_feed(request):
feed_id = request.GET["feed_id"]
feed = get_object_or_404(Feed, pk=int(feed_id))
recommended_feeds = RecommendedFeed.objects.filter(feed=feed)
for recommended_feed in recommended_feeds:
recommended_feed.is_public = False
recommended_feed.declined_date = datetime.datetime.now()
recommended_feed.save()
return load_recommended_feed(request)