Fix blog extraction for get and post both type of requests.
[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
A
17import logging
18
19_log = logging.getLogger(__name__)
20
cf46184a
A
21from datetime import datetime
22
23from werkzeug.exceptions import Forbidden
24
cf46184a
A
25from mediagoblin import mg_globals
26
27from mediagoblin.media_types.blog import forms as blog_forms
5cb38a28
A
28from mediagoblin.media_types.blog.models import Blog, BlogPostData
29from mediagoblin.media_types.blog.lib import may_edit_blogpost
30
af8f995f 31from mediagoblin.messages import add_message, SUCCESS, ERROR
cf46184a
A
32from mediagoblin.decorators import (require_active_login, active_user_from_url,
33 get_media_entry_by_id, user_may_alter_collection,
34 get_user_collection)
35from mediagoblin.tools.response import (render_to_response,
36 redirect, redirect_obj, render_404)
37from mediagoblin.tools.translate import pass_to_ugettext as _
38from mediagoblin.tools.template import render_template
39from mediagoblin.tools.text import (
40 convert_to_tag_list_of_dicts, media_tags_as_string)
41from mediagoblin.tools.url import slugify
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")
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
118def 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
165def 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
204def 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