user's can't set/unset site in Login Details without the proper authorization
[plstackapi.git] / planetstack / ec2_observer / syncstep.py
index 187b318..31fec04 100644 (file)
@@ -44,13 +44,26 @@ class SyncStep:
         return
 
     def fetch_pending(self, deletion=False):
-        return []
+        # This is the most common implementation of fetch_pending
+        # Steps should override it if they have their own logic
+        # for figuring out what objects are outstanding.
+        main_obj = self.provides[0]
+        if (not deleted):
+            objs = main_obj.objects.filter(Q(enacted__lt=F('updated')) | Q(enacted=None))
+        else:
+            objs = main_obj.deleted_objects.all()
+
+        return objs
         #return Sliver.objects.filter(ip=None)
     
     def check_dependencies(self, obj, failed):
         for dep in self.dependencies:
-            peer_object = getattr(obj, dep.lower())
-            if (peer_object.pk==failed.pk):
+            peer_name = dep[0].lower() + dep[1:]    # django names are camelCased with the first letter lower
+            peer_object = getattr(obj, peer_name)
+            
+            # peer_object can be None, and if so there
+            # is no object-level dependency
+            if (peer_object and peer_object.pk==failed.pk):
                 raise FailedDependency
 
     def call(self, failed=[], deletion=False):
@@ -73,7 +86,8 @@ class SyncStep:
                 except:
                     o.backend_status = str(e)
 
-                o.save(update_fields=['backend_status'])
+                if (o.pk):
+                    o.save(update_fields=['backend_status'])
 
                 logger.log_exc("sync step failed!")
                 failed.append(o)