from django.contrib import admin
urlpatterns = [
- url(r'^admin/', include(admin.site.urls)),
+ url(r'^cntrl/', include(admin.site.urls)),
url(r'^tinymce/', include('tinymce.urls')),
url(r'^quotes/', include('quotes.urls', namespace='quotes')),
]
--- /dev/null
+from django.shortcuts import render
+from django.contrib.auth.decorators import permission_required
+
+from quotes.massimport import domassimport
+
+check_admin = permission_required('quotes.can_add',
+ login_url='/quotes/admin/login')
+
+@check_admin
+def massimport(request):
+ if 'quotes' in request.POST:
+ resultcontext = domassimport(request.POST['quotes'])
+ return render(request, 'quotes/domassimport.html', resultcontext)
+ else:
+ return render(request, 'quotes/massimport.html', {})
+
+@check_admin
+def listadmintools(request):
+ return render(request, 'quotes/listadmintools.html', {})
else:
raise RuntimeError('Unknown method %s for %s' % (method, url))
assert response.status_code == exp_status
+ if response.status_code != 200:
+ return None
assert response.charset == 'utf-8'
document = response.content.decode(response.charset)
lxml.etree.fromstring(document)
assert '<script>' not in document
return document
- def getPage(self, url):
- return self.request(url, 'get')
+ def getPage(self, url, exp_status=200):
+ return self.request(url, 'get', exp_status=exp_status)
- def postPage(self, url, params):
- return self.request(url, 'post', params=params)
+ def postPage(self, url, params, exp_status=200):
+ return self.request(url, 'post', params=params, exp_status=exp_status)
@pytest.fixture
def c(client):
return ValidatingClient(client)
+
+@pytest.fixture
+def c_adm(admin_client):
+ return ValidatingClient(admin_client)
--- /dev/null
+{% extends 'quotes/base.html' %}
+
+{% block title %}Administration tools{% endblock %}
+
+{% block body %}
+
+<p>Available administration tools:</p>
+
+<ul>
+ <li><a href="/cntrl/quotes/">Manage individual quotes</a>, in
+ particular add and edit single quotes</li>
+ <li><a href="/quotes/admin/massimport/">Import many quotes at once</a></li>
+</ul>
+
+{% endblock %}
return q1
@pytest.mark.django_db
- def test_massimport_1(self, q1, c):
+ def test_massimport_1(self, q1, c_adm):
allquotes = """\
Ich bin ein Berliner
---
tag1, tag555
==="""
- results = c.postPage('massimport/', {'quotes': allquotes})
+ results = c_adm.postPage('massimport/', {'quotes': allquotes})
assert "rejected" not in results
assert hamlet.author == Author.objects.get(name="William Shakespeare")
for quote in Quote.objects.all():
- assert c.getPage(quote.get_absolute_url())
+ assert c_adm.getPage(quote.get_absolute_url())
@pytest.mark.django_db
- def test_massimport_2(self, q1, c):
+ def test_massimport_2(self, q1, c_adm):
allquotes = """\
<script>somethingevil()</script>
A rose by any other name...
tag1, tag555
==="""
- results = c.postPage('massimport/', {'quotes': allquotes})
+ results = c_adm.postPage('massimport/', {'quotes': allquotes})
assert "<script>" not in results
with pytest.raises(Quote.DoesNotExist):
Quote.objects.get(text__contains="<script>")
@pytest.mark.django_db
- def test_massimport_3(self, c):
+ def test_massimport_3(self, c_adm):
"""Whitespace and stuff"""
allquotes = """\
A rose by any other name...
"""
- results = c.postPage('massimport/', {'quotes': allquotes})
+ results = c_adm.postPage('massimport/', {'quotes': allquotes})
assert "rejected" not in results
assert Quote.objects.get(text="<p>A rose by any other name...</p>")
assert Author.objects.get(name="William Shakespeare")
assert tirade.work.author.name == "William Shakespeare"
assert Author.objects.filter(name__contains="Shakespeare").count() == 1
+ def test_massimport_noaccess(self, c):
+ c.getPage('massimport/', exp_status=302)
+ c.postPage('massimport/', {}, exp_status=302)
from django.conf.urls import url
+from django.contrib.auth.views import login
-from . import views
+from . import views, adminviews
urlpatterns = [
url(r'^$', views.index, name='index'),
url(r'^cloud/$', views.cloud, name="cloud"),
url(r'^search/$', views.searchpage, name="search"),
- url(r'^massimport/$', views.massimport, name="massimport"),
+
+ url(r'^admin/$', adminviews.listadmintools, name='listadmintools'),
+ url(r'^admin/login$', login, {'template_name': 'admin/login.html'}),
+ url(r'^admin/massimport/$', adminviews.massimport, name='massimport'),
url(r'^all/$', views.all, name="all"),
]
from quotes.models import Author, Work, Quote, QuoteTag
from quotes import search
from quotes import tagcloud
-from quotes.massimport import domassimport
# create your views here.
def index(request):
def cloud(request):
clouddata = tagcloud.build_cloud()
return render(request, 'quotes/cloud.html', clouddata)
-
-def massimport(request):
- if 'quotes' in request.POST:
- resultcontext = domassimport(request.POST['quotes'])
- return render(request, 'quotes/domassimport.html', resultcontext)
- else:
- return render(request, 'quotes/massimport.html', {})