Added django badge
[e_cidadania.git] / src / apps / ecidadania / news / views.py
blob4577f41d655f6e30d5e1b38d990f63f63135d14d
1 # -*- coding: utf-8 -*-
3 # Copyright (c) 2013 Clione Software
4 # Copyright (c) 2010-2013 Cidadania S. Coop. Galega
6 # Licensed under the Apache License, Version 2.0 (the "License");
7 # you may not use this file except in compliance with the License.
8 # You may obtain a copy of the License at
10 # http://www.apache.org/licenses/LICENSE-2.0
12 # Unless required by applicable law or agreed to in writing, software
13 # distributed under the License is distributed on an "AS IS" BASIS,
14 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 # See the License for the specific language governing permissions and
16 # limitations under the License.
18 from django.http import HttpResponse, HttpResponseRedirect
19 from django.shortcuts import render_to_response, get_object_or_404, redirect
20 from django.utils.decorators import method_decorator
21 from django.contrib.auth.decorators import login_required, permission_required
22 from django.views.generic.base import TemplateView, RedirectView
23 from django.views.generic.list import ListView
24 from django.views.generic.edit import CreateView, UpdateView, DeleteView
25 from django.views.generic.detail import DetailView
26 from django.views.generic import FormView
27 from django.template import RequestContext
28 from django.contrib.auth.models import User
29 from django.core.urlresolvers import reverse
30 from django.core.exceptions import PermissionDenied
31 from guardian.shortcuts import assign_perm
33 from core.spaces import url_names as urln
34 from core.spaces.models import Space
35 from apps.ecidadania.news.models import Post
36 from apps.ecidadania.news.forms import NewsForm
39 class AddPost(FormView):
41 """
42 Create a new post. Only registered users belonging to a concrete group
43 are allowed to create news. only site administrators will be able to
44 post news in the index page.
46 .. versionadded: 0.1
48 :permissions required: admin_space, mod_space
49 :parameters: space_url
50 :context: get_place
51 """
52 form_class = NewsForm
53 template_name = 'news/post_form.html'
55 def dispatch(self, request, *args, **kwargs):
56 space = get_object_or_404(Space, url=kwargs['space_url'])
58 if (request.user.has_perm('admin_space', space) or
59 request.user.has_perm('mod_space', space)):
60 return super(AddPost, self).dispatch(request, *args, **kwargs)
61 else:
62 raise PermissionDenied
64 def get_success_url(self):
65 space = self.kwargs['space_url']
66 return reverse(urln.SPACE_INDEX, kwargs={'space_url': space})
68 def form_valid(self, form):
69 self.space = get_object_or_404(Space, url=self.kwargs['space_url'])
70 form_uncommited = form.save(commit=False)
71 form_uncommited.author = self.request.user
72 form_uncommited.space = self.space
73 form_uncommited.save()
74 return super(AddPost, self).form_valid(form)
76 def get_context_data(self, **kwargs):
77 context = super(AddPost, self).get_context_data(**kwargs)
78 self.space = get_object_or_404(Space, url=self.kwargs['space_url'])
79 context['get_place'] = self.space
80 return context
83 class ViewPost(DetailView):
85 """
86 View a specific post.
88 :permissions required: view_space
89 """
90 context_object_name = 'news'
91 template_name = 'news/post_detail.html'
93 def dispatch(self, request, *args, **kwargs):
94 space = get_object_or_404(Space, url=kwargs['space_url'])
96 if request.user.has_perm('view_space', space):
97 return super(ViewPost, self).dispatch(request, *args, **kwargs)
98 else:
99 raise PermissionDenied
101 def get_object(self):
102 post = Post.objects.get(pk=self.kwargs['post_id'])
103 try:
104 post.views = post.views + 1
105 except:
106 post.views = 1
107 post.save()
108 return post
110 def get_context_data(self, **kwargs):
113 Get extra context data for the ViewPost view.
115 context = super(ViewPost, self).get_context_data(**kwargs)
116 context['get_place'] = get_object_or_404(Space, url=self.kwargs['space_url'])
117 return context
120 class EditPost(UpdateView):
123 Edit an existent post.
125 :permissions required: admin_space, mod_space
126 :parameters: space_url, post_id
127 :context: get_place
129 model = Post
130 template_name = 'news/post_form.html'
132 def dispatch(self, request, *args, **kwargs):
133 space = get_object_or_404(Space, url=kwargs['space_url'])
135 if (request.user.has_perm('admin_space', space) or
136 request.user.has_perm('mod_space', space)):
137 return super(EditPost, self).dispatch(request, *args, **kwargs)
138 else:
139 raise PermissionDenied
141 def form_valid(self, form):
142 self.space = get_object_or_404(Space, url=self.kwargs['space_url'])
143 form_uncommited = form.save(commit=False)
144 form_uncommited.author = self.request.user
145 form_uncommited.space = self.space
146 form_uncommited.save()
147 return super(EditPost, self).form_valid(form)
149 def get_success_url(self):
150 space = self.kwargs['space_url']
151 return reverse(urln.SPACE_INDEX, kwargs={'space_url': space})
153 def get_object(self):
154 cur_post = get_object_or_404(Post, pk=self.kwargs['post_id'])
155 return cur_post
157 def get_context_data(self, **kwargs):
158 context = super(EditPost, self).get_context_data(**kwargs)
159 context['get_place'] = get_object_or_404(Space, url=self.kwargs['space_url'])
160 return context
163 class DeletePost(DeleteView):
166 Delete an existent post. Post deletion is only reserved to spaces
167 administrators or site admins.
169 context_object_name = "get_place"
171 def dispatch(self, request, *args, **kwargs):
172 space = get_object_or_404(Space, url=kwargs['space_url'])
174 if (request.user.has_perm('admin_space', space) or
175 request.user.has_perm('mod_space', space)):
176 return super(DeletePost, self).dispatch(request, *args, **kwargs)
177 else:
178 raise PermissionDenied
180 def get_success_url(self):
181 space = self.kwargs['space_url']
182 return reverse(urln.SPACE_INDEX, kwargs={'space_url': space})
184 def get_object(self):
185 return get_object_or_404(Post, pk=self.kwargs['post_id'])
187 def get_context_data(self, **kwargs):
190 Get extra context data for the ViewPost view.
192 context = super(DeletePost, self).get_context_data(**kwargs)
193 context['get_place'] = get_object_or_404(Space, url=self.kwargs['space_url'])
194 return context