First step towards a MediaManager class: Compat one.
authorElrond <elrond+mediagoblin.org@samba-tng.org>
Fri, 8 Mar 2013 13:37:33 +0000 (14:37 +0100)
committerElrond <elrond+mediagoblin.org@samba-tng.org>
Wed, 17 Apr 2013 10:08:52 +0000 (12:08 +0200)
To get us moving towards a MediaManager class, the first
idea is to create a class that wraps our current dict based
manager and makes all users happy.

mediagoblin/db/mixin.py
mediagoblin/media_types/__init__.py
mediagoblin/tests/test_submission.py

index 0dc3bc851fb8c3b14a36de7c55f9388321fda08a..db08dfd2755d75771287dc129964d93c96e5c6ba 100644 (file)
@@ -212,7 +212,7 @@ class MediaEntryMixin(GenerateSlugMixin):
         # than iterating through all media managers.
         for media_type, manager in get_media_managers():
             if media_type == self.media_type:
-                return manager
+                return manager(self)
         # Not found?  Then raise an error
         raise FileTypeNotSupported(
             "MediaManager not in enabled types.  Check media_types in config?")
index 0abb38d3ada5f8b686d61feea27ab97fd03c274a..745e05ef5a5590156c8996487e92a45b0331e0e7 100644 (file)
@@ -20,6 +20,7 @@ import logging
 import tempfile
 
 from mediagoblin import mg_globals
+from mediagoblin.tools.common import import_component
 from mediagoblin.tools.translate import lazy_pass_to_ugettext as _
 
 _log = logging.getLogger(__name__)
@@ -31,6 +32,29 @@ class InvalidFileType(Exception):
     pass
 
 
+class CompatMediaManager(object):
+    def __init__(self, mm_dict, entry=None):
+        self.mm_dict = mm_dict
+        self.entry = entry
+       
+    def __call__(self, entry):
+        "So this object can look like a class too, somehow"
+        assert self.entry is None
+        return self.__class__(self.mm_dict, entry)
+
+    def __getitem__(self, i):
+        return self.mm_dict[i]
+
+    def __contains__(self, i):
+        return (i in self.mm_dict)
+
+    def get(self, *args, **kwargs):
+        return self.mm_dict.get(*args, **kwargs)
+
+    def __getattr__(self, i):
+        return self.mm_dict[i]
+
+
 def sniff_media(media):
     '''
     Iterate through the enabled media types and find those suited
@@ -74,9 +98,12 @@ def get_media_managers():
     Generator, yields all enabled media managers
     '''
     for media_type in get_media_types():
-        __import__(media_type)
+        mm = import_component(media_type + ":MEDIA_MANAGER")
+
+        if isinstance(mm, dict):
+            mm = CompatMediaManager(mm)
 
-        yield media_type, sys.modules[media_type].MEDIA_MANAGER
+        yield media_type, mm
 
 
 def get_media_type_and_manager(filename):
index d9c7ca4699d5eefdfc8d104e73e52d8d2c16c4a0..0d74848aad4512b8c11caa1570e155bd9423f03f 100644 (file)
@@ -231,7 +231,8 @@ class TestSubmission:
         media = self.check_media(request, {'title': u'Balanced Goblin'}, 1)
 
         assert media.media_type == u'mediagoblin.media_types.image'
-        assert media.media_manager == img_MEDIA_MANAGER
+        assert media.media_manager.mm_dict == img_MEDIA_MANAGER
+        assert media.media_manager.entry == media
 
 
     def test_sniffing(self, test_app):