Generic check_media_slug_used db utility.
authorElrond <elrond+mediagoblin.org@samba-tng.org>
Tue, 24 Jan 2012 20:47:40 +0000 (21:47 +0100)
committerElrond <elrond+mediagoblin.org@samba-tng.org>
Mon, 5 Mar 2012 20:37:05 +0000 (21:37 +0100)
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()

mediagoblin/db/mongo/util.py
mediagoblin/db/sql/util.py
mediagoblin/db/util.py
mediagoblin/edit/views.py

index 89348d98423ce85599d4a7d668fbf6eae74abb7a..2d47f648e0eb058248b017eea5c39b1e19cdad56 100644 (file)
@@ -301,3 +301,12 @@ def atomic_update(table, query_dict, update_values):
     table.collection.update(
         query_dict,
         {"$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
index 737e4e59f3ff212bc33454b6845afed32c59b886..efb0fafe5e5787781d1c6a247d735ba788e427b1 100644 (file)
@@ -17,7 +17,7 @@
 
 import sys
 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):
@@ -285,6 +285,15 @@ def atomic_update(table, query_dict, update_values):
     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():
     q1 = Session.query(Tag).outerjoin(MediaTag).filter(MediaTag.id==None)
     for t in q1:
index 73aee238b832dbb880c1fad59e419777e41f7561..ff7aaf79f0ba32b7d0d86c83d84919114676ecb3 100644 (file)
@@ -21,7 +21,7 @@ except ImportError:
 
 if use_sql:
     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:
     from mediagoblin.db.mongo.util import \
-        ObjectId, InvalidId, DESCENDING, atomic_update
+        ObjectId, InvalidId, DESCENDING, atomic_update, check_media_slug_used
index d21ef03ab5ebe9452d295e082ea1cf9f71270377..2df8f9abd38279d52cbca7c5d8dee71cea008505 100644 (file)
@@ -36,6 +36,7 @@ from mediagoblin.tools.text import (
     clean_html, convert_to_tag_list_of_dicts,
     media_tags_as_string)
 from mediagoblin.tools.licenses import SUPPORTED_LICENSES
+from mediagoblin.db.util import check_media_slug_used
 
 
 @get_user_media_entry
@@ -58,12 +59,10 @@ def edit_media(request, media):
     if request.method == 'POST' and form.validate():
         # Make sure there isn't already a MediaEntry with such a slug
         # and userid.
-        existing_user_slug_entries = request.db.MediaEntry.find(
-            {'slug': request.POST['slug'],
-             'uploader': media.uploader,
-             '_id': {'$ne': media._id}}).count()
+        slug_used = check_media_slug_used(request.db, media.uploader,
+                request.POST['slug'], media.id)
 
-        if existing_user_slug_entries:
+        if slug_used:
             form.slug.errors.append(
                 _(u'An entry with that slug already exists for this user.'))
         else: