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/>.
17 from functools
import wraps
21 from mediagoblin
.db
.util
import ObjectId
, InvalidId
22 from mediagoblin
.tools
.response
import redirect
, render_404
25 def require_active_login(controller
):
27 Require an active login from the user.
30 def new_controller_func(request
, *args
, **kwargs
):
32 request
.user
.get('status') == u
'needs_email_verification':
34 request
, 'mediagoblin.user_pages.user_home',
35 user
=request
.user
.username
)
36 elif not request
.user
or request
.user
.get('status') != u
'active':
38 location
="%s?next=%s" % (
39 request
.urlgen("mediagoblin.auth.login"),
42 return controller(request
, *args
, **kwargs
)
44 return new_controller_func
47 def user_may_delete_media(controller
):
49 Require user ownership of the MediaEntry to delete.
52 def wrapper(request
, *args
, **kwargs
):
53 uploader_id
= request
.db
.MediaEntry
.find_one(
54 {'_id': ObjectId(request
.matchdict
['media'])}).uploader
55 if not (request
.user
.is_admin
or
56 request
.user
._id
== uploader_id
):
57 return exc
.HTTPForbidden()
59 return controller(request
, *args
, **kwargs
)
64 def uses_pagination(controller
):
66 Check request GET 'page' key for wrong values
69 def wrapper(request
, *args
, **kwargs
):
71 page
= int(request
.GET
.get('page', 1))
73 return render_404(request
)
75 return render_404(request
)
77 return controller(request
, page
=page
, *args
, **kwargs
)
82 def get_user_media_entry(controller
):
84 Pass in a MediaEntry based off of a url component
87 def wrapper(request
, *args
, **kwargs
):
88 user
= request
.db
.User
.find_one(
89 {'username': request
.matchdict
['user']})
92 return render_404(request
)
93 media
= request
.db
.MediaEntry
.find_one(
94 {'slug': request
.matchdict
['media'],
95 'state': u
'processed',
96 'uploader': user
._id
})
98 # no media via slug? Grab it via ObjectId
101 media
= request
.db
.MediaEntry
.find_one(
102 {'_id': ObjectId(request
.matchdict
['media']),
103 'state': u
'processed',
104 'uploader': user
._id
})
106 return render_404(request
)
108 # Still no media? Okay, 404.
110 return render_404(request
)
112 return controller(request
, media
=media
, *args
, **kwargs
)
117 def get_media_entry_by_id(controller
):
119 Pass in a MediaEntry based off of a url component
122 def wrapper(request
, *args
, **kwargs
):
124 media
= request
.db
.MediaEntry
.find_one(
125 {'_id': ObjectId(request
.matchdict
['media']),
126 'state': u
'processed'})
128 return render_404(request
)
130 # Still no media? Okay, 404.
132 return render_404(request
)
134 return controller(request
, media
=media
, *args
, **kwargs
)