1 # GNU MediaGoblin -- federated, autonomous media hosting
2 # Copyright (C) 2011 Free Software Foundation, Inc
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 from mediagoblin
import messages
20 from mediagoblin
.db
.util
import DESCENDING
, ObjectId
21 from mediagoblin
.util
import (
22 Pagination
, render_to_response
, redirect
, cleaned_markdown_conversion
)
23 from mediagoblin
.user_pages
import forms
as user_forms
25 from mediagoblin
.decorators
import uses_pagination
, get_user_media_entry
, \
28 from werkzeug
.contrib
.atom
import AtomFeed
32 def user_home(request
, page
):
33 """'Homepage' of a User()"""
34 user
= request
.db
.User
.find_one({
35 'username': request
.matchdict
['user'],
38 return exc
.HTTPNotFound()
40 cursor
= request
.db
.MediaEntry
.find(
41 {'uploader': user
['_id'],
42 'state': 'processed'}).sort('created', DESCENDING
)
44 pagination
= Pagination(page
, cursor
)
45 media_entries
= pagination()
47 #if no data is available, return NotFound
48 if media_entries
== None:
49 return exc
.HTTPNotFound()
51 return render_to_response(
53 'mediagoblin/user_pages/user.html',
55 'media_entries': media_entries
,
56 'pagination': pagination
})
59 def user_gallery(request
, page
):
60 """'Gallery' of a User()"""
61 user
= request
.db
.User
.find_one({
62 'username': request
.matchdict
['user'],
65 return exc
.HTTPNotFound()
67 cursor
= request
.db
.MediaEntry
.find(
68 {'uploader': user
['_id'],
69 'state': 'processed'}).sort('created', DESCENDING
)
71 pagination
= Pagination(page
, cursor
)
72 media_entries
= pagination()
74 #if no data is available, return NotFound
75 if media_entries
== None:
76 return exc
.HTTPNotFound()
78 return render_to_response(
80 'mediagoblin/user_pages/gallery.html',
82 'media_entries': media_entries
,
83 'pagination': pagination
})
85 MEDIA_COMMENTS_PER_PAGE
= 50
89 def media_home(request
, media
, page
, **kwargs
):
91 'Homepage' of a MediaEntry()
94 pagination
= Pagination(page
, media
.get_comments(), MEDIA_COMMENTS_PER_PAGE
)
95 comments
= pagination()
97 comment_form
= user_forms
.MediaCommentForm(request
.POST
)
99 return render_to_response(
101 'mediagoblin/user_pages/media.html',
103 'comments': comments
,
104 'pagination': pagination
,
105 'comment_form': comment_form
})
108 @require_active_login
109 def media_post_comment(request
):
111 recieves POST from a MediaEntry() comment form, saves the comment.
113 comment
= request
.db
.MediaComment()
114 comment
['media_entry'] = ObjectId(request
.matchdict
['media'])
115 comment
['author'] = request
.user
['_id']
116 comment
['content'] = request
.POST
['comment']
118 comment
['content_html'] = cleaned_markdown_conversion(comment
['content'])
122 messages
.add_message(
123 request
, messages
.SUCCESS
,
126 return redirect(request
, 'mediagoblin.user_pages.media_home',
127 media
= request
.matchdict
['media'],
128 user
= request
.matchdict
['user'])
131 ATOM_DEFAULT_NR_OF_UPDATED_ITEMS
= 5
133 def atom_feed(request
):
135 generates the atom feed with the newest images
138 user
= request
.db
.User
.find_one({
139 'username': request
.matchdict
['user'],
142 return exc
.HTTPNotFound()
144 cursor
= request
.db
.MediaEntry
.find({
145 'uploader': user
['_id'],
146 'state': 'processed'}) \
147 .sort('created', DESCENDING
) \
148 .limit(ATOM_DEFAULT_NR_OF_UPDATED_ITEMS
)
150 feed
= AtomFeed(request
.matchdict
['user'],
151 feed_url
=request
.url
,
152 url
=request
.host_url
)
155 feed
.add(entry
.get('title'),
156 entry
.get('description_html'),
158 author
=request
.matchdict
['user'],
159 updated
=entry
.get('created'),
160 url
=entry
.url_for_self(request
.urlgen
))
162 return feed
.get_response()