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
):
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.
48 :permissions required: admin_space, mod_space
49 :parameters: space_url
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
)
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
83 class ViewPost(DetailView
):
88 :permissions required: view_space
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
)
99 raise PermissionDenied
101 def get_object(self
):
102 post
= Post
.objects
.get(pk
=self
.kwargs
['post_id'])
104 post
.views
= post
.views
+ 1
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'])
120 class EditPost(UpdateView
):
123 Edit an existent post.
125 :permissions required: admin_space, mod_space
126 :parameters: space_url, post_id
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
)
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'])
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'])
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
)
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'])