X-Git-Url: https://vcs.fsf.org/?a=blobdiff_plain;f=mediagoblin%2Fdb%2Futil.py;h=aba9c59c79f06ef873f569d4e7aaf74cb6d1c790;hb=23002ee77f742f3b00fbee64def0dea5de0f5e51;hp=1fc949a656ef8452ee17c560c821d40beb7bd60f;hpb=cf29e8a824e0ef4612f1144f079c80c1d20b89e5;p=mediagoblin.git diff --git a/mediagoblin/db/util.py b/mediagoblin/db/util.py index 1fc949a6..aba9c59c 100644 --- a/mediagoblin/db/util.py +++ b/mediagoblin/db/util.py @@ -14,12 +14,78 @@ # You should have received a copy of the GNU Affero General Public License # along with this program. If not, see . -try: - from mediagoblin.db.sql_switch import use_sql -except ImportError: - use_sql = False - -if use_sql: - from mediagoblin.db.sql.fake import ObjectId, InvalidId, DESCENDING -else: - from mediagoblin.db.mongo.util import ObjectId, InvalidId, DESCENDING +import sys + +from mediagoblin import mg_globals as mgg +from mediagoblin.db.base import Session +from mediagoblin.db.models import MediaEntry, Tag, MediaTag, Collection +from mediagoblin.gmg_commands.dbupdate import gather_database_data + +########################## +# Random utility functions +########################## + + +def atomic_update(table, query_dict, update_values): + table.query.filter_by(**query_dict).update(update_values, + synchronize_session=False) + Session.commit() + + +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 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)) + + +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() + + +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 + + +def check_db_up_to_date(): + """Check if the database is up to date and quit if not""" + dbdatas = gather_database_data(mgg.global_config.get('plugins', {}).keys()) + + for dbdata in dbdatas: + migration_manager = dbdata.make_migration_manager(Session()) + if migration_manager.database_current_migration is None or \ + migration_manager.migrations_to_run(): + sys.exit("Your database is not up to date. Please run " + "'gmg dbupdate' before starting MediaGoblin.") + + +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'}) + + clean_orphan_tags()