NewsBlur/apps/push/views.py

81 lines
3.4 KiB
Python
Raw Normal View History

# Adapted from djpubsubhubbub. See License: http://git.participatoryculture.org/djpubsubhubbub/tree/LICENSE
import datetime
2024-04-24 09:50:42 -04:00
import random
2024-04-24 09:50:42 -04:00
import feedparser
from django.http import Http404, HttpResponse
from django.http.request import UnreadablePostError
from django.shortcuts import get_object_or_404
from apps.push.models import PushSubscription
from apps.push.signals import verified
from apps.rss_feeds.models import MFetchHistory
2012-04-09 15:42:26 -07:00
from utils import log as logging
2024-04-24 09:43:56 -04:00
def push_callback(request, push_id):
2024-04-24 09:43:56 -04:00
if request.method == "GET":
mode = request.GET["hub.mode"]
topic = request.GET["hub.topic"]
challenge = request.GET.get("hub.challenge", "")
lease_seconds = request.GET.get("hub.lease_seconds")
verify_token = request.GET.get("hub.verify_token", "")
2024-04-24 09:43:56 -04:00
if mode == "subscribe":
if not verify_token.startswith("subscribe"):
raise Http404
2024-04-24 09:43:56 -04:00
subscription = get_object_or_404(
PushSubscription, pk=push_id, topic=topic, verify_token=verify_token
)
subscription.verified = True
subscription.set_expiration(int(lease_seconds))
subscription.save()
subscription.feed.setup_push()
2012-04-09 15:42:26 -07:00
2024-04-24 09:43:56 -04:00
logging.debug(" ---> [%-30s] [%s] ~BBVerified PuSH" % (subscription.feed, subscription.feed_id))
2012-04-09 15:42:26 -07:00
verified.send(sender=subscription)
2024-04-24 09:43:56 -04:00
return HttpResponse(challenge, content_type="text/plain")
elif request.method == "POST":
subscription = get_object_or_404(PushSubscription, pk=push_id)
2015-02-19 13:43:33 -08:00
fetch_history = MFetchHistory.feed(subscription.feed_id)
2015-02-19 13:41:09 -08:00
latest_push_date_delta = None
2024-04-24 09:43:56 -04:00
if fetch_history and fetch_history.get("push_history"):
latest_push = fetch_history["push_history"][0]["push_date"]
latest_push_date = datetime.datetime.strptime(latest_push, "%Y-%m-%d %H:%M:%S")
2015-02-19 14:14:38 -08:00
latest_push_date_delta = datetime.datetime.now() - latest_push_date
2015-02-19 13:36:41 -08:00
if latest_push_date > datetime.datetime.now() - datetime.timedelta(minutes=1):
2024-04-24 09:43:56 -04:00
logging.debug(
" ---> [%-30s] ~SN~FBSkipping feed fetch, pushed %s seconds ago"
% (subscription.feed, latest_push_date_delta.seconds)
)
return HttpResponse(
"Slow down, you just pushed %s seconds ago..." % latest_push_date_delta.seconds,
status=429,
)
# XXX TODO: Optimize this by removing feedparser. It just needs to find out
# the hub_url or topic has changed. ElementTree could do it.
if random.random() < 0.1:
try:
parsed = feedparser.parse(request.body)
subscription.check_urls_against_pushed_data(parsed)
except UnreadablePostError:
pass
# Don't give fat ping, just fetch.
# subscription.feed.queue_pushed_feed_xml(request.body)
2022-01-10 17:00:27 -05:00
if subscription.feed.active_subscribers >= 1:
2015-02-19 13:41:09 -08:00
subscription.feed.queue_pushed_feed_xml("Fetch me", latest_push_date_delta=latest_push_date_delta)
2024-04-24 09:43:56 -04:00
MFetchHistory.add(feed_id=subscription.feed_id, fetch_type="push")
else:
2024-04-24 09:43:56 -04:00
logging.debug(
" ---> [%-30s] ~FBSkipping feed fetch, no actives: %s"
% (subscription.feed, subscription.feed)
)
return HttpResponse("OK")
return Http404