some fixes
[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 from werkzeug.exceptions import Forbidden
23 from mediagoblin.tools import pluginapi
24
25 from mediagoblin import mg_globals
26
27 from mediagoblin.media_types.blog import forms as blog_forms
28 from mediagoblin.media_types.blog.models import Blog, BlogPostData
29 from mediagoblin.media_types.blog.lib import may_edit_blogpost, set_blogpost_state, get_all_blogposts_of_blog
30
31 from mediagoblin.messages import add_message, SUCCESS, ERROR
32 from mediagoblin.decorators import (require_active_login, active_user_from_url,
33 get_media_entry_by_id, user_may_alter_collection,
34 get_user_collection, uses_pagination)
35 from mediagoblin.tools.pagination import Pagination
36 from mediagoblin.tools.response import (render_to_response,
37 redirect, render_404)
38 from mediagoblin.tools.translate import pass_to_ugettext as _
39 from mediagoblin.tools.template import render_template
40 from mediagoblin.tools.text import (
41 convert_to_tag_list_of_dicts, media_tags_as_string, clean_html,
42 cleaned_markdown_conversion)
43
44 from mediagoblin.db.util import check_media_slug_used, check_collection_slug_used
45 from mediagoblin.db.models import User, Collection, MediaEntry
46
47 from mediagoblin.notifications import add_comment_subscription
48
49
50 @require_active_login
51 def blog_edit(request):
52 """
53 View for editing the existing blog or automatically
54 creating a new blog if user does not have any yet.
55 """
56 url_user = request.matchdict.get('user', None)
57 blog_slug = request.matchdict.get('blog_slug', None)
58
59 config = pluginapi.get_config('mediagoblin.media_types.blog')
60 max_blog_count = config['max_blog_count']
61 form = blog_forms.BlogEditForm(request.form)
62 # the blog doesn't exists yet
63 if not blog_slug:
64 if Blog.query.filter_by(author=request.user.id).count()<max_blog_count:
65 if request.method=='GET':
66 return render_to_response(
67 request,
68 'mediagoblin/blog/blog_edit_create.html',
69 {'form': form,
70 'user' : request.user,
71 'app_config': mg_globals.app_config})
72
73 if request.method=='POST' and form.validate():
74 _log.info("Here")
75 blog = request.db.Blog()
76 blog.title = unicode(form.title.data)
77 blog.description = unicode(cleaned_markdown_conversion((form.description.data)))
78 blog.author = request.user.id
79 blog.generate_slug()
80
81 blog.save()
82 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
83 user=request.user.username
84 )
85 else:
86 #the case when max blog count is one.
87 add_message(request, ERROR, "Welcome! You already have created a blog.")
88 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
89 user=request.user.username)
90
91
92 #Blog already exists.
93 else:
94 blog = request.db.Blog.query.filter_by(slug=blog_slug).first()
95 if request.method == 'GET':
96 defaults = dict(
97 title = blog.title,
98 description = cleaned_markdown_conversion(blog.description),
99 author = request.user.id)
100
101 form = blog_forms.BlogEditForm(**defaults)
102
103 return render_to_response(
104 request,
105 'mediagoblin/blog/blog_edit_create.html',
106 {'form': form,
107 'user': request.user,
108 'app_config': mg_globals.app_config})
109 else:
110 if request.method == 'POST' and form.validate():
111 blog.title = unicode(form.title.data)
112 blog.description = unicode(cleaned_markdown_conversion((form.description.data)))
113 blog.author = request.user.id
114 blog.generate_slug()
115
116 blog.save()
117 add_message(request, SUCCESS, "Your blog is updated.")
118 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
119 user=request.user.username,
120 blog_slug=blog.slug)
121
122
123 @require_active_login
124 def blogpost_create(request):
125
126 form = blog_forms.BlogPostEditForm(request.form, license=request.user.license_preference)
127
128 if request.method == 'POST' and form.validate():
129 blog_slug = request.matchdict.get('blog_slug')
130 blog = request.db.Blog.query.filter_by(slug=blog_slug,
131 author=request.user.id).first()
132 if not blog:
133 return render_404(request)
134
135 blogpost = request.db.MediaEntry()
136 blogpost.media_type = 'mediagoblin.media_types.blogpost'
137 blogpost.title = unicode(form.title.data)
138 blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
139 blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
140 blogpost.license = unicode(form.license.data) or None
141 blogpost.uploader = request.user.id
142 blogpost.generate_slug()
143
144 set_blogpost_state(request, blogpost)
145 blogpost.save()
146
147 # connect this blogpost to its blog
148 blog_post_data = request.db.BlogPostData()
149 blog_post_data.blog = blog.id
150 blog_post_data.media_entry = blogpost.id
151 blog_post_data.save()
152
153 add_message(request, SUCCESS, _('Woohoo! Submitted!'))
154 add_comment_subscription(request.user, blogpost)
155 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
156 user=request.user.username,
157 blog_slug=blog.slug)
158
159 return render_to_response(
160 request,
161 'mediagoblin/blog/blog_post_edit_create.html',
162 {'form': form,
163 'app_config': mg_globals.app_config,
164 'user': request.user.username})
165
166
167 @require_active_login
168 def blogpost_edit(request):
169 blog_slug = request.matchdict.get('blog_slug', None)
170 blog_post_slug = request.matchdict.get('blog_post_slug', None)
171
172 blogpost = request.db.MediaEntry.query.filter_by(slug=blog_post_slug, uploader=request.user.id).first()
173 blog = request.db.Blog.query.filter_by(slug=blog_slug, author=request.user.id).first()
174
175 if not blogpost or not blog:
176 return render_404(request)
177
178 defaults = dict(
179 title = blogpost.title,
180 description = cleaned_markdown_conversion(blogpost.description),
181 tags=media_tags_as_string(blogpost.tags),
182 license=blogpost.license)
183
184 form = blog_forms.BlogPostEditForm(request.form, **defaults)
185 if request.method == 'POST' and form.validate():
186 blogpost.title = unicode(form.title.data)
187 blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
188 blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
189 blogpost.license = unicode(form.license.data)
190 set_blogpost_state(request, blogpost)
191 blogpost.generate_slug()
192 blogpost.save()
193
194 add_message(request, SUCCESS, _('Woohoo! edited blogpost is submitted'))
195 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
196 user=request.user.username,
197 blog_slug=blog.slug)
198
199 return render_to_response(
200 request,
201 'mediagoblin/blog/blog_post_edit_create.html',
202 {'form': form,
203 'app_config': mg_globals.app_config,
204 'user': request.user.username,
205 'blog_post_slug': blog_post_slug
206 })
207
208
209 @uses_pagination
210 def blog_dashboard(request, page):
211
212 url_user = request.matchdict.get('user')
213 user = request.db.User.query.filter_by(username=url_user).one()
214 blog_slug = request.matchdict.get('blog_slug', None)
215 blogs = request.db.Blog.query.filter_by(author=user.id)
216 config = pluginapi.get_config('mediagoblin.media_types.blog')
217 max_blog_count = config['max_blog_count']
218 if (request.user and request.user.id == user.id) or (request.user and request.user.is_admin):
219 if blog_slug:
220 blog = blogs.filter(Blog.slug==blog_slug).first()
221 if not blog:
222 return render_404(request)
223 else:
224 blog_posts_list = blog.get_all_blog_posts().order_by(MediaEntry.created.desc())
225 pagination = Pagination(page, blog_posts_list)
226 pagination.per_page = 15
227 blog_posts_on_a_page = pagination()
228 if may_edit_blogpost(request, blog):
229 return render_to_response(
230 request,
231 'mediagoblin/blog/blog_admin_dashboard.html',
232 {'blog_posts_list': blog_posts_on_a_page,
233 'blog_slug':blog_slug,
234 'blog':blog,
235 'user':user,
236 'pagination':pagination
237 })
238 if not request.user or request.user.id != user.id or not blog_slug:
239 blogs = blogs.all()
240 return render_to_response(
241 request,
242 'mediagoblin/blog/list_of_blogs.html',
243 {
244 'blogs':blogs,
245 'user':user,
246 'max_blog_count':max_blog_count
247 })
248
249
250
251 #supposed to list all the blog posts belonging to a particular blog of particular user.
252 @uses_pagination
253 def blog_post_listing(request, page):
254
255 blog_owner = request.matchdict.get('user')
256 blog_slug = request.matchdict.get('blog_slug', None)
257 owner_user = User.query.filter_by(username=blog_owner).one()
258 blog = request.db.Blog.query.filter_by(slug=blog_slug).first()
259
260 if not owner_user or not blog:
261 return render_404(request)
262
263 all_blog_posts = blog.get_all_blog_posts(u'processed').order_by(MediaEntry.created.desc())
264 pagination = Pagination(page, all_blog_posts)
265 pagination.per_page = 8
266 blog_posts_on_a_page = pagination()
267
268 return render_to_response(
269 request,
270 'mediagoblin/blog/blog_post_listing.html',
271 {'blog_posts': blog_posts_on_a_page,
272 'pagination': pagination,
273 'blog_owner': blog_owner,
274 'blog':blog
275 })
276
277 @require_active_login
278 def draft_view(request):
279 blog_slug = request.matchdict.get('blog_slug', None)
280 blog_post_slug = request.matchdict.get('blog_post_slug', None)
281 user = request.matchdict.get('user')
282
283 blog = request.db.Blog.query.filter_by(author=request.user.id, slug=blog_slug).first()
284 blogpost = request.db.MediaEntry.query.filter_by(state = u'failed', uploader=request.user.id, slug=blog_post_slug).first()
285
286 if not blog or not blogpost:
287 return render_404(request)
288
289 return render_to_response(
290 request,
291 'mediagoblin/blog/blogpost_draft_view.html',
292 {'blogpost':blogpost,
293 'blog': blog
294 })
295
296 @require_active_login
297 def blog_delete(request, **kwargs):
298 url_user = request.matchdict.get('user')
299 owner_user = request.db.User.query.filter_by(username=url_user).first()
300
301 blog_slug = request.matchdict.get('blog_slug', None)
302 blog = request.db.Blog.query.filter_by(slug=blog_slug, author=owner_user.id).first()
303 if not blog:
304 return render_404(reequest)
305
306 form = blog_forms.ConfirmDeleteForm(request.form)
307 if request.user.id == blog.author or request.user.is_admin:
308 if request.method == 'POST' and form.validate():
309 if form.confirm.data is True:
310 blog.delete()
311 add_message(
312 request, SUCCESS, _('You deleted the Blog.'))
313 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
314 user=request.user.username)
315 else:
316 add_message(
317 request, ERROR,
318 _("The media was not deleted because you didn't check that you were sure."))
319 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
320 user=request.user.username)
321 else:
322 if request.user.is_admin:
323 add_message(
324 request, WARNING,
325 _("You are about to delete another user's Blog. "
326 "Proceed with caution."))
327 return render_to_response(
328 request,
329 'mediagoblin/blog/blog_confirm_delete.html',
330 {'blog':blog,
331 'form':form
332 })
333 else:
334 add_message(
335 request, ERROR,
336 _("The blog was not deleted because you have no rights."))
337 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
338 user=request.user.username)
339
340 def blog_about_view(request):
341 blog_slug = request.matchdict.get('blog_slug', None)
342 url_user = request.matchdict.get('user', None)
343
344 user = request.db.User.query.filter_by(username=url_user).first()
345 blog = request.db.Blog.query.filter_by(author=user.id, slug=blog_slug).first()
346
347 if not user or not blog:
348 return render_404(request)
349
350 else:
351 blog_posts_processed = blog.get_all_blog_posts(u'processed').count()
352 return render_to_response(
353 request,
354 'mediagoblin/blog/blog_about.html',
355 {'user': user,
356 'blog': blog,
357 'blogpost_count': blog_posts_processed
358 })
359
360
361
362
363
364
365
366