Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
    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
Ejemplo n.º 4
0
 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]
Ejemplo n.º 5
0
    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
Ejemplo n.º 6
0
    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())
Ejemplo n.º 7
0
    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())
Ejemplo n.º 8
0
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)
Ejemplo n.º 9
0
    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)])
Ejemplo n.º 10
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")
Ejemplo n.º 11
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")
Ejemplo n.º 12
0
    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)])
Ejemplo n.º 13
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)
Ejemplo n.º 14
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)
Ejemplo n.º 15
0
    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
Ejemplo n.º 16
0
    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