Merge branch 'persona_resquash'
[mediagoblin.git] / mediagoblin / db / util.py
index 46f899f7a6883f973186ab707b0d84fafffb4e82..8431361a89fc6dc6d22c962e238816fb9e3e0e60 100644 (file)
@@ -1,5 +1,5 @@
 # GNU MediaGoblin -- federated, autonomous media hosting
-# Copyright (C) 2011 Free Software Foundation, Inc
+# Copyright (C) 2011, 2012 MediaGoblin contributors.  See AUTHORS.
 #
 # 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
 # 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/>.
 
-"""
-Utilities for database operations.
+from mediagoblin.db.base import Session
+from mediagoblin.db.models import MediaEntry, Tag, MediaTag, Collection
 
-Some note on migration and indexing tools:
 
-We store information about what the state of the database is in the
-'mediagoblin' document of the 'app_metadata' collection.  Keys in that
-document relevant to here:
+##########################
+# Random utility functions
+##########################
 
- - 'migration_number': The integer representing the current state of
-   the migrations
-"""
 
-import copy
+def atomic_update(table, query_dict, update_values):
+    table.query.filter_by(**query_dict).update(update_values,
+       synchronize_session=False)
+    Session.commit()
 
-# Imports that other modules might use
-from pymongo import DESCENDING
-from pymongo.errors import InvalidId
-from mongokit import ObjectId
 
-from mediagoblin.db.indexes import ACTIVE_INDEXES, DEPRECATED_INDEXES
+def check_media_slug_used(uploader_id, slug, ignore_m_id):
+    query = MediaEntry.query.filter_by(uploader=uploader_id, slug=slug)
+    if ignore_m_id is not None:
+        query = query.filter(MediaEntry.id != ignore_m_id)
+    does_exist = query.first() is not None
+    return does_exist
 
 
-def add_new_indexes(database, active_indexes=ACTIVE_INDEXES):
-    """
-    Add any new indexes to the database.
+def media_entries_for_tag_slug(dummy_db, tag_slug):
+    return MediaEntry.query \
+        .join(MediaEntry.tags_helper) \
+        .join(MediaTag.tag_helper) \
+        .filter(
+            (MediaEntry.state == u'processed')
+            & (Tag.slug == tag_slug))
 
-    Args:
-     - database: pymongo or mongokit database instance.
-     - active_indexes: indexes to possibly add in the pattern of:
-       {'collection_name': {
-            'identifier': {
-                'index': [index_foo_goes_here],
-                'unique': True}}
-       where 'index' is the index to add and all other options are
-       arguments for collection.create_index.
 
-    Returns:
-      A list of indexes added in form ('collection', 'index_name')
-    """
-    indexes_added = []
+def clean_orphan_tags(commit=True):
+    """Search for unused MediaTags and delete them"""
+    q1 = Session.query(Tag).outerjoin(MediaTag).filter(MediaTag.id==None)
+    for t in q1:
+        Session.delete(t)
+    # The "let the db do all the work" version:
+    # q1 = Session.query(Tag.id).outerjoin(MediaTag).filter(MediaTag.id==None)
+    # q2 = Session.query(Tag).filter(Tag.id.in_(q1))
+    # q2.delete(synchronize_session = False)
+    if commit:
+        Session.commit()
 
-    for collection_name, indexes in active_indexes.iteritems():
-        collection = database[collection_name]
-        collection_indexes = collection.index_information().keys()
 
-        for index_name, index_data in indexes.iteritems():
-            if not index_name in collection_indexes:
-                # Get a copy actually so we don't modify the actual
-                # structure
-                index_data = copy.copy(index_data)
-                index = index_data.pop('index')
-                collection.create_index(
-                    index, name=index_name, **index_data)
+def check_collection_slug_used(creator_id, slug, ignore_c_id):
+    filt = (Collection.creator == creator_id) \
+        & (Collection.slug == slug)
+    if ignore_c_id is not None:
+        filt = filt & (Collection.id != ignore_c_id)
+    does_exist = Session.query(Collection.id).filter(filt).first() is not None
+    return does_exist
 
-                indexes_added.append((collection_name, index_name))
 
-    return indexes_added
+if __name__ == '__main__':
+    from mediagoblin.db.open import setup_connection_and_db_from_config
 
+    db = setup_connection_and_db_from_config({'sql_engine':'sqlite:///mediagoblin.db'})
 
-def remove_deprecated_indexes(database, deprecated_indexes=DEPRECATED_INDEXES):
-    """
-    Remove any deprecated indexes from the database.
-
-    Args:
-     - database: pymongo or mongokit database instance.
-     - deprecated_indexes: the indexes to deprecate in the pattern of:
-       {'collection': ['index_identifier1', 'index_identifier2']}
-
-    Returns:
-      A list of indexes removed in form ('collection', 'index_name')
-    """
-    indexes_removed = []
-
-    for collection_name, index_names in deprecated_indexes.iteritems():
-        collection = database[collection_name]
-        collection_indexes = collection.index_information().keys()
-
-        for index_name in index_names:
-            if index_name in collection_indexes:
-                collection.drop_index(index_name)
-
-                indexes_removed.append((collection_name, index_name))
-
-    return indexes_removed
+    clean_orphan_tags()