From b526716c8d778a9a650312806a8009bc8bbc7c04 Mon Sep 17 00:00:00 2001 From: Stephen Burrows Date: Tue, 25 Jan 2011 15:40:12 -0500 Subject: [PATCH] Added get_item_queryset method to BlogView and NewsletterView so that subclasses can replace this functionality. Moved get_context hook onto the MultiView base class and added a basic_view method which provides a simple way to add a view method to a multiview's urlpatterns for a related View subclass instance. --- contrib/penfield/models.py | 53 +++++++++++++++----------------------- contrib/waldo/models.py | 4 --- models/nodes.py | 22 ++++++++++++++++ 3 files changed, 43 insertions(+), 36 deletions(-) diff --git a/contrib/penfield/models.py b/contrib/penfield/models.py index 4191463..6b6b1f7 100644 --- a/contrib/penfield/models.py +++ b/contrib/penfield/models.py @@ -104,9 +104,6 @@ class BlogView(MultiView, FeedMultiViewMixin): return 'entries_by_day', [], kwargs raise ViewCanNotProvideSubpath - def get_context(self): - return {'blog': self.blog} - @property def urlpatterns(self): urlpatterns = patterns('', @@ -121,7 +118,7 @@ class BlogView(MultiView, FeedMultiViewMixin): ) if self.tag_archive_page: urlpatterns += patterns('', - url((r'^(?:%s)/?$' % self.tag_permalink_base), self.tag_archive_view) + url((r'^(?:%s)/?$' % self.tag_permalink_base), self.basic_view('tag_archive_page')) ) if self.entry_archive_page: @@ -160,13 +157,19 @@ class BlogView(MultiView, FeedMultiViewMixin): ) return urlpatterns + def get_context(self): + return {'blog': self.blog} + + def get_item_queryset(self): + return self.blog.entries.all() + def get_all_entries(self, request, extra_context=None): - return self.blog.entries.all(), extra_context + return self.get_item_queryset(), extra_context def get_entries_by_ymd(self, request, year=None, month=None, day=None, extra_context=None): if not self.entry_archive_page: raise Http404 - entries = self.blog.entries.all() + entries = self.get_item_queryset() if year: entries = entries.filter(date__year=year) if month: @@ -191,12 +194,11 @@ class BlogView(MultiView, FeedMultiViewMixin): if slug and slug not in found_slugs: raise Http404 - entries = self.blog.entries.all() + entries = self.get_item_queryset() for tag in tags: entries = entries.filter(tags=tag) - context = self.get_context() - context.update(extra_context or {}) + context = extra_context or {} context.update({'tags': tags}) return entries, context @@ -227,7 +229,7 @@ class BlogView(MultiView, FeedMultiViewMixin): return super(BlogView, self).get_feed(feed_type, extra_context, defaults) def entry_view(self, request, slug, year=None, month=None, day=None, extra_context=None): - entries = self.blog.entries.all() + entries = self.get_item_queryset() if year: entries = entries.filter(date__year=year) if month: @@ -242,14 +244,6 @@ class BlogView(MultiView, FeedMultiViewMixin): context.update(extra_context or {}) context.update({'entry': entry}) return self.entry_page.render_to_response(request, extra_context=context) - - def tag_archive_view(self, request, extra_context=None): - if not self.tag_archive_page: - raise Http404 - context = {} - context.update(extra_context or {}) - context.update({'blog': self.blog}) - return self.tag_archive_page.render_to_response(request, extra_context=context) class Newsletter(Entity, Titled): @@ -352,7 +346,7 @@ class NewsletterView(MultiView, FeedMultiViewMixin): ) if self.issue_archive_page: urlpatterns += patterns('', - url(r'^(?:%s)/$' % self.issue_permalink_base, self.issue_archive_view) + url(r'^(?:%s)/$' % self.issue_permalink_base, self.basic_view('issue_archive_page')) ) if self.article_archive_page: urlpatterns += patterns('', @@ -393,16 +387,19 @@ class NewsletterView(MultiView, FeedMultiViewMixin): def get_context(self): return {'newsletter': self.newsletter} + def get_item_queryset(self): + return self.newsletter.articles.all() + def get_all_articles(self, request, extra_context=None): - return self.newsletter.articles.all(), extra_context + return self.get_item_queryset(), extra_context def get_articles_by_ymd(self, request, year, month=None, day=None, extra_context=None): - articles = self.newsletter.articles.filter(dat__year=year) + articles = self.get_item_queryset().filter(date__year=year) if month: articles = articles.filter(date__month=month) if day: articles = articles.filter(date__day=day) - return articles + return articles, extra_context def get_articles_by_issue(self, request, numbering, extra_context=None): try: @@ -411,10 +408,10 @@ class NewsletterView(MultiView, FeedMultiViewMixin): raise Http404 context = extra_context or {} context.update({'issue': issue}) - return issue.articles.all(), context + return self.get_item_queryset().filter(issues=issue), context def article_view(self, request, slug, year=None, month=None, day=None, extra_context=None): - articles = self.newsletter.articles.all() + articles = self.get_item_queryset() if year: articles = articles.filter(date__year=year) if month: @@ -430,14 +427,6 @@ class NewsletterView(MultiView, FeedMultiViewMixin): context.update({'article': article}) return self.article_page.render_to_response(request, extra_context=context) - def issue_archive_view(self, request, extra_context=None): - if not self.issue_archive_page: - raise Http404 - context = {} - context.update(extra_context or {}) - context.update({'newsletter': self.newsletter}) - return self.issue_archive_page.render_to_response(request, extra_context=context) - def add_item(self, feed, obj, kwargs=None): title = loader.get_template("penfield/feeds/newsletter_article/title.html") description = loader.get_template("penfield/feeds/newsletter_article/description.html") diff --git a/contrib/waldo/models.py b/contrib/waldo/models.py index c537ba9..2f40da7 100644 --- a/contrib/waldo/models.py +++ b/contrib/waldo/models.py @@ -67,10 +67,6 @@ class LoginMultiView(MultiView): } kwargs.update(reverse_kwargs or {}) return 'http://%s%s' % (current_site.domain, self.reverse(confirmation_view, kwargs=kwargs, node=node)) - - def get_context(self): - """Hook for providing instance-specific context - such as the value of a Field - to all views.""" - return {} def display_login_page(self, request, message, extra_context=None): request.session.set_test_cookie() diff --git a/models/nodes.py b/models/nodes.py index de10ed1..2bfb4fd 100644 --- a/models/nodes.py +++ b/models/nodes.py @@ -127,6 +127,28 @@ class MultiView(View): return '/%s/%s/' % (node.get_absolute_url().strip('/'), subpath.strip('/')) return subpath + def get_context(self): + """Hook for providing instance-specific context - such as the value of a Field - to all views.""" + return {} + + def basic_view(self, view_name): + """ + Wraps a field name and returns a simple view function that will render that view + with a basic context. This assumes that the field name is a ForeignKey to a + model with a render_to_response method. + """ + field = self._meta.get_field(view_name) + view = getattr(self, field.name, None) + + def inner(request, extra_context=None, **kwargs): + if not view: + raise Http404 + context = self.get_context() + context.update(extra_context or {}) + return view.render_to_response(request, extra_context=context) + + return inner + class Meta: abstract = True -- 2.20.1