Merge branch 'transcoding_progress'
[mediagoblin.git] / mediagoblin / db / models.py
index b2dcb6ad32068a5cbdbec368ce678ebce55b0078..0974676a5577352c68550834a67bfcba235daa13 100644 (file)
@@ -43,6 +43,7 @@ from mediagoblin.db.mixin import UserMixin, MediaEntryMixin, \
 from mediagoblin.tools.files import delete_media_files
 from mediagoblin.tools.common import import_component
 from mediagoblin.tools.routing import extract_url_arguments
+from mediagoblin.tools.text import convert_to_tag_list_of_dicts
 
 import six
 from six.moves.urllib.parse import urljoin
@@ -574,6 +575,15 @@ class MediaEntry(Base, MediaEntryMixin, CommentingMixin):
             name=v["name"], filepath=v["filepath"])
         )
 
+    subtitle_files_helper = relationship("MediaSubtitleFile",
+        cascade="all, delete-orphan",
+        order_by="MediaSubtitleFile.created"
+        )
+    subtitle_files = association_proxy("subtitle_files_helper", "dict_view",
+        creator=lambda v: MediaSubtitleFile(
+            name=v["name"], filepath=v["filepath"])
+        )
+
     tags_helper = relationship("MediaTag",
         cascade="all, delete-orphan" # should be automatically deleted
         )
@@ -771,7 +781,6 @@ class MediaEntry(Base, MediaEntryMixin, CommentingMixin):
                 "self": {
                     "href": public_id,
                 },
-
             }
         }
 
@@ -787,6 +796,12 @@ class MediaEntry(Base, MediaEntryMixin, CommentingMixin):
         if self.location:
             context["location"] = self.get_location.serialize(request)
 
+        # Always show tags, even if empty list
+        if self.tags:
+            context["tags"] = [tag['name'] for tag in self.tags]
+        else:
+            context["tags"] = []
+
         if show_comments:
             comments = [
                 l.comment().serialize(request) for l in self.get_comments()]
@@ -834,6 +849,9 @@ class MediaEntry(Base, MediaEntryMixin, CommentingMixin):
         if "location" in data:
             License.create(data["location"], self)
 
+        if "tags" in data:
+            self.tags = convert_to_tag_list_of_dicts(', '.join(data["tags"]))
+
         return True
 
 class FileKeynames(Base):
@@ -899,6 +917,22 @@ class MediaAttachmentFile(Base):
         """A dict like view on this object"""
         return DictReadAttrProxy(self)
 
+class MediaSubtitleFile(Base):
+    __tablename__ = "core__subtitle_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.utcnow)
+
+    @property
+    def dict_view(self):
+        """A dict like view on this object"""
+        return DictReadAttrProxy(self)
+
 
 class Tag(Base):
     __tablename__ = "core__tags"
@@ -1610,7 +1644,7 @@ class Graveyard(Base):
         return context
 MODELS = [
     LocalUser, RemoteUser, User, MediaEntry, Tag, MediaTag, Comment, TextComment,
-    Collection, CollectionItem, MediaFile, FileKeynames, MediaAttachmentFile,
+    Collection, CollectionItem, MediaFile, FileKeynames, MediaAttachmentFile, MediaSubtitleFile,
     ProcessingMetaData, Notification, Client, CommentSubscription, Report,
     UserBan, Privilege, PrivilegeUserAssociation, RequestToken, AccessToken,
     NonceTimestamp, Activity, Generator, Location, GenericModelReference, Graveyard]