Fix #5440 - Typo in blog views
[mediagoblin.git] / mediagoblin / media_types / blog / views.py
1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License as published by
6 # the Free Software Foundation, either version 3 of the License, or
7 # (at your option) any later version.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU Affero General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16
17 import logging
18 _log = logging.getLogger(__name__)
19
20 from datetime import datetime
21
22 import six
23
24 from werkzeug.exceptions import Forbidden
25 from mediagoblin.tools import pluginapi
26
27 from mediagoblin import mg_globals
28
29 from mediagoblin.media_types.blog import forms as blog_forms
30 from mediagoblin.media_types.blog.models import Blog, BlogPostData
31 from mediagoblin.media_types.blog.lib import (
32 may_edit_blogpost, set_blogpost_state, get_all_blogposts_of_blog,
33 get_blog_by_slug)
34
35 from mediagoblin.messages import add_message, SUCCESS, ERROR
36 from mediagoblin.decorators import (require_active_login, active_user_from_url,
37 get_media_entry_by_id, user_may_alter_collection,
38 get_user_collection, uses_pagination)
39 from mediagoblin.tools.pagination import Pagination
40 from mediagoblin.tools.response import (render_to_response,
41 redirect, render_404)
42 from mediagoblin.tools.translate import pass_to_ugettext as _
43 from mediagoblin.tools.template import render_template
44 from mediagoblin.tools.text import (
45 convert_to_tag_list_of_dicts, media_tags_as_string, clean_html,
46 cleaned_markdown_conversion)
47
48 from mediagoblin.db.util import check_media_slug_used, check_collection_slug_used
49 from mediagoblin.db.models import User, Collection, MediaEntry, LocalUser
50
51 from mediagoblin.notifications import add_comment_subscription
52
53
54 @require_active_login
55 def blog_edit(request):
56 """
57 View for editing an existing blog or creating a new blog
58 if user have not exceeded maximum allowed acount of blogs.
59 """
60 url_user = request.matchdict.get('user', None)
61 blog_slug = request.matchdict.get('blog_slug', None)
62
63 config = pluginapi.get_config('mediagoblin.media_types.blog')
64 max_blog_count = config['max_blog_count']
65 form = blog_forms.BlogEditForm(request.form)
66 # creating a blog
67 if not blog_slug:
68 if Blog.query.filter_by(author=request.user.id).count()<max_blog_count:
69 if request.method=='GET':
70 return render_to_response(
71 request,
72 'mediagoblin/blog/blog_edit_create.html',
73 {'form': form,
74 'user' : request.user,
75 'app_config': mg_globals.app_config})
76
77 if request.method=='POST' and form.validate():
78 _log.info("Here")
79 blog = request.db.Blog()
80 blog.title = six.text_type(form.title.data)
81 blog.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
82 blog.author = request.user.id
83 blog.generate_slug()
84
85 blog.save()
86 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
87 user=request.user.username
88 )
89 else:
90 add_message(request, ERROR, "Welcome! You already have created \
91 maximum number of blogs.")
92 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
93 user=request.user.username)
94
95
96 #Blog already exists.
97 else:
98 blog = get_blog_by_slug(request, blog_slug)
99 if not blog:
100 return render_404(request)
101 if request.method == 'GET':
102 defaults = dict(
103 title = blog.title,
104 description = cleaned_markdown_conversion(blog.description),
105 author = request.user.id)
106
107 form = blog_forms.BlogEditForm(**defaults)
108
109 return render_to_response(
110 request,
111 'mediagoblin/blog/blog_edit_create.html',
112 {'form': form,
113 'user': request.user,
114 'app_config': mg_globals.app_config})
115 else:
116 if request.method == 'POST' and form.validate():
117 blog.title = six.text_type(form.title.data)
118 blog.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
119 blog.author = request.user.id
120 blog.generate_slug()
121
122 blog.save()
123 add_message(request, SUCCESS, "Your blog is updated.")
124 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
125 user=request.user.username,
126 blog_slug=blog.slug)
127
128
129 @require_active_login
130 def blogpost_create(request):
131
132 form = blog_forms.BlogPostEditForm(request.form, license=request.user.license_preference)
133
134 if request.method == 'POST' and form.validate():
135 blog_slug = request.matchdict.get('blog_slug')
136 blog = get_blog_by_slug(request, blog_slug, author=request.user.id)
137 if not blog:
138 return render_404(request)
139
140 blogpost = request.db.MediaEntry()
141 blogpost.media_type = 'mediagoblin.media_types.blogpost'
142 blogpost.title = six.text_type(form.title.data)
143 blogpost.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
144 blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
145 blogpost.license = six.text_type(form.license.data) or None
146 blogpost.actor = request.user.id
147 blogpost.generate_slug()
148
149 set_blogpost_state(request, blogpost)
150 blogpost.save()
151
152 # connect this blogpost to its blog
153 blog_post_data = request.db.BlogPostData()
154 blog_post_data.blog = blog.id
155 blog_post_data.media_entry = blogpost.id
156 blog_post_data.save()
157
158 add_message(request, SUCCESS, _('Woohoo! Submitted!'))
159 add_comment_subscription(request.user, blogpost)
160 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
161 user=request.user.username,
162 blog_slug=blog.slug)
163
164 return render_to_response(
165 request,
166 'mediagoblin/blog/blog_post_edit_create.html',
167 {'form': form,
168 'app_config': mg_globals.app_config,
169 'user': request.user.username})
170
171
172 @require_active_login
173 def blogpost_edit(request):
174
175 blog_slug = request.matchdict.get('blog_slug', None)
176 blog_post_slug = request.matchdict.get('blog_post_slug', None)
177
178 blogpost = request.db.MediaEntry.query.filter_by(slug=blog_post_slug, actor=request.user.id).first()
179 blog = get_blog_by_slug(request, blog_slug, author=request.user.id)
180
181 if not blogpost or not blog:
182 return render_404(request)
183
184 defaults = dict(
185 title = blogpost.title,
186 description = cleaned_markdown_conversion(blogpost.description),
187 tags=media_tags_as_string(blogpost.tags),
188 license=blogpost.license)
189
190 form = blog_forms.BlogPostEditForm(request.form, **defaults)
191 if request.method == 'POST' and form.validate():
192 blogpost.title = six.text_type(form.title.data)
193 blogpost.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
194 blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
195 blogpost.license = six.text_type(form.license.data)
196 set_blogpost_state(request, blogpost)
197 blogpost.generate_slug()
198 blogpost.save()
199
200 add_message(request, SUCCESS, _('Woohoo! edited blogpost is submitted'))
201 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
202 user=request.user.username,
203 blog_slug=blog.slug)
204
205 return render_to_response(
206 request,
207 'mediagoblin/blog/blog_post_edit_create.html',
208 {'form': form,
209 'app_config': mg_globals.app_config,
210 'user': request.user.username,
211 'blog_post_slug': blog_post_slug
212 })
213
214
215 @active_user_from_url
216 @uses_pagination
217 def blog_dashboard(request, page, url_user=None):
218 """
219 Dashboard for a blog, only accessible to
220 the owner of the blog.
221 """
222 blog_slug = request.matchdict.get('blog_slug', None)
223 blogs = request.db.Blog.query.filter_by(author=url_user.id)
224 config = pluginapi.get_config('mediagoblin.media_types.blog')
225 max_blog_count = config['max_blog_count']
226 if request.user and (request.user.id == url_user.id or request.user.has_privilege(u'admin')):
227 if blog_slug:
228 blog = get_blog_by_slug(request, blog_slug)
229 if not blog:
230 return render_404(request)
231 else:
232 blog_posts_list = blog.get_all_blog_posts().order_by(MediaEntry.created.desc())
233 pagination = Pagination(page, blog_posts_list)
234 pagination.per_page = 15
235 blog_posts_on_a_page = pagination()
236 if may_edit_blogpost(request, blog):
237 return render_to_response(
238 request,
239 'mediagoblin/blog/blog_admin_dashboard.html',
240 {'blog_posts_list': blog_posts_on_a_page,
241 'blog_slug':blog_slug,
242 'blog':blog,
243 'user':url_user,
244 'pagination':pagination
245 })
246 if not request.user or request.user.id != url_user.id or not blog_slug:
247 blogs = blogs.all()
248 return render_to_response(
249 request,
250 'mediagoblin/blog/list_of_blogs.html',
251 {
252 'blogs':blogs,
253 'user':url_user,
254 'max_blog_count':max_blog_count
255 })
256
257
258 @active_user_from_url
259 @uses_pagination
260 def blog_post_listing(request, page, url_user=None):
261 """
262 Page, listing all the blog posts of a particular blog.
263 """
264 blog_slug = request.matchdict['blog_slug']
265 blog = get_blog_by_slug(request, blog_slug, author=url_user.id)
266 if not blog:
267 return render_404(request)
268
269 all_blog_posts = blog.get_all_blog_posts(u'processed').order_by(MediaEntry.created.desc())
270 pagination = Pagination(page, all_blog_posts)
271 pagination.per_page = 8
272 blog_posts_on_a_page = pagination()
273
274 return render_to_response(
275 request,
276 'mediagoblin/blog/blog_post_listing.html',
277 {'blog_posts': blog_posts_on_a_page,
278 'pagination': pagination,
279 'blog_owner': url_user,
280 'blog':blog
281 })
282
283
284 @require_active_login
285 def draft_view(request):
286 blog_slug = request.matchdict.get('blog_slug', None)
287 blog_post_slug = request.matchdict.get('blog_post_slug', None)
288 user = request.matchdict.get('user')
289 blog = get_blog_by_slug(request, blog_slug, author=request.user.id)
290 blogpost = request.db.MediaEntry.query.filter_by(state = u'failed', actor=request.user.id, slug=blog_post_slug).first()
291
292 if not blog or not blogpost:
293 return render_404(request)
294
295 return render_to_response(
296 request,
297 'mediagoblin/blog/blogpost_draft_view.html',
298 {'blogpost':blogpost,
299 'blog': blog
300 })
301
302
303 @require_active_login
304 def blog_delete(request, **kwargs):
305 """
306 Deletes a blog and media entries, tags associated with it.
307 """
308 url_user = request.matchdict.get('user')
309 owner_user = request.db.LocalUser.query.filter(
310 LocalUser.username==url_user
311 ).first()
312
313 blog_slug = request.matchdict.get('blog_slug', None)
314 blog = get_blog_by_slug(request, blog_slug, author=owner_user.id)
315 if not blog:
316 return render_404(request)
317
318 form = blog_forms.ConfirmDeleteForm(request.form)
319 if request.user.id == blog.author or request.user.has_privilege(u'admin'):
320 if request.method == 'POST' and form.validate():
321 if form.confirm.data is True:
322 blog.delete()
323 add_message(
324 request, SUCCESS, _('You deleted the Blog.'))
325 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
326 user=request.user.username)
327 else:
328 add_message(
329 request, ERROR,
330 _("The media was not deleted because you didn't check that you were sure."))
331 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
332 user=request.user.username)
333 else:
334 if request.user.has_privilege(u'admin'):
335 add_message(
336 request, WARNING,
337 _("You are about to delete another user's Blog. "
338 "Proceed with caution."))
339 return render_to_response(
340 request,
341 'mediagoblin/blog/blog_confirm_delete.html',
342 {'blog':blog,
343 'form':form
344 })
345 else:
346 add_message(
347 request, ERROR,
348 _("The blog was not deleted because you have no rights."))
349 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
350 user=request.user.username)
351
352
353 def blog_about_view(request):
354 """
355 Page containing blog description and statistics
356 """
357 blog_slug = request.matchdict.get('blog_slug', None)
358 url_user = request.matchdict.get('user', None)
359
360 user = request.db.LocalUser.query.filter(
361 LocalUser.username==url_user
362 ).first()
363 blog = get_blog_by_slug(request, blog_slug, author=user.id)
364
365 if not user or not blog:
366 return render_404(request)
367
368 else:
369 blog_posts_processed = blog.get_all_blog_posts(u'processed').count()
370 return render_to_response(
371 request,
372 'mediagoblin/blog/blog_about.html',
373 {'user': user,
374 'blog': blog,
375 'blogpost_count': blog_posts_processed
376 })