# along with this program. If not, see <http://www.gnu.org/licenses/>.
import logging
-
_log = logging.getLogger(__name__)
from datetime import datetime
+import six
+
from werkzeug.exceptions import Forbidden
+from mediagoblin.tools import pluginapi
from mediagoblin import mg_globals
from mediagoblin.media_types.blog import forms as blog_forms
from mediagoblin.media_types.blog.models import Blog, BlogPostData
-from mediagoblin.media_types.blog.lib import may_edit_blogpost
+from mediagoblin.media_types.blog.lib import (
+ may_edit_blogpost, set_blogpost_state, get_all_blogposts_of_blog,
+ get_blog_by_slug)
-from mediagoblin.messages import add_message, SUCCESS, ERROR
from mediagoblin.decorators import (require_active_login, active_user_from_url,
get_media_entry_by_id, user_may_alter_collection,
- get_user_collection)
+ get_user_collection, uses_pagination)
+from mediagoblin.tools.pagination import Pagination
from mediagoblin.tools.response import (render_to_response,
- redirect, redirect_obj, render_404)
+ redirect, render_404)
from mediagoblin.tools.translate import pass_to_ugettext as _
from mediagoblin.tools.template import render_template
from mediagoblin.tools.text import (
- convert_to_tag_list_of_dicts, media_tags_as_string, clean_html,
+ convert_to_tag_list_of_dicts, media_tags_as_string, clean_html,
cleaned_markdown_conversion)
-from mediagoblin.tools.url import slugify
from mediagoblin.db.util import check_media_slug_used, check_collection_slug_used
-from mediagoblin.db.models import User, Collection, MediaEntry
+from mediagoblin.db.models import User, Collection, MediaEntry, LocalUser
from mediagoblin.notifications import add_comment_subscription
@require_active_login
def blog_edit(request):
"""
- View for editing the existing blog or automatically
- creating a new blog if user does not have any yet.
+ View for editing an existing blog or creating a new blog
+ if user have not exceeded maximum allowed acount of blogs.
"""
url_user = request.matchdict.get('user', None)
blog_slug = request.matchdict.get('blog_slug', None)
-
- max_blog_count = 1
+
+ config = pluginapi.get_config('mediagoblin.media_types.blog')
+ max_blog_count = config['max_blog_count']
form = blog_forms.BlogEditForm(request.form)
- # the blog doesn't exists yet
+ # creating a blog
if not blog_slug:
if Blog.query.filter_by(author=request.user.id).count()<max_blog_count:
if request.method=='GET':
if request.method=='POST' and form.validate():
_log.info("Here")
- blog = Blog()
- blog.title = unicode(form.title.data)
- blog.description = unicode(cleaned_markdown_conversion((form.description.data))) #remember clean html data.
+ blog = request.db.Blog()
+ blog.title = six.text_type(form.title.data)
+ blog.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
blog.author = request.user.id
blog.generate_slug()
-
+
blog.save()
- return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
- user=request.user.username,
- blog_slug=blog.slug)
+ return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
+ user=request.user.username
+ )
else:
- #the case when max blog count is one.
- blog = request.db.Blog.query.filter_by(author=request.user.id).first()
- add_message(request, ERROR, "Welcome! You already have created a blog.")
- return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
- user=request.user.username,
- blog_slug=blog.slug)
+ messages.add_message(
+ request,
+ messages.ERROR,
+ "Welcome! You already have created maximum number of blogs.")
+ return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
+ user=request.user.username)
#Blog already exists.
else:
- blog = Blog.query.filter_by(slug=blog_slug).first()
+ blog = get_blog_by_slug(request, blog_slug)
+ if not blog:
+ return render_404(request)
if request.method == 'GET':
defaults = dict(
title = blog.title,
description = cleaned_markdown_conversion(blog.description),
- author = request.user.id)
-
+ author = request.user.id)
+
form = blog_forms.BlogEditForm(**defaults)
return render_to_response(
'app_config': mg_globals.app_config})
else:
if request.method == 'POST' and form.validate():
- blog.title = unicode(form.title.data)
- blog.description = unicode(cleaned_markdown_conversion((form.description.data)))
+ blog.title = six.text_type(form.title.data)
+ blog.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
blog.author = request.user.id
blog.generate_slug()
-
+
blog.save()
- add_message(request, SUCCESS, "Your blog is updated.")
+ messages.add_message(
+ request,
+ messages.SUCCESS,
+ "Your blog is updated.")
return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
user=request.user.username,
- blog_slug=blog.slug)
-
-@require_active_login
+ blog_slug=blog.slug)
+
+
+@require_active_login
def blogpost_create(request):
-
form = blog_forms.BlogPostEditForm(request.form, license=request.user.license_preference)
-
+
if request.method == 'POST' and form.validate():
-
blog_slug = request.matchdict.get('blog_slug')
- blog = request.db.Blog.query.filter_by(slug=blog_slug,
- author=request.user.id).first()
-
+ blog = get_blog_by_slug(request, blog_slug, author=request.user.id)
+ if not blog:
+ return render_404(request)
blogpost = request.db.MediaEntry()
blogpost.media_type = 'mediagoblin.media_types.blogpost'
- blogpost.title = unicode(form.title.data)
- blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
+ blogpost.title = six.text_type(form.title.data)
+ blogpost.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
- blogpost.license = unicode(form.license.data) or None
- blogpost.uploader = request.user.id
- blogpost.state = u'processed'
-
+ blogpost.license = six.text_type(form.license.data) or None
+ blogpost.actor = request.user.id
blogpost.generate_slug()
-
+
+ set_blogpost_state(request, blogpost)
blogpost.save()
-
+
# connect this blogpost to its blog
blog_post_data = request.db.BlogPostData()
blog_post_data.blog = blog.id
blog_post_data.media_entry = blogpost.id
blog_post_data.save()
-
- add_message(request, SUCCESS, _('Woohoo! Submitted!'))
+
+ messages.add_message(
+ request,
+ messages.SUCCESS,
+ _('Woohoo! Submitted!'))
add_comment_subscription(request.user, blogpost)
return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
user=request.user.username,
blog_slug=blog.slug)
-
+
return render_to_response(
request,
'mediagoblin/blog/blog_post_edit_create.html',
@require_active_login
def blogpost_edit(request):
+
blog_slug = request.matchdict.get('blog_slug', None)
blog_post_slug = request.matchdict.get('blog_post_slug', None)
-
- blogpost = request.db.MediaEntry.query.filter_by(slug=blog_post_slug, uploader=request.user.id).first()
- blog = request.db.Blog.query.filter_by(slug=blog_slug, author=request.user.id).first()
-
+
+ blogpost = request.db.MediaEntry.query.filter_by(slug=blog_post_slug, actor=request.user.id).first()
+ blog = get_blog_by_slug(request, blog_slug, author=request.user.id)
+
if not blogpost or not blog:
return render_404(request)
-
+
defaults = dict(
title = blogpost.title,
description = cleaned_markdown_conversion(blogpost.description),
tags=media_tags_as_string(blogpost.tags),
license=blogpost.license)
-
+
form = blog_forms.BlogPostEditForm(request.form, **defaults)
if request.method == 'POST' and form.validate():
-
- blogpost.title = unicode(form.title.data)
- blogpost.description = unicode(cleaned_markdown_conversion((form.description.data)))
+ blogpost.title = six.text_type(form.title.data)
+ blogpost.description = six.text_type(cleaned_markdown_conversion((form.description.data)))
blogpost.tags = convert_to_tag_list_of_dicts(form.tags.data)
- blogpost.license = unicode(form.license.data)
-
+ blogpost.license = six.text_type(form.license.data)
+ set_blogpost_state(request, blogpost)
blogpost.generate_slug()
blogpost.save()
-
- add_message(request, SUCCESS, _('Woohoo! edited blogpost is submitted'))
+
+ messages.add_message(
+ request,
+ messages.SUCCESS,
+ _('Woohoo! edited blogpost is submitted'))
return redirect(request, "mediagoblin.media_types.blog.blog-dashboard",
user=request.user.username,
blog_slug=blog.slug)
-
+
return render_to_response(
request,
'mediagoblin/blog/blog_post_edit_create.html',
'app_config': mg_globals.app_config,
'user': request.user.username,
'blog_post_slug': blog_post_slug
- })
+ })
-@require_active_login
-def blog_dashboard(request):
-
- url_user = request.matchdict.get('user')
- blog_posts_list = []
- blog_slug = request.matchdict.get('blog_slug')
- _log.info(blog_slug)
- blog = request.db.Blog.query.filter_by(slug=blog_slug).first()
-
+@active_user_from_url
+@uses_pagination
+def blog_dashboard(request, page, url_user=None):
+ """
+ Dashboard for a blog, only accessible to
+ the owner of the blog.
+ """
+ blog_slug = request.matchdict.get('blog_slug', None)
+ blogs = request.db.Blog.query.filter_by(author=url_user.id)
+ config = pluginapi.get_config('mediagoblin.media_types.blog')
+ max_blog_count = config['max_blog_count']
+ if request.user and (request.user.id == url_user.id or request.user.has_privilege(u'admin')):
+ if blog_slug:
+ blog = get_blog_by_slug(request, blog_slug)
+ if not blog:
+ return render_404(request)
+ else:
+ blog_posts_list = blog.get_all_blog_posts().order_by(MediaEntry.created.desc())
+ pagination = Pagination(page, blog_posts_list)
+ pagination.per_page = 15
+ blog_posts_on_a_page = pagination()
+ if may_edit_blogpost(request, blog):
+ return render_to_response(
+ request,
+ 'mediagoblin/blog/blog_admin_dashboard.html',
+ {'blog_posts_list': blog_posts_on_a_page,
+ 'blog_slug':blog_slug,
+ 'blog':blog,
+ 'user':url_user,
+ 'pagination':pagination
+ })
+ if not request.user or request.user.id != url_user.id or not blog_slug:
+ blogs = blogs.all()
+ return render_to_response(
+ request,
+ 'mediagoblin/blog/list_of_blogs.html',
+ {
+ 'blogs':blogs,
+ 'user':url_user,
+ 'max_blog_count':max_blog_count
+ })
+
+
+@active_user_from_url
+@uses_pagination
+def blog_post_listing(request, page, url_user=None):
+ """
+ Page, listing all the blog posts of a particular blog.
+ """
+ blog_slug = request.matchdict['blog_slug']
+ blog = get_blog_by_slug(request, blog_slug, author=url_user.id)
if not blog:
return render_404(request)
-
- blog_post_data = request.db.BlogPostData.query.filter_by(blog=blog.id).all()
- for each_blog_post_data in blog_post_data:
- blog_post = each_blog_post_data.get_media_entry
- if blog_post:
- blog_posts_list.append(blog_post)
- blog_posts_list.reverse()
- blog_post_count = len(blog_posts_list)
+ all_blog_posts = blog.get_all_blog_posts(u'processed').order_by(MediaEntry.created.desc())
+ pagination = Pagination(page, all_blog_posts)
+ pagination.per_page = 8
+ blog_posts_on_a_page = pagination()
- if may_edit_blogpost(request, blog):
- return render_to_response(
- request,
- 'mediagoblin/blog/blog_admin_dashboard.html',
- {'blog_posts_list': blog_posts_list,
- 'blog_slug':blog_slug,
- 'blog':blog,
- 'blog_post_count':blog_post_count
- })
-
-#supposed to list all the blog posts not just belonging to a particular post.
-def blog_post_listing(request):
-
- blog_owner = request.matchdict.get('user')
- owner_user = User.query.filter_by(username=blog_owner).one()
-
- if not owner_user:
- return render_404(request)
-
- all_blog_posts = MediaEntry.query.filter_by(
- uploader=owner_user.id, media_type='mediagoblin.media_types.blogpost',
- state=u'processed').all()
- all_blog_posts.reverse()
- _log.info(len(all_blog_posts))
-
return render_to_response(
request,
'mediagoblin/blog/blog_post_listing.html',
- {'blog_posts': all_blog_posts,
- 'blog_owner': blog_owner
+ {'blog_posts': blog_posts_on_a_page,
+ 'pagination': pagination,
+ 'blog_owner': url_user,
+ 'blog':blog
})
-
-
-
-
-
+
+
+@require_active_login
+def draft_view(request):
+ blog_slug = request.matchdict.get('blog_slug', None)
+ blog_post_slug = request.matchdict.get('blog_post_slug', None)
+ user = request.matchdict.get('user')
+ blog = get_blog_by_slug(request, blog_slug, author=request.user.id)
+ blogpost = request.db.MediaEntry.query.filter_by(state = u'failed', actor=request.user.id, slug=blog_post_slug).first()
+
+ if not blog or not blogpost:
+ return render_404(request)
+
+ return render_to_response(
+ request,
+ 'mediagoblin/blog/blogpost_draft_view.html',
+ {'blogpost':blogpost,
+ 'blog': blog
+ })
+
+
+@require_active_login
+def blog_delete(request, **kwargs):
+ """
+ Deletes a blog and media entries, tags associated with it.
+ """
+ url_user = request.matchdict.get('user')
+ owner_user = request.db.LocalUser.query.filter(
+ LocalUser.username==url_user
+ ).first()
+
+ blog_slug = request.matchdict.get('blog_slug', None)
+ blog = get_blog_by_slug(request, blog_slug, author=owner_user.id)
+ if not blog:
+ return render_404(request)
+
+ form = blog_forms.ConfirmDeleteForm(request.form)
+ if request.user.id == blog.author or request.user.has_privilege(u'admin'):
+ if request.method == 'POST' and form.validate():
+ if form.confirm.data is True:
+ blog.delete()
+ messages.add_message(
+ request,
+ messages.SUCCESS,
+ _('You deleted the Blog.'))
+ return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
+ user=request.user.username)
+ else:
+ messages.add_message(
+ request,
+ messages.ERROR,
+ _("The media was not deleted because you didn't check "
+ "that you were sure."))
+ return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
+ user=request.user.username)
+ else:
+ if request.user.has_privilege(u'admin'):
+ messages.add_message(
+ request,
+ messages.WARNING,
+ _("You are about to delete another user's Blog. "
+ "Proceed with caution."))
+ return render_to_response(
+ request,
+ 'mediagoblin/blog/blog_confirm_delete.html',
+ {'blog':blog,
+ 'form':form
+ })
+ else:
+ messages.add_message(
+ request,
+ messages.ERROR,
+ _("The blog was not deleted because you have no rights."))
+ return redirect(request, "mediagoblin.media_types.blog.blog_admin_dashboard",
+ user=request.user.username)
+
+
+def blog_about_view(request):
+ """
+ Page containing blog description and statistics
+ """
+ blog_slug = request.matchdict.get('blog_slug', None)
+ url_user = request.matchdict.get('user', None)
+
+ user = request.db.LocalUser.query.filter(
+ LocalUser.username==url_user
+ ).first()
+
+ if user:
+ blog = get_blog_by_slug(request, blog_slug, author=user.id)
+
+ if not user or not blog:
+ return render_404(request)
+
+ else:
+ blog_posts_processed = blog.get_all_blog_posts(u'processed').count()
+ return render_to_response(
+ request,
+ 'mediagoblin/blog/blog_about.html',
+ {'user': user,
+ 'blog': blog,
+ 'blogpost_count': blog_posts_processed
+ })