Merge remote branch 'refs/remotes/gullydwarf-cfdv/is315'
[mediagoblin.git] / mediagoblin / db / models.py
index 1bc1da60c6275a88ce3ff8c0601fb70db0193a62..600b79ff28485c28673ecec6cef3cff94303df31 100644 (file)
@@ -20,7 +20,9 @@ from mongokit import Document, Set
 
 from mediagoblin import util
 from mediagoblin.auth import lib as auth_lib
-from mediagoblin import globals as mediagoblin_globals
+from mediagoblin import mg_globals
+from mediagoblin.db import migrations
+from mediagoblin.db.util import ObjectId
 
 ###################
 # Custom validators
@@ -44,6 +46,8 @@ class User(Document):
         'status': unicode,
         'verification_key': unicode,
         'is_admin': bool,
+        'url' : unicode,
+        'bio' : unicode
         }
 
     required_fields = ['username', 'created', 'pw_hash', 'email']
@@ -54,6 +58,8 @@ class User(Document):
         'status': u'needs_email_verification',
         'verification_key': lambda: unicode(uuid.uuid4()),
         'is_admin': False}
+        
+    migration_handler = migrations.UserMigration
 
     def check_login(self, password):
         """
@@ -67,11 +73,12 @@ class MediaEntry(Document):
     __collection__ = 'media_entries'
 
     structure = {
-        'uploader': User,
+        'uploader': ObjectId,
         'title': unicode,
         'slug': unicode,
         'created': datetime.datetime,
-        'description': unicode,
+        'description': unicode, # May contain markdown/up
+        'description_html': unicode, # May contain plaintext, or HTML
         'media_type': unicode,
         'media_data': dict, # extra data relevant to this media_type
         'plugin_data': dict, # plugins can dump stuff here.
@@ -93,17 +100,18 @@ class MediaEntry(Document):
         'thumbnail_file': [unicode]}
 
     required_fields = [
-        'uploader', 'created', 'media_type']
+        'uploader', 'created', 'media_type', 'slug']
 
     default_values = {
         'created': datetime.datetime.utcnow,
         'state': u'unprocessed'}
 
-    # Actually we should referene uniqueness by uploader, but we
-    # should fix http://bugs.foocorp.net/issues/340 first.
-    # indexes = [
-    #     {'fields': ['uploader', 'slug'],
-    #      'unique': True}]
+    migration_handler = migrations.MediaEntryMigration
+
+    indexes = [
+        # Referene uniqueness of slugs by uploader
+        {'fields': ['uploader', 'slug'],
+         'unique': True}]
 
     def main_mediafile(self):
         pass
@@ -111,12 +119,35 @@ class MediaEntry(Document):
     def generate_slug(self):
         self['slug'] = util.slugify(self['title'])
 
-        duplicate = mediagoblin_globals.database.media_entries.find_one(
+        duplicate = mg_globals.database.media_entries.find_one(
             {'slug': self['slug']})
         
         if duplicate:
             self['slug'] = "%s-%s" % (self['_id'], self['slug'])
 
+    def url_for_self(self, urlgen):
+        """
+        Generate an appropriate url for ourselves
+
+        Use a slug if we have one, else use our '_id'.
+        """
+        uploader = self.uploader()
+
+        if self.get('slug'):
+            return urlgen(
+                'mediagoblin.user_pages.media_home',
+                user=uploader['username'],
+                media=self['slug'])
+        else:
+            return urlgen(
+                'mediagoblin.user_pages.media_home',
+                user=uploader['username'],
+                media=unicode(self['_id']))
+
+    def uploader(self):
+        return self.db.User.find_one({'_id': self['uploader']})
+
+
 REGISTER_MODELS = [MediaEntry, User]