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 A |
17 | import logging |
18 | ||
19 | _log = logging.getLogger(__name__) | |
20 | ||
cf46184a A |
21 | from datetime import datetime |
22 | ||
23 | from werkzeug.exceptions import Forbidden | |
24 | ||
cf46184a A |
25 | from mediagoblin import mg_globals |
26 | ||
27 | from mediagoblin.media_types.blog import forms as blog_forms | |
5cb38a28 A |
28 | from mediagoblin.media_types.blog.models import Blog, BlogPostData |
29 | from mediagoblin.media_types.blog.lib import may_edit_blogpost | |
30 | ||
af8f995f | 31 | from mediagoblin.messages import add_message, SUCCESS, ERROR |
cf46184a A |
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) | |
35 | from mediagoblin.tools.response import (render_to_response, | |
36 | redirect, redirect_obj, 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) | |
41 | from mediagoblin.tools.url import slugify | |
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") | |
73 | blog = Blog() | |
74 | blog.title = unicode(form.title.data) | |
75 | blog.description = unicode(form.description.data) #remember clean html data. | |
76 | blog.author = request.user.id | |
77 | blog.generate_slug() | |
78 | ||
79 | blog.save() | |
80 | return redirect(request, "mediagoblin.user_pages.user_home", | |
81 | user=request.user.username) | |
cf46184a | 82 | else: |
af8f995f A |
83 | add_message(request, ERROR, "You can not create any more blogs") |
84 | return redirect(request, "mediagoblin.user_pages.user_home", | |
cf46184a A |
85 | user=request.user.username) |
86 | ||
cf46184a | 87 | |
bed960cb | 88 | #Blog already exists. |
cf46184a | 89 | else: |
bed960cb | 90 | blog = Blog.query.filter_by(slug=blog_slug).first() |
af8f995f | 91 | if request.method == 'GET': |
af8f995f A |
92 | defaults = dict( |
93 | title = blog.title, | |
94 | description = blog.description, | |
95 | author = request.user.id) | |
cf46184a | 96 | |
af8f995f A |
97 | form = blog_forms.BlogEditForm(**defaults) |
98 | ||
99 | return render_to_response( | |
100 | request, | |
101 | 'mediagoblin/blog/blog_edit_create.html', | |
102 | {'form': form, | |
103 | 'user': request.user, | |
104 | 'app_config': mg_globals.app_config}) | |
105 | else: | |
fa5a13f8 | 106 | if request.method == 'POST' and form.validate(): |
145a1738 A |
107 | blog.title = unicode(form.title.data) |
108 | blog.description = unicode(form.description.data) | |
109 | blog.author = request.user.id | |
110 | blog.generate_slug() | |
111 | ||
112 | blog.save() | |
113 | add_message(request, SUCCESS, "Your blog is updated.") | |
114 | return redirect(request, "mediagoblin.user_pages.user_home", | |
115 | user=request.user.username) | |
116 | ||
fa5a13f8 A |
117 | @require_active_login |
118 | def blogpost_create(request): | |
145a1738 | 119 | |
5cb38a28 A |
120 | |
121 | form = blog_forms.BlogPostEditForm(request.form, license=request.user.license_preference) | |
bed960cb | 122 | |
145a1738 | 123 | if request.method == 'POST' and form.validate(): |
bed960cb A |
124 | |
125 | _log.info(request.form['status']) | |
126 | ||
5cb38a28 A |
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 | ||
131 | ||
132 | blogpost = request.db.MediaEntry() | |
783b5005 | 133 | blogpost.media_type = 'mediagoblin.media_types.blogpost' |
145a1738 A |
134 | blogpost.title = unicode(form.title.data) |
135 | blogpost.description = unicode(form.description.data) | |
136 | blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data) | |
137 | blogpost.license = unicode(form.license.data) or None | |
138 | blogpost.uploader = request.user.id | |
e058cdce | 139 | blogpost.state = 'processed' |
145a1738 A |
140 | |
141 | blogpost.generate_slug() | |
142 | ||
143 | blogpost.save() | |
5cb38a28 A |
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() | |
145a1738 A |
150 | |
151 | add_message(request, SUCCESS, _('Woohoo! Submitted!')) | |
152 | add_comment_subscription(request.user, blogpost) | |
153 | return redirect(request, "mediagoblin.user_pages.user_home", | |
154 | user=request.user.username) | |
155 | ||
156 | return render_to_response( | |
fa5a13f8 A |
157 | request, |
158 | 'mediagoblin/blog/blog_post_edit_create.html', | |
159 | {'form': form, | |
160 | 'app_config': mg_globals.app_config, | |
161 | 'user': request.user.username}) | |
e058cdce A |
162 | |
163 | ||
164 | @require_active_login | |
165 | def blogpost_edit(request): | |
5cb38a28 A |
166 | blog_slug = request.matchdict.get('blog_slug') |
167 | blog_post_slug = request.matchdict.get('blog_post_slug') | |
168 | ||
169 | blog = request.db.Blog.query.filter_by(slug=blog_slug, author=request.user.id).first() | |
170 | blog_post_data = request.db.BlogPostData.query.filter_by(blog=blog.id).first() | |
171 | ||
172 | blogpost = blog_post_data.get_media_entry | |
173 | ||
174 | defaults = dict( | |
175 | title = blogpost.title, | |
176 | description = blogpost.description, | |
177 | tags=media_tags_as_string(blogpost.tags), | |
178 | license=blogpost.license) | |
179 | ||
180 | form = blog_forms.BlogPostEditForm(request.form, **defaults) | |
181 | if request.method == 'POST' and form.validate(): | |
182 | blogpost.title = unicode(form.title.data) | |
183 | blogpost.description = unicode(form.description.data) | |
184 | blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data) | |
185 | blogpost.license = unicode(form.license.data) | |
186 | ||
187 | blogpost.generate_slug() | |
188 | blogpost.save() | |
189 | ||
190 | add_message(request, SUCCESS, _('Woohoo! edited blogpost is submitted')) | |
191 | return redirect(request, "mediagoblin.user_pages.user_home", | |
192 | user=request.user.username) | |
193 | ||
194 | return render_to_response( | |
e058cdce A |
195 | request, |
196 | 'mediagoblin/blog/blog_post_edit_create.html', | |
197 | {'form': form, | |
198 | 'app_config': mg_globals.app_config, | |
199 | 'user': request.user.username, | |
5cb38a28 | 200 | 'blog_post_slug': blog_post_slug |
783b5005 | 201 | }) |
e058cdce | 202 | |
5cb38a28 A |
203 | @require_active_login |
204 | def blog_dashboard(request): | |
205 | blog_posts_list = [] | |
206 | blog_slug = request.matchdict.get('blog_slug') | |
207 | _log.info(blog_slug) | |
208 | ||
209 | blog = request.db.Blog.query.filter_by(slug=blog_slug).first() | |
210 | blog_post_data = request.db.BlogPostData.query.filter_by(blog=blog.id).all() | |
211 | ||
212 | for each_blog_post_data in blog_post_data: | |
213 | blog_post = each_blog_post_data.get_media_entry | |
214 | if blog_post: | |
215 | blog_posts_list.append(blog_post) | |
216 | blog_post_count = len(blog_posts_list) | |
217 | ||
218 | if may_edit_blogpost(request, blog): | |
219 | return render_to_response( | |
220 | request, | |
221 | 'mediagoblin/blog/blog_admin_dashboard.html', | |
222 | {'blog_posts_list': blog_posts_list, | |
223 | 'blog_slug':blog_slug, | |
224 | 'blog':blog, | |
225 | 'blog_post_count':blog_post_count | |
bed960cb | 226 | }) |
5cb38a28 A |
227 | |
228 | ||
145a1738 | 229 | |
e058cdce | 230 |