aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/db
Commit message (Collapse)AuthorAgeFilesLines
* Fix deleting media with attachments.Elrond2013-02-181-0/+1
| | | | | | | | | | | | | | If one deletes a media with attachments, there have been various problems: 1) If the file in the storage did not exist any more (maybe because due to a previous deletion attempt?), the error propagation failed, because the wrong thing was gathered. 2) The attachment database entries were not deleted. Using cascade for this, for now. Also add a simple unit test, that tests both by having a broken attachment on a media.
* Drop backward compatibility for media_data backref.Elrond2013-02-011-9/+1
| | | | Now we only support media_type backrefs with uselist=False.
* Drop media_data_table property.Elrond2013-02-011-6/+3
| | | | | Only when creating a new media_data row, we need the table. So load that locally in media_data_init().
* Rewrite media_data handling to use relationshipsElrond2013-02-011-20/+21
| | | | | | | | | | | | | | | | | | Instead of doing query by hand, use the relationships on the models to find the media_data. Is is made possible by the BACKREF_NAME in each models.py, which lets us know the local attr to ask for. Also initialize the relationship attribute on new media_data instead of the media_id. Also do not add it to the session. This gives us: - This automatically initializes the other side of the relationship, which will allow later acces via that way. - If the media_data is too early in the session, when the (new) media_entry is not yet in there, this could get conflicts. Avoid those by not adding to session. - Uses cascading to commit media_data together with the media_entry.
* Fix issue 611: Proper (back)relationship on MediaComment.Elrond2013-01-291-1/+7
| | | | well, fix the relationship on the comments.
* Merge branch '216_cwebber_style_unique_slugs'Christopher Allan Webber2013-01-251-9/+61
|\
| * New mediaentry slug tests now pass!Christopher Allan Webber2013-01-231-3/+4
| | | | | | | | | | | | - fixed some issues with "whacking uuid junk on the slug" - uuid4() -> uuid.uuid4() so that mock will work right - added all the tests!
| * We don't want any empty string slugs, so make "" -> NoneChristopher Allan Webber2013-01-231-0/+4
| |
| * Switching uuid4()[1:4] -> uuid4().hex[:4]Christopher Allan Webber2013-01-231-1/+1
| | | | | | | | | | | | .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.
| * Simplifying string concatenation in generate_slug and fixing docstringChristopher Allan Webber2013-01-151-5/+7
| | | | | | | | | | | | | | | | - 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.
| * A revised algorithm for generating slugs.Christopher Allan Webber2013-01-151-11/+47
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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!
| * Need to import uuid4 for generate_slug to totally workChristopher Allan Webber2013-01-151-0/+2
| |
| * Make generate_slug assign a slug in any caseSebastian Spaeth2013-01-151-8/+15
| | | | | | | | | | | | | | | | | | | | | | | | 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>
* | Use better relationships to delete collections.Elrond2013-01-231-5/+8
| | | | | | | | | | | | When deleting a User, his/her collections can be deleted by sqlalchemy: Collections do not need any special code to be executed on deletion.
* | Use inspect_table; default user license==None.Elrond2013-01-221-3/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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.
* | Merge remote-tracking branch 'refs/remotes/spaetz/521_license_preference' ↵Christopher Allan Webber2013-01-222-0/+13
|\ \ | | | | | | | | | into mergetest
| * | Add a license preference fieldMark Holmquist2013-01-172-0/+13
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | 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>
* | | Enable foreign key checking on sqlite.Elrond2013-01-181-1/+12
|/ / | | | | | | | | | | sqlite normally does not check foreign key referential integrity. But it can do so. So let's use it. Better safe than sorry.
* | import db.sql.util -> db.utilSebastian Spaeth2013-01-171-1/+1
| | | | | | | | | | | | | | 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>
* | Implement User.delete() (#540)Sebastian Spaeth2013-01-171-1/+22
| | | | | | | | | | | | | | | | | | 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)
* | Implement Collection.delete()Sebastian Spaeth2013-01-171-1/+10
| | | | | | | | | | | | Deleting a Collection should automatically delete all containing items. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* | Implement MediaEntry().delete() (#540)Sebastian Spaeth2013-01-171-3/+36
|/ | | | | | | | | | | | 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>
* Simplify check_media_slug_usedSebastian Spaeth2013-01-152-7/+5
| | | | | | | Remove the unused dummy_db argument and generally make the function readable. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Move db.sql.migration_tools to db.migration_tools.Elrond2013-01-082-1/+1
| | | | Follow the new trend.
* Add inspect_table.Elrond2013-01-082-7/+11
| | | | | | 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.
* Move all the migration tools into new migration_tools.pyElrond2013-01-083-250/+265
| | | | | | | | | 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.
* Remove custom GMQuery classSebastian Spaeth2013-01-071-14/+1
| | | | | | | | | We provided a custom GMQuery class that offered a .sort() method for compatibility with the Mongo syntax. Now that we have settled for sqlalchemy which uses the order_by() method, we can safely remove this custom class and move a little closer to "pure" and native sqlalchemy usage. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Mv db.sql.base to db.baseSebastian Spaeth2013-01-076-21/+4
| | | | | | | | This concludes the db.sql.* -> db.* move. Our db abstraction layer is sqlalchemy, so there is no need to a separate db.sql.* hierarchy. All tests have been run for each of the commit series to make sure everything works at every step.
* Move mediagoblin.db.sql.extratypes to mediagoblin.db.extratypesSebastian Spaeth2013-01-073-2/+2
| | | | No other functional changes.
* Move db.sql.models* to db.models*Sebastian Spaeth2013-01-075-5/+5
|
* Move db.sql.util to db.utilSebastian Spaeth2013-01-073-331/+310
| | | | | | | | Now that sqlalchemy is providing the database abstractions, there is no need to hide everything in db.sql. sub-modules. It complicates the code and provides a futher layer of indirection. Move the db.sql.util.py to db.util.py and adapt the importers.
* Remove mediagoblin.db.sql.fake.DESCENDINGSebastian Spaeth2013-01-073-35/+1
| | | | | | | | This is the last remnant that requires us to keep db.sql.fake.py. Use ModelName.desc() or sqlalchemy.sql.expression.desc(column) to achieve descending sorts. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Remove ObjectId from the treeSebastian Spaeth2012-12-252-10/+1
| | | | | | | This was one of the last remaining Mongo holdouts and has been removed from the tree herewith. Good bye, ObjectId. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Remove InvalidIdSebastian Spaeth2012-12-252-10/+2
| | | | | | It was a NoOp in our Non-mongo world. So it is safe to remove. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Move db.sql.migrations to db.migrationsSebastian Spaeth2012-12-251-0/+0
|
* Move db.sql.open to db.openSebastian Spaeth2012-12-253-82/+63
| | | | | | Now that mongo has been ripped out and sqlalchemy is already providing the database abstraction, there is no need to hide everything in the sql module. Transition db.sql.open to db.open and adapt all direct importers.
* RIP out mongoSebastian Spaeth2012-12-2513-1400/+7
| | | | | | | | | Since sqlalchemy is providing our database abstraction and we have moved away from Mongo as the underlying database, it is now time to simplify things and rip out mongo. This provides the bulk of the changes, and can stand on its own. There are some followup tasks that can be done, such as removing now unneeded abstraction layers, e.g. db.sql.fake.py
* Mongo removal: Remove the validate=True arg to obj.save()Elrond2012-12-241-2/+1
| | | | | all callers were forced to use validate=True anyway. So remove this useless stuff.
* Remove Mongoism query.skip()Sebastian Spaeth2012-12-211-3/+0
| | | | | | | | | | sqlalchemy supports slice() or [n:m] just fine. Right now, it seems we cannot distinguish beween "empty" results and out-of bound slices. It would be nice if we could distinguish these somehow. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Remove SimpleFieldAliasSebastian Spaeth2012-12-211-12/+0
| | | | | | | It was only used for the model._id -> model.id conversion and is not needed anymore. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Move DBModel._id -> DBModel.idSebastian Spaeth2012-12-213-29/+6
| | | | | | | | | | | | | | | | | | | | | | | We were refering to model._id in most of the code base as this is what Mongo uses. However, each use of _id required a) fixup of queries: e.g. what we did in our find() and find_one() functions moving all '_id' to 'id'. It also required using AliasFields to make the ._id attribute available. This all means lots of superfluous fixing and transitioning in a SQL world. It will also not work in the long run. Much newer code already refers to the objects by model.id (e.g. in the oauth plugin), which will break with Mongo. So let's be honest, rip out the _id mongoism and live with .id as the one canonical way to address objects. This commit modifies all users and providers of model._id to use model.id instead. This patch works with or without Mongo removed first, but will break Mongo usage (even more than before) I have not bothered to fixup db.mongo.* and db.sql.convert (which converts from Mongo to SQL) Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Remove print statments from this migration.Christopher Allan Webber2012-12-101-6/+5
| | | | | | | The reason for wanting to give extra information to the user (this is a very special case migration) is good, but we don't have a nice "official" way to capture and present that information during tests, so removing this.
* Fix typo, disable debugging.Elrond2012-12-101-3/+2
|
* UniqueConstraing migration: Adding the explaining comments.Elrond2012-12-101-0/+23
| | | | Add a lengthy comment explaining all the variants.
* Fixing our broken CollectionItem unique constraint.Elrond2012-12-101-4/+42
| | | | | This one seems to work nicely in all relevant situations. See comments inside the source.
* Ensure query_dict is a dict after the contents have been modified.Nathan Yergler2012-12-101-2/+8
| | | | | | _fix_query_dict modifies its argument in place. Ensure that the argument passed in has a local name and will be passed into the subsequent filter_by call.
* Eeek! Set the migration number to the current migration number being run!Christopher Allan Webber2012-12-091-1/+1
|
* Elrond's suggestion: have set_current_migration execute after each migration ↵Christopher Allan Webber2012-12-091-1/+1
| | | | run.
* make media_manager a property of MediaEntry in mixin.pySebastian Spaeth2012-12-041-3/+21
| | | | | | | | | | | | | | | | | | | | | | | | In all cases where get_media_manager(_media_type_as_string) was called in our code base we ultimately passed in a "MediaEntry().media_type" to get the matching MEDIA_MANAGER. It so makes sense to make this a function of the MediaEntry rather than a global function in mediagoblin.media_types and passing around media_entry.media_type as arguments all the time. It saves a few import statements and arguments. I also made it so the Media_manager property is cached for subsequent calls, although I am not too sure that this is needed (there are other cases for which this would make more sense) Also add a get_media_manager test to the media submission tests. It submits an image and checks that both media.media_type and media.media_manager return the right thing. Not sure if these tests could not be merged with an existing submission test, but it can't hurt to have things explicit. TODO: Right now we iterate through all existing media_managers to find the right one based on the string of its module name. This should be made a simple dict lookup to avoid all the extra work. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>
* Implement licenses.get_license_by_urlSebastian Spaeth2012-11-301-1/+1
| | | | | | | | | Rather than exploding in the user's face (for example if we custom-configure licenses in our MG instance, and there are still media with now "unknown" licenses in the db), simply return a License object as a fallback, where all attributes are set to the URL we were handed. Signed-off-by: Sebastian Spaeth <Sebastian@SSpaeth.de>