def test_thread_summary_locmem_cache(self): cache.cache = LocMemCache('', {}) # Enable local caching thread = self.q.thread key = Thread.SUMMARY_CACHE_KEY_TPL % thread.id self.assertTrue(thread.summary_html_cached()) self.assertIsNotNone(thread.get_cached_summary_html()) ### cache.cache.delete(key) # let's start over self.assertFalse(thread.summary_html_cached()) self.assertIsNone(thread.get_cached_summary_html()) context = { 'thread': thread, 'question': self.q, 'search_state': DummySearchState(), } html = get_template('widgets/question_summary.html').render(context) filled_html = html.replace('<<<tag1>>>', SearchState.get_empty().add_tag('tag1').full_url())\ .replace('<<<tag2>>>', SearchState.get_empty().add_tag('tag2').full_url())\ .replace('<<<tag3>>>', SearchState.get_empty().add_tag('tag3').full_url()) self.assertEqual( filled_html, thread.get_summary_html(search_state=SearchState.get_empty())) self.assertTrue(thread.summary_html_cached()) self.assertEqual(html, thread.get_cached_summary_html()) ### cache.cache.set(key, 'Test <<<tag1>>>', timeout=100) self.assertTrue(thread.summary_html_cached()) self.assertEqual('Test <<<tag1>>>', thread.get_cached_summary_html()) self.assertEqual( 'Test %s' % SearchState.get_empty().add_tag('tag1').full_url(), thread.get_summary_html(search_state=SearchState.get_empty())) ### cache.cache.set(key, 'TestBBB <<<tag1>>>', timeout=100) self.assertTrue(thread.summary_html_cached()) self.assertEqual('TestBBB <<<tag1>>>', thread.get_cached_summary_html()) self.assertEqual( 'TestBBB %s' % SearchState.get_empty().add_tag('tag1').full_url(), thread.get_summary_html(search_state=SearchState.get_empty())) ### cache.cache.delete(key) thread.update_summary_html = lambda dummy: "Monkey-patched <<<tag2>>>" self.assertFalse(thread.summary_html_cached()) self.assertIsNone(thread.get_cached_summary_html()) self.assertEqual( 'Monkey-patched %s' % SearchState.get_empty().add_tag('tag2').full_url(), thread.get_summary_html(search_state=SearchState.get_empty()))
def _html_for_question(self, q): context = { 'thread': q.thread, 'question': q, 'search_state': DummySearchState(), } html = get_template('widgets/question_summary.html').render(context) return html
def _html_for_question(self, q): return render_to_string( 'widgets/question_summary.html', { 'thread': q.thread, 'question': q, 'search_state': DummySearchState(), 'visitor': None, })
def _html_for_question(self, q): context = { 'thread': q.thread, 'question': q, 'search_state': DummySearchState(), 'visitor': None } return get_template('widgets/question_summary.html').render( Context(context))
def _html_for_exercise(self, q): context = { 'thread': q.thread, 'exercise': q, 'search_state': DummySearchState(), 'visitor': None } html = get_template('widgets/exercise_summary.html').render(context) return html
def update_summary_html(self): context = { 'thread': self, 'question': self._question_post(refresh=True), # fetch new question post to make sure we're up-to-date 'search_state': DummySearchState(), } html = get_template('widgets/question_summary.html').render(context) # INFO: Timeout is set to 30 days: # * timeout=0/None is not a reliable cross-backend way to set infinite timeout # * We probably don't need to pollute the cache with threads older than 30 days # * Additionally, Memcached treats timeouts > 30day as dates (https://code.djangoproject.com/browser/django/tags/releases/1.3/django/core/cache/backends/memcached.py#L36), # which probably doesn't break anything but if we can stick to 30 days then let's stick to it cache.cache.set( self.SUMMARY_CACHE_KEY_TPL % self.id, html, timeout=const.LONG_TIME ) return html