# HG changeset patch # User Lennard de Rijk # Date 1246531242 -7200 # Node ID 031e5828f3a4357ae823787516c04a7db3693ad5 # Parent 0079e1038740365f8150e74170e8649a55991b32 Added base class logic for Expando based models. diff -r 0079e1038740 -r 031e5828f3a4 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" ', + ] + + +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