def home(request, oc=None): # this is temporarily here to see how often this is actually rendered logging.info("PSEUDO-DEBUGGING cache miss on home()") data = {} qs = BlogItem.objects.filter(pub_date__lt=utc_now()) if oc: categories = parse_ocs_to_categories(oc) cat_q = make_categories_q(categories) qs = qs.filter(cat_q) data['categories'] = categories BATCH_SIZE = 10 page = max(1, int(request.GET.get('page', 1))) - 1 n, m = page * BATCH_SIZE, (page + 1) * BATCH_SIZE max_count = qs.count() if (page + 1) * BATCH_SIZE < max_count: data['next_page'] = page + 2 data['previous_page'] = page data['blogitems'] = ( qs .prefetch_related('categories') .order_by('-pub_date') )[n:m] return render(request, 'homepage/home.html', data)
def home(request, oc=None): data = {} qs = BlogItem.objects.filter(pub_date__lt=utc_now()) if oc: categories = parse_ocs_to_categories(oc) cat_q = make_categories_q(categories) qs = qs.filter(cat_q) data['categories'] = categories ## Reasons for not being here if request.method == 'HEAD': return http.HttpResponse('') try: redis_increment('homepage:misses', request) except Exception: logging.error('Unable to redis.zincrby', exc_info=True) BATCH_SIZE = 10 try: page = max(1, int(request.GET.get('page', 1))) - 1 except ValueError: raise http.Http404('invalid page value') n, m = page * BATCH_SIZE, (page + 1) * BATCH_SIZE max_count = qs.count() if (page + 1) * BATCH_SIZE < max_count: data['next_page'] = page + 2 data['previous_page'] = page data['blogitems'] = ( qs .prefetch_related('categories') .order_by('-pub_date') )[n:m] return render(request, 'homepage/home.html', data)
def test_text_rendering_with_images(self): blog = BlogItem.objects.create( oid='myoid', title='TITLEX', text=""" "image.png":/plog/myoid/image.png and *this* """, display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) url = reverse('blog_post', args=[blog.oid]) response = self.client.get(url) content = response.content.split('id="post"')[1].split('</section')[0] self.assertTrue('<em>this</em>' in content) regex_str = ('/CONTENTCACHE-\d+%s' % (re.escape('/plog/myoid/image.png'),)) self.assertTrue(re.findall(regex_str, content)) old = settings.STATIC_URL settings.STATIC_URL = '//some.cdn.com/' try: blog.text_rendered = '' blog.save() response = self.client.get(url) content = response.content.split('id="post"')[1].split('</section')[0] regex_str = ('%sCONTENTCACHE-\d+%s' % (settings.STATIC_URL, re.escape('/plog/myoid/image.png'))) self.assertTrue(re.findall(regex_str, content)) finally: settings.STATIC_URL = old
def items(self, categories): qs = (BlogItem.objects .filter(pub_date__lt=utc_now())) if categories: qs = qs.filter(make_categories_q(categories)) print qs.query return qs.order_by('-pub_date')[:10]
def test_text_rendering_with_images(self): blog = BlogItem.objects.create( oid='myoid', title='TITLEX', text=""" "image.png":/plog/myoid/image.png and *this* """, display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) url = reverse('blog_post', args=[blog.oid]) response = self.client.get(url) content = response.content.split('id="post"')[1].split('</section')[0] self.assertTrue('<em>this</em>' in content) regex_str = ('/CONTENTCACHE-\d+%s' % (re.escape('/plog/myoid/image.png'), )) self.assertTrue(re.findall(regex_str, content)) old = settings.STATIC_URL settings.STATIC_URL = '//some.cdn.com/' try: blog.text_rendered = '' blog.save() response = self.client.get(url) content = response.content.split('id="post"')[1].split( '</section')[0] regex_str = ( '%sCONTENTCACHE-\d+%s' % (settings.STATIC_URL, re.escape('/plog/myoid/image.png'))) self.assertTrue(re.findall(regex_str, content)) finally: settings.STATIC_URL = old
def test_postmark_inbound(self): here = os.path.dirname(__file__) filepath = os.path.join(here, 'raw_data.1333828973.78.json') url = reverse('inbound_email') json_content = open(filepath).read() response = self.client.post(url, data=json_content, content_type="application/json") self.assertEqual(response.status_code, 200) self.assertTrue("error" in response.content.lower()) self.assertTrue("no hashkey defined in subject line" in response.content.lower()) post = BlogItem.objects.create( oid='some-longish-test-post', title='TITLEX', text='BLABLABLA', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) hashkey = post.get_or_create_inbound_hashkey() json_content = json_content.replace('Test subject', '%s: Test Title' % hashkey) response = self.client.post(url, data=json_content, content_type="application/json") self.assertEqual(response.status_code, 200) self.assertTrue("OK" in response.content) self.assertTrue(BlogFile.objects.filter(blogitem=post)) blogfile, = BlogFile.objects.filter(blogitem=post) self.assertEqual(blogfile.title, 'Test Title') self.assertTrue(blogfile.file.read())
def test_postmark_inbound(self): here = os.path.dirname(__file__) filepath = os.path.join(here, 'raw_data.1333828973.78.json') url = reverse('inbound_email') json_content = open(filepath).read() response = self.client.post(url, data=json_content, content_type="application/json") self.assertEqual(response.status_code, 200) self.assertTrue("error" in response.content.lower()) self.assertTrue( "no hashkey defined in subject line" in response.content.lower()) post = BlogItem.objects.create( oid='some-longish-test-post', title='TITLEX', text='BLABLABLA', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) hashkey = post.get_or_create_inbound_hashkey() json_content = json_content.replace('Test subject', '%s: Test Title' % hashkey) response = self.client.post(url, data=json_content, content_type="application/json") self.assertEqual(response.status_code, 200) self.assertTrue("OK" in response.content) self.assertTrue(BlogFile.objects.filter(blogitem=post)) blogfile, = BlogFile.objects.filter(blogitem=post) self.assertEqual(blogfile.title, 'Test Title') self.assertTrue(blogfile.file.read())
def home(request, oc=None): data = {} qs = BlogItem.objects.filter(pub_date__lt=utc_now()) if oc: categories = parse_ocs_to_categories(oc) cat_q = make_categories_q(categories) qs = qs.filter(cat_q) data['categories'] = categories ## Reasons for not being here if request.method == 'HEAD': return http.HttpResponse('') try: redis_increment('homepage:misses', request) except Exception: logging.error('Unable to redis.zincrby', exc_info=True) BATCH_SIZE = 10 try: page = max(1, int(request.GET.get('page', 1))) - 1 except ValueError: raise http.Http404('invalid page value') n, m = page * BATCH_SIZE, (page + 1) * BATCH_SIZE max_count = qs.count() first_post, = qs.order_by('-pub_date')[:1] data['first_post_url'] = request.build_absolute_uri( reverse('blog_post', args=[first_post.oid])) if (page + 1) * BATCH_SIZE < max_count: data['next_page'] = page + 2 data['previous_page'] = page data['blogitems'] = ( qs.prefetch_related('categories').order_by('-pub_date'))[n:m] return render(request, 'homepage/home.html', data)
def test_blog_post_caching(self): blog = BlogItem.objects.create( oid='some-longish-test-post', title='TITLEX', text='BLABLABLA', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) url = reverse('blog_post', args=[blog.oid]) import apps.plog.views old_render = apps.plog.views.render from django.shortcuts import render as django_render render_counts = [] def mocked_render(*a, **k): render_counts.append(1) return django_render(*a, **k) apps.plog.views.render = mocked_render try: response = self.client.get(url) self.assertTrue(blog.title in response.content) assert '0 comments' in response.content response = self.client.get(url) assert '0 comments' in response.content comment1 = BlogComment.objects.create( comment="textext", blogitem=blog, approved=True, add_date=utc_now() + datetime.timedelta(seconds=1), ) response = self.client.get(url) assert '1 comment' in response.content finally: apps.plog.views.render = old_render assert len(render_counts) == 2 self.assertTrue(self.redis.zrange('plog:hits', 0, -1, withscores=True), [('/plog/some-longish-test-post', 5.0)]) self.assertTrue( self.redis.zrange('plog:misses', 0, -1, withscores=True), [('/plog/some-longish-test-post', 1.0)])
def sitemap(request): base_url = 'http://%s' % RequestSite(request).domain urls = [] urls.append('<?xml version="1.0" encoding="iso-8859-1"?>') urls.append('<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">') def add(loc, lastmod=None, changefreq='monthly', priority=None): url = '<url><loc>%s%s</loc>' % (base_url, loc) if lastmod: url += '<lastmod>%s</lastmod>' % lastmod.strftime('%Y-%m-%d') if priority: url += '<priority>%s</priority>' % priority if changefreq: url += '<changefreq>%s</changefreq>' % changefreq url += '</url>' urls.append(url) now = utc_now() latest_blogitem, = (BlogItem.objects .filter(pub_date__lt=now) .order_by('-pub_date')[:1]) add('/', priority=1.0, changefreq='daily', lastmod=latest_blogitem.pub_date) add(reverse('about'), changefreq='weekly', priority=0.5) add(reverse('contact'), changefreq='weekly', priority=0.5) for blogitem in (BlogItem.objects .filter(pub_date__lt=now) .order_by('-pub_date')[:1000]): if not blogitem.modify_date: # legacy! try: latest_comment, = (BlogComment.objects .filter(approved=True, blogitem=blogitem) .order_by('-add_date')[:1]) blogitem.modify_date = latest_comment.add_date except ValueError: blogitem.modify_date = blogitem.pub_date blogitem._modify_date_set = True blogitem.save() age = (now - blogitem.modify_date).days if age < 14: changefreq = 'daily' elif age < 60: changefreq = 'weekly' elif age < 100: changefreq = 'monthly' else: changefreq = None add(reverse('blog_post', args=[blogitem.oid]), lastmod=blogitem.modify_date, changefreq=changefreq ) urls.append('</urlset>') return http.HttpResponse('\n'.join(urls), mimetype="text/xml")
def sitemap(request): base_url = 'http://%s' % RequestSite(request).domain urls = [] urls.append('<?xml version="1.0" encoding="iso-8859-1"?>') urls.append('<urlset xmlns="http://www.google.com/schemas/sitemap/0.84">') def add(loc, lastmod=None, changefreq='monthly', priority=None): url = '<url><loc>%s%s</loc>' % (base_url, loc) if lastmod: url += '<lastmod>%s</lastmod>' % lastmod.strftime('%Y-%m-%d') if priority: url += '<priority>%s</priority>' % priority if changefreq: url += '<changefreq>%s</changefreq>' % changefreq url += '</url>' urls.append(url) now = utc_now() latest_blogitem, = (BlogItem.objects.filter( pub_date__lt=now).order_by('-pub_date')[:1]) add('/', priority=1.0, changefreq='daily', lastmod=latest_blogitem.pub_date) add(reverse('about'), changefreq='weekly', priority=0.5) add(reverse('contact'), changefreq='weekly', priority=0.5) for blogitem in (BlogItem.objects.filter( pub_date__lt=now).order_by('-pub_date')[:1000]): if not blogitem.modify_date: # legacy! try: latest_comment, = (BlogComment.objects.filter( approved=True, blogitem=blogitem).order_by('-add_date')[:1]) blogitem.modify_date = latest_comment.add_date except ValueError: blogitem.modify_date = blogitem.pub_date blogitem._modify_date_set = True blogitem.save() age = (now - blogitem.modify_date).days if age < 14: changefreq = 'daily' elif age < 60: changefreq = 'weekly' elif age < 100: changefreq = 'monthly' else: changefreq = None add(reverse('blog_post', args=[blogitem.oid]), lastmod=blogitem.modify_date, changefreq=changefreq) urls.append('</urlset>') return http.HttpResponse('\n'.join(urls), mimetype="text/xml")
def test_blog_post_caching(self): blog = BlogItem.objects.create( oid='some-longish-test-post', title='TITLEX', text='BLABLABLA', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) url = reverse('blog_post', args=[blog.oid]) import apps.plog.views old_render = apps.plog.views.render from django.shortcuts import render as django_render render_counts = [] def mocked_render(*a, **k): render_counts.append(1) return django_render(*a, **k) apps.plog.views.render = mocked_render try: response = self.client.get(url) self.assertTrue(blog.title in response.content) assert '0 comments' in response.content response = self.client.get(url) assert '0 comments' in response.content comment1 = BlogComment.objects.create( comment="textext", blogitem=blog, approved=True, add_date=utc_now() + datetime.timedelta(seconds=1), ) response = self.client.get(url) assert '1 comment' in response.content finally: apps.plog.views.render = old_render assert len(render_counts) == 2 self.assertTrue(self.redis.zrange('plog:hits', 0, -1, withscores=True), [('/plog/some-longish-test-post', 5.0)]) self.assertTrue(self.redis.zrange('plog:misses', 0, -1, withscores=True), [('/plog/some-longish-test-post', 1.0)])
def test_old_redirects(self): blog = BlogItem.objects.create( oid='myoid', title='TITLEX', text=""" ttest test """, display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) url = reverse('blog_post', args=[blog.oid]) response = self.client.get(url) assert response.status_code == 200 response = self.client.get(url, {'replypath': 'foo'}) self.assertEqual(response.status_code, 301) self.assertEqual(urlparse(response['location']).path, url) self.assertTrue(not urlparse(response['location']).query)
def test_homepage_cache_rendering(self): url = reverse('home') blog1 = BlogItem.objects.create( title='TITLE1', text='BLABLABLA', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) comment1 = BlogComment.objects.create( comment="textext", blogitem=blog1, approved=True, ) comment2 = BlogComment.objects.create( comment="tuxtuxt", blogitem=blog1, approved=True, ) response = self.client.get(url) self.assertTrue('TITLE1' in response.content) self.assertTrue('2 comments' in response.content) blog1.title = 'TUTLE1' blog1.save() response = self.client.get(url) self.assertTrue('TUTLE1' in response.content) blog2 = BlogItem.objects.create( title='TATLE2', text='BLEBLE', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=1), ) response = self.client.get(url) self.assertTrue('TATLE2' in response.content) self.assertTrue('0 comments' in response.content) self.assertTrue('TUTLE1' in response.content) self.assertTrue('2 comments' in response.content) # by categories only cat1 = Category.objects.create( name='CATEGORY1', ) cat2 = Category.objects.create( name='CATEGORY2', ) blog1.categories.add(cat1) blog1.save() blog2.categories.add(cat2) blog2.save() response = self.client.get(url) self.assertTrue('CATEGORY1' in response.content) self.assertTrue('CATEGORY2' in response.content) url = reverse('only_category', args=['CATEGORY2']) response = self.client.get(url) self.assertTrue('CATEGORY1' not in response.content) self.assertTrue('CATEGORY2' in response.content) url = reverse('only_category', args=['CATEGORY1']) response = self.client.get(url) self.assertTrue('CATEGORY1' in response.content) self.assertTrue('CATEGORY2' not in response.content) for i in range(2, 21): BlogItem.objects.create( title='TITLE-%s' % i, text='BLEBLE', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=20 + i), ) url = reverse('home') response = self.client.get(url) assert '?page=2' in response.content visible_titles = [] not_visible_titles = [] for item in BlogItem.objects.all(): if item.title in response.content: visible_titles.append(item.title) else: not_visible_titles.append(item.title) response = self.client.get(url, {'page': 2}) for each in visible_titles[:10]: assert each not in response.content for each in not_visible_titles[:10]: assert each in response.content assert '?page=1' in response.content assert '?page=3' in response.content
def test_homepage_cache_rendering(self): url = reverse('home') blog1 = BlogItem.objects.create( title='TITLE1', text='BLABLABLA', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=10), ) comment1 = BlogComment.objects.create( comment="textext", blogitem=blog1, approved=True, ) comment2 = BlogComment.objects.create( comment="tuxtuxt", blogitem=blog1, approved=True, ) response = self.client.get(url) self.assertTrue('TITLE1' in response.content) self.assertTrue('2 comments' in response.content) blog1.title = 'TUTLE1' blog1.save() response = self.client.get(url) self.assertTrue('TUTLE1' in response.content) blog2 = BlogItem.objects.create( title='TATLE2', text='BLEBLE', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=1), ) response = self.client.get(url) self.assertTrue('TATLE2' in response.content) self.assertTrue('0 comments' in response.content) self.assertTrue('TUTLE1' in response.content) self.assertTrue('2 comments' in response.content) # by categories only cat1 = Category.objects.create(name='CATEGORY1', ) cat2 = Category.objects.create(name='CATEGORY2', ) blog1.categories.add(cat1) blog1.save() blog2.categories.add(cat2) blog2.save() response = self.client.get(url) self.assertTrue('CATEGORY1' in response.content) self.assertTrue('CATEGORY2' in response.content) url = reverse('only_category', args=['CATEGORY2']) response = self.client.get(url) self.assertTrue('CATEGORY1' not in response.content) self.assertTrue('CATEGORY2' in response.content) url = reverse('only_category', args=['CATEGORY1']) response = self.client.get(url) self.assertTrue('CATEGORY1' in response.content) self.assertTrue('CATEGORY2' not in response.content) for i in range(2, 21): BlogItem.objects.create( title='TITLE-%s' % i, text='BLEBLE', display_format='structuredtext', pub_date=utc_now() - datetime.timedelta(seconds=20 + i), ) url = reverse('home') response = self.client.get(url) assert '?page=2' in response.content visible_titles = [] not_visible_titles = [] for item in BlogItem.objects.all(): if item.title in response.content: visible_titles.append(item.title) else: not_visible_titles.append(item.title) response = self.client.get(url, {'page': 2}) for each in visible_titles[:10]: assert each not in response.content for each in not_visible_titles[:10]: assert each in response.content assert '?page=1' in response.content assert '?page=3' in response.content