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/>.
18 from bson
.errors
import InvalidId
21 from mediagoblin
.util
import redirect
22 from mediagoblin
.db
.util
import ObjectId
25 def _make_safe(decorator
, original
):
27 Copy the function data from the old function to the decorator.
29 decorator
.__name
__ = original
.__name
__
30 decorator
.__dict
__ = original
.__dict
__
31 decorator
.__doc
__ = original
.__doc
__
35 def require_active_login(controller
):
37 Require an active login from the user.
39 def new_controller_func(request
, *args
, **kwargs
):
41 request
.user
.get('status') == u
'needs_email_verification':
42 return redirect(request
,
43 'mediagoblin.auth.verify_email_notice')
44 elif not request
.user
or request
.user
.get('status') != u
'active':
46 location
="%s?next=%s" % (
47 request
.urlgen("mediagoblin.auth.login"),
50 return controller(request
, *args
, **kwargs
)
52 return _make_safe(new_controller_func
, controller
)
55 def uses_pagination(controller
):
57 Check request GET 'page' key for wrong values
59 def wrapper(request
, *args
, **kwargs
):
61 page
= int(request
.GET
.get('page', 1))
63 return exc
.HTTPNotFound()
65 return exc
.HTTPNotFound()
67 return controller(request
, page
=page
, *args
, **kwargs
)
69 return _make_safe(wrapper
, controller
)
72 def get_user_media_entry(controller
):
74 Pass in a MediaEntry based off of a url component
76 def wrapper(request
, *args
, **kwargs
):
77 user
= request
.db
.User
.find_one(
78 {'username': request
.matchdict
['user']})
81 return exc
.HTTPNotFound()
83 media
= request
.db
.MediaEntry
.find_one(
84 {'slug': request
.matchdict
['media'],
86 'uploader': user
['_id']})
88 # no media via slug? Grab it via ObjectId
91 media
= request
.db
.MediaEntry
.find_one(
92 {'_id': ObjectId(request
.matchdict
['media']),
94 'uploader': user
['_id']})
96 return exc
.HTTPNotFound()
98 # Still no media? Okay, 404.
100 return exc
.HTTPNotFound()
102 return controller(request
, media
=media
, *args
, **kwargs
)
104 return _make_safe(wrapper
, controller
)
106 def get_media_entry_by_id(controller
):
108 Pass in a MediaEntry based off of a url component
110 def wrapper(request
, *args
, **kwargs
):
112 media
= request
.db
.MediaEntry
.find_one(
113 {'_id': ObjectId(request
.matchdict
['media']),
114 'state': 'processed'})
116 return exc
.HTTPNotFound()
118 # Still no media? Okay, 404.
120 return exc
.HTTPNotFound()
122 return controller(request
, media
=media
, *args
, **kwargs
)
124 return _make_safe(wrapper
, controller
)