Attachment support in the SQL backend
authorElrond <elrond+mediagoblin.org@samba-tng.org>
Sat, 25 Feb 2012 22:53:11 +0000 (23:53 +0100)
committerElrond <elrond+mediagoblin.org@samba-tng.org>
Tue, 28 Feb 2012 19:52:35 +0000 (20:52 +0100)
attachments working with the sql backend.

- SQL Schema for attachment files, ordering attachments by
  their name, not by the submission order (as earlier).
- Dot-Notation for attachments, where missing.
- convert existing attachments over from mongo -> sql

mediagoblin/db/sql/convert.py
mediagoblin/db/sql/models.py
mediagoblin/edit/views.py
mediagoblin/tools/files.py

index 403025dc6861039e4196b06af175b6b980bfeaa9..797179137c97daa73deb036cb4fb8f29ed4a9ae2 100644 (file)
@@ -19,7 +19,7 @@ from mediagoblin.init import setup_global_and_app_config, setup_database
 from mediagoblin.db.mongo.util import ObjectId
 
 from mediagoblin.db.sql.models import (Base, User, MediaEntry, MediaComment,
-    Tag, MediaTag, MediaFile)
+    Tag, MediaTag, MediaFile, MediaAttachmentFile)
 from mediagoblin.db.sql.open import setup_connection_and_db_from_config as \
     sql_connect
 from mediagoblin.db.mongo.open import setup_connection_and_db_from_config as \
@@ -92,6 +92,15 @@ def convert_media_entries(mk_db):
             new_file.media_entry = new_entry.id
             Session.add(new_file)
 
+        for attachment in entry.attachment_files:
+            new_attach = MediaAttachmentFile(
+                name=attachment["name"],
+                filepath=attachment["filepath"],
+                created=attachment["created"]
+                )
+            new_attach.media_entry = new_entry.id
+            Session.add(new_attach)
+
     session.commit()
     session.close()
 
index 699dbf3353be622f60f1f9c24c52a85e2f0de7c0..b52eac762dffb0eb362afe4314742d56a71a6e62 100644 (file)
@@ -118,6 +118,15 @@ class MediaEntry(Base, MediaEntryMixin):
         creator=lambda k, v: MediaFile(name=k, file_path=v)
         )
 
+    attachment_files_helper = relationship("MediaAttachmentFile",
+        cascade="all, delete-orphan",
+        order_by="MediaAttachmentFile.created"
+        )
+    attachment_files = association_proxy("attachment_files_helper", "dict_view",
+        creator=lambda v: MediaAttachmentFile(
+            name=v["name"], filepath=v["filepath"])
+        )
+
     tags_helper = relationship("MediaTag",
         cascade="all, delete-orphan"
         )
@@ -127,7 +136,6 @@ class MediaEntry(Base, MediaEntryMixin):
 
     ## TODO
     # media_data
-    # attachment_files
     # fail_error
 
     _id = SimpleFieldAlias("id")
@@ -177,6 +185,23 @@ class MediaFile(Base):
         return "<MediaFile %s: %r>" % (self.name, self.file_path)
 
 
+class MediaAttachmentFile(Base):
+    __tablename__ = "core__attachment_files"
+
+    id = Column(Integer, primary_key=True)
+    media_entry = Column(
+        Integer, ForeignKey(MediaEntry.id),
+        nullable=False)
+    name = Column(Unicode, nullable=False)
+    filepath = Column(PathTupleWithSlashes)
+    created = Column(DateTime, nullable=False, default=datetime.datetime.now)
+
+    @property
+    def dict_view(self):
+        """A dict like view on this object"""
+        return DictReadAttrProxy(self)
+
+
 class Tag(Base):
     __tablename__ = "tags"
 
index 3df36e8ebc4953b317e8b23f393eb5f87a1428d4..d21ef03ab5ebe9452d295e082ea1cf9f71270377 100644 (file)
@@ -120,7 +120,7 @@ def edit_attachments(request, media):
             finally:
                 request.POST['attachment_file'].file.close()
 
-            media['attachment_files'].append(dict(
+            media.attachment_files.append(dict(
                     name=request.POST['attachment_name'] \
                         or request.POST['attachment_file'].filename,
                     filepath=attachment_public_filepath,
index b2f316b2277b9bf0a7e0759c0000d36f49404219..25c1a6e6f1bab9f565effd6d8a95358f407b8548 100644 (file)
@@ -27,6 +27,6 @@ def delete_media_files(media):
         mg_globals.public_store.delete_file(
             listpath)
 
-    for attachment in media['attachment_files']:
+    for attachment in media.attachment_files:
         mg_globals.public_store.delete_file(
             attachment['filepath'])