Skip to content

Commit

Permalink
Explicitly mark redirect views as permanent or not.
Browse files Browse the repository at this point in the history
This fixes warnings of the default changing in 1.9.

Fixes #15.
  • Loading branch information
przem8k committed May 3, 2015
1 parent 8ad6f83 commit b7fd585
Show file tree
Hide file tree
Showing 12 changed files with 48 additions and 36 deletions.
2 changes: 1 addition & 1 deletion articles/test_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ def test_approve_article(self):

# Try to approve the article - approver can and does.
response = self.get(article.get_approve_url(), self.user_approver_zoe)
self.assertEqual(301, response.status_code)
self.assertEqual(302, response.status_code)
article = Article.objects.get(id=article.id) # Refresh from db.
self.assertTrue(article.is_live())

Expand Down
4 changes: 2 additions & 2 deletions articles/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@
from content.trevor import put_text_in_trevor
from content.mixins import ContentItemEditMixin, ContentItemAddMixin
from content.mixins import ContentItemViewMixin
from content.mixins import ContentItemApproveMixin
from content.views import ReviewContentView
from content.views import ApproveContentView


class IndexView(TemplateView):
Expand Down Expand Up @@ -66,5 +66,5 @@ class ReviewArticle(GetArticleMixin, ReviewContentView):
pass


class ApproveArticle(GetArticleMixin, ContentItemApproveMixin, RedirectView):
class ApproveArticle(GetArticleMixin, ApproveContentView):
pass
10 changes: 5 additions & 5 deletions blog/test_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def test_approve_post(self):

# Try to approve the post - approver can and does.
response = self.get(post.get_approve_url(), self.user_approver_zoe)
self.assertEqual(301, response.status_code)
self.assertEqual(302, response.status_code)
post = Post.objects.get(id=post.id) # Refresh from db.
self.assertTrue(post.is_live())

Expand All @@ -76,21 +76,21 @@ def test_review_post(self):
# message.
response = self.get_client(self.user_alice).get(post.get_review_url(),
follow=True)
self.assertRedirects(response, post.get_absolute_url(), status_code=301)
self.assertRedirects(response, post.get_absolute_url())
self.assertTrue('messages' in response.context)
self.assertEqual(1, len(response.context['messages']))

# Bob should be redirected too.
response = self.get_client(self.user_bob).get(post.get_review_url(),
follow=True)
self.assertRedirects(response, post.get_absolute_url(), status_code=301)
self.assertRedirects(response, post.get_absolute_url())
self.assertTrue('messages' in response.context)
self.assertEqual(1, len(response.context['messages']))

# And the valid approver too.
response = self.get_client(self.user_approver_zoe).get(
post.get_review_url(), follow=True)
self.assertRedirects(response, post.get_absolute_url(), status_code=301)
self.assertRedirects(response, post.get_absolute_url())
self.assertTrue('messages' in response.context)
self.assertEqual(1, len(response.context['messages']))

Expand All @@ -99,6 +99,6 @@ def test_review_post(self):
post.save()
response = self.get_client(self.user_approver_zoe).get(
post.get_review_url(), follow=True)
self.assertRedirects(response, post.get_absolute_url(), status_code=301)
self.assertRedirects(response, post.get_absolute_url())
self.assertTrue('messages' in response.context)
self.assertEqual(1, len(response.context['messages']))
4 changes: 2 additions & 2 deletions blog/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
from blog.models import Post
from content.mixins import ContentItemEditMixin, ContentItemAddMixin
from content.mixins import ContentItemViewMixin
from content.mixins import ContentItemApproveMixin
from content.views import ReviewContentView
from content.views import ApproveContentView


def obsolete_post(request, post_id):
Expand Down Expand Up @@ -82,5 +82,5 @@ class ReviewPost(GetPostMixin, ReviewContentView):
pass


class ApprovePost(GetPostMixin, ContentItemApproveMixin, RedirectView):
class ApprovePost(GetPostMixin, ApproveContentView):
pass
15 changes: 0 additions & 15 deletions content/mixins.py
Original file line number Diff line number Diff line change
Expand Up @@ -47,21 +47,6 @@ def form_valid(self, form):
return ret


class ContentItemApproveMixin(object):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
item = self.get_object()
if not item.can_be_approved_by(self.request.user):
raise Http404
return super().dispatch(*args, **kwargs)

def get_redirect_url(self, *args, **kwargs):
item = self.get_object()
item.reviewed = True
item.save()
return item.get_absolute_url()


class ContentItemEditMixin(object):
@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
Expand Down
26 changes: 26 additions & 0 deletions content/views.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import Http404
from django.utils.decorators import method_decorator
from django.views.generic import RedirectView

Expand All @@ -12,6 +13,7 @@ class ReviewContentView(RedirectView):
Requirements for impl:
- self.get_object() has to return the content item
"""
permanent = False

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
Expand All @@ -34,3 +36,27 @@ def get_redirect_url(self, *args, **kwargs):
"Edytuj lub zatwierdź materiał przy pomocy linków "
"na dole strony.")
return item.get_absolute_url()


class ApproveContentView(RedirectView):
""" Marks the content item as reviewed.
Requirements for impl:
- self.get_object() has to return the content item
"""
permanent = False

@method_decorator(login_required)
def dispatch(self, *args, **kwargs):
item = self.get_object()
if not item.can_be_approved_by(self.request.user):
raise Http404
return super().dispatch(*args, **kwargs)

def get_redirect_url(self, *args, **kwargs):
item = self.get_object()
item.reviewed = True
item.save()
messages.add_message(self.request, messages.INFO,
"Materiał zatwierdzony.")
return item.get_absolute_url()
2 changes: 1 addition & 1 deletion events/test_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ def test_approve_event(self):

# Try to approve the event - approver can and does.
response = self.get(event.get_approve_url(), self.user_approver_zoe)
self.assertEqual(301, response.status_code)
self.assertEqual(302, response.status_code)
event = Event.objects.get(id=event.id) # Refresh from db.
self.assertTrue(event.is_live())

Expand Down
5 changes: 3 additions & 2 deletions events/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,8 @@
from content.trevor import put_text_in_trevor
from content.mixins import ContentItemEditMixin, ContentItemAddMixin
from content.mixins import ContentItemViewMixin, ManageInlineFormsetMixin
from content.mixins import ContentItemApproveMixin
from content.views import ReviewContentView
from content.views import ApproveContentView


class EventIndex(EventMenuMixin, TemplateView):
Expand Down Expand Up @@ -72,6 +72,7 @@ class EventDetail(ContentItemViewMixin, DateDetailView):
class MonthArchiveRedirect(RedirectView):
""" Redirect for the per-month archives which were replaced by per-year
archives. """
permanent = True

def get_redirect_url(self, *args, **kwargs):
return reverse('event_year', kwargs={'year': kwargs['year']})
Expand Down Expand Up @@ -176,5 +177,5 @@ class ReviewEvent(GetEventMixin, ReviewContentView):
pass


class ApproveEvent(GetEventMixin, ContentItemApproveMixin, RedirectView):
class ApproveEvent(GetEventMixin, ApproveContentView):
pass
2 changes: 1 addition & 1 deletion songs/entity_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,6 @@
url(r'^(?P<entity_slug>[-\w]+)/(?P<slug>[-\w]+)/', include([
url(r'^$', views.SongRedirectView.as_view()),
url(r'^drukuj/$', RedirectView.as_view(
url='/spiewnik/%(entity_slug)s/%(slug)s/')),
url='/spiewnik/%(entity_slug)s/%(slug)s/', permanent=True)),
])),
]
2 changes: 1 addition & 1 deletion songs/test_urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -95,7 +95,7 @@ def test_approve_song(self):

# Try to approve the song - approver can and does.
response = self.get(song.get_approve_url(), self.user_approver_zoe)
self.assertEqual(301, response.status_code)
self.assertEqual(302, response.status_code)
song = Song.objects.get(id=song.id) # Refresh from db.
self.assertTrue(song.is_live())

Expand Down
7 changes: 3 additions & 4 deletions songs/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@
from artists.models import Entity
from content.mixins import ContentItemEditMixin, ContentItemAddMixin
from content.mixins import ContentItemViewMixin
from content.mixins import ContentItemApproveMixin
from content.mixins import ManageInlineFormsetMixin
from songs.forms import SongForm, ContributionFormSet
from songs.lyrics import render_lyrics
from songs.models import Song, EntityContribution
from content.views import ReviewContentView
from content.views import ApproveContentView


INITIAL_LYRICS = """\
Expand Down Expand Up @@ -47,8 +47,7 @@ def get_song_by_entity_or_404(song_slug, entity_slug):


class SongRedirectView(RedirectView):
""" Displays a songs by default, returns transposed lyrics part in json if
asked. """
permanent = True

def get_redirect_url(self, *args, **kwargs):
song = get_song_by_entity_or_404(kwargs['slug'], kwargs['entity_slug'])
Expand Down Expand Up @@ -197,5 +196,5 @@ class ReviewSong(GetSongMixin, ReviewContentView):
pass


class ApproveSong(GetSongMixin, ContentItemApproveMixin, RedirectView):
class ApproveSong(GetSongMixin, ApproveContentView):
pass
5 changes: 3 additions & 2 deletions urls.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,8 +10,9 @@
urlpatterns = [
# Obsolete paths redicrects.
url(r'^songs/song/(?P<song_id>\d+)/$', songs.obsolete.obsolete_song),
url(r'^about/$', RedirectView.as_view(url="/o-stronie/")),
url(r'^facebook/$', RedirectView.as_view(url="/o-stronie/")),
url(r'^about/$', RedirectView.as_view(url="/o-stronie/", permanent=True)),
url(r'^facebook/$', RedirectView.as_view(url="/o-stronie/",
permanent=True)),
# Songbook.
url(r'^spiewnik/', include('songs.entity_urls')),
url(r'^opracowanie/', include('songs.song_urls')),
Expand Down

0 comments on commit b7fd585

Please sign in to comment.