aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authortom <tom@teamfay.co.uk>2015-12-12 11:02:39 +0000
committerChristopher Allan Webber <cwebber@dustycloud.org>2016-01-07 11:04:11 -0800
commit5f60a4550d4ae46fdea07bc5f11f8513bdac8f77 (patch)
treeae54447ef79ed2f6f35f73bf86c1fe64854d08a6
parentcf948352b2b4624ad019aab7740ca669fddcc694 (diff)
downloadmediagoblin-5f60a4550d4ae46fdea07bc5f11f8513bdac8f77.tar.lz
mediagoblin-5f60a4550d4ae46fdea07bc5f11f8513bdac8f77.tar.xz
mediagoblin-5f60a4550d4ae46fdea07bc5f11f8513bdac8f77.zip
Add collection drop down to submit page.
-rw-r--r--mediagoblin/submit/forms.py5
-rw-r--r--mediagoblin/submit/views.py22
-rw-r--r--mediagoblin/tests/test_submission.py60
3 files changed, 83 insertions, 4 deletions
diff --git a/mediagoblin/submit/forms.py b/mediagoblin/submit/forms.py
index c5bacc44..69d211e6 100644
--- a/mediagoblin/submit/forms.py
+++ b/mediagoblin/submit/forms.py
@@ -16,7 +16,7 @@
import wtforms
-
+from wtforms.ext.sqlalchemy.fields import QuerySelectField
from mediagoblin import mg_globals
from mediagoblin.tools.text import tag_length_validator
from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
@@ -50,6 +50,9 @@ def get_submit_start_form(form, **kwargs):
_('License'),
[wtforms.validators.Optional(),],
choices=licenses_as_choices())
+ collection = QuerySelectField(
+ _('Collection'),
+ allow_blank=True, blank_text=_('-- Select --'), get_label='title',)
max_file_size = wtforms.HiddenField('')
upload_limit = wtforms.HiddenField('')
uploaded = wtforms.HiddenField('')
diff --git a/mediagoblin/submit/views.py b/mediagoblin/submit/views.py
index eae4a1e7..c2eecdb6 100644
--- a/mediagoblin/submit/views.py
+++ b/mediagoblin/submit/views.py
@@ -23,7 +23,8 @@ import logging
_log = logging.getLogger(__name__)
-
+from mediagoblin.db.models import Collection
+from mediagoblin.tools.federation import create_activity
from mediagoblin.tools.translate import pass_to_ugettext as _
from mediagoblin.tools.response import render_to_response, redirect
from mediagoblin.decorators import require_active_login, user_has_privilege
@@ -33,6 +34,7 @@ from mediagoblin.media_types import FileTypeNotSupported
from mediagoblin.submit.lib import \
check_file_field, submit_media, get_upload_file_limits, \
FileUploadLimit, UserUploadLimit, UserPastUploadLimit
+from mediagoblin.user_pages.lib import add_media_to_collection
@require_active_login
@@ -49,6 +51,15 @@ def submit_start(request):
max_file_size=max_file_size,
upload_limit=upload_limit,
uploaded=request.user.uploaded)
+ users_collections = Collection.query.filter_by(
+ actor=request.user.id,
+ type=Collection.USER_DEFINED_TYPE
+ ).order_by(Collection.title)
+
+ if users_collections.count() > 0:
+ submit_form.collection.query = users_collections
+ else:
+ del submit_form.collection
if request.method == 'POST' and submit_form.validate():
if not check_file_field(request, 'file'):
@@ -56,7 +67,7 @@ def submit_start(request):
_(u'You must provide a file.'))
else:
try:
- submit_media(
+ media = submit_media(
mg_app=request.app, user=request.user,
submitted_file=request.files['file'],
filename=request.files['file'].filename,
@@ -67,6 +78,13 @@ def submit_start(request):
upload_limit=upload_limit, max_file_size=max_file_size,
urlgen=request.urlgen)
+ if submit_form.collection and submit_form.collection.data:
+ add_media_to_collection(
+ submit_form.collection.data, media)
+ create_activity(
+ "add", media, request.user,
+ target=submit_form.collection.data)
+
add_message(request, SUCCESS, _('Woohoo! Submitted!'))
return redirect(request, "mediagoblin.user_pages.user_home",
diff --git a/mediagoblin/tests/test_submission.py b/mediagoblin/tests/test_submission.py
index f9031d37..eed7afa3 100644
--- a/mediagoblin/tests/test_submission.py
+++ b/mediagoblin/tests/test_submission.py
@@ -23,6 +23,7 @@ if six.PY2: # this hack only work in Python 2
import os
import pytest
+import webtest.forms
import six.moves.urllib.parse as urlparse
@@ -32,7 +33,7 @@ gi.require_version('Gst', '1.0')
from gi.repository import Gst
Gst.init(None)
-from mediagoblin.tests.tools import fixture_add_user
+from mediagoblin.tests.tools import fixture_add_user, fixture_add_collection
from .media_tools import create_av
from mediagoblin import mg_globals
from mediagoblin.db.models import MediaEntry, User, LocalUser
@@ -421,3 +422,60 @@ class TestSubmission:
size = os.stat(filename).st_size
assert last_size > size
last_size = size
+
+ def test_collection_selection(self):
+ """Test the ability to choose a collection when submitting media
+ """
+ # Collection option shouldn't be present if the user has no collections
+ response = self.test_app.get('/submit/')
+ assert 'collection' not in response.form.fields
+
+ upload = webtest.forms.Upload(os.path.join(
+ 'mediagoblin', 'static', 'images', 'media_thumbs', 'image.png'))
+
+ # Check that upload of an image when a user has no collections
+ response.form['file'] = upload
+ no_collection_title = 'no collection'
+ response.form['title'] = no_collection_title
+ response.form.submit()
+ assert MediaEntry.query.filter_by(
+ actor=self.our_user().id
+ ).first().title == no_collection_title
+
+ # Collection option should be present if the user has collections. It
+ # shouldn't allow other users' collections to be selected.
+ col = fixture_add_collection(user=self.our_user())
+ user = fixture_add_user(username=u'different')
+ fixture_add_collection(user=user, name=u'different')
+ response = self.test_app.get('/submit/')
+ form = response.form
+ assert 'collection' in form.fields
+ # Option length is 2, because of the default "--Select--" option
+ assert len(form['collection'].options) == 2
+ assert form['collection'].options[1][2] == col.title
+
+ # Test that if we specify a collection then the media entry is added to
+ # the specified collection.
+ form['file'] = upload
+ title = 'new picture'
+ form['title'] = title
+ form['collection'] = form['collection'].options[1][0]
+ form.submit()
+ # The title of the first item in our user's first collection should
+ # match the title of the picture that was just added.
+ col = self.our_user().collections[0]
+ assert col.collection_items[0].get_object().title == title
+
+ # Test upload succeeds if the user has collection and no collection is
+ # chosen.
+ form['file'] = webtest.forms.Upload(os.path.join(
+ 'mediagoblin', 'static', 'images', 'media_thumbs', 'image.png'))
+ title = 'no collection 2'
+ form['title'] = title
+ form['collection'] = form['collection'].options[0][0]
+ form.submit()
+ # The title of the first item in our user's first collection should
+ # match the title of the picture that was just added.
+ assert MediaEntry.query.filter_by(
+ actor=self.our_user().id
+ ).count() == 3