Add MediaFile table and related infrastructure.
[mediagoblin.git] / mediagoblin / db / sql / models.py
index 268f57159cb59ae798e4a11687846e49603056ef..91092f332fd68ec99e3c5d101ceaf03133e4975b 100644 (file)
@@ -4,8 +4,13 @@ from sqlalchemy.ext.declarative import declarative_base
 from sqlalchemy import (
     Column, Integer, Unicode, UnicodeText, DateTime, Boolean, ForeignKey,
     UniqueConstraint)
+from sqlalchemy.orm import relationship
+from sqlalchemy.orm.collections import attribute_mapped_collection
+from sqlalchemy.ext.associationproxy import association_proxy
 
+from mediagoblin.db.sql.extratypes import PathTupleWithSlashes
 from mediagoblin.db.sql.base import GMGTableBase
+from mediagoblin.db.mixin import UserMixin, MediaEntryMixin
 
 
 Base = declarative_base(cls=GMGTableBase)
@@ -23,7 +28,7 @@ class SimpleFieldAlias(object):
         setattr(instance, self.fieldname, val)
 
 
-class User(Base):
+class User(Base, UserMixin):
     __tablename__ = "users"
 
     id = Column(Integer, primary_key=True)
@@ -47,7 +52,7 @@ class User(Base):
     _id = SimpleFieldAlias("id")
 
 
-class MediaEntry(Base):
+class MediaEntry(Base, MediaEntryMixin):
     __tablename__ = "media_entries"
 
     id = Column(Integer, primary_key=True)
@@ -63,7 +68,7 @@ class MediaEntry(Base):
     fail_error = Column(Unicode)
     fail_metadata = Column(UnicodeText)
 
-    queued_media_file = Column(Unicode)
+    queued_media_file = Column(PathTupleWithSlashes)
 
     queued_task_id = Column(Unicode)
 
@@ -71,13 +76,35 @@ class MediaEntry(Base):
         UniqueConstraint('uploader', 'slug'),
         {})
 
+    get_uploader = relationship(User)
+
+    media_files_helper = relationship("MediaFile",
+        collection_class=attribute_mapped_collection("name"),
+        cascade="all, delete-orphan"
+        )
+    media_files = association_proxy('media_files_helper', 'file_path',
+        creator=lambda k,v: MediaFile(name=k, file_path=v)
+        )
+
     ## TODO
-    # media_files
     # media_data
     # attachment_files
     # fail_error
 
 
+class MediaFile(Base):
+    __tablename__ = "mediafiles"
+
+    media_entry = Column(
+        Integer, ForeignKey(MediaEntry.id),
+        nullable=False, primary_key=True)
+    name = Column(Unicode, primary_key=True)
+    file_path = Column(PathTupleWithSlashes)
+
+    def __repr__(self):
+        return "<MediaFile %s: %r>" % (self.name, self.file_path)
+
+
 class Tag(Base):
     __tablename__ = "tags"
 
@@ -112,6 +139,8 @@ class MediaComment(Base):
     content = Column(UnicodeText, nullable=False)
     content_html = Column(UnicodeText)
 
+    get_author = relationship(User)
+
 
 def show_table_init():
     from sqlalchemy import create_engine