Generic generate_slug for mongo and sql.
authorElrond <elrond+mediagoblin.org@samba-tng.org>
Sun, 19 Feb 2012 11:14:13 +0000 (12:14 +0100)
committerElrond <elrond+mediagoblin.org@samba-tng.org>
Wed, 7 Mar 2012 20:32:20 +0000 (21:32 +0100)
Using the new check_media_slug_used it is possible to have
one generic generate_slug in the mixin class instead of in
each db class.

In the sql variant self.id is not always set: If the slug
alone would create a dupe the current code decides for "no
slug at all".

mediagoblin/db/mixin.py
mediagoblin/db/mongo/models.py

index 758f7e72dee98ab513a3df705815bd2b0a5511da..4f9e1b119bf8ce9f4b55afe03d2b0d5f42a50b13 100644 (file)
@@ -27,9 +27,11 @@ These functions now live here and get "mixed in" into the
 real objects.
 """
 
+from mediagoblin import mg_globals
 from mediagoblin.auth import lib as auth_lib
 from mediagoblin.tools import common, licenses
 from mediagoblin.tools.text import cleaned_markdown_conversion
+from mediagoblin.tools.url import slugify
 
 
 class UserMixin(object):
@@ -46,6 +48,22 @@ class UserMixin(object):
 
 
 class MediaEntryMixin(object):
+    def generate_slug(self):
+        # import this here due to a cyclic import issue
+        # (db.models -> db.mixin -> db.util -> db.models)
+        from mediagoblin.db.util import check_media_slug_used
+
+        self.slug = slugify(self.title)
+
+        duplicate = check_media_slug_used(mg_globals.database,
+            self.uploader, self.slug, self.id)
+
+        if duplicate:
+            if self.id is not None:
+                self.slug = "%s-%s" % (self.id, self.slug)
+            else:
+                self.slug = None
+
     @property
     def description_html(self):
         """
index c86adbb6f60d7a09c1906305d46adccd381cfc5e..2e35a2b8f00c24265cb57c0689cd2bb8b427d20c 100644 (file)
@@ -18,11 +18,9 @@ import datetime
 
 from mongokit import Document
 
-from mediagoblin import mg_globals
 from mediagoblin.db.mongo import migrations
 from mediagoblin.db.mongo.util import ASCENDING, DESCENDING, ObjectId
 from mediagoblin.tools.pagination import Pagination
-from mediagoblin.tools import url
 from mediagoblin.db.mixin import UserMixin, MediaEntryMixin, MediaCommentMixin
 
 
@@ -232,15 +230,6 @@ class MediaEntry(Document, MediaEntryMixin):
         return self.db.MediaComment.find({
                 'media_entry': self._id}).sort('created', order)
 
-    def generate_slug(self):
-        self.slug = url.slugify(self.title)
-
-        duplicate = mg_globals.database.media_entries.find_one(
-            {'slug': self.slug})
-
-        if duplicate:
-            self.slug = "%s-%s" % (self._id, self.slug)
-
     def url_to_prev(self, urlgen):
         """
         Provide a url to the previous entry from this user, if there is one