Commit | Line | Data |
---|---|---|
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 | 17 | import logging |
af8f995f A |
18 | _log = logging.getLogger(__name__) |
19 | ||
cf46184a A |
20 | from datetime import datetime |
21 | ||
22 | from werkzeug.exceptions import Forbidden | |
23 | ||
cf46184a A |
24 | from mediagoblin import mg_globals |
25 | ||
26 | from mediagoblin.media_types.blog import forms as blog_forms | |
5cb38a28 | 27 | from mediagoblin.media_types.blog.models import Blog, BlogPostData |
0b2ea4bb | 28 | from mediagoblin.media_types.blog.lib import may_edit_blogpost, set_blogpost_state, get_all_blogposts_of_blog |
5cb38a28 | 29 | |
af8f995f | 30 | from mediagoblin.messages import add_message, SUCCESS, ERROR |
cf46184a A |
31 | from 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) |
34 | from mediagoblin.tools.pagination import Pagination | |
cf46184a | 35 | from mediagoblin.tools.response import (render_to_response, |
0b2ea4bb | 36 | redirect, render_404) |
cf46184a A |
37 | from mediagoblin.tools.translate import pass_to_ugettext as _ |
38 | from mediagoblin.tools.template import render_template | |
39 | from 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 | 43 | from mediagoblin.db.util import check_media_slug_used, check_collection_slug_used |
af8f995f A |
44 | from mediagoblin.db.models import User, Collection, MediaEntry |
45 | ||
fa5a13f8 A |
46 | from mediagoblin.notifications import add_comment_subscription |
47 | ||
cf46184a A |
48 | |
49 | @require_active_login | |
af8f995f | 50 | def 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 |
124 | def 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 | |
168 | def 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 |
209 | def 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 |
236 | def 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 | 256 | def 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 |