forked from cdleary/coffin
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Brought our port of the syndication framework up to speed with the
changes in Django 1.2. Fixes #5.
- Loading branch information
Showing
4 changed files
with
106 additions
and
34 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,36 @@ | ||
from django.contrib.syndication.views import * # merge modules | ||
|
||
import sys | ||
from django.contrib.syndication.views import Feed as DjangoFeed | ||
from coffin.template import loader as coffin_loader | ||
|
||
|
||
class Feed(DjangoFeed): | ||
"""A ``Feed`` implementation that renders it's title and | ||
description templates using Jinja2. | ||
Unfortunately, Django's base ``Feed`` class is not very extensible | ||
in this respect at all. For a real solution, we'd have to essentially | ||
have to duplicate the whole class. So for now, we use this terrible | ||
non-thread safe hack. | ||
Another, somewhat crazy option would be: | ||
* Render the templates ourselves through Jinja2 (possible | ||
introduce new attributes to avoid having to rewrite the | ||
existing ones). | ||
* Make the rendered result available to Django/the superclass by | ||
using a custom template loader using a prefix, say | ||
"feed:<myproject.app.views.MyFeed>". The loader would simply | ||
return the Jinja-rendered template (escaped), the Django template | ||
mechanism would find no nodes and just pass the output through. | ||
Possible even worse than this though. | ||
""" | ||
|
||
def get_feed(self, *args, **kwargs): | ||
parent_module = sys.modules[DjangoFeed.__module__] | ||
old_loader = parent_module.loader | ||
parent_module.loader = coffin_loader | ||
try: | ||
return super(Feed, self).get_feed(*args, **kwargs) | ||
finally: | ||
parent_module.loader = old_loader |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,11 +1,31 @@ | ||
def test_syndication(): | ||
from django.http import HttpRequest | ||
fake_request = HttpRequest() | ||
fake_request.META['SERVER_NAME'] = 'foo' | ||
fake_request.META['SERVER_PORT'] = 80 | ||
|
||
from apps.feeds_app.feeds import TestFeed | ||
feedgen = TestFeed('', fake_request).get_feed(None) | ||
s = feedgen.writeString('utf-8') | ||
assert 'JINJA WAS HERE (TITLE)' in s | ||
assert 'JINJA WAS HERE (DESCRIPTION)' in s | ||
from nose.plugins.skip import SkipTest | ||
import django | ||
|
||
|
||
class TestSyndication: | ||
|
||
def test_old(self): | ||
from django.http import HttpRequest | ||
fake_request = HttpRequest() | ||
fake_request.META['SERVER_NAME'] = 'foo' | ||
fake_request.META['SERVER_PORT'] = 80 | ||
|
||
from apps.feeds_app.feeds import TestOldFeed | ||
feedgen = TestOldFeed('', fake_request).get_feed(None) | ||
s = feedgen.writeString('utf-8') | ||
assert 'JINJA WAS HERE (TITLE)' in s | ||
assert 'JINJA WAS HERE (DESCRIPTION)' in s | ||
|
||
def test_new(self): | ||
if django.VERSION < (1,2): | ||
raise SkipTest() | ||
|
||
from django.http import HttpRequest | ||
fake_request = HttpRequest() | ||
fake_request.META['SERVER_NAME'] = 'foo' | ||
fake_request.META['SERVER_PORT'] = 80 | ||
|
||
from apps.feeds_app.feeds import TestNewFeed | ||
response = TestNewFeed()(fake_request) | ||
assert 'JINJA WAS HERE (TITLE)' in response.content | ||
assert 'JINJA WAS HERE (DESCRIPTION)' in response.content |