Refactor views using functions in lib file.
[mediagoblin.git] / mediagoblin / media_types / blog / views.py
CommitLineData
cf46184a
A
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
af8f995f 17import logging
af8f995f
A
18_log = logging.getLogger(__name__)
19
cf46184a
A
20from datetime import datetime
21
22from werkzeug.exceptions import Forbidden
23
cf46184a
A
24from mediagoblin import mg_globals
25
26from mediagoblin.media_types.blog import forms as blog_forms
5cb38a28 27from mediagoblin.media_types.blog.models import Blog, BlogPostData
0b2ea4bb 28from mediagoblin.media_types.blog.lib import may_edit_blogpost, set_blogpost_state, get_all_blogposts_of_blog
5cb38a28 29
af8f995f 30from mediagoblin.messages import add_message, SUCCESS, ERROR
cf46184a
A
31from mediagoblin.decorators import (require_active_login, active_user_from_url,
32 get_media_entry_by_id, user_may_alter_collection,
0b2ea4bb
A
33 get_user_collection, uses_pagination)
34from mediagoblin.tools.pagination import Pagination
cf46184a 35from mediagoblin.tools.response import (render_to_response,
0b2ea4bb 36 redirect, render_404)
cf46184a
A
37from mediagoblin.tools.translate import pass_to_ugettext as _
38from mediagoblin.tools.template import render_template
39from mediagoblin.tools.text import (
3e329412
A
40 convert_to_tag_list_of_dicts, media_tags_as_string, clean_html,
41 cleaned_markdown_conversion)
5cb38a28 42
cf46184a 43from mediagoblin.db.util import check_media_slug_used, check_collection_slug_used
af8f995f
A
44from mediagoblin.db.models import User, Collection, MediaEntry
45
fa5a13f8
A
46from mediagoblin.notifications import add_comment_subscription
47
cf46184a
A
48
49@require_active_login
af8f995f 50def blog_edit(request):
cf46184a 51 """
af8f995f
A
52 View for editing the existing blog or automatically
53 creating a new blog if user does not have any yet.
cf46184a 54 """
af8f995f
A
55 url_user = request.matchdict.get('user', None)
56 blog_slug = request.matchdict.get('blog_slug', None)
cf46184a 57
af8f995f
A
58 max_blog_count = 1
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")
0b2ea4bb 73 blog = request.db.Blog()
af8f995f 74 blog.title = unicode(form.title.data)
0b2ea4bb 75 blog.description = unicode(cleaned_markdown_conversion((form.description.data)))
af8f995f
A
76 blog.author = request.user.id
77 blog.generate_slug()
78
79 blog.save()
8f6a0bf4
A
80 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
81 user=request.user.username,
82 blog_slug=blog.slug)
cf46184a 83 else:
3e329412
A
84 #the case when max blog count is one.
85 blog = request.db.Blog.query.filter_by(author=request.user.id).first()
bd71103e 86 add_message(request, ERROR, "Welcome! You already have created a blog.")
b5ae9685
A
87 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
88 user=request.user.username,
89 blog_slug=blog.slug)
cf46184a 90
cf46184a 91
bed960cb 92 #Blog already exists.
cf46184a 93 else:
0b2ea4bb 94 blog = request.db.Blog.query.filter_by(slug=blog_slug).first()
af8f995f 95 if request.method == 'GET':
af8f995f
A
96 defaults = dict(
97 title = blog.title,
21ac4966 98 description = cleaned_markdown_conversion(blog.description),
af8f995f 99 author = request.user.id)
cf46184a 100
af8f995f
A
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:
fa5a13f8 110 if request.method == 'POST' and form.validate():
145a1738 111 blog.title = unicode(form.title.data)
21ac4966 112 blog.description = unicode(cleaned_markdown_conversion((form.description.data)))
145a1738
A
113 blog.author = request.user.id
114 blog.generate_slug()
115
116 blog.save()
117 add_message(request, SUCCESS, "Your blog is updated.")
8f6a0bf4
A
118 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
119 user=request.user.username,
120 blog_slug=blog.slug)
145a1738 121
0b2ea4bb 122
fa5a13f8
A
123@require_active_login
124def blogpost_create(request):
145a1738 125
5cb38a28 126 form = blog_forms.BlogPostEditForm(request.form, license=request.user.license_preference)
bed960cb 127
145a1738 128 if request.method == 'POST' and form.validate():
5cb38a28
A
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()
4cf5b010
A
132 if not blog:
133 return render_404(request)
5cb38a28 134
5cb38a28 135 blogpost = request.db.MediaEntry()
783b5005 136 blogpost.media_type = 'mediagoblin.media_types.blogpost'
145a1738 137 blogpost.title = unicode(form.title.data)
21ac4966 138 blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
145a1738
A
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
145a1738
A
142 blogpost.generate_slug()
143
4cf5b010 144 set_blogpost_state(request, blogpost)
145a1738 145 blogpost.save()
5cb38a28
A
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()
145a1738
A
152
153 add_message(request, SUCCESS, _('Woohoo! Submitted!'))
154 add_comment_subscription(request.user, blogpost)
7b23b1e5
A
155 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
156 user=request.user.username,
157 blog_slug=blog.slug)
145a1738
A
158
159 return render_to_response(
fa5a13f8
A
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})
e058cdce
A
165
166
167@require_active_login
168def blogpost_edit(request):
8f6a0bf4
A
169 blog_slug = request.matchdict.get('blog_slug', None)
170 blog_post_slug = request.matchdict.get('blog_post_slug', None)
b5ae9685 171
221cde57 172 blogpost = request.db.MediaEntry.query.filter_by(slug=blog_post_slug, uploader=request.user.id).first()
5cb38a28 173 blog = request.db.Blog.query.filter_by(slug=blog_slug, author=request.user.id).first()
b5ae9685
A
174
175 if not blogpost or not blog:
176 return render_404(request)
177
5cb38a28
A
178 defaults = dict(
179 title = blogpost.title,
21ac4966 180 description = cleaned_markdown_conversion(blogpost.description),
5cb38a28
A
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)
21ac4966 187 blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
5cb38a28
A
188 blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
189 blogpost.license = unicode(form.license.data)
4cf5b010 190 set_blogpost_state(request, blogpost)
5cb38a28
A
191 blogpost.generate_slug()
192 blogpost.save()
193
194 add_message(request, SUCCESS, _('Woohoo! edited blogpost is submitted'))
3e329412
A
195 return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
196 user=request.user.username,
197 blog_slug=blog.slug)
5cb38a28
A
198
199 return render_to_response(
e058cdce
A
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,
5cb38a28 205 'blog_post_slug': blog_post_slug
783b5005 206 })
e058cdce 207
5cb38a28
A
208@require_active_login
209def blog_dashboard(request):
b5ae9685
A
210
211 url_user = request.matchdict.get('user')
5cb38a28 212 blog_posts_list = []
0b2ea4bb 213 blog_slug = request.matchdict.get('blog_slug', None)
5cb38a28
A
214 _log.info(blog_slug)
215
216 blog = request.db.Blog.query.filter_by(slug=blog_slug).first()
b5ae9685
A
217
218 if not blog:
219 return render_404(request)
220
0b2ea4bb 221 blog_posts_list = get_all_blogposts_of_blog(request, blog)
5cb38a28
A
222 blog_post_count = len(blog_posts_list)
223
224 if may_edit_blogpost(request, blog):
225 return render_to_response(
226 request,
227 'mediagoblin/blog/blog_admin_dashboard.html',
228 {'blog_posts_list': blog_posts_list,
229 'blog_slug':blog_slug,
230 'blog':blog,
231 'blog_post_count':blog_post_count
0b2ea4bb 232 })
5cb38a28 233
0b2ea4bb
A
234
235#supposed to list all the blog posts belonging to a particular blog of particular user.
3e329412
A
236def blog_post_listing(request):
237
238 blog_owner = request.matchdict.get('user')
0b2ea4bb 239 blog_slug = request.matchdict.get('blog_slug', None)
3e329412 240 owner_user = User.query.filter_by(username=blog_owner).one()
0b2ea4bb 241 blog = request.db.Blog.query.filter_by(author=request.user.id, slug=blog_slug).first()
3e329412 242
0b2ea4bb 243 if not owner_user or not blog:
3e329412
A
244 return render_404(request)
245
0b2ea4bb 246 all_blog_posts = get_all_blogposts_of_blog(request, blog, u'processed')
3e329412
A
247
248 return render_to_response(
249 request,
250 'mediagoblin/blog/blog_post_listing.html',
251 {'blog_posts': all_blog_posts,
252 'blog_owner': blog_owner
253 })
254
255
4cf5b010 256def draft_view(request):
0b2ea4bb
A
257 blog_slug = request.matchdict.get('blog_slug', None)
258 blog_post_slug = request.matchdict.get('blog_post_slug', None)
4cf5b010
A
259 user = request.matchdict.get('user')
260
261 blog = request.db.Blog.query.filter_by(author=request.user.id, slug=blog_slug).first()
262 blogpost = request.db.MediaEntry.query.filter_by(state = u'failed', uploader=request.user.id, slug=blog_post_slug).first()
5cb38a28 263
4cf5b010
A
264 if not blog or not blogpost:
265 return render_404(request)
266
267 return render_to_response(
268 request,
269 'mediagoblin/blog/blogpost_draft_view.html',
270 {'blogpost':blogpost,
271 'blog': blog
272 })
273
274
275
145a1738 276
e058cdce 277