Generic check_media_slug_used db utility.

In two cases (generating a new slug and editing the slug)
it is nice to know in advance (before the db gets angry)
that the slug is used/free. So created a db utility
function to check for this on mongo and sql:
check_media_slug_used()
This commit is contained in:
Elrond 2012-01-24 21:47:40 +01:00
parent c65cbf9514
commit b62b3b982a
4 changed files with 25 additions and 8 deletions

View File

@ -301,3 +301,12 @@ def atomic_update(table, query_dict, update_values):
table.collection.update( table.collection.update(
query_dict, query_dict,
{"$set": update_values}) {"$set": update_values})
def check_media_slug_used(db, uploader_id, slug, ignore_m_id):
query_dict = {'uploader': uploader_id, 'slug': slug}
if ignore_m_id is not None:
query_dict['_id'] = {'$ne': ignore_m_id}
existing_user_slug_entries = db.MediaEntry.find(
query_dict).count()
return existing_user_slug_entries

View File

@ -17,7 +17,7 @@
import sys import sys
from mediagoblin.db.sql.base import Session from mediagoblin.db.sql.base import Session
from mediagoblin.db.sql.models import Tag, MediaTag from mediagoblin.db.sql.models import MediaEntry, Tag, MediaTag
def _simple_printer(string): def _simple_printer(string):
@ -285,6 +285,15 @@ def atomic_update(table, query_dict, update_values):
Session.commit() Session.commit()
def check_media_slug_used(dummy_db, uploader_id, slug, ignore_m_id):
filt = (MediaEntry.uploader == uploader_id) \
& (MediaEntry.slug == slug)
if ignore_m_id is not None:
filt = filt & (MediaEntry.id != ignore_m_id)
does_exist = Session.query(MediaEntry.id).filter(filt).first() is not None
return does_exist
def clean_orphan_tags(): def clean_orphan_tags():
q1 = Session.query(Tag).outerjoin(MediaTag).filter(MediaTag.id==None) q1 = Session.query(Tag).outerjoin(MediaTag).filter(MediaTag.id==None)
for t in q1: for t in q1:

View File

@ -21,7 +21,7 @@ except ImportError:
if use_sql: if use_sql:
from mediagoblin.db.sql.fake import ObjectId, InvalidId, DESCENDING from mediagoblin.db.sql.fake import ObjectId, InvalidId, DESCENDING
from mediagoblin.db.sql.util import atomic_update from mediagoblin.db.sql.util import atomic_update, check_media_slug_used
else: else:
from mediagoblin.db.mongo.util import \ from mediagoblin.db.mongo.util import \
ObjectId, InvalidId, DESCENDING, atomic_update ObjectId, InvalidId, DESCENDING, atomic_update, check_media_slug_used

View File

@ -36,6 +36,7 @@ from mediagoblin.tools.text import (
clean_html, convert_to_tag_list_of_dicts, clean_html, convert_to_tag_list_of_dicts,
media_tags_as_string) media_tags_as_string)
from mediagoblin.tools.licenses import SUPPORTED_LICENSES from mediagoblin.tools.licenses import SUPPORTED_LICENSES
from mediagoblin.db.util import check_media_slug_used
@get_user_media_entry @get_user_media_entry
@ -58,12 +59,10 @@ def edit_media(request, media):
if request.method == 'POST' and form.validate(): if request.method == 'POST' and form.validate():
# Make sure there isn't already a MediaEntry with such a slug # Make sure there isn't already a MediaEntry with such a slug
# and userid. # and userid.
existing_user_slug_entries = request.db.MediaEntry.find( slug_used = check_media_slug_used(request.db, media.uploader,
{'slug': request.POST['slug'], request.POST['slug'], media.id)
'uploader': media.uploader,
'_id': {'$ne': media._id}}).count()
if existing_user_slug_entries: if slug_used:
form.slug.errors.append( form.slug.errors.append(
_(u'An entry with that slug already exists for this user.')) _(u'An entry with that slug already exists for this user.'))
else: else: