diff --git a/articles/test_urls.py b/articles/test_urls.py index fb51619..8422dfc 100644 --- a/articles/test_urls.py +++ b/articles/test_urls.py @@ -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()) diff --git a/articles/views.py b/articles/views.py index 944e27b..0abd657 100644 --- a/articles/views.py +++ b/articles/views.py @@ -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): @@ -66,5 +66,5 @@ class ReviewArticle(GetArticleMixin, ReviewContentView): pass -class ApproveArticle(GetArticleMixin, ContentItemApproveMixin, RedirectView): +class ApproveArticle(GetArticleMixin, ApproveContentView): pass diff --git a/blog/test_urls.py b/blog/test_urls.py index f3f875b..7fff9c3 100644 --- a/blog/test_urls.py +++ b/blog/test_urls.py @@ -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()) @@ -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'])) @@ -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'])) diff --git a/blog/views.py b/blog/views.py index af11d62..152995e 100644 --- a/blog/views.py +++ b/blog/views.py @@ -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): @@ -82,5 +82,5 @@ class ReviewPost(GetPostMixin, ReviewContentView): pass -class ApprovePost(GetPostMixin, ContentItemApproveMixin, RedirectView): +class ApprovePost(GetPostMixin, ApproveContentView): pass diff --git a/content/mixins.py b/content/mixins.py index e68c307..60d6d5d 100644 --- a/content/mixins.py +++ b/content/mixins.py @@ -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): diff --git a/content/views.py b/content/views.py index 74bcf30..5b374ed 100644 --- a/content/views.py +++ b/content/views.py @@ -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 @@ -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): @@ -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() diff --git a/events/test_urls.py b/events/test_urls.py index 78cfdf8..adf9c88 100644 --- a/events/test_urls.py +++ b/events/test_urls.py @@ -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()) diff --git a/events/views.py b/events/views.py index 12aaef5..dbe1212 100644 --- a/events/views.py +++ b/events/views.py @@ -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): @@ -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']}) @@ -176,5 +177,5 @@ class ReviewEvent(GetEventMixin, ReviewContentView): pass -class ApproveEvent(GetEventMixin, ContentItemApproveMixin, RedirectView): +class ApproveEvent(GetEventMixin, ApproveContentView): pass diff --git a/songs/entity_urls.py b/songs/entity_urls.py index 7987ecf..51302b4 100644 --- a/songs/entity_urls.py +++ b/songs/entity_urls.py @@ -11,6 +11,6 @@ url(r'^(?P[-\w]+)/(?P[-\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)), ])), ] diff --git a/songs/test_urls.py b/songs/test_urls.py index 0b2b262..d3dcf60 100644 --- a/songs/test_urls.py +++ b/songs/test_urls.py @@ -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()) diff --git a/songs/views.py b/songs/views.py index bbc3d3a..2e111ef 100644 --- a/songs/views.py +++ b/songs/views.py @@ -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 = """\ @@ -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']) @@ -197,5 +196,5 @@ class ReviewSong(GetSongMixin, ReviewContentView): pass -class ApproveSong(GetSongMixin, ContentItemApproveMixin, RedirectView): +class ApproveSong(GetSongMixin, ApproveContentView): pass diff --git a/urls.py b/urls.py index bc14d17..2e7083c 100644 --- a/urls.py +++ b/urls.py @@ -10,8 +10,9 @@ urlpatterns = [ # Obsolete paths redicrects. url(r'^songs/song/(?P\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')),