From e2b9f0567be926168310b88a110d13533f19cf43 Mon Sep 17 00:00:00 2001 From: Gilles Dartiguelongue Date: Sun, 3 Jul 2016 19:18:41 +0200 Subject: [PATCH] Switch bookmark submit page to class based view Also add a simple template to allow going to home page or back where you came from, refs: #15 --- collectr/collector/tests.py | 47 ++++++++++++++++- collectr/collector/urls.py | 2 +- collectr/collector/views.py | 52 ++++++++++++------- .../templates/collector/bookmark_submit.html | 19 +++++++ 4 files changed, 99 insertions(+), 21 deletions(-) create mode 100644 collectr/templates/collector/bookmark_submit.html diff --git a/collectr/collector/tests.py b/collectr/collector/tests.py index 15a2859..ef98516 100644 --- a/collectr/collector/tests.py +++ b/collectr/collector/tests.py @@ -3,12 +3,14 @@ """ from django.conf import settings -from django.test import TestCase +from django.core.urlresolvers import reverse +from django.test import TestCase, TransactionTestCase import redis from source import models as source_models from source import factories as source_factories +from userprofile.models import UserProfile from . import rss as rss_module @@ -50,3 +52,46 @@ def test_rss_collector(self): ) job_len = len(self.redis_client.keys('rq:job:*')) self.assertEqual(job_len, expected_jobs_len) + + +class CollectorViewTest(TransactionTestCase): + + def setUp(self): + self.user = source_factories.UserFactory() + self.user.set_password('toto') + self.user.save() + self.client.login(username=self.user.username, password='toto') + + def test_submit_nolink(self): + response = self.client.get(reverse('collector:bookmark', + args=(self.user.username,))) + self.assertEqual(response.status_code, 400) + + def test_submit_invalid_token(self): + response = self.client.get( + reverse('collector:bookmark', args=(self.user.username,)) + "?" + + "&".join( + key + '=' + value for key, value in { + 'url': 'http://www.moto-net.com/rss_actu.xml', + 'from': 'me', + 'source': 'all', + 'token': 'pazoeiazeip', + }.items() + )) + self.assertEqual(response.status_code, 403) + + def test_submit_success(self): + uprofile = UserProfile(user=self.user, token='randomtoken') + uprofile.save() + + response = self.client.get( + reverse('collector:bookmark', args=(self.user.username,)) + "?" + + "&".join( + key + '=' + value for key, value in { + 'url': 'http://www.moto-net.com/rss_actu.xml', + 'from': 'me', + 'source': 'all', + 'token': 'randomtoken', + }.items() + )) + self.assertEqual(response.status_code, 202) diff --git a/collectr/collector/urls.py b/collectr/collector/urls.py index 465ec8d..87bcb21 100644 --- a/collectr/collector/urls.py +++ b/collectr/collector/urls.py @@ -5,6 +5,6 @@ from collector import views urlpatterns = patterns('', - url(r'^bookmark/(?P\w+)/$', views.secret_bookmark, name="bookmark"), + url(r'^bookmark/(?P\w+)/$', views.SubmitBookmarkView.as_view(), name="bookmark"), ) diff --git a/collectr/collector/views.py b/collectr/collector/views.py index a8d4542..6680794 100644 --- a/collectr/collector/views.py +++ b/collectr/collector/views.py @@ -3,10 +3,10 @@ # django from django.conf import settings -from django.contrib.auth.decorators import login_required from django.contrib.auth.models import User from django.http import HttpResponse -from django.shortcuts import redirect +from django.template.response import TemplateResponse +from django.views.generic import TemplateView # rq from redis import Redis @@ -15,24 +15,38 @@ from semantism.process import index_url -def secret_bookmark(request, username): - url = request.GET.get('url') - link_from = request.GET.get('from') - source = request.GET.get('source') - token = request.GET.get('token') +class AcceptTemplateResponse(TemplateResponse): + """`TemplateResponse` that returns with 202 Accept status code.""" + status_code = 202 - if None in (url, link_from, source, token): - return HttpResponse(status=400) - try: - user = User.objects.get(username=username, userprofile__token=token) - except User.DoesNotExist: - return HttpResponse(status=403) +class SubmitBookmarkView(TemplateView): - with Connection(Redis(**settings.RQ_DATABASE)): - links_queue = Queue('link_indexing') - links_queue.enqueue_call(func=index_url, - args=(url, user.id, datetime.now(), link_from, source), timeout=60 - ) + response_class = AcceptTemplateResponse + template_name = 'collector/bookmark_submit.html' + + def get(self, request, *args, **kwargs): + url = request.GET.get('url') + link_from = request.GET.get('from') + source = request.GET.get('source') + token = request.GET.get('token') + + if None in (url, link_from, source, token): + return HttpResponse(status=400) + + try: + user = User.objects.get(username=kwargs['username'], + userprofile__token=token) + except User.DoesNotExist: + return HttpResponse(status=403) + + with Connection(Redis(**settings.RQ_DATABASE)): + links_queue = Queue('link_indexing') + links_queue.enqueue_call( + func=index_url, + args=(url, user.id, datetime.now(), link_from, source), + timeout=60 + ) + + return super(SubmitBookmarkView, self).get(request, *args, **kwargs) - return HttpResponse(status=201) diff --git a/collectr/templates/collector/bookmark_submit.html b/collectr/templates/collector/bookmark_submit.html new file mode 100644 index 0000000..5556dcf --- /dev/null +++ b/collectr/templates/collector/bookmark_submit.html @@ -0,0 +1,19 @@ +{% extends "base.html" %} +{% load i18n %} + +{% block title %} - Bookmark submission{% endblock title %} + +{% block container-fluid %} + +
+

Bookmark submitted

+

+ {% blocktrans %}Your bookmark has been submitted and will be processed shorlty.{% endblocktrans %} +

+

+ {% url "home" as homelink %} + {% blocktrans %}Once processed, it will appear on your Home page. In the meantime, you may go back to where you came from to continue reading.{%endblocktrans %} +

+
+ +{% endblock container-fluid %}