Import View from django.views
[mygpo.git] / mygpo / pubsub / views.py
blobda003a8c22f794743f7c1cf4c30623368a2db95a
1 # -*- coding: utf-8 -*-
3 # PubSubHubbub subscriber for mygpo
7 import logging
9 from django.http import HttpResponseNotFound, HttpResponse
10 from django.views import View
11 from django.views.decorators.csrf import csrf_exempt
13 from mygpo.pubsub.models import HubSubscription
14 from mygpo.pubsub.signals import subscription_updated
16 logger = logging.getLogger(__name__)
19 class SubscribeView(View):
20 """ Endpoint for Pubsubhubbub subscriptions """
22 @csrf_exempt
23 def dispatch(self, *args, **kwargs):
24 return super(SubscribeView, self).dispatch(*args, **kwargs)
26 def get(self, request):
27 """ Callback used by the Hub to verify the subscription request """
29 # received arguments: hub.mode, hub.topic, hub.challenge,
30 # hub.lease_seconds, hub.verify_token
31 mode = request.GET.get('hub.mode')
32 feed_url = request.GET.get('hub.topic')
33 challenge = request.GET.get('hub.challenge')
34 lease_seconds = request.GET.get('hub.lease_seconds')
35 verify_token = request.GET.get('hub.verify_token')
37 logger.debug(('received subscription-parameters: mode: %(mode)s, ' +
38 'topic: %(topic)s, challenge: %(challenge)s, lease_seconds: ' +
39 '%(lease_seconds)s, verify_token: %(verify_token)s') % \
40 dict(mode=mode, topic=feed_url, challenge=challenge,
41 lease_seconds=lease_seconds, verify_token=verify_token))
43 try:
44 subscription = HubSubscription.objects.get(topic_url=feed_url)
46 except HubSubscription.DoesNotExist:
47 logger.warn('subscription does not exist')
48 return HttpResponseNotFound()
50 if subscription.mode != mode:
51 logger.warn('invalid mode, %s expected' % subscription.mode)
52 return HttpResponseNotFound()
54 if subscription.verify_token != verify_token:
55 logger.warn('invalid verify_token, %s expected' %
56 subscription.verify_token)
57 return HttpResponseNotFound()
59 subscription.verified = True
60 subscription.save()
62 logger.info('subscription confirmed')
63 return HttpResponse(challenge)
66 def post(self, request):
67 """ Callback to notify about a feed update """
69 feed_url = request.GET.get('url')
71 if not feed_url:
72 logger.info('received notification without url')
73 return HttpResponse(status=400)
75 logger.info('received notification for %s' % feed_url)
77 try:
78 subscription = HubSubscription.objects.get(topic_url=feed_url)
80 except HubSubscription.DoesNotExist:
81 logger.warn('no subscription for this URL')
82 return HttpResponse(status=400)
84 if subscription.mode != 'subscribe':
85 logger.warn('invalid subscription mode: %s' % subscription.mode)
86 return HttpResponse(status=400)
88 if not subscription.verified:
89 logger.warn('the subscription has not yet been verified')
90 return HttpResponse(status=400)
92 subscription_updated.send(sender=feed_url)
94 return HttpResponse(status=200)