1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011, 2012 MediaGoblin contributors. See AUTHORS.
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.
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.
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/>.
19 _log
= logging
.getLogger(__name__
)
21 from datetime
import datetime
23 from werkzeug
.exceptions
import Forbidden
25 from mediagoblin
import mg_globals
27 from mediagoblin
.media_types
.blog
import forms
as blog_forms
28 from mediagoblin
.media_types
.blog
.models
import Blog
, BlogPostData
29 from mediagoblin
.media_types
.blog
.lib
import may_edit_blogpost
31 from mediagoblin
.messages
import add_message
, SUCCESS
, ERROR
32 from mediagoblin
.decorators
import (require_active_login
, active_user_from_url
,
33 get_media_entry_by_id
, user_may_alter_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
43 from mediagoblin
.db
.util
import check_media_slug_used
, check_collection_slug_used
44 from mediagoblin
.db
.models
import User
, Collection
, MediaEntry
46 from mediagoblin
.notifications
import add_comment_subscription
50 def blog_edit(request
):
52 View for editing the existing blog or automatically
53 creating a new blog if user does not have any yet.
55 url_user
= request
.matchdict
.get('user', None)
56 blog_slug
= request
.matchdict
.get('blog_slug', None)
59 form
= blog_forms
.BlogEditForm(request
.form
)
60 # the blog doesn't exists yet
62 if Blog
.query
.filter_by(author
=request
.user
.id).count()<max_blog_count
:
63 if request
.method
=='GET':
64 return render_to_response(
66 'mediagoblin/blog/blog_edit_create.html',
68 'user' : request
.user
,
69 'app_config': mg_globals
.app_config
})
71 if request
.method
=='POST' and form
.validate():
74 blog
.title
= unicode(form
.title
.data
)
75 blog
.description
= unicode(form
.description
.data
) #remember clean html data.
76 blog
.author
= request
.user
.id
80 return redirect(request
, "mediagoblin.media_types.blog.blog-dashboard",
81 user
=request
.user
.username
,
84 add_message(request
, ERROR
, "You can not create any more blogs")
85 return redirect(request
, "mediagoblin.media_types.blog.blog-dashboard",
86 user
=request
.user
.username
,
92 blog
= Blog
.query
.filter_by(slug
=blog_slug
).first()
93 if request
.method
== 'GET':
96 description
= blog
.description
,
97 author
= request
.user
.id)
99 form
= blog_forms
.BlogEditForm(**defaults
)
101 return render_to_response(
103 'mediagoblin/blog/blog_edit_create.html',
105 'user': request
.user
,
106 'app_config': mg_globals
.app_config
})
108 if request
.method
== 'POST' and form
.validate():
109 blog
.title
= unicode(form
.title
.data
)
110 blog
.description
= unicode(form
.description
.data
)
111 blog
.author
= request
.user
.id
115 add_message(request
, SUCCESS
, "Your blog is updated.")
116 return redirect(request
, "mediagoblin.media_types.blog.blog-dashboard",
117 user
=request
.user
.username
,
120 @require_active_login
121 def blogpost_create(request
):
124 form
= blog_forms
.BlogPostEditForm(request
.form
, license
=request
.user
.license_preference
)
126 if request
.method
== 'POST' and form
.validate():
128 _log
.info(request
.form
['status'])
130 blog_slug
= request
.matchdict
.get('blog_slug')
131 blog
= request
.db
.Blog
.query
.filter_by(slug
=blog_slug
,
132 author
=request
.user
.id).first()
135 blogpost
= request
.db
.MediaEntry()
136 blogpost
.media_type
= 'mediagoblin.media_types.blogpost'
137 blogpost
.title
= unicode(form
.title
.data
)
138 blogpost
.description
= unicode(form
.description
.data
)
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
142 blogpost
.state
= 'processed'
144 blogpost
.generate_slug()
148 # connect this blogpost to its blog
149 blog_post_data
= request
.db
.BlogPostData()
150 blog_post_data
.blog
= blog
.id
151 blog_post_data
.media_entry
= blogpost
.id
152 blog_post_data
.save()
154 add_message(request
, SUCCESS
, _('Woohoo! Submitted!'))
155 add_comment_subscription(request
.user
, blogpost
)
156 return redirect(request
, "mediagoblin.user_pages.user_home",
157 user
=request
.user
.username
)
159 return render_to_response(
161 'mediagoblin/blog/blog_post_edit_create.html',
163 'app_config': mg_globals
.app_config
,
164 'user': request
.user
.username
})
167 @require_active_login
168 def blogpost_edit(request
):
169 blog_slug
= request
.matchdict
.get('blog_slug', None)
170 blog_post_slug
= request
.matchdict
.get('blog_post_slug', None)
172 blogpost
= request
.db
.MediaEntry
.query
.filter_by(slug
=blog_post_slug
, uploader
=request
.user
.id).first()
173 blog
= request
.db
.Blog
.query
.filter_by(slug
=blog_slug
, author
=request
.user
.id).first()
175 if not blogpost
or not blog
:
176 return render_404(request
)
179 title
= blogpost
.title
,
180 description
= blogpost
.description
,
181 tags
=media_tags_as_string(blogpost
.tags
),
182 license
=blogpost
.license
)
184 form
= blog_forms
.BlogPostEditForm(request
.form
, **defaults
)
185 if request
.method
== 'POST' and form
.validate():
186 blogpost
.title
= unicode(form
.title
.data
)
187 blogpost
.description
= unicode(form
.description
.data
)
188 blogpost
.tags
= convert_to_tag_list_of_dicts(form
.tags
.data
)
189 blogpost
.license
= unicode(form
.license
.data
)
191 blogpost
.generate_slug()
194 add_message(request
, SUCCESS
, _('Woohoo! edited blogpost is submitted'))
195 return redirect(request
, "mediagoblin.user_pages.user_home",
196 user
=request
.user
.username
)
198 return render_to_response(
200 'mediagoblin/blog/blog_post_edit_create.html',
202 'app_config': mg_globals
.app_config
,
203 'user': request
.user
.username
,
204 'blog_post_slug': blog_post_slug
207 @require_active_login
208 def blog_dashboard(request
):
210 url_user
= request
.matchdict
.get('user')
212 blog_slug
= request
.matchdict
.get('blog_slug')
215 blog
= request
.db
.Blog
.query
.filter_by(slug
=blog_slug
).first()
218 return render_404(request
)
220 blog_post_data
= request
.db
.BlogPostData
.query
.filter_by(blog
=blog
.id).all()
222 for each_blog_post_data
in blog_post_data
:
223 blog_post
= each_blog_post_data
.get_media_entry
225 blog_posts_list
.append(blog_post
)
226 blog_post_count
= len(blog_posts_list
)
228 if may_edit_blogpost(request
, blog
):
229 return render_to_response(
231 'mediagoblin/blog/blog_admin_dashboard.html',
232 {'blog_posts_list': blog_posts_list
,
233 'blog_slug':blog_slug
,
235 'blog_post_count':blog_post_count