Fix some problems with activity mixins and migrations
authorJessica Tallon <jessica@megworld.co.uk>
Mon, 25 May 2015 15:22:32 +0000 (17:22 +0200)
committerJessica Tallon <jessica@megworld.co.uk>
Tue, 26 May 2015 14:48:59 +0000 (16:48 +0200)
mediagoblin/db/migrations.py
mediagoblin/db/mixin.py
mediagoblin/db/models.py
mediagoblin/tests/test_modelmethods.py
mediagoblin/tools/federation.py

index 1cc4b6252133124c32681ab3261ba3759c96165e..9ecd6e6225a0d55e0c1c302b4c5772bbcb1ec933 100644 (file)
@@ -36,7 +36,7 @@ from mediagoblin.db.extratypes import JSONEncoded, MutationDict
 from mediagoblin.db.migration_tools import (
     RegisterMigration, inspect_table, replace_table_hack)
 from mediagoblin.db.models import (MediaEntry, Collection, MediaComment, User,
-    Privilege, Generator, GenericForeignKey)
+    Privilege, Generator)
 from mediagoblin.db.extratypes import JSONEncoded, MutationDict
 
 
@@ -1289,10 +1289,10 @@ def add_foreign_key_fields(db):
     activity_table = inspect_table(metadata, "core__activities")
 
     # Create column and add to model.
-    object_column = Column("temp_object", Integer, GenericForeignKey())
+    object_column = Column("temp_object", Integer, ForeignKey(GenericModelReference_V0))
     object_column.create(activity_table)
 
-    target_column = Column("temp_target", Integer, GenericForeignKey())
+    target_column = Column("temp_target", Integer, ForeignKey(GenericModelReference_V0))
     target_column.create(activity_table)
 
     # Commit this to the database
index 4602c709a40b5192ebf6130836d99af6425f5f9a..88df1f6b11ffc90a7c1367bb06b6a7185e608969 100644 (file)
@@ -432,13 +432,12 @@ class ActivityMixin(object):
             "audio": _("audio"),
             "person": _("a person"),
         }
-
-        obj = self.get_object
-        target = self.get_target
+        obj = self.object_helper.get_object()
+        target = None if self.target_helper is None else self.target_helper.get_object()
         actor = self.get_actor
         content = verb_to_content.get(self.verb, None)
 
-        if content is None or obj is None:
+        if content is None or self.object is None:
             return
 
         # Decide what to fill the object with
@@ -452,7 +451,7 @@ class ActivityMixin(object):
         # Do we want to add a target (indirect object) to content?
         if target is not None and "targetted" in content:
             if hasattr(target, "title") and target.title.strip(" "):
-                target_value = target.title
+                target_value = terget.title
             elif target.object_type in object_map:
                 target_value = object_map[target.object_type]
             else:
index 6fdf0a0f37e9d516dea762419613059af28fc127..054e1677716c6b867d4da126988a644e79101eb4 100644 (file)
@@ -61,8 +61,10 @@ class GenericModelReference(Base):
     model_type = Column(Unicode, nullable=False)
 
     # Constrain it so obj_pk and model_type have to be unique
+    # They should be this order as the index is generated, "model_type" will be
+    # the major order as it's put first.
     __table_args__ = (
-        UniqueConstraint("obj_pk", "model_type"),
+        UniqueConstraint("model_type", "obj_pk"),
         {})
 
     def get_object(self):
@@ -108,11 +110,11 @@ class GenericModelReference(Base):
             # the class so it can be shared between all instances
 
             # to prevent circular imports do import here
-            registry = Base._decl_class_registry
+            registry = dict(Base._decl_class_registry).values()
             self._TYPE_MAP = dict(
-                ((m.__tablename__, m) for m in six.itervalues(registry))
+                ((m.__tablename__, m) for m in registry if hasattr(m, "__tablename__"))
             )
-            setattr(self.__class__, "_TYPE_MAP",  self._TYPE_MAP)
+            setattr(type(self), "_TYPE_MAP",  self._TYPE_MAP)
 
         return self.__class__._TYPE_MAP[model_type]
 
@@ -133,16 +135,16 @@ class GenericModelReference(Base):
     @classmethod
     def find_or_new(cls, obj):
         """ Finds an existing GMR or creates a new one for the object """
-        obj = cls.find_for_obj(obj)
+        gmr = cls.find_for_obj(obj)
 
         # If there isn't one already create one
-        if obj is None:
-            obj = cls(
+        if gmr is None:
+            gmr = cls(
                 obj_pk=obj.id,
                 model_type=type(obj).__tablename__
             )
 
-        return obj
+        return gmr
 
 class Location(Base):
     """ Represents a physical location """
@@ -582,7 +584,6 @@ class MediaEntry(Base, MediaEntryMixin):
         return import_component(self.media_type + '.models:BACKREF_NAME')
 
     def __repr__(self):
-        return "<MediaEntry DEBUG>"
         if six.PY2:
             # obj.__repr__() should return a str on Python 2
             safe_title = self.title.encode('utf-8', 'replace')
@@ -715,7 +716,7 @@ class MediaEntry(Base, MediaEntryMixin):
             self.license = data["license"]
 
         if "location" in data:
-            Licence.create(data["location"], self)
+            License.create(data["location"], self)
 
         return True
 
@@ -1373,13 +1374,13 @@ class Activity(Base, ActivityMixin):
 
     # Create the generic foreign keys for the object
     object_id = Column(Integer, ForeignKey(GenericModelReference.id), nullable=False)
-    object_helper = relationship(GenericModelReference)
+    object_helper = relationship(GenericModelReference, foreign_keys=[object_id])
     object = association_proxy("object_helper", "get_object",
                                 creator=GenericModelReference.find_or_new)
 
     # Create the generic foreign Key for the target
-    target_id = Column(Integer, ForeignKey(GenericModelReference), nullable=True)
-    target_helper = relationship(GenericModelReference)
+    target_id = Column(Integer, ForeignKey(GenericModelReference.id), nullable=True)
+    target_helper = relationship(GenericModelReference, foreign_keys=[target_id])
     taget = association_proxy("target_helper", "get_target",
                               creator=GenericModelReference.find_or_new)
 
index 1ab0c476ea270a63492131ae063bd3efc11c4bd1..0706aae437ede7b1c0f642ed30679c4ef2ce4566 100644 (file)
@@ -232,55 +232,3 @@ class TestUserUrlForSelf(MGClientTestCase):
             self.user(u'lindsay').url_for_self(fake_urlgen())
         assert excinfo.errisinstance(TypeError)
         assert 'object is not callable' in str(excinfo)
-
-class TestActivitySetGet(object):
-    """ Test methods on the Activity and ActivityIntermediator models """
-
-    @pytest.fixture(autouse=True)
-    def setup(self, test_app):
-        self.app = test_app
-        self.user = fixture_add_user()
-        self.obj = fixture_media_entry()
-        self.target = fixture_media_entry()
-
-    def test_set_activity_object(self):
-        """ Activity.set_object should produce ActivityIntermediator """
-        # The fixture will set self.obj as the object on the activity.
-        activity = fixture_add_activity(self.obj, actor=self.user)
-
-        # Assert the media has been associated with an AI
-        assert self.obj.activity is not None
-
-        # Assert the AI on the media and object are the same
-        assert activity.object == self.obj.activity
-
-    def test_activity_set_target(self):
-        """ Activity.set_target should produce ActivityIntermediator """
-        # This should set everything needed on the target
-        activity = fixture_add_activity(self.obj, actor=self.user)
-        activity.set_target(self.target)
-
-        # Assert the media has been associated with the AI
-        assert self.target.activity is not None
-
-        # assert the AI on the media and target are the same
-        assert activity.target == self.target.activity
-
-    def test_get_activity_object(self):
-        """ Activity.get_object should return a set object """
-        activity = fixture_add_activity(self.obj, actor=self.user)
-
-        print("self.obj.activity = {0}".format(self.obj.activity))
-
-        # check we now can get the object
-        assert activity.get_object is not None
-        assert activity.get_object.id == self.obj.id
-
-    def test_get_activity_target(self):
-        """ Activity.set_target should return a set target """
-        activity = fixture_add_activity(self.obj, actor=self.user)
-        activity.set_target(self.target)
-
-        # check we can get the target
-        assert activity.get_target is not None
-        assert activity.get_target.id == self.target.id
index e8d6fc369aa54360c761dd5ed19c1db248c79c94..e7593a92ab20e79557306f4ae3c4d0bf990a5dae 100644 (file)
@@ -26,7 +26,7 @@ def create_generator(request):
         return None
 
     client = request.access_token.get_requesttoken.get_client
-    
+
     # Check if there is a generator already
     generator = Generator.query.filter_by(
         name=client.application_name,
@@ -40,8 +40,8 @@ def create_generator(request):
         generator.save()
 
     return generator
-    
-     
+
+
 
 def create_activity(verb, obj, actor, target=None, generator=None):
     """