aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin
diff options
context:
space:
mode:
authorElrond <elrond+mediagoblin.org@samba-tng.org>2012-11-28 16:44:43 +0100
committerChristopher Allan Webber <cwebber@dustycloud.org>2012-12-10 16:17:24 -0600
commit0f14c362c33408d4642372392fa56353946d5cdc (patch)
tree948b0b3d3b90544a5fabbbd0cd9e9c37064e5d54 /mediagoblin
parentafe0afdb88727de854de48909e4eb28c1ff57c66 (diff)
downloadmediagoblin-0f14c362c33408d4642372392fa56353946d5cdc.tar.lz
mediagoblin-0f14c362c33408d4642372392fa56353946d5cdc.tar.xz
mediagoblin-0f14c362c33408d4642372392fa56353946d5cdc.zip
Fixing our broken CollectionItem unique constraint.
This one seems to work nicely in all relevant situations. See comments inside the source.
Diffstat (limited to 'mediagoblin')
-rw-r--r--mediagoblin/db/sql/migrations.py46
1 files changed, 42 insertions, 4 deletions
diff --git a/mediagoblin/db/sql/migrations.py b/mediagoblin/db/sql/migrations.py
index bc68caa3..274843ff 100644
--- a/mediagoblin/db/sql/migrations.py
+++ b/mediagoblin/db/sql/migrations.py
@@ -18,8 +18,10 @@ import datetime
from sqlalchemy import (MetaData, Table, Column, Boolean, SmallInteger,
Integer, Unicode, UnicodeText, DateTime,
- ForeignKey, UniqueConstraint)
+ ForeignKey)
+from sqlalchemy.exc import ProgrammingError
from sqlalchemy.ext.declarative import declarative_base
+from migrate.changeset.constraint import UniqueConstraint
from mediagoblin.db.sql.util import RegisterMigration
from mediagoblin.db.sql.models import MediaEntry, Collection, User
@@ -92,15 +94,20 @@ class CollectionItem_v0(declarative_base()):
## This should be activated, normally.
## But this would change the way the next migration used to work.
## So it's commented for now.
- # __table_args__ = (
- # UniqueConstraint('collection', 'media_entry'),
- # {})
+ __table_args__ = (
+ UniqueConstraint('collection', 'media_entry'),
+ {})
+
+collectionitem_unique_constraint_done = False
@RegisterMigration(4, MIGRATIONS)
def add_collection_tables(db_conn):
Collection_v0.__table__.create(db_conn.bind)
CollectionItem_v0.__table__.create(db_conn.bind)
+ global collectionitem_unique_constraint_done
+ collectionitem_unique_constraint_done = True
+
db_conn.commit()
@@ -128,3 +135,34 @@ class ProcessingMetaData_v0(declarative_base()):
def create_processing_metadata_table(db):
ProcessingMetaData_v0.__table__.create(db.bind)
db.commit()
+
+@RegisterMigration(7, MIGRATIONS)
+def fix_CollectionItem_v0_constraint(db_conn):
+ """Add the forgotten Constraint on CollectionItem"""
+
+ global collectionitem_unique_constraint_done
+ if collectionitem_unique_constraint_done:
+ print "Okay, already done, short circuit"
+ # Reset it. Maybe the whole thing gets run again
+ # For a different db?
+ collectionitem_unique_constraint_done = False
+ return
+
+ metadata = MetaData(bind=db_conn.bind)
+
+ CollectionItem_table = Table('core__collection_items',
+ metadata, autoload=True, autoload_with=db_conn.bind)
+
+ constraint = UniqueConstraint('collection', 'media_entry',
+ name='core__collection_items_collection_media_entry_key',
+ table=CollectionItem_table)
+
+ try:
+ constraint.create()
+ except ProgrammingError as exc:
+ print "***", repr(exc)
+ print "***", repr(exc.statement)
+ print "***", repr(exc.params)
+ print "***", repr(exc.orig)
+ print "*** Ignoring it, you probably have a fresh install from a recent git."
+ db_conn.commit()