Added base class logic for Expando based models.
authorLennard de Rijk <ljvderijk@gmail.com>
Thu, 02 Jul 2009 12:40:42 +0200
changeset 2481 031e5828f3a4
parent 2480 0079e1038740
child 2482 0e544df4d925
Added base class logic for Expando based models.
app/soc/logic/models/expando_base.py
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/app/soc/logic/models/expando_base.py	Thu Jul 02 12:40:42 2009 +0200
@@ -0,0 +1,77 @@
+#!/usr/bin/python2.5
+#
+# Copyright 2009 the Melange authors.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+"""Helpers functions for updating different kinds of Expando models.
+"""
+
+__authors__ = [
+  '"Lennard de Rijk" <ljvderijk@gmail.com>',
+  ]
+
+
+from soc.logic.models import base
+
+
+class Logic(base.Logic):
+  """Base logic for Expando entity classes.
+  """
+
+  def __init__(self, model, base_model=None, scope_logic=None,
+               name=None, skip_properties=None, id_based=False):
+    """Defines the name, key_name and model for this entity.
+    """
+
+    super(Logic, self).__init__(model=model, base_model=base_model,
+                                scope_logic=scope_logic, name=name,
+                                skip_properties=skip_properties,
+                                id_based=id_based)
+
+  def updateEntityProperties(self, entity, entity_properties, silent=False):
+    """Update existing entity using supplied properties.
+
+    Overwrites base because of Expando properties.
+
+    Args:
+      entity: a model entity
+      entity_properties: keyword arguments that correspond to entity
+        properties and their values
+      silent: iff True does not call _onUpdate method
+
+    Returns:
+      The original entity with any supplied properties changed.
+    """
+
+    if not entity:
+      raise NoEntityError
+
+    if not entity_properties:
+      raise InvalidArgumentError
+
+    for name, value in entity_properties.iteritems():
+      # if the property is not to be updated, skip it
+      if name in self._skip_properties:
+        continue
+
+      if self._updateField(entity, entity_properties, name):
+        setattr(entity, name, value)
+
+    entity.put()
+
+    # call the _onUpdate method
+    if not silent:
+      self._onUpdate(entity)
+
+    return entity