Merge branch 'master' of git://gitorious.org/mediagoblin/mediagoblin
[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
24 from mediagoblin import mg_globals
25
26 from mediagoblin.media_types.blog import forms as blog_forms
27 from mediagoblin.media_types.blog.models import Blog, BlogPostData
28 from mediagoblin.media_types.blog.lib import may_edit_blogpost, set_blogpost_state, get_all_blogposts_of_blog
29
30 from mediagoblin.messages import add_message, SUCCESS, ERROR
31 from mediagoblin.decorators import (require_active_login, active_user_from_url,
32 get_media_entry_by_id, user_may_alter_collection,
33 get_user_collection, uses_pagination)
34 from mediagoblin.tools.pagination import Pagination
35 from mediagoblin.tools.response import (render_to_response,
36 redirect, render_404)
37 from mediagoblin.tools.translate import pass_to_ugettext as _
38 from mediagoblin.tools.template import render_template
39 from mediagoblin.tools.text import (
40 convert_to_tag_list_of_dicts, media_tags_as_string, clean_html,
41 cleaned_markdown_conversion)
42
43 from mediagoblin.db.util import check_media_slug_used, check_collection_slug_used
44 from mediagoblin.db.models import User, Collection, MediaEntry
45
46 from mediagoblin.notifications import add_comment_subscription
47
48
49 @require_active_login
50 def blog_edit(request):
51 """
52 View for editing the existing blog or automatically
53 creating a new blog if user does not have any yet.
54 """
55 url_user = request.matchdict.get('user', None)
56 blog_slug = request.matchdict.get('blog_slug', None)
57
58 max_blog_count = 4
59 form = blog_forms.BlogEditForm(request.form)
60 # the blog doesn't exists yet
61 if not blog_slug:
62 if Blog.query.filter_by(author=request.user.id).count()<max_blog_count:
63 if request.method=='GET':
64 return render_to_response(
65 request,
66 'mediagoblin/blog/blog_edit_create.html',
67 {'form': form,
68 'user' : request.user,
69 'app_config': mg_globals.app_config})
70
71 if request.method=='POST' and form.validate():
72 _log.info("Here")
73 blog = request.db.Blog()
74 blog.title = unicode(form.title.data)
75 blog.description = unicode(cleaned_markdown_conversion((form.description.data)))
76 blog.author = request.user.id
77 blog.generate_slug()
78
79 blog.save()
80 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
81 user=request.user.username
82 )
83 else:
84 #the case when max blog count is one.
85 add_message(request, ERROR, "Welcome! You already have created a blog.")
86 return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
87 user=request.user.username)
88
89
90 #Blog already exists.
91 else:
92 blog = request.db.Blog.query.filter_by(slug=blog_slug).first()
93 if request.method == 'GET':
94 defaults = dict(
95 title = blog.title,
96 description = cleaned_markdown_conversion(blog.description),
97 author = request.user.id)
98
99 form = blog_forms.BlogEditForm(**defaults)
100
101 return render_to_response(
102 request,
103 'mediagoblin/blog/blog_edit_create.html',
104 {'form': form,
105 'user': request.user,
106 'app_config': mg_globals.app_config})
107 else:
108 if request.method == 'POST' and form.validate():
109 blog.title = unicode(form.title.data)
110 blog.description = unicode(cleaned_markdown_conversion((form.description.data)))
111 blog.author = request.user.id
112 blog.generate_slug()
113
114 blog.save()
115 add_message(request, SUCCESS, "Your blog is updated.")
116 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
117 user=request.user.username,
118 blog_slug=blog.slug)
119
120
121 @require_active_login
122 def blogpost_create(request):
123
124 form = blog_forms.BlogPostEditForm(request.form, license=request.user.license_preference)
125
126 if request.method == 'POST' and form.validate():
127 blog_slug = request.matchdict.get('blog_slug')
128 blog = request.db.Blog.query.filter_by(slug=blog_slug,
129 author=request.user.id).first()
130 if not blog:
131 return render_404(request)
132
133 blogpost = request.db.MediaEntry()
134 blogpost.media_type = 'mediagoblin.media_types.blogpost'
135 blogpost.title = unicode(form.title.data)
136 blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
137 blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
138 blogpost.license = unicode(form.license.data) or None
139 blogpost.uploader = request.user.id
140 blogpost.generate_slug()
141
142 set_blogpost_state(request, blogpost)
143 blogpost.save()
144
145 # connect this blogpost to its blog
146 blog_post_data = request.db.BlogPostData()
147 blog_post_data.blog = blog.id
148 blog_post_data.media_entry = blogpost.id
149 blog_post_data.save()
150
151 add_message(request, SUCCESS, _('Woohoo! Submitted!'))
152 add_comment_subscription(request.user, blogpost)
153 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
154 user=request.user.username,
155 blog_slug=blog.slug)
156
157 return render_to_response(
158 request,
159 'mediagoblin/blog/blog_post_edit_create.html',
160 {'form': form,
161 'app_config': mg_globals.app_config,
162 'user': request.user.username})
163
164
165 @require_active_login
166 def blogpost_edit(request):
167 blog_slug = request.matchdict.get('blog_slug', None)
168 blog_post_slug = request.matchdict.get('blog_post_slug', None)
169
170 blogpost = request.db.MediaEntry.query.filter_by(slug=blog_post_slug, uploader=request.user.id).first()
171 blog = request.db.Blog.query.filter_by(slug=blog_slug, author=request.user.id).first()
172
173 if not blogpost or not blog:
174 return render_404(request)
175
176 defaults = dict(
177 title = blogpost.title,
178 description = cleaned_markdown_conversion(blogpost.description),
179 tags=media_tags_as_string(blogpost.tags),
180 license=blogpost.license)
181
182 form = blog_forms.BlogPostEditForm(request.form, **defaults)
183 if request.method == 'POST' and form.validate():
184 blogpost.title = unicode(form.title.data)
185 blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
186 blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
187 blogpost.license = unicode(form.license.data)
188 set_blogpost_state(request, blogpost)
189 blogpost.generate_slug()
190 blogpost.save()
191
192 add_message(request, SUCCESS, _('Woohoo! edited blogpost is submitted'))
193 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
194 user=request.user.username,
195 blog_slug=blog.slug)
196
197 return render_to_response(
198 request,
199 'mediagoblin/blog/blog_post_edit_create.html',
200 {'form': form,
201 'app_config': mg_globals.app_config,
202 'user': request.user.username,
203 'blog_post_slug': blog_post_slug
204 })
205
206 @require_active_login
207 @uses_pagination
208 def blog_dashboard(request, page):
209
210 url_user = request.matchdict.get('user')
211 user = request.db.User.query.filter_by(username=url_user).one()
212 blog_slug = request.matchdict.get('blog_slug', None)
213
214 blogs = request.db.Blog.query.filter_by(author=request.user.id)
215 if blog_slug and user.id == request.user.id:
216 blog = blogs.filter(Blog.slug==blog_slug).first()
217 if not blog:
218 return render_404(request)
219 blog_posts_list = blog.get_all_blog_posts().order_by(MediaEntry.created.desc())
220 _log.info(type(blog_posts_list))
221 pagination = Pagination(page, blog_posts_list)
222 pagination.per_page = 15
223 blog_posts_on_a_page = pagination()
224
225 if may_edit_blogpost(request, blog):
226 return render_to_response(
227 request,
228 'mediagoblin/blog/blog_admin_dashboard.html',
229 {'blog_posts_list': blog_posts_on_a_page,
230 'blog_slug':blog_slug,
231 'blog':blog,
232 'pagination':pagination
233 })
234 else:
235 return render_403(request)
236 else:
237 blogs = request.db.Blog.query.filter_by(author=user.id)
238 _log.info(blogs.count())
239 return render_to_response(
240 request,
241 'mediagoblin/blog/list_of_blogs.html',
242 {
243 'blogs':blogs,
244 'url_user':url_user
245 })
246
247
248
249 #supposed to list all the blog posts belonging to a particular blog of particular user.
250 @uses_pagination
251 def blog_post_listing(request, page):
252
253 blog_owner = request.matchdict.get('user')
254 blog_slug = request.matchdict.get('blog_slug', None)
255 owner_user = User.query.filter_by(username=blog_owner).one()
256 blog = request.db.Blog.query.filter_by(slug=blog_slug).first()
257
258 if not owner_user or not blog:
259 return render_404(request)
260
261 all_blog_posts = blog.get_all_blog_posts(u'processed').order_by(MediaEntry.created.desc())
262 pagination = Pagination(page, all_blog_posts)
263 pagination.per_page = 8
264 blog_posts_on_a_page = pagination()
265
266 return render_to_response(
267 request,
268 'mediagoblin/blog/blog_post_listing.html',
269 {'blog_posts': blog_posts_on_a_page,
270 'pagination': pagination,
271 'blog_owner': blog_owner
272 })
273
274 @require_active_login
275 def draft_view(request):
276 blog_slug = request.matchdict.get('blog_slug', None)
277 blog_post_slug = request.matchdict.get('blog_post_slug', None)
278 user = request.matchdict.get('user')
279
280 blog = request.db.Blog.query.filter_by(author=request.user.id, slug=blog_slug).first()
281 blogpost = request.db.MediaEntry.query.filter_by(state = u'failed', uploader=request.user.id, slug=blog_post_slug).first()
282
283 if not blog or not blogpost:
284 return render_404(request)
285
286 return render_to_response(
287 request,
288 'mediagoblin/blog/blogpost_draft_view.html',
289 {'blogpost':blogpost,
290 'blog': blog
291 })
292