Merge remote-tracking branch 'gitorious/master'
This commit is contained in:
commit
f4b2bd93f2
@ -140,6 +140,7 @@ def setup_celery_from_config(app_config, global_config,
|
|||||||
|
|
||||||
if force_celery_always_eager:
|
if force_celery_always_eager:
|
||||||
celery_settings['CELERY_ALWAYS_EAGER'] = True
|
celery_settings['CELERY_ALWAYS_EAGER'] = True
|
||||||
|
celery_settings['CELERY_EAGER_PROPAGATES_EXCEPTIONS'] = True
|
||||||
|
|
||||||
__import__(settings_module)
|
__import__(settings_module)
|
||||||
this_module = sys.modules[settings_module]
|
this_module = sys.modules[settings_module]
|
||||||
|
@ -102,3 +102,23 @@ def get_user_media_entry(controller):
|
|||||||
return controller(request, media=media, *args, **kwargs)
|
return controller(request, media=media, *args, **kwargs)
|
||||||
|
|
||||||
return _make_safe(wrapper, controller)
|
return _make_safe(wrapper, controller)
|
||||||
|
|
||||||
|
def get_media_entry_by_id(controller):
|
||||||
|
"""
|
||||||
|
Pass in a MediaEntry based off of a url component
|
||||||
|
"""
|
||||||
|
def wrapper(request, *args, **kwargs):
|
||||||
|
try:
|
||||||
|
media = request.db.MediaEntry.find_one(
|
||||||
|
{'_id': ObjectId(request.matchdict['media']),
|
||||||
|
'state': 'processed'})
|
||||||
|
except InvalidId:
|
||||||
|
return exc.HTTPNotFound()
|
||||||
|
|
||||||
|
# Still no media? Okay, 404.
|
||||||
|
if not media:
|
||||||
|
return exc.HTTPNotFound()
|
||||||
|
|
||||||
|
return controller(request, media=media, *args, **kwargs)
|
||||||
|
|
||||||
|
return _make_safe(wrapper, controller)
|
||||||
|
0
mediagoblin/edit/__init__.py
Normal file
0
mediagoblin/edit/__init__.py
Normal file
27
mediagoblin/edit/forms.py
Normal file
27
mediagoblin/edit/forms.py
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||||
|
# Copyright (C) 2011 Free Software Foundation, Inc
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
import wtforms
|
||||||
|
|
||||||
|
|
||||||
|
class EditForm(wtforms.Form):
|
||||||
|
title = wtforms.TextField(
|
||||||
|
'Title',
|
||||||
|
[wtforms.validators.Length(min=0, max=500)])
|
||||||
|
slug = wtforms.TextField(
|
||||||
|
'Slug')
|
||||||
|
description = wtforms.TextAreaField('Description of this work')
|
24
mediagoblin/edit/lib.py
Normal file
24
mediagoblin/edit/lib.py
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||||
|
# Copyright (C) 2011 Free Software Foundation, Inc
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
def may_edit_media(request, media):
|
||||||
|
"""Check, if the request's user may edit the media details"""
|
||||||
|
if media['uploader'] == request.user['_id']:
|
||||||
|
return True
|
||||||
|
if request.user['is_admin']:
|
||||||
|
return True
|
||||||
|
return False
|
22
mediagoblin/edit/routing.py
Normal file
22
mediagoblin/edit/routing.py
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||||
|
# Copyright (C) 2011 Free Software Foundation, Inc
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
from routes.route import Route
|
||||||
|
|
||||||
|
edit_routes = [
|
||||||
|
Route('mediagoblin.edit.edit_media', "/{user}/{media}/",
|
||||||
|
controller="mediagoblin.edit.views:edit_media"),
|
||||||
|
]
|
64
mediagoblin/edit/views.py
Normal file
64
mediagoblin/edit/views.py
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||||
|
# Copyright (C) 2011 Free Software Foundation, Inc
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
|
||||||
|
from webob import Response, exc
|
||||||
|
|
||||||
|
from mediagoblin.edit import forms
|
||||||
|
from mediagoblin.edit.lib import may_edit_media
|
||||||
|
from mediagoblin.decorators import require_active_login, get_user_media_entry
|
||||||
|
|
||||||
|
|
||||||
|
@get_user_media_entry
|
||||||
|
@require_active_login
|
||||||
|
def edit_media(request, media):
|
||||||
|
if not may_edit_media(request, media):
|
||||||
|
return exc.HTTPForbidden()
|
||||||
|
|
||||||
|
form = forms.EditForm(request.POST,
|
||||||
|
title = media['title'],
|
||||||
|
slug = media['slug'],
|
||||||
|
description = media['description'])
|
||||||
|
|
||||||
|
if request.method == 'POST' and form.validate():
|
||||||
|
# Make sure there isn't already a MediaEntry with such a slug
|
||||||
|
# and userid.
|
||||||
|
existing_user_slug_entries = request.db.MediaEntry.find(
|
||||||
|
{'slug': request.POST['slug'],
|
||||||
|
'uploader': media['uploader'],
|
||||||
|
'_id': {'$ne': media['_id']}}).count()
|
||||||
|
|
||||||
|
if existing_user_slug_entries:
|
||||||
|
form.slug.errors.append(
|
||||||
|
u'An entry with that slug already exists for this user.')
|
||||||
|
else:
|
||||||
|
media['title'] = request.POST['title']
|
||||||
|
media['description'] = request.POST['description']
|
||||||
|
media['slug'] = request.POST['slug']
|
||||||
|
|
||||||
|
# redirect
|
||||||
|
return exc.HTTPFound(
|
||||||
|
location=request.urlgen("mediagoblin.user_pages.media_home",
|
||||||
|
user=media.uploader()['username'], media=media['_id']))
|
||||||
|
|
||||||
|
# render
|
||||||
|
template = request.template_env.get_template(
|
||||||
|
'mediagoblin/edit/edit.html')
|
||||||
|
return Response(
|
||||||
|
template.render(
|
||||||
|
{'request': request,
|
||||||
|
'media': media,
|
||||||
|
'form': form}))
|
@ -19,6 +19,7 @@ from routes import Mapper
|
|||||||
from mediagoblin.auth.routing import auth_routes
|
from mediagoblin.auth.routing import auth_routes
|
||||||
from mediagoblin.submit.routing import submit_routes
|
from mediagoblin.submit.routing import submit_routes
|
||||||
from mediagoblin.user_pages.routing import user_routes
|
from mediagoblin.user_pages.routing import user_routes
|
||||||
|
from mediagoblin.edit.routing import edit_routes
|
||||||
|
|
||||||
def get_mapper():
|
def get_mapper():
|
||||||
mapping = Mapper()
|
mapping = Mapper()
|
||||||
@ -31,5 +32,6 @@ def get_mapper():
|
|||||||
mapping.extend(auth_routes, '/auth')
|
mapping.extend(auth_routes, '/auth')
|
||||||
mapping.extend(submit_routes, '/submit')
|
mapping.extend(submit_routes, '/submit')
|
||||||
mapping.extend(user_routes, '/u')
|
mapping.extend(user_routes, '/u')
|
||||||
|
mapping.extend(edit_routes, '/edit')
|
||||||
|
|
||||||
return mapping
|
return mapping
|
||||||
|
38
mediagoblin/templates/mediagoblin/edit/edit.html
Normal file
38
mediagoblin/templates/mediagoblin/edit/edit.html
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
{#
|
||||||
|
# GNU MediaGoblin -- federated, autonomous media hosting
|
||||||
|
# Copyright (C) 2011 Free Software Foundation, Inc
|
||||||
|
#
|
||||||
|
# This program is free software: you can redistribute it and/or modify
|
||||||
|
# it under the terms of the GNU Affero General Public License as published by
|
||||||
|
# the Free Software Foundation, either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# This program is distributed in the hope that it will be useful,
|
||||||
|
# but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU Affero General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU Affero General Public License
|
||||||
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
#}
|
||||||
|
{% extends "mediagoblin/base.html" %}
|
||||||
|
|
||||||
|
{% import "/mediagoblin/utils/wtforms.html" as wtforms_util %}
|
||||||
|
|
||||||
|
{% block mediagoblin_content %}
|
||||||
|
<h1>Edit details for {{ media.title }}</h1>
|
||||||
|
|
||||||
|
<form action="{{ request.urlgen('mediagoblin.edit.edit_media',
|
||||||
|
user= media.uploader().username,
|
||||||
|
media= media._id) }}"
|
||||||
|
method="POST" enctype="multipart/form-data">
|
||||||
|
<div class="submit_box form_box">
|
||||||
|
{{ wtforms_util.render_divs(form) }}
|
||||||
|
<div class="form_submit_buttons">
|
||||||
|
<input type="submit" value="submit" class="button" />
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
<img src="{{ request.app.public_store.file_url(
|
||||||
|
media['media_files']['thumb']) }}" />
|
||||||
|
{% endblock %}
|
@ -20,11 +20,11 @@
|
|||||||
|
|
||||||
{# temporarily, an "image gallery" that isn't one really ;) #}
|
{# temporarily, an "image gallery" that isn't one really ;) #}
|
||||||
{% if media %}
|
{% if media %}
|
||||||
<img class="media_image" src="{{ request.app.public_store.file_url(
|
|
||||||
media.media_files.main) }}" />
|
|
||||||
<h1>
|
<h1>
|
||||||
{{media.title}}
|
{{media.title}}
|
||||||
</h1>
|
</h1>
|
||||||
|
<img class="media_image" src="{{ request.app.public_store.file_url(
|
||||||
|
media.media_files.main) }}" />
|
||||||
<p>{{ media.description }}</p>
|
<p>{{ media.description }}</p>
|
||||||
<p>Uploaded on
|
<p>Uploaded on
|
||||||
{{ "%4d-%02d-%02d"|format(media.created.year,
|
{{ "%4d-%02d-%02d"|format(media.created.year,
|
||||||
@ -33,6 +33,9 @@
|
|||||||
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
|
<a href="{{ request.urlgen('mediagoblin.user_pages.user_home',
|
||||||
user= media.uploader().username) }}">
|
user= media.uploader().username) }}">
|
||||||
{{- media.uploader().username }}</a></p>
|
{{- media.uploader().username }}</a></p>
|
||||||
|
<p><a href="{{ request.urlgen('mediagoblin.edit.edit_media',
|
||||||
|
user= media.uploader().username,
|
||||||
|
media= media._id) }}">Edit</a></p>
|
||||||
{% else %}
|
{% else %}
|
||||||
<p>Sorry, no such media found.<p/>
|
<p>Sorry, no such media found.<p/>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user