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
19 from urlparse
import urljoin
20 from werkzeug
.exceptions
import Forbidden
21 from werkzeug
.urls
import url_quote
23 from mediagoblin
.db
.sql
.models
import MediaEntry
, User
24 from mediagoblin
.tools
.response
import redirect
, render_404
27 def require_active_login(controller
):
29 Require an active login from the user.
32 def new_controller_func(request
, *args
, **kwargs
):
34 request
.user
.get('status') == u
'needs_email_verification':
36 request
, 'mediagoblin.user_pages.user_home',
37 user
=request
.user
.username
)
38 elif not request
.user
or request
.user
.get('status') != u
'active':
40 request
.urlgen('mediagoblin.auth.login',
44 return redirect(request
, 'mediagoblin.auth.login',
45 next
=url_quote(next_url
))
47 return controller(request
, *args
, **kwargs
)
49 return new_controller_func
51 def active_user_from_url(controller
):
52 """Retrieve User() from <user> URL pattern and pass in as url_user=...
54 Returns a 404 if no such active user has been found"""
56 def wrapper(request
, *args
, **kwargs
):
57 user
= User
.query
.filter_by(username
=request
.matchdict
['user']).first()
59 return render_404(request
)
61 return controller(request
, *args
, url_user
=user
, **kwargs
)
66 def user_may_delete_media(controller
):
68 Require user ownership of the MediaEntry to delete.
71 def wrapper(request
, *args
, **kwargs
):
72 uploader_id
= MediaEntry
.query
.get(request
.matchdict
['media']).uploader
73 if not (request
.user
.is_admin
or
74 request
.user
.id == uploader_id
):
77 return controller(request
, *args
, **kwargs
)
82 def user_may_alter_collection(controller
):
84 Require user ownership of the Collection to modify.
87 def wrapper(request
, *args
, **kwargs
):
88 creator_id
= request
.db
.User
.find_one(
89 {'username': request
.matchdict
['user']}).id
90 if not (request
.user
.is_admin
or
91 request
.user
.id == creator_id
):
94 return controller(request
, *args
, **kwargs
)
99 def uses_pagination(controller
):
101 Check request GET 'page' key for wrong values
104 def wrapper(request
, *args
, **kwargs
):
106 page
= int(request
.GET
.get('page', 1))
108 return render_404(request
)
110 return render_404(request
)
112 return controller(request
, page
=page
, *args
, **kwargs
)
117 def get_user_media_entry(controller
):
119 Pass in a MediaEntry based off of a url component
122 def wrapper(request
, *args
, **kwargs
):
123 user
= request
.db
.User
.find_one(
124 {'username': request
.matchdict
['user']})
127 return render_404(request
)
128 media
= request
.db
.MediaEntry
.find_one(
129 {'slug': request
.matchdict
['media'],
130 'state': u
'processed',
131 'uploader': user
.id})
133 # no media via slug? Grab it via object id
135 media
= MediaEntry
.query
.filter_by(
136 id=request
.matchdict
['media'],
138 uploader
=user
.id).first()
139 # Still no media? Okay, 404.
141 return render_404(request
)
143 return controller(request
, media
=media
, *args
, **kwargs
)
148 def get_user_collection(controller
):
150 Pass in a Collection based off of a url component
153 def wrapper(request
, *args
, **kwargs
):
154 user
= request
.db
.User
.find_one(
155 {'username': request
.matchdict
['user']})
158 return render_404(request
)
160 collection
= request
.db
.Collection
.find_one(
161 {'slug': request
.matchdict
['collection'],
164 # Still no collection? Okay, 404.
166 return render_404(request
)
168 return controller(request
, collection
=collection
, *args
, **kwargs
)
173 def get_user_collection_item(controller
):
175 Pass in a CollectionItem based off of a url component
178 def wrapper(request
, *args
, **kwargs
):
179 user
= request
.db
.User
.find_one(
180 {'username': request
.matchdict
['user']})
183 return render_404(request
)
185 collection
= request
.db
.Collection
.find_one(
186 {'slug': request
.matchdict
['collection'],
189 collection_item
= request
.db
.CollectionItem
.find_one(
190 {'id': request
.matchdict
['collection_item'] })
192 # Still no collection item? Okay, 404.
193 if not collection_item
:
194 return render_404(request
)
196 return controller(request
, collection_item
=collection_item
, *args
, **kwargs
)
201 def get_media_entry_by_id(controller
):
203 Pass in a MediaEntry based off of a url component
206 def wrapper(request
, *args
, **kwargs
):
207 media
= MediaEntry
.query
.filter_by(
208 id=request
.matchdict
['media'],
209 state
=u
'processed').first()
210 # Still no media? Okay, 404.
212 return render_404(request
)
214 return controller(request
, media
=media
, *args
, **kwargs
)