mediagoblin.git
11 years agoBetter Py3 compat: d.has_key(k) -> k in d
Elrond [Wed, 30 Jan 2013 14:03:04 +0000 (15:03 +0100)]
Better Py3 compat: d.has_key(k) -> k in d

py3 does not have dict.has_key any more. You have to use
"key in dict" instead. As that works in python2 as well,
let's use that.

Also some small bits of pep8.

11 years agoImprove runtime of one test.
Elrond [Tue, 29 Jan 2013 20:45:16 +0000 (21:45 +0100)]
Improve runtime of one test.

Do not commit so often. flushing is enough.

11 years agoFix issue 611: Proper (back)relationship on MediaComment.
Elrond [Tue, 29 Jan 2013 20:23:21 +0000 (21:23 +0100)]
Fix issue 611: Proper (back)relationship on MediaComment.

well, fix the relationship on the comments.

11 years agoFailing testcase for issue 611.
Elrond [Tue, 29 Jan 2013 20:13:49 +0000 (21:13 +0100)]
Failing testcase for issue 611.

This currently fails (with foreign key constrain error):
1. Have user A and B.
2. User B creates media M.
3. User A post a comment on M.
4. User A deletes his own account.

The test is a little bit wider.

11 years ago*docs* intersphinx, exception monitoring
Joar Wandborg [Sun, 27 Jan 2013 21:10:47 +0000 (22:10 +0100)]
*docs* intersphinx, exception monitoring

11 years agoDocs: Add a database guide to the plugin docs.
Elrond [Sat, 26 Jan 2013 18:21:40 +0000 (19:21 +0100)]
Docs: Add a database guide to the plugin docs.

Plugin writers will often need to create new tables. So
give them some hints, what they need to do and where they
might find more info.

11 years agoDocs: Create new area for developers.
Elrond [Sat, 26 Jan 2013 18:20:18 +0000 (19:20 +0100)]
Docs: Create new area for developers.

We need some "Part" for developers. Currently, it's named
"Part 4: Developer's Zone".  But we should come up with a
better name soon.

Moved the codebase docs in there for starters.

11 years agoAdd Trim whitespace plugin docs.
Elrond [Sat, 26 Jan 2013 12:03:54 +0000 (13:03 +0100)]
Add Trim whitespace plugin docs.

Added the documentation (which was already present in
plugindocs/) to the TOC, so it's getting build and linked.

11 years agoAllow doc string extraction and use for pluginapi.
Elrond [Fri, 25 Jan 2013 23:12:18 +0000 (00:12 +0100)]
Allow doc string extraction and use for pluginapi.

Allow us to extract docstrings from our sources using the
sphinx.ext.autodoc module.

First use: Extract some of the docs for the pluginapi and
provide it in a new "Plugin API" section.

11 years agoUpdated video apt-get to not use glob
Joar Wandborg [Fri, 25 Jan 2013 20:43:49 +0000 (21:43 +0100)]
Updated video apt-get to not use glob

Also changed some literal blocks to code-blocks

11 years agoFix reference of get_test_app->get_app in test_modelmethods
Christopher Allan Webber [Fri, 25 Jan 2013 18:10:27 +0000 (12:10 -0600)]
Fix reference of get_test_app->get_app in test_modelmethods

(This changed in master while this test was being written; correcting
post-merge.)

11 years agoMerge branch '216_cwebber_style_unique_slugs'
Christopher Allan Webber [Fri, 25 Jan 2013 18:03:40 +0000 (12:03 -0600)]
Merge branch '216_cwebber_style_unique_slugs'

11 years agoNew mediaentry slug tests now pass!
Christopher Allan Webber [Wed, 23 Jan 2013 22:49:54 +0000 (16:49 -0600)]
New mediaentry slug tests now pass!

 - fixed some issues with "whacking uuid junk on the slug"
 - uuid4() -> uuid.uuid4() so that mock will work right
 - added all the tests!

11 years agorequire mock for the new uuid-mocking tests
Christopher Allan Webber [Wed, 23 Jan 2013 22:47:30 +0000 (16:47 -0600)]
require mock for the new uuid-mocking tests

11 years agoWe don't want any empty string slugs, so make "" -> None
Christopher Allan Webber [Wed, 23 Jan 2013 22:40:39 +0000 (16:40 -0600)]
We don't want any empty string slugs, so make "" -> None

11 years agoSwitching uuid4()[1:4] -> uuid4().hex[:4]
Christopher Allan Webber [Wed, 23 Jan 2013 21:15:22 +0000 (15:15 -0600)]
Switching uuid4()[1:4] -> uuid4().hex[:4]

.hex is what we need to access to get at the ascii (hex) version
anyway.  Also, not sure why the previous version grabbed starting at
the index of 1... just grab the first characters instead.

11 years agoUse better relationships to delete collections.
Elrond [Tue, 22 Jan 2013 21:00:41 +0000 (22:00 +0100)]
Use better relationships to delete collections.

When deleting a User, his/her collections can be deleted by
sqlalchemy: Collections do not need any special code to be
executed on deletion.

11 years agoMade pil_filters a PIL_FILTERS (global)
Joar Wandborg [Tue, 22 Jan 2013 22:02:06 +0000 (23:02 +0100)]
Made pil_filters a PIL_FILTERS (global)

11 years agoChanged sampling filter default to AA
Joar Wandborg [Tue, 22 Jan 2013 21:54:10 +0000 (22:54 +0100)]
Changed sampling filter default to AA

11 years agoMade the image sampling filter configurable
Joar Wandborg [Tue, 22 Jan 2013 16:55:55 +0000 (17:55 +0100)]
Made the image sampling filter configurable

- Changed the default to BICUBIC instead of previous ANTIALIAS

11 years agoUse inspect_table; default user license==None.
Elrond [Tue, 22 Jan 2013 21:28:19 +0000 (22:28 +0100)]
Use inspect_table; default user license==None.

Use inspect_table in the new migration. Makes code more
readable, really.

And make the default for the preferred license be None.
This is a userspace thing, so we can even change the
migration here. Changing the migration means, that people
running the migration before this commit get a "" in
User.license_preference, while people running the migration
now get a None. Both values are okay.

None has been designated as "Use the site's default". We're
not actually having a site default right now. Which means
no license is selected in the dropdown.

While "" means "All rights reserved" being chosen by the
user.

Side note: Having no license being selected in the submit
dropdown is as "worse" as before and does not really hurt
much. MediaEntry.license==None means "All rights reserved"
as does "" also do.

11 years agouser.get('moo') -> user.moo
Sebastian Spaeth [Tue, 22 Jan 2013 21:18:08 +0000 (22:18 +0100)]
user.get('moo') -> user.moo

User fields are always existent, so there is no need to .get() them,
just use them directly.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMerge remote-tracking branch 'refs/remotes/spaetz/521_license_preference' into mergetest
Christopher Allan Webber [Tue, 22 Jan 2013 19:43:02 +0000 (13:43 -0600)]
Merge remote-tracking branch 'refs/remotes/spaetz/521_license_preference' into mergetest

11 years agoMoved MediaComment form descriptions to apt. place
Joar Wandborg [Tue, 22 Jan 2013 13:38:53 +0000 (14:38 +0100)]
Moved MediaComment form descriptions to apt. place

11 years agoAlso set login_failed in case of form errors
Sebastian Spaeth [Mon, 21 Jan 2013 15:27:19 +0000 (16:27 +0100)]
Also set login_failed in case of form errors

If we send a POST request to the login page which contained form errors
(e.g. a too short password), the variable "login_failed" was not set to
true. This condition was tested by the test suite however, so we should
make sure that login_failed is set even if the form failed to validate.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoRestructure ForgotPassword view
Sebastian Spaeth [Mon, 7 Jan 2013 09:17:52 +0000 (10:17 +0100)]
Restructure ForgotPassword view

1) Remove mongo limitations (no 'or' when querying for either username
or email).

2) Lost password function revealed if an user name or email address
   is registered, which can be considered a data leak.
   Leaking user names is OK, they are public anyway, but don't reveal
   lookup success in case the lookup happened by email address.
   Simply respond: "If you have an account here, we have send you
                    your email"?

3) username and email search was case sensitive. Made username search
   case insensitive (they are always stored lowercase in the db).
   Keep email-address search case sensitive for now. This might need
   further discussion

4) Remove a whole bunch of indention in the style of:
   if no error:
        ...
        if no error:
            ...
            if no error:
                actually do something in the regular case

   by restructuring the function.

5) Outsource the sanity checking for username and email fields into the
   validator function. This way, we get automatic case sanity checking
   and sanitizing for all required fields.

6) Require 5-char password and fix tests

   Originally, the Change password form required a password between 6-30
   chars while the registration and login form did not require anything
   special. This commit introduces a common minimum limit for all forms
   which breaks the test suite which uses a 5 char password by
   default. :-).  As 5 chars seem sensible enough to enforce (people
   should be picking much longer ones anyway), just reduce the limit to
   5 chars, thereby making all tests pass.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoNormalize the email address in the same way in all places
Sebastian Spaeth [Mon, 7 Jan 2013 09:16:20 +0000 (10:16 +0100)]
Normalize the email address in the same way in all places

We were case normalizing the email address for registration, but not at
all for the forgotten password retrieval. Make a
tools.mail.normalize_email helper that can be used to normalize the
email in the same way in all places.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMerge remote-tracking branch 'refs/remotes/spaetz/436_celery_push'
Christopher Allan Webber [Sun, 20 Jan 2013 19:13:39 +0000 (13:13 -0600)]
Merge remote-tracking branch 'refs/remotes/spaetz/436_celery_push'

11 years agoSanitize slug input on media edit
Sebastian Spaeth [Wed, 9 Jan 2013 11:38:08 +0000 (12:38 +0100)]
Sanitize slug input on media edit

Previously we allowed EVERYTHING, even slashes as slug when editing the media.
Make sure we slugify the input to sanitize it.

(+ string formdata is unicode, so there is no need to convert it)

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoAdd (failing) test for editing the slug.
Elrond [Fri, 18 Jan 2013 20:17:52 +0000 (21:17 +0100)]
Add (failing) test for editing the slug.

This test fails, because it tries to set a slug with an "="
in it. And tests that the "=" gets replaced by "-".

Well, it currently is not being replaced.

The next (cherry picked) commit by Sebastian Spaeth fixes
this test!

11 years agoEnable foreign key checking on sqlite.
Elrond [Fri, 18 Jan 2013 17:42:52 +0000 (18:42 +0100)]
Enable foreign key checking on sqlite.

sqlite normally does not check foreign key referential
integrity. But it can do so.
So let's use it. Better safe than sorry.

11 years agoTurn comment list into a real <ul>.
Elrond [Fri, 18 Jan 2013 12:05:57 +0000 (13:05 +0100)]
Turn comment list into a real <ul>.

Well, I like semantic html. And the list of comments, well,
is now a list: <ul>.
Using list-style:none it looks nearly the same as before.

11 years agoAdd some simple collection test.
Elrond [Fri, 18 Jan 2013 10:42:56 +0000 (11:42 +0100)]
Add some simple collection test.

11 years agoRename get_test_app to get_app.
Elrond [Fri, 18 Jan 2013 10:40:40 +0000 (11:40 +0100)]
Rename get_test_app to get_app.

nosetests runs everything that even vaguely looks like a
test case... even our get_test_app. And as it is imported
everywhere... it is run everywhere as a test case. Renaming
it saves us about 10+ tests and a few seconds of time.

11 years agoRemove useless spaces in comment stuff.
Elrond [Thu, 17 Jan 2013 22:55:49 +0000 (23:55 +0100)]
Remove useless spaces in comment stuff.

When rendering a comment, we had a lot of whitespace. And
some of it made it into the rendered page:
"""<a href=...>abc </a>""" the trailing space gets
rendered and looks ugly.

11 years agoTranslate account deletion.
Elrond [Thu, 17 Jan 2013 22:54:48 +0000 (23:54 +0100)]
Translate account deletion.

Mark all the strings in the new account deletion stuff for
translation.

11 years agoFix linking to comments.
Elrond [Thu, 17 Jan 2013 22:50:51 +0000 (23:50 +0100)]
Fix linking to comments.

when linking to a comment in a MediaEntry, the page did not
contain a <a name="comment"> because, well:

We fetched a string comment-id from the routing. And the
pagination code tried to compare that to the int id on the
comment.

Fix is to let routing fetch an int from the url. Easy.

Relatedly remove duplicated comment_id fetching from the
URL in the view.

11 years agoMerge branch 'master' of gitorious.org:mediagoblin/mediagoblin
Christopher Allan Webber [Thu, 17 Jan 2013 21:51:30 +0000 (15:51 -0600)]
Merge branch 'master' of gitorious.org:mediagoblin/mediagoblin

11 years agoReturn to media collection page if no collection selected
Sebastian Spaeth [Thu, 17 Jan 2013 21:37:41 +0000 (22:37 +0100)]
Return to media collection page if no collection selected

schendje rightly pointed out that we should not return to the media
homepage if we did not select a collection on the "collect" page, but
should actually return to the collect page.

This is an improvement of the user experience ;-)

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMove workbench into tools directory.
Elrond [Thu, 17 Jan 2013 21:10:43 +0000 (22:10 +0100)]
Move workbench into tools directory.

11 years agoRemove DEFAULT_WORKBENCH_DIR.
Elrond [Wed, 16 Jan 2013 18:50:48 +0000 (19:50 +0100)]
Remove DEFAULT_WORKBENCH_DIR.

We never used this.
Removed, as okayed by cwebber.

11 years agoMerge remote-tracking branch 'refs/remotes/spaetz/565_workbench_cleanup'
Christopher Allan Webber [Thu, 17 Jan 2013 21:02:52 +0000 (15:02 -0600)]
Merge remote-tracking branch 'refs/remotes/spaetz/565_workbench_cleanup'

11 years agoAdd a license preference field
Mark Holmquist [Sun, 11 Nov 2012 00:59:37 +0000 (16:59 -0800)]
Add a license preference field

This feature is absolutely necessary. Now a user can simply define
their default license and quickly go through a form, as opposed to
stopping to click on the select and choosing the same option over
and over again.

Also added DB migration for the field, so that's working now, too.

Rebased by Sebastian and made the default value to be unicode.

Reviewed-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoAdd "Browse collections" link to profile pages
Jef van Schendel [Thu, 17 Jan 2013 19:04:22 +0000 (20:04 +0100)]
Add "Browse collections" link to profile pages

11 years agoadding back dropdown.js now that we have, well, a dropdown again :)
Christopher Allan Webber [Thu, 17 Jan 2013 17:53:32 +0000 (11:53 -0600)]
adding back dropdown.js now that we have, well, a dropdown again :)

11 years agoMerge remote-tracking branch 'refs/remotes/origin/533-new-dropdown'
Christopher Allan Webber [Thu, 17 Jan 2013 17:47:29 +0000 (11:47 -0600)]
Merge remote-tracking branch 'refs/remotes/origin/533-new-dropdown'

Conflicts:
mediagoblin/templates/mediagoblin/base.html
mediagoblin/templates/mediagoblin/root.html

11 years agoMerge commit '9408938' from 565_workbench_cleanup (spaetz)
Christopher Allan Webber [Thu, 17 Jan 2013 17:12:13 +0000 (11:12 -0600)]
Merge commit '9408938' from 565_workbench_cleanup (spaetz)

11 years agoCSS edits to dropdown menu; added log out button for unverified users
Jef van Schendel [Thu, 17 Jan 2013 15:15:03 +0000 (16:15 +0100)]
CSS edits to dropdown menu; added log out button for unverified users

11 years agoChange position of "Delete account" link, put it below the form
Jef van Schendel [Thu, 17 Jan 2013 12:35:45 +0000 (13:35 +0100)]
Change position of "Delete account" link, put it below the form

11 years agoBetter "delete my account" placement
Sebastian Spaeth [Thu, 17 Jan 2013 11:47:38 +0000 (12:47 +0100)]
Better "delete my account" placement

Improve the "delete my account" link location by not placing it outside the
main content bar. It still might require more tweaks.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoIntroduce user_deletion test.
Sebastian Spaeth [Thu, 17 Jan 2013 11:19:16 +0000 (12:19 +0100)]
Introduce user_deletion test.

Delete a user via web interface and see if it works. TODO: this does not test
that related entries are also cleaned up and we should extend the test to
do so.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoAllowing to delete a user account (#302)
Sebastian Spaeth [Thu, 15 Nov 2012 09:44:38 +0000 (10:44 +0100)]
Allowing to delete a user account (#302)

Add a "Delete user account" template and link to it from the user
account settings page.

Create a delete_account function and fill in most blanks. We can now
successfully delete our own account.

Thanks to Elrond for catching a stray csrf_exempt in a previous iteration
of this patch.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoimport db.sql.util -> db.util
Sebastian Spaeth [Thu, 17 Jan 2013 11:18:14 +0000 (12:18 +0100)]
import db.sql.util -> db.util

Merging an old branch, I reintroduced an import of db.sql.util rather than
db.util. Fixing the glitch.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMerge branch '540_User_delete_deletes_related_entries'
Sebastian Spaeth [Thu, 17 Jan 2013 10:52:22 +0000 (11:52 +0100)]
Merge branch '540_User_delete_deletes_related_entries'

11 years agoImplement User.delete() (#540)
Sebastian Spaeth [Wed, 28 Nov 2012 14:46:40 +0000 (15:46 +0100)]
Implement User.delete() (#540)

Set User.collections to her Collections using the backref feature.
This way we can iterate a user's collections and delete them all.

Delete all MediaEntries/Files/attachments/comments/collections etc
before finally deleting the User object. This is the backend work for
issue 302 (allow a user to delete ones own account)

11 years agoImplement Collection.delete()
Sebastian Spaeth [Wed, 28 Nov 2012 15:15:46 +0000 (16:15 +0100)]
Implement Collection.delete()

Deleting a Collection should automatically delete all containing items.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoImplement MediaEntry().delete() (#540)
Sebastian Spaeth [Thu, 15 Nov 2012 10:44:50 +0000 (11:44 +0100)]
Implement MediaEntry().delete() (#540)

Deleting a MediaEntry instance will automatically
delete all related comments and files/attachments. This moves
implementation logic out of views.py and allows to make use of this
functionality when e.g. deleting a User() account.

Whenever a MediaEntry entry is deleted, this will also sql-delete
the corresponding MediaFile entry.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoDo not read complete videos in RAM (#419)
Sebastian Spaeth [Wed, 19 Dec 2012 14:03:43 +0000 (15:03 +0100)]
Do not read complete videos in RAM (#419)

We were reading the complete "medium" "thumbnail" and "original"
in RAM via dst.write(src.read()). Just call the appropriate storage
methods copy_local_to_storage which are responsible for streaming
local files efficiently.

The efficiency of this patch depends on the separate branch that
actually implements chunked copying for Storage().copy_local_to_storage()

11 years agoAdd @get_workbench test
Sebastian Spaeth [Wed, 12 Dec 2012 13:29:49 +0000 (14:29 +0100)]
Add @get_workbench test

Test the decorator function and proper cleanup after it's usage.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoShorten Workbench(Manager) method names
Sebastian Spaeth [Wed, 12 Dec 2012 13:08:38 +0000 (14:08 +0100)]
Shorten Workbench(Manager) method names

1) destroy_self() is a horrible function name, make it "destroy".
workbench.destroy() is descriptive enough.

2) WorkbenchManager.create_workbench() -> WorkbenchManager.create()
  We use the pattern "with workbench_manager.create() as workbench:"
  No need to mention workbenches three times in a row...

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoSwitch over media processor to use the get_workbench decorator (#565)
Sebastian Spaeth [Wed, 12 Dec 2012 12:57:17 +0000 (13:57 +0100)]
Switch over media processor to use the get_workbench decorator (#565)

This makes workbench getting more convenient by eliminating some
boilerplate and more robust by cleaning the workbench up even if processing
ends with an Exception.

Finally, this fixes the bugs in the ascii and video backends to never call
workbench.destroy, so those workbenches were never cleaned up.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoImplement @get_workbench decorator
Sebastian Spaeth [Wed, 12 Dec 2012 12:53:56 +0000 (13:53 +0100)]
Implement @get_workbench decorator

This passes in a Workbench() via the 'workbench' keyword argument, and
conveniently cleans it up after the function has finished. 2 out of our 5
backends forgot to clean up their workbench, so this is clearly needed :-).

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMake Workbench() a context manager
Sebastian Spaeth [Wed, 12 Dec 2012 12:50:32 +0000 (13:50 +0100)]
Make Workbench() a context manager

This allows us to use "with Workbench() as foo: do_stuff..."
No consumers have been switched yet though.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMake the workbench destroy itself for video processing also.
Christopher Allan Webber [Wed, 16 Jan 2013 18:12:57 +0000 (12:12 -0600)]
Make the workbench destroy itself for video processing also.

11 years agoMerge remote-tracking branch 'refs/remotes/spaetz/561_use_workbench_not_tempfiles'
Christopher Allan Webber [Wed, 16 Jan 2013 17:23:38 +0000 (11:23 -0600)]
Merge remote-tracking branch 'refs/remotes/spaetz/561_use_workbench_not_tempfiles'

11 years agoMerge remote-tracking branch 'refs/remotes/elrond/misc/use_media_id'
Christopher Allan Webber [Wed, 16 Jan 2013 17:06:22 +0000 (11:06 -0600)]
Merge remote-tracking branch 'refs/remotes/elrond/misc/use_media_id'

11 years agocollection browsing: rename view/template user_collections -> collection_list
Stefano Zacchiroli [Tue, 15 Jan 2013 22:11:33 +0000 (23:11 +0100)]
collection browsing: rename view/template user_collections -> collection_list

Rationale, avoid confusion between views user_collection and user_collections
(note trailing "s"). Ditto for the collection(s).html templates.

11 years agoSimplifying string concatenation in generate_slug and fixing docstring
Christopher Allan Webber [Tue, 15 Jan 2013 22:11:15 +0000 (16:11 -0600)]
Simplifying string concatenation in generate_slug and fixing docstring

 - made the mistake of copying some commit message things into the
   docstring.  Fixed.
 - elrond points out that += is nicer and we don't need u"" in this
   case since we're not concatenating a variable, we're concatenating
   a known ascii string.

11 years agocollection browsing: remove pagination support
Stefano Zacchiroli [Tue, 15 Jan 2013 22:04:37 +0000 (23:04 +0100)]
collection browsing: remove pagination support

rationale: we do not expect hundreds of collection (and it was likely broken
anyhow)

thanks to Elrond der Elbenfuerst for pointing this out

11 years agoA revised algorithm for generating slugs.
Christopher Allan Webber [Tue, 15 Jan 2013 21:48:19 +0000 (15:48 -0600)]
A revised algorithm for generating slugs.

This one does not *force* slugs, but usually it will probably result
in a niceish one.

The end *result* of the algorithm will (presumably, I have not tested
it) result in these resolutions for these situations:
 - If we have a slug, make sure it's clean and sanitized, and if it's
   unique, we'll use that.
 - If we have a title, slugify it, and if it's unique, we'll use that.
 - If we can't get any sort of thing that looks like it'll be a useful
   slug out of a title or an existing slug, bail, and don't set the
   slug at all.  Don't try to create something just because.  Make
   sure we have a reasonable basis for a slug first.
 - If we have a reasonable basis for a slug (either based on existing
   slug or slugified title) but it's not unique, first try appending
   the entry's id, if that exists
 - If that doesn't result in something unique, tack on some randomly
   generated bits until it's unique.  That'll be a little bit of junk,
   but at least it has the *basis* of a nice slug!

11 years agocollection browsing: drop atom feed from page template
Stefano Zacchiroli [Tue, 15 Jan 2013 20:43:12 +0000 (21:43 +0100)]
collection browsing: drop atom feed from page template

rationale: it refers to something else than a "collection feed"

thanks to Elrond der Elbenfuerst for pointing this out

11 years agocollections: add support to browse existing collections
Stefano Zacchiroli [Tue, 18 Dec 2012 11:34:30 +0000 (12:34 +0100)]
collections: add support to browse existing collections

- add a route at /u/<user>/collections/ (note trailing 's') that lists
  all existing collections
- move there the "Create new collection" link, if the user is logged in
- add a new link "Browse collections" from root.html

11 years agoNeed to import uuid4 for generate_slug to totally work
Christopher Allan Webber [Tue, 15 Jan 2013 20:34:13 +0000 (14:34 -0600)]
Need to import uuid4 for generate_slug to totally work

11 years agoMake generate_slug assign a slug in any case
Sebastian Spaeth [Wed, 9 Jan 2013 11:40:18 +0000 (12:40 +0100)]
Make generate_slug assign a slug in any case

generate_slug could assign "none" as slug. Make sure it assigns a unique
slug in any case. We now try based on:

a) existing slug values
b) media.title
c) media.id
d) random garbage

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoSanitize slug input on media edit
Sebastian Spaeth [Wed, 9 Jan 2013 11:38:08 +0000 (12:38 +0100)]
Sanitize slug input on media edit

Previously we allowed EVERYTHING, even slashes as slug when editing the media.
Make sure we slugify the input to sanitize it.

(+ string formdata is unicode, so there is no need to convert it)

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoDisallow ":" as part of a media slug
Sebastian Spaeth [Wed, 9 Jan 2013 11:36:26 +0000 (12:36 +0100)]
Disallow ":" as part of a media slug

We might want to use "id:IDN" as a special case slug to point to a media's
id.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years ago#571: Fixed. Display collection description with Markdown formatting.
Tiberiu C. Turbureanu [Tue, 15 Jan 2013 16:03:06 +0000 (18:03 +0200)]
#571: Fixed. Display collection description with Markdown formatting.

11 years agoUnbreak 301 responses
Sebastian Spaeth [Tue, 15 Jan 2013 15:52:22 +0000 (16:52 +0100)]
Unbreak 301 responses

The move to werkzeug routing went pretty smooth, but one thing was
broken by accident: URLs without final slash result in a 301
werkzeug.routing.RequestRedirect response. We displayed it as a generic
error page rather than actually sending the redirect. Do that. One thing
it does though is to skip all meddlewares, which should be OK for a 301
response, but might need rework if we decide otherwise. With this, 301
responses with lacking final slash are unbroken again.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoDon't pass request into run_process_media
Sebastian Spaeth [Tue, 15 Jan 2013 14:03:00 +0000 (15:03 +0100)]
Don't pass request into run_process_media

People(tm) want to start run_process_media from the CLI and might not
have a request object handy. So pass in the feed_url into
run_process_media rather than the request object and allow the feed url
to be empty (resulting in no PuSH notification at all then).

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMake PuSHing the Pubhubsubbub server an async task (#436, #585)
Sebastian Spaeth [Tue, 15 Jan 2013 13:41:30 +0000 (14:41 +0100)]
Make PuSHing the Pubhubsubbub server an async task (#436, #585)

Notifying the PuSH servers had 3 problems. 

1) it was done immediately after sending of the processing task to celery. So if celery was run in a separate
process we would notify the PuSH servers before the new media was processed/
visible. (#436)

2) Notification code was called in submit/views.py, so submitting via the
   API never resulted in notifications. (#585)

3) If Notifying the PuSH server failed, we would never retry.

The solution was to make the PuSH notification an asynchronous subtask. This
way: 1) it will only be called once async processing has finished, 2) it
is in the main processing code path, so even API calls will result in
notifications, and 3) We retry 3 times in case of failure before giving up.
If the server is in a separate process, we will wait 3x 2 minutes before
retrying the notification.

The only downside is that the celery server needs to have access to the internet
to ping the PuSH server. If that is a problem, we need to make the task belong
to a special group of celery servers that has access to the internet.

As a side effect, I believe I removed the limitation that prevented us from
upgrading celery.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoSimplify check_media_slug_used
Sebastian Spaeth [Wed, 9 Jan 2013 10:31:05 +0000 (11:31 +0100)]
Simplify check_media_slug_used

Remove the unused dummy_db argument and generally make the function
readable.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoMore explicit get_or_create pattern
Sebastian Spaeth [Wed, 9 Jan 2013 08:53:55 +0000 (09:53 +0100)]
More explicit get_or_create pattern

Don't do "user = getUser() or newUser()" in one line. It is bound to
confuse poor souls. Be more explicit here and even add a code comment.

Thanks to Elrond for not liking the previous pattern.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoImprove error message wording (#564)
Sebastian Spaeth [Mon, 14 Jan 2013 15:09:24 +0000 (16:09 +0100)]
Improve error message wording (#564)

Improve error message wording if no csf cookie could be detected. Also,
make the error text translatable.

11 years agoUse the new logo.html thingy in airy.
Elrond [Sun, 16 Dec 2012 13:08:38 +0000 (14:08 +0100)]
Use the new logo.html thingy in airy.

11 years agoMove logo part into bits/logo.html
Elrond [Sun, 16 Dec 2012 12:47:13 +0000 (13:47 +0100)]
Move logo part into bits/logo.html

To make it easier for themers to replace the logo, move it
out into its own logo.html.

11 years agoKill db_host, db_name, and db_port from config_spec.ini.
Elrond [Tue, 8 Jan 2013 21:54:36 +0000 (22:54 +0100)]
Kill db_host, db_name, and db_port from config_spec.ini.

The last bits of mongo. Let me remove them.

11 years agoStart to use the media_id in "admin" URLs.
Elrond [Fri, 11 Jan 2013 13:18:27 +0000 (14:18 +0100)]
Start to use the media_id in "admin" URLs.

We have a bunch of URLs that are more for internal use. At
least they're definitely not intended to be posted
somewhere for long term useage.

When those things affect a media, it's much better to
reference the media by its id. This can't change, ever.
This is better for races.
Like someone posting a comment while the owner
corrects a typo in the slug.

11 years agoMake runtests.sh be useable from anywhere.
Elrond [Fri, 11 Jan 2013 19:55:35 +0000 (20:55 +0100)]
Make runtests.sh be useable from anywhere.

Now you can have your current directory anywhere and call
runtests.sh with full path and it'll find the way to
nosetests and the tests directory on its own.

Most useful if you're inside the mediagoblin/ dir and can
just call "../runtests.sh".

11 years agoissue 355: Only run tests in mediagoblin/tests/
Elrond [Thu, 10 Jan 2013 21:34:52 +0000 (22:34 +0100)]
issue 355: Only run tests in mediagoblin/tests/

If you don't give an option argument (starting with a dash)
to runtests.sh then it will append the directory with all
the tests to the commandline of nosetests. That way it will
only search there for tests.

11 years agoImprove and extend profile editing tests
Sebastian Spaeth [Tue, 8 Jan 2013 09:24:10 +0000 (10:24 +0100)]
Improve and extend profile editing tests

We only ever ran the password changing test here, and not the
half-existing test for changing the bio and homepage.

Fix the tests to actually run both tests. We check that setting bio and
homepage to a valid value works as expected. We also test for invalid
bio (too long) and invalid URLs setting fails. (which is what we want).

- Check that the old /edit/profile/ address redirects to /u/USER/edit/.
- Check that /u/USER/edit/ works as expected
- Check that /u/OTHERUSER/edit/ fails with a 403 Forbidden error when we
  are not logged in as that user. The last remaining test that would be
  useful is to make a user an admin and make sure the admin can edit
  other users' profiles.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoEnable /u/USERNAME/edit/ pattern #588
Sebastian Spaeth [Mon, 7 Jan 2013 15:18:45 +0000 (16:18 +0100)]
Enable /u/USERNAME/edit/ pattern #588

Transition from the inconsistent /edit/profile/?username=FOO to
the nicer /u/FOO/edit/. The old pattern will still work and
redirects to the new URL.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoFix tests on webtest < 1.3.6.
Elrond [Tue, 8 Jan 2013 23:19:24 +0000 (00:19 +0100)]
Fix tests on webtest < 1.3.6.

Debian testing ships webtest 1.3.4. And it would be nice to
use the base packages.

One of the csrf tests fails on webtest < 1.3.6.
But using a fresh app fixes it.
We have no clue, why exactly.

When we require webtest 1.3.6, change this.

11 years agoMove db.sql.migration_tools to db.migration_tools.
Elrond [Tue, 8 Jan 2013 21:12:16 +0000 (22:12 +0100)]
Move db.sql.migration_tools to db.migration_tools.

Follow the new trend.

11 years agoAdd inspect_table.
Elrond [Thu, 13 Dec 2012 11:35:27 +0000 (12:35 +0100)]
Add inspect_table.

In our current scheme of migrations, we reflect the current
sql schema into an SQLAlchemy schema. So let's have a tool
function for this.

11 years agoMove all the migration tools into new migration_tools.py
Elrond [Thu, 13 Dec 2012 11:31:47 +0000 (12:31 +0100)]
Move all the migration tools into new migration_tools.py

Factor all the migration related stuff out into a new
.db.sql.migration_tools.
First we don't have to load this module for our normal
server.
Second it makes all the import dependencies a little more
cleaner.

11 years agoFixing import to mediagoblin.db.base in stl models
Christopher Allan Webber [Tue, 8 Jan 2013 19:24:27 +0000 (13:24 -0600)]
Fixing import to mediagoblin.db.base in stl models

Previously we had mediagoblin.db.sql.base, that just changed to drop
the sql; fixing.

11 years agoMerge branch 'WIP/test_performance'
Sebastian Spaeth [Tue, 8 Jan 2013 15:57:15 +0000 (16:57 +0100)]
Merge branch 'WIP/test_performance'

11 years agotests: More instances where a fresh database is not needed
Sebastian Spaeth [Tue, 8 Jan 2013 12:31:16 +0000 (13:31 +0100)]
tests: More instances where a fresh database is not needed

Save test runtime by not dumping the databases when not needed.

11 years agoAudio and video should use workbench instead of tempfiles (#561)
Sebastian Spaeth [Wed, 12 Dec 2012 13:44:10 +0000 (14:44 +0100)]
Audio and video should use workbench instead of tempfiles (#561)

We were using lots of tempfiles in the audio and video processing
backends which worked around our workbench system. Still use the
tempfiles package but create them in the workbench directory. This
can help address the uploads of large files (#419) where /tmp might
be a smallish tmpfs and our workbench a real disk.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
11 years agoDon't read full image media into RAM on copying (#419)
Sebastian Spaeth [Wed, 19 Dec 2012 13:18:03 +0000 (14:18 +0100)]
Don't read full image media into RAM on copying (#419)

We copy uploaded media from the queue store to the local workbench
and then to its final destination. The latter was done by simply:
dst.write(src.read()) which is of course evil as it reads the whole
file content into RAM. Which *might* arguably still be OK for
images, but you never know.

Make use of the provided storage() methods that offer chunked copying
rather than opening and fudging with files ourselves.

Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>