Skip to content

Commit

Permalink
deferring database hits on import, useful for launching tests without…
Browse files Browse the repository at this point in the history
… database
  • Loading branch information
Fantomas42 committed Feb 4, 2011
1 parent e134ec5 commit 4dff50b
Show file tree
Hide file tree
Showing 4 changed files with 66 additions and 49 deletions.
16 changes: 10 additions & 6 deletions zinnia/feeds.py
Expand Up @@ -20,8 +20,6 @@
from zinnia.managers import entries_published
from zinnia.views.categories import get_category_or_404

CURRENT_SITE = Site.objects.get_current()


class ImgParser(SGMLParser):
"""Parser for getting IMG markups"""
Expand All @@ -43,6 +41,9 @@ class EntryFeed(Feed):
description_template = 'feeds/entry_description.html'
feed_copyright = COPYRIGHT

def __init__(self):
self.site = Site.objects.get_current()

def item_pubdate(self, item):
"""Publication date of an entry"""
return item.creation_date
Expand All @@ -61,7 +62,7 @@ def item_author_email(self, item):

def item_author_link(self, item):
"""Returns the author's URL"""
url = '%s://%s' % (PROTOCOL, CURRENT_SITE.domain)
url = '%s://%s' % (PROTOCOL, self.site.domain)
try:
author_url = reverse('zinnia_author_detail',
args=[item.authors.all()[0].username])
Expand All @@ -79,11 +80,11 @@ def item_enclosure_url(self, item):
except UnicodeEncodeError:
return
if len(parser.img_locations):
if CURRENT_SITE.domain in parser.img_locations[0]:
if self.site.domain in parser.img_locations[0]:
return parser.img_locations[0]
else:
return '%s://%s%s' % (PROTOCOL,
CURRENT_SITE.domain,
self.site.domain,
parser.img_locations[0])
return None

Expand All @@ -99,7 +100,6 @@ def item_enclosure_mime_type(self, item):
class LatestEntries(EntryFeed):
"""Feed for the latest entries"""
title = _('Latest entries')
description = _('The latest entries for the site %s') % CURRENT_SITE.domain

def link(self):
"""URL of latest entries"""
Expand All @@ -109,6 +109,10 @@ def items(self):
"""Items are published entries"""
return Entry.published.all()[:FEEDS_MAX_ITEMS]

def description(self, obj):
"""Description of the feed"""
return _('The latest entries for the site %s') % self.site.domain


class CategoryEntries(EntryFeed):
"""Feed filtered by a category"""
Expand Down
49 changes: 28 additions & 21 deletions zinnia/ping.py
Expand Up @@ -13,27 +13,29 @@

from zinnia.settings import PROTOCOL

CURRENT_SITE = Site.objects.get_current()
SITE = '%s://%s' % (PROTOCOL, CURRENT_SITE.domain)
BLOG_URL = ''
BLOG_FEED = ''

class URLRessources(object):
"""Object defining the ressources of the website"""

def __init__(self):
self.current_site = Site.objects.get_current()
self.site_url = '%s://%s' % (PROTOCOL, self.current_site.domain)
self.blog_url = '%s%s' % (self.site_url,
reverse('zinnia_entry_archive_index'))
self.blog_feed = '%s%s' % (self.site_url,
reverse('zinnia_entry_latest_feed'))


class DirectoryPinger(threading.Thread):
"""Threaded Directory Pinger"""

def __init__(self, server_name, entries, timeout=10, start_now=True):
global BLOG_URL, BLOG_FEED

self.results = []
self.timeout = timeout
self.entries = entries
self.server_name = server_name
self.server = xmlrpclib.ServerProxy(self.server_name)

if not BLOG_URL or not BLOG_FEED:
BLOG_URL = '%s%s' % (SITE, reverse('zinnia_entry_archive_index'))
BLOG_FEED = '%s%s' % (SITE, reverse('zinnia_entry_latest_feed'))
self.ressources = URLRessources()

threading.Thread.__init__(self)
if start_now:
Expand All @@ -51,19 +53,21 @@ def run(self):

def ping_entry(self, entry):
"""Ping an entry to a Directory"""
entry_url = '%s%s' % (SITE, entry.get_absolute_url())
entry_url = '%s%s' % (self.ressources.site_url,
entry.get_absolute_url())
categories = '|'.join([c.title for c in entry.categories.all()])

try:
reply = self.server.weblogUpdates.extendedPing(CURRENT_SITE.name,
BLOG_URL, entry_url,
BLOG_FEED,
categories)
reply = self.server.weblogUpdates.extendedPing(
self.ressources.current_site.name,
self.ressources.blog_url, entry_url,
self.ressources.blog_feed, categories)
except Exception:
try:
reply = self.server.weblogUpdates.ping(CURRENT_SITE.name,
BLOG_URL, entry_url,
categories)
reply = self.server.weblogUpdates.ping(
self.ressources.current_site.name,
self.ressources.blog_url, entry_url,
categories)
except Exception:
reply = {'message': '%s is an invalid directory.' % \
self.server_name,
Expand All @@ -78,7 +82,9 @@ def __init__(self, entry, timeout=10, start_now=True):
self.results = []
self.entry = entry
self.timeout = timeout
self.entry_url = '%s%s' % (SITE, self.entry.get_absolute_url())
self.ressources = URLRessources()
self.entry_url = '%s%s' % (self.ressources.site_url,
self.entry.get_absolute_url())

threading.Thread.__init__(self)
if start_now:
Expand All @@ -99,7 +105,7 @@ def run(self):

socket.setdefaulttimeout(None)

def is_external_url(self, url, site_url=SITE):
def is_external_url(self, url, site_url):
"""Check of the url in an external url"""
url_splitted = urlsplit(url)
if not url_splitted.netloc:
Expand All @@ -110,7 +116,8 @@ def find_external_urls(self, entry):
"""Find external urls in an entry"""
soup = BeautifulSoup(entry.html_content)
external_urls = [a['href'] for a in soup.findAll('a')
if self.is_external_url(a['href'])]
if self.is_external_url(
a['href'], self.ressources.site_url)]
return external_urls

def find_pingback_href(self, content):
Expand Down
23 changes: 12 additions & 11 deletions zinnia/templatetags/zbreadcrumbs.py
Expand Up @@ -38,15 +38,16 @@ def day_crumb(creation_date):
args=[year, month, day]))


ZINNIA_ROOT_URL = reverse('zinnia_entry_archive_index')

TAGS_CRUMB = Crumb(_('Tags'), reverse('zinnia_tag_list'))
AUTHORS_CRUMB = Crumb(_('Authors'), reverse('zinnia_author_list'))
CATEGORIES_CRUMB = Crumb(_('Categories'), reverse('zinnia_category_list'))

MODEL_BREADCRUMBS = {'Tag': lambda x: [TAGS_CRUMB, Crumb(x.name)],
'User': lambda x: [AUTHORS_CRUMB, Crumb(x.username)],
'Category': lambda x: [CATEGORIES_CRUMB] + \
ZINNIA_ROOT_URL = lambda: reverse('zinnia_entry_archive_index')

MODEL_BREADCRUMBS = {'Tag': lambda x: [Crumb(_('Tags'),
reverse('zinnia_tag_list')),
Crumb(x.name)],
'User': lambda x: [Crumb(_('Authors'),
reverse('zinnia_author_list')),
Crumb(x.username)],
'Category': lambda x: [Crumb(_('Categories'),
reverse('zinnia_category_list'))] + \
[Crumb(anc.title,
anc.get_absolute_url())
for anc in x.get_ancestors()] + \
Expand All @@ -66,7 +67,7 @@ def retrieve_breadcrumbs(path, model_instance, root_name=''):
breadcrumbs = []

if root_name:
breadcrumbs.append(Crumb(root_name, ZINNIA_ROOT_URL))
breadcrumbs.append(Crumb(root_name, ZINNIA_ROOT_URL()))

if model_instance is not None:
key = model_instance.__class__.__name__
Expand Down Expand Up @@ -94,7 +95,7 @@ def retrieve_breadcrumbs(path, model_instance, root_name=''):
return breadcrumbs

url_components = [comp for comp in
path.replace(ZINNIA_ROOT_URL, '').split('/') if comp]
path.replace(ZINNIA_ROOT_URL(), '').split('/') if comp]
if len(url_components):
breadcrumbs.append(Crumb(_(url_components[-1].capitalize())))

Expand Down
27 changes: 16 additions & 11 deletions zinnia/tests/ping.py
Expand Up @@ -4,7 +4,7 @@
from django.test import TestCase

from zinnia.models import Entry
from zinnia.ping import SITE
from zinnia.ping import URLRessources
from zinnia.ping import ExternalUrlsPinger


Expand All @@ -20,24 +20,29 @@ def setUp(self):
self.pinger = ExternalUrlsPinger(self.entry, start_now=False)

def test_is_external_url(self):
self.assertEquals(self.pinger.is_external_url('http://example.com/',
'http://google.com/'), True)
self.assertEquals(self.pinger.is_external_url('http://example.com/toto/',
'http://google.com/titi/'), True)
self.assertEquals(self.pinger.is_external_url('http://example.com/blog/',
'http://example.com/page/'), False)
self.assertEquals(self.pinger.is_external_url('%s/blog/' % SITE), False)
self.assertEquals(self.pinger.is_external_url('http://google.com/'), True)
self.assertEquals(self.pinger.is_external_url('/blog/'), False)
r = URLRessources()
self.assertEquals(self.pinger.is_external_url(
'http://example.com/', 'http://google.com/'), True)
self.assertEquals(self.pinger.is_external_url(
'http://example.com/toto/', 'http://google.com/titi/'), True)
self.assertEquals(self.pinger.is_external_url(
'http://example.com/blog/', 'http://example.com/page/'), False)
self.assertEquals(self.pinger.is_external_url(
'%s/blog/' % r.site_url, r.site_url), False)
self.assertEquals(self.pinger.is_external_url(
'http://google.com/', r.site_url), True)
self.assertEquals(self.pinger.is_external_url(
'/blog/', r.site_url), False)

def test_find_external_urls(self):
r = URLRessources()
external_urls = self.pinger.find_external_urls(self.entry)
self.assertEquals(external_urls, [])
self.entry.content = """
<p>This is a <a href="http://fantomas.willbreak.it/">link</a> to a site.</p>
<p>This is a <a href="%s/blog/">link</a> within my site.</p>
<p>This is a <a href="/blog/">relative link</a> within my site.</p>
""" % SITE
""" % r.site_url
self.entry.save()
external_urls = self.pinger.find_external_urls(self.entry)
self.assertEquals(external_urls, ['http://fantomas.willbreak.it/'])
Expand Down

0 comments on commit 4dff50b

Please sign in to comment.