Create function to search media by slug.
authorElrond <elrond+mediagoblin.org@samba-tng.org>
Fri, 16 Mar 2012 17:13:46 +0000 (18:13 +0100)
committerElrond <elrond+mediagoblin.org@samba-tng.org>
Fri, 16 Mar 2012 20:20:14 +0000 (21:20 +0100)
Searching media by slug is easy on mongo. But doing the
joins in sqlalchemy is not as nice. So created a function
for doing it.

Well, and create the same function for mongo, so that it
also works.

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

index 2d47f648e0eb058248b017eea5c39b1e19cdad56..f61ae6be8e79929157023e7d207bf16e318e3cc4 100644 (file)
@@ -310,3 +310,9 @@ def check_media_slug_used(db, uploader_id, slug, ignore_m_id):
     existing_user_slug_entries = db.MediaEntry.find(
         query_dict).count()
     return existing_user_slug_entries
+
+
+def media_entries_for_tag_slug(db, tag_slug):
+    return db.MediaEntry.find(
+        {u'state': u'processed',
+         u'tags.slug': tag_slug})
index efb0fafe5e5787781d1c6a247d735ba788e427b1..60024b2884d6cd94f8cb0e552318ee564faa2f21 100644 (file)
@@ -294,6 +294,15 @@ def check_media_slug_used(dummy_db, uploader_id, slug, ignore_m_id):
     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():
     q1 = Session.query(Tag).outerjoin(MediaTag).filter(MediaTag.id==None)
     for t in q1:
index ff7aaf79f0ba32b7d0d86c83d84919114676ecb3..540a9244d578d53094f72acea45ad28d9163cd5e 100644 (file)
@@ -21,7 +21,9 @@ except ImportError:
 
 if use_sql:
     from mediagoblin.db.sql.fake import ObjectId, InvalidId, DESCENDING
-    from mediagoblin.db.sql.util import atomic_update, check_media_slug_used
+    from mediagoblin.db.sql.util import atomic_update, check_media_slug_used, \
+        media_entries_for_tag_slug
 else:
     from mediagoblin.db.mongo.util import \
-        ObjectId, InvalidId, DESCENDING, atomic_update, check_media_slug_used
+        ObjectId, InvalidId, DESCENDING, atomic_update, \
+        check_media_slug_used, media_entries_for_tag_slug
index 5c365ed2fc03b812ac7dfd87022c69208e2a14e9..9244293fd0fed4483c0e2acaab856cbb198602b3 100644 (file)
@@ -14,7 +14,7 @@
 # You should have received a copy of the GNU Affero General Public License
 # along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
-from mediagoblin.db.util import DESCENDING
+from mediagoblin.db.util import media_entries_for_tag_slug, DESCENDING
 
 from mediagoblin.tools.pagination import Pagination
 from mediagoblin.tools.response import render_to_response
@@ -48,9 +48,7 @@ def tag_listing(request, page):
     """'Gallery'/listing for this tag slug"""
     tag_slug = request.matchdict[u'tag']
 
-    cursor = request.db.MediaEntry.find(
-        {u'state': u'processed',
-         u'tags.slug': tag_slug})
+    cursor = media_entries_for_tag_slug(request.db, tag_slug)
     cursor = cursor.sort('created', DESCENDING)
 
     pagination = Pagination(page, cursor)