[pytest]
DJANGO_SETTINGS_MODULE=djsite.settings
+addopts = --fail-on-template-vars
\ No newline at end of file
--- /dev/null
+from quotes.models import QuoteTag
+from django.db.models import Count, Max
+
+def build_cloud():
+ maxtag = QuoteTag.objects \
+ .all() \
+ .aggregate(max=Max('quote'))['max']
+ print maxtag
+ tags = QuoteTag.objects \
+ .annotate(num_quotes=Count('quote'),
+ size=Count(1)) \
+ .order_by('-num_quotes')[:20]
+
+ for tag in tags:
+ tag.size = int(10 * float(tag.num_quotes) / maxtag)
+
+ return tags
--- /dev/null
+{% extends 'quotes/base.html' %}
+
+{% block title %}All the quotes in the database{% endblock %}
+
+{% block body %}
+
+<ul>
+ {% for tag in cloud %}
+ <li class="tag-size-{{ tag.size }}">
+ <a href="{{ tag.get_absolute_url }}"
+ title="{{ tag.tag }}, {{ tag.num_quotes }} quotes">{{ tag.tag }}</a>: {{ tag.num_quotes }}
+ </li>
+ {% endfor %}
+</ul>
+
+{% endblock %}
--- /dev/null
+import pytest
+import re
+
+from quotes.models import QuoteTag, Quote, Work, Author
+
+class Test_Cloud(object):
+ @pytest.fixture
+ def size_range_small(self):
+ return [1, 5, 10, 7, 3]
+
+ def fill_db(self, size_range):
+ maxsize = max(size_range)
+
+ a = Author.objects.create(name="blah")
+ w = Work.objects.create(name="foo", author=a)
+
+ for i in range(maxsize):
+ Quote.objects.create(text="some text for quote %d" % i,
+ work = w)
+
+ for size in size_range:
+ tag = QuoteTag.objects.create(tag="tag-%d-" % size)
+ quotelist = Quote.objects.all()[:size]
+
+ for i in range(size):
+ quotelist[i].tags.add(tag)
+
+ def check_cloud(self, c, size_range):
+ top20 = sorted(size_range, reverse=True)[0:20]
+
+ cloud = c.getPage("cloud/")
+ for size in top20:
+ assert re.search("tag-%d-, %d quotes" % (size, size), cloud)
+
+ def test_cloud(self, size_range_small, db, c):
+ self.fill_db(size_range_small)
+ self.check_cloud(c, size_range_small)
+
+ @pytest.fixture
+ def size_range_large(self):
+ return range(1, 50)
+
+ def test_cloud_large(self, size_range_large, db, c):
+ self.fill_db(size_range_large)
+ self.check_cloud(c, size_range_large)
url(r'^author/(?P<author_id>[0-9]+)/$', views.author, name="author"),
url(r'^work/(?P<work_id>[0-9]+)/$', views.work, name="work"),
+ url(r'^cloud/$', views.cloud, name="cloud"),
url(r'^search/$', views.searchpage, name="search"),
url(r'^all/$', views.all, name="all"),
from quotes.models import Author, Work, Quote, QuoteTag
import quotes.search as search
+import quotes.tagcloud as tagcloud
-# Create your views here.
+# create your views here.
def index(request):
return render(request, 'quotes/index.html')
if 'q' in request.POST:
results = search.search(request.POST['q'])
return render(request, 'quotes/search.html', results)
+
+def cloud(request):
+ clouddata = tagcloud.build_cloud()
+ return render(request, 'quotes/cloud.html', { 'cloud': clouddata })