Generate unique slugs for newly submitted images.
authorAaron Williamson <aaron@copiesofcopies.org>
Fri, 13 May 2011 16:18:52 +0000 (12:18 -0400)
committerAaron Williamson <aaron@copiesofcopies.org>
Fri, 13 May 2011 16:18:52 +0000 (12:18 -0400)
mediagoblin/models.py
mediagoblin/submit/views.py
mediagoblin/tests/test_util.py
mediagoblin/util.py
mediagoblin/views.py
setup.py

index 5b2860386b1a85875d9527bb484f3f349a9197e4..1ecabe3e9ca2dd36b2d13adf202d3610b5681ed8 100644 (file)
@@ -18,8 +18,9 @@ import datetime, uuid
 
 from mongokit import Document, Set
 
+from mediagoblin import util
 from mediagoblin.auth import lib as auth_lib
-
+from mediagoblin import globals as mediagoblin_globals
 
 ###################
 # Custom validators
@@ -66,6 +67,7 @@ class MediaEntry(Document):
     structure = {
         'uploader': User,
         'title': unicode,
+        'slug':unicode,
         'created': datetime.datetime,
         'description': unicode,
         'media_type': unicode,
@@ -98,6 +100,13 @@ class MediaEntry(Document):
     def main_mediafile(self):
         pass
 
+    def generate_slug(self):
+        self['slug'] = util.slugify(self['title'])
+
+        duplicate = mediagoblin_globals.database.media_entries.find_one({'slug': self['slug']})
+        
+        if duplicate:
+            self['slug'] = "%s-%s" % (self['_id'], self['slug'])
 
 REGISTER_MODELS = [MediaEntry, User]
 
index 1b28e339272db95742cb0c687a60c216126f3aa5..95a416e24ce7dc63fbb4338a1e408489069852ce 100644 (file)
@@ -52,6 +52,9 @@ def submit_start(request):
             # it to generate the file path
             entry.save(validate=False)
 
+            # Generate a slug from the title
+            entry.generate_slug()
+
             # Now store generate the queueing related filename
             queue_filepath = request.app.queue_store.get_unique_filepath(
                 ['media_entries',
index ff40a677d92ceb535bbd16974906dfbba23fdb0b..7b00a07482ef4e7f30a990f41fe1730c1d98bca9 100644 (file)
@@ -70,6 +70,14 @@ I hope you like unit tests JUST AS MUCH AS I DO!"""
 
 I hope you like unit tests JUST AS MUCH AS I DO!"""
 
+def test_slugify():
+    assert util.slugify('a walk in the park') == 'a-walk-in-the-park'
+    assert util.slugify('A Walk in the Park') == 'a-walk-in-the-park'
+    assert util.slugify('a  walk in the park') == 'a-walk-in-the-park'
+    assert util.slugify('a walk in-the-park') == 'a-walk-in-the-park'
+    assert util.slugify('a w@lk in the park?') == 'a-w-lk-in-the-park'
+    assert util.slugify(u'a walk in the par\u0107') == 'a-walk-in-the-parc'
+    assert util.slugify(u'\u00E0\u0042\u00E7\u010F\u00EB\u0066') == 'abcdef'
 
 def test_locale_to_lower_upper():
     """
index 1f568ed3826cd1d4fe8f885ea2beaa04e4f8e582..a66e2ba5bd29dd2e4c5ec174614e2f0a46357b11 100644 (file)
@@ -19,9 +19,10 @@ import gettext
 import pkg_resources
 import smtplib
 import sys
-
+import re
 import jinja2
 import mongokit
+import translitcodec
 
 from mediagoblin import globals as mgoblin_globals
 
@@ -107,6 +108,18 @@ def import_component(import_string):
     func = getattr(module, func_name)
     return func
 
+_punct_re = re.compile(r'[\t !"#$%&\'()*\-/<=>?@\[\\\]^_`{|},.]+')
+
+def slugify(text, delim=u'-'):
+    """
+    Generates an ASCII-only slug. Taken from http://flask.pocoo.org/snippets/5/
+    """
+    result = []
+    for word in _punct_re.split(text.lower()):
+        word = word.encode('translit/long')
+        if word:
+            result.append(word)
+    return unicode(delim.join(result))
 
 ### ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 ### Special email test stuff begins HERE
index 95d0be7ad83b37197434ea93d6e7915141f47333..7f925bb7d5c0957e5ad9c6792fca46d25969af91 100644 (file)
@@ -20,6 +20,7 @@ from webob import Response, exc
 import wtforms
 from mongokit import ObjectId
 from mediagoblin import models
+import gettext
 
 def root_view(request):
     media_entries = request.db.MediaEntry.find(
index 7d38e52687e96cdf39225190a76cb3e63cc697eb..08887deef8058fd325347eb8ca2af6b9c0fd3dee 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -39,6 +39,7 @@ setup(
         'sphinx',
         'PIL',
         'Babel',
+        'translitcodec',
         ],
     test_suite='nose.collector',