Check for duplicate collection slugs and make them unique. Add unique constraint to collection.slug model

This commit is contained in:
Rodney Ewing 2013-04-23 18:28:10 -07:00
parent cec9648c11
commit 34d8bc9820
2 changed files with 42 additions and 2 deletions

View File

@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
import datetime import datetime
import uuid
from sqlalchemy import (MetaData, Table, Column, Boolean, SmallInteger, from sqlalchemy import (MetaData, Table, Column, Boolean, SmallInteger,
Integer, Unicode, UnicodeText, DateTime, Integer, Unicode, UnicodeText, DateTime,
@ -212,7 +213,6 @@ def mediaentry_new_slug_era(db):
- slugs with = (or also : which is now also not allowed) to have those - slugs with = (or also : which is now also not allowed) to have those
stripped out (small possibility of breakage here sadly) stripped out (small possibility of breakage here sadly)
""" """
import uuid
def slug_and_user_combo_exists(slug, uploader): def slug_and_user_combo_exists(slug, uploader):
return db.execute( return db.execute(
@ -251,3 +251,39 @@ def mediaentry_new_slug_era(db):
row, row.slug.replace(u"=", u"-").replace(u":", u"-")) row, row.slug.replace(u"=", u"-").replace(u":", u"-"))
db.commit() db.commit()
@RegisterMigration(10, MIGRATIONS)
def unique_collections_slug(db):
"""Add unique constraint to collection slug"""
metadata = MetaData(bind=db.bind)
collection_table = inspect_table(metadata, "core__collections")
existing_slugs = {}
slugs_to_change = []
for row in db.execute(collection_table.select()):
# if duplicate slug, generate a unique slug
if row.creator in existing_slugs and row.slug in \
existing_slugs[row.creator]:
slugs_to_change.append(row.id)
else:
if not row.creator in existing_slugs:
existing_slugs[row.creator] = [row.slug]
else:
existing_slugs[row.creator].append(row.slug)
for row_id in slugs_to_change:
new_slug = uuid.uuid4().hex
db.execute(collection_table.update().
where(collection_table.c.id == row_id).
values(slug=new_slug))
# sqlite does not like to change the schema when a transaction(update) is
# not yet completed
db.commit()
constraint = UniqueConstraint('creator', 'slug',
name='core__collection_creator_slug_key',
table=collection_table)
constraint.create()
db.commit()

View File

@ -410,7 +410,7 @@ class Collection(Base, CollectionMixin):
title = Column(Unicode, nullable=False) title = Column(Unicode, nullable=False)
slug = Column(Unicode) slug = Column(Unicode)
created = Column(DateTime, nullable=False, default=datetime.datetime.now, created = Column(DateTime, nullable=False, default=datetime.datetime.now,
index=True) index=True)
description = Column(UnicodeText) description = Column(UnicodeText)
creator = Column(Integer, ForeignKey(User.id), nullable=False) creator = Column(Integer, ForeignKey(User.id), nullable=False)
# TODO: No of items in Collection. Badly named, can we migrate to num_items? # TODO: No of items in Collection. Badly named, can we migrate to num_items?
@ -421,6 +421,10 @@ class Collection(Base, CollectionMixin):
backref=backref("collections", backref=backref("collections",
cascade="all, delete-orphan")) cascade="all, delete-orphan"))
__table_args__ = (
UniqueConstraint('creator', 'slug'),
{})
def get_collection_items(self, ascending=False): def get_collection_items(self, ascending=False):
#TODO, is this still needed with self.collection_items being available? #TODO, is this still needed with self.collection_items being available?
order_col = CollectionItem.position order_col = CollectionItem.position