app/soc/logic/models/base.py
author Sverre Rabbelier <srabbelier@gmail.com>
Tue, 22 Sep 2009 13:07:27 +0200
changeset 2968 7ba28890eb75
parent 2897 c0e78185444c
child 2980 cbfd8e12527a
permissions -rw-r--r--
Prevent modification of key fields Only non-id-based entities are affected as id-based entities do not have any un-modificable fields.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     1
#!/usr/bin/python2.5
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     2
#
1308
35b75ffcbb37 Partially reverted "Update the copyright notice for 2009."
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1307
diff changeset
     3
# Copyright 2008 the Melange authors.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     4
#
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     5
# Licensed under the Apache License, Version 2.0 (the "License");
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     6
# you may not use this file except in compliance with the License.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     7
# You may obtain a copy of the License at
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     8
#
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
     9
#   http://www.apache.org/licenses/LICENSE-2.0
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    10
#
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    11
# Unless required by applicable law or agreed to in writing, software
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    12
# distributed under the License is distributed on an "AS IS" BASIS,
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    13
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    14
# See the License for the specific language governing permissions and
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    15
# limitations under the License.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    16
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    17
"""Helpers functions for updating different kinds of models in datastore.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    18
"""
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    19
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    20
__authors__ = [
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
    21
  '"Madhusudan C.S." <madhusudancs@gmail.com>',
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    22
  '"Todd Larsen" <tlarsen@google.com>',
429
e50e18936f06 Fixed typo in e-mail address
Sverre Rabbelier <srabbelier@gmail.com>
parents: 410
diff changeset
    23
  '"Sverre Rabbelier" <sverre@rabbelier.nl>',
634
ad58da0b78e8 Changed email address in logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 608
diff changeset
    24
  '"Lennard de Rijk" <ljvderijk@gmail.com>',
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    25
  '"Pawel Solyga" <pawel.solyga@gmail.com>',
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    26
  ]
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    27
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    28
2346
d830123c1be1 Do not die on NeedIndexErrors
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2230
diff changeset
    29
import logging
d830123c1be1 Do not die on NeedIndexErrors
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2230
diff changeset
    30
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    31
from google.appengine.ext import db
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    32
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
    33
from django.utils.translation import ugettext
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
    34
1106
e14b0995cf29 Flush sidebar when creating a new entity
Sverre Rabbelier <srabbelier@gmail.com>
parents: 986
diff changeset
    35
from soc.cache import sidebar
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
    36
from soc.logic import dicts
543
280a1ac6bcc1 Merge soc/logic/out_of_band.py into soc/views/out_of_band.py. Merge
Todd Larsen <tlarsen@google.com>
parents: 535
diff changeset
    37
from soc.views import out_of_band
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    38
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    39
441
8a7110ad3d82 Fix not working former ids feature of User Profile Developer Edit view. Add missing Error exception class to soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 436
diff changeset
    40
class Error(Exception):
499
d22e4fe8e64b Fix missing dots in doc strings and some other doc string corrections.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 487
diff changeset
    41
  """Base class for all exceptions raised by this module.
d22e4fe8e64b Fix missing dots in doc strings and some other doc string corrections.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 487
diff changeset
    42
  """
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    43
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    44
  pass
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    45
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
    46
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    47
class InvalidArgumentError(Error):
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    48
  """Raised when an invalid argument is passed to a method.
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    49
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    50
  For example, if an argument is None, but must always be non-False.
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    51
  """
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    52
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    53
  pass
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    54
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
    55
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    56
class NoEntityError(InvalidArgumentError):
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    57
  """Raised when no entity is passed to a method that requires one.
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    58
  """
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    59
441
8a7110ad3d82 Fix not working former ids feature of User Profile Developer Edit view. Add missing Error exception class to soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 436
diff changeset
    60
  pass
8a7110ad3d82 Fix not working former ids feature of User Profile Developer Edit view. Add missing Error exception class to soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 436
diff changeset
    61
8a7110ad3d82 Fix not working former ids feature of User Profile Developer Edit view. Add missing Error exception class to soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 436
diff changeset
    62
642
671dc971c3d1 Allow for extra dynamic fields for the create form
Sverre Rabbelier <srabbelier@gmail.com>
parents: 634
diff changeset
    63
class Logic(object):
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    64
  """Base logic for entity classes.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    65
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    66
  The BaseLogic class functions specific to Entity classes by relying
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    67
  on arguments passed to __init__.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    68
  """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    69
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    70
  def __init__(self, model, base_model=None, scope_logic=None,
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
    71
               name=None, skip_properties=None, id_based=False):
481
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    72
    """Defines the name, key_name and model for this entity.
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    73
    """
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    74
481
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    75
    self._model = model
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    76
    self._base_model = base_model
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    77
    self._scope_logic = scope_logic
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
    78
    self._id_based = id_based
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    79
481
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    80
    if name:
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    81
      self._name = name
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    82
    else:
533
ba3309b2fd30 Move LINK_ID and SCOPE_PATH regular expressions to soc/models/linkable.py.
Todd Larsen <tlarsen@google.com>
parents: 512
diff changeset
    83
      self._name =  self._model.__name__
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    84
481
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    85
    if skip_properties:
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    86
      self._skip_properties = skip_properties
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    87
    else:
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    88
      self._skip_properties = []
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    89
2968
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    90
  def skipField(self, name):
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    91
    """Returns whether a field with the specified name should be saved.
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    92
    """
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    93
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    94
    if name in self._skip_properties:
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    95
      return True
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    96
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    97
    if self._id_based:
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    98
      return False
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
    99
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
   100
    if name in self.getKeyFieldNames():
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
   101
      return True
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
   102
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
   103
    return False
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
   104
606
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
   105
  def getModel(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
   106
    """Returns the model this logic class uses.
606
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
   107
    """
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
   108
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
   109
    return self._model
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
   110
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
   111
  def getScopeLogic(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
   112
    """Returns the logic of the enclosing scope.
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
   113
    """
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
   114
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
   115
    return self._scope_logic
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
   116
679
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   117
  def getScopeDepth(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
   118
    """Returns the scope depth for this entity.
679
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   119
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
   120
    Returns None if any of the parent scopes return None.
679
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   121
    """
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   122
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   123
    if not self._scope_logic:
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   124
      return 0
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   125
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   126
    depth = self._scope_logic.logic.getScopeDepth()
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   127
    return None if (depth is None) else (depth + 1)
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   128
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   129
  def getKeyNameFromFields(self, fields):
1218
569a3fe9cb88 Cleaned up getKeyNameFromFields in Logic base.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1183
diff changeset
   130
    """Returns the KeyName constructed from fields dict for this type of entity.
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   131
436
f3c313d54aa4 Add missing TODOs to soc.logic.models classes. Fix comments format in base.Logic class. Changes based on comments to r972.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 435
diff changeset
   132
    The KeyName is in the following format:
1218
569a3fe9cb88 Cleaned up getKeyNameFromFields in Logic base.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1183
diff changeset
   133
    <key_value1>/<key_value2>/.../<key_valueN>
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   134
    """
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   135
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   136
    if not fields:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   137
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   138
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   139
    key_field_names = self.getKeyFieldNames()
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   140
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   141
    # check if all key_field_names for this entity are present in fields
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   142
    if not all(field in fields.keys() for field in key_field_names):
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   143
      raise InvalidArgumentError("Not all the required key fields are present")
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   144
1218
569a3fe9cb88 Cleaned up getKeyNameFromFields in Logic base.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1183
diff changeset
   145
    if not all(fields.get(field) for field in key_field_names):
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   146
      raise InvalidArgumentError("Not all KeyValues are non-false")
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   147
436
f3c313d54aa4 Add missing TODOs to soc.logic.models classes. Fix comments format in base.Logic class. Changes based on comments to r972.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 435
diff changeset
   148
    # construct the KeyValues in the order given by getKeyFieldNames()
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   149
    keyvalues = []
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   150
    for key_field_name in key_field_names:
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   151
      keyvalues.append(fields[key_field_name])
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   152
436
f3c313d54aa4 Add missing TODOs to soc.logic.models classes. Fix comments format in base.Logic class. Changes based on comments to r972.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 435
diff changeset
   153
    # construct the KeyName in the appropriate format
661
d7b643255255 Change the key name to not include entity type
Sverre Rabbelier <srabbelier@gmail.com>
parents: 655
diff changeset
   154
    return '/'.join(keyvalues)
481
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
   155
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
   156
  def getFullModelClassName(self):
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
   157
    """Returns fully-qualified model module.class name string.
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   158
    """
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   159
533
ba3309b2fd30 Move LINK_ID and SCOPE_PATH regular expressions to soc/models/linkable.py.
Todd Larsen <tlarsen@google.com>
parents: 512
diff changeset
   160
    return '%s.%s' % (self._model.__module__, self._model.__name__)
481
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
   161
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   162
  def getKeyValuesFromEntity(self, entity):
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   163
    """Extracts the key values from entity and returns them.
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   164
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   165
    The default implementation uses the scope and link_id as key values.
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   166
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   167
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   168
      entity: the entity from which to extract the key values
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   169
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   170
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   171
    if not entity:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   172
      raise NoEntityError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   173
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   174
    return [entity.scope_path, entity.link_id]
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   175
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   176
  def getKeyValuesFromFields(self, fields):
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   177
    """Extracts the key values from a dict and returns them.
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   178
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   179
    The default implementation uses the scope and link_id as key values.
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   180
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   181
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   182
      fields: the dict from which to extract the key values
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   183
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   184
2190
399fc9411abc Readability fix in base logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2161
diff changeset
   185
    if ('scope_path' not in fields) or ('link_id' not in fields):
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   186
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   187
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   188
    return [fields['scope_path'], fields['link_id']]
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   189
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   190
  def getKeyFieldNames(self):
499
d22e4fe8e64b Fix missing dots in doc strings and some other doc string corrections.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 487
diff changeset
   191
    """Returns an array with the names of the Key Fields.
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   192
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   193
    The default implementation uses the scope and link_id as key values.
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   194
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   195
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   196
    return ['scope_path', 'link_id']
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   197
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   198
  def getKeyFieldsFromFields(self, dictionary):
499
d22e4fe8e64b Fix missing dots in doc strings and some other doc string corrections.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 487
diff changeset
   199
    """Does any required massaging and filtering of dictionary.
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   200
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   201
    The resulting dictionary contains just the key names, and has any
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   202
    required translations/modifications performed.
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   203
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   204
    Args:
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   205
      dictionary: The arguments to massage
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   206
    """
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   207
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   208
    if not dictionary:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   209
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   210
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   211
    keys = self.getKeyFieldNames()
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   212
    values = self.getKeyValuesFromFields(dictionary)
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   213
    key_fields = dicts.zip(keys, values)
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   214
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   215
    return key_fields
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   216
2709
7a595f688ab5 Add parent parameter to accommodate entity groups.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2364
diff changeset
   217
  def getFromKeyName(self, key_name, parent=None):
7a595f688ab5 Add parent parameter to accommodate entity groups.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2364
diff changeset
   218
    """Returns entity for key_name or None if not found.
1222
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   219
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   220
    Args:
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   221
      key_name: key name of entity
2709
7a595f688ab5 Add parent parameter to accommodate entity groups.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2364
diff changeset
   222
      parent: parent of the entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   223
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   224
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   225
    if self._id_based:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   226
      raise Error("getFromKeyName called on an id based logic")
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   227
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   228
    if not key_name:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   229
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   230
2709
7a595f688ab5 Add parent parameter to accommodate entity groups.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2364
diff changeset
   231
    return self._model.get_by_key_name(key_name, parent=parent)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   232
2709
7a595f688ab5 Add parent parameter to accommodate entity groups.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2364
diff changeset
   233
  def getFromID(self, id, parent=None):
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   234
    """Returns entity for id or None if not found.
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   235
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   236
    Args:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   237
      id: id of entity
2709
7a595f688ab5 Add parent parameter to accommodate entity groups.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2364
diff changeset
   238
      parent: parent of the entity
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   239
    """
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   240
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   241
    if not self._id_based:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   242
      raise Error("getFromID called on a not id based logic")
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   243
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   244
    if not id:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   245
      raise InvalidArgumentError
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   246
2709
7a595f688ab5 Add parent parameter to accommodate entity groups.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2364
diff changeset
   247
    return self._model.get_by_id(id, parent=parent)
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   248
1780
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   249
  def getFromKeyNameOr404(self, key_name):
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   250
    """Like getFromKeyName but expects to find an entity.
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   251
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   252
    Raises:
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   253
      out_of_band.Error if no entity is found
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   254
    """
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   255
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   256
    entity = self.getFromKeyName(key_name)
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   257
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   258
    if entity:
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   259
      return entity
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   260
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   261
    msg = ugettext('There is no "%(name)s" named %(key_name)s.') % {
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   262
        'name': self._name, 'key_name': key_name}
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   263
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   264
    raise out_of_band.Error(msg, status=404)
210ab3d5d6ea Added a getFromKeyNameOr404 to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1696
diff changeset
   265
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   266
  def getFromIDOr404(self, id):
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   267
    """Like getFromID but expects to find an entity.
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   268
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   269
    Raises:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   270
      out_of_band.Error if no entity is found
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   271
    """
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   272
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   273
    entity = self.getFromID(id)
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   274
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   275
    if entity:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   276
      return entity
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   277
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   278
    msg = ugettext('There is no "%(name)s" with id %(id)s.') % {
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   279
        'name': self._name, 'id': id}
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   280
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   281
    raise out_of_band.Error(msg, status=404)
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   282
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   283
  def getFromKeyFields(self, fields):
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   284
    """Returns the entity for the specified key names, or None if not found.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   285
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   286
    Args:
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   287
      fields: a dict containing the fields of the entity that
1222
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   288
        uniquely identifies it
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   289
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   290
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   291
    if not fields:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   292
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   293
1222
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   294
    key_fields = self.getKeyFieldsFromFields(fields)
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   295
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   296
    if all(key_fields.values()):
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   297
      key_name = self.getKeyNameFromFields(key_fields)
672
c8f9281f535b Some more cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 671
diff changeset
   298
      entity = self.getFromKeyName(key_name)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   299
    else:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   300
      entity = None
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   301
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   302
    return entity
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   303
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   304
  def getFromKeyFieldsOr404(self, fields):
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   305
    """Like getFromKeyFields but expects to find an entity.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   306
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   307
    Raises:
1222
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   308
      out_of_band.Error if no entity is found
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   309
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   310
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   311
    entity = self.getFromKeyFields(fields)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   312
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   313
    if entity:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   314
      return entity
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   315
1672
9b6cc71dd70c Only show key_fields in error message
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1626
diff changeset
   316
    key_fields = self.getKeyFieldsFromFields(fields)
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
   317
    format_text = ugettext('"%(key)s" is "%(value)s"')
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   318
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   319
    msg_pairs = [format_text % {'key': key, 'value': value}
1672
9b6cc71dd70c Only show key_fields in error message
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1626
diff changeset
   320
      for key, value in key_fields.iteritems()]
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   321
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   322
    joined_pairs = ' and '.join(msg_pairs)
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   323
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
   324
    msg = ugettext(
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   325
      'There is no "%(name)s" where %(pairs)s.') % {
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   326
        'name': self._name, 'pairs': joined_pairs}
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   327
592
be98a2f5d8a2 Fixed an outstanding TODO for tlarsen
Sverre Rabbelier <srabbelier@gmail.com>
parents: 565
diff changeset
   328
    raise out_of_band.Error(msg, status=404)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   329
2854
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   330
  def prefetchField(self, field, data):
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   331
    """Prefetches all fields in data from the datastore in one fetch.
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   332
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   333
    Args:
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   334
      field: the field that should be fetched
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   335
      data: the data for which the prefetch should be done
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   336
    """
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   337
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   338
    prop = getattr(self._model, field, None)
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   339
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   340
    if not prop:
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   341
      logging.exception("Model %s does not have attribute %s" %
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   342
                        (self._model, field))
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   343
      return
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   344
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   345
    if not isinstance(prop, db.ReferenceProperty):
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   346
      logging.exception("Property %s of %s is not a ReferenceProperty but a %s" %
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   347
                        (field, self._model.kind(), prop.__class__.__name__))
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   348
      return
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   349
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   350
    keys = [prop.get_value_for_datastore(i) for i in data]
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   351
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   352
    prefetched_entities = db.get(keys)
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   353
    prefetched_dict = dict((i.key(), i) for i in prefetched_entities)
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   354
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   355
    for i in data:
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   356
      value = prefetched_dict[prop.get_value_for_datastore(i)]
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   357
      setattr(i, field, value)
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   358
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   359
  def getForFields(self, filter=None, unique=False, limit=1000, offset=0,
2854
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   360
                   ancestors=None, order=None, prefetch=None):
499
d22e4fe8e64b Fix missing dots in doc strings and some other doc string corrections.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 487
diff changeset
   361
    """Returns all entities that have the specified properties.
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   362
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   363
    Args:
961
36a90d0e9211 Add Madhusudan.C.S to AUTHORS. Fix docstring parameters list in soc.logic.models.base module Base class getForFields method.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 723
diff changeset
   364
      filter: a dict for the properties that the entities should have
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   365
      unique: if set, only the first item from the resultset will be returned
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   366
      limit: the amount of entities to fetch at most
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   367
      offset: the position to start at
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   368
      ancestors: list of ancestors properties to set for this query
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   369
      order: a list with the sort order
2854
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   370
      prefetch: the fields of the data that should be pre-fetched,
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   371
          has no effect if unique is True
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   372
    """
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   373
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   374
    if unique:
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   375
      limit = 1
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   376
2854
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   377
    if not prefetch:
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   378
      prefetch = []
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   379
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   380
    query = self.getQueryForFields(filter=filter, 
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   381
                                   ancestors=ancestors, order=order)
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   382
2346
d830123c1be1 Do not die on NeedIndexErrors
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2230
diff changeset
   383
    try:
d830123c1be1 Do not die on NeedIndexErrors
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2230
diff changeset
   384
      result = query.fetch(limit, offset)
d830123c1be1 Do not die on NeedIndexErrors
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2230
diff changeset
   385
    except db.NeedIndexError, exception:
d830123c1be1 Do not die on NeedIndexErrors
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2230
diff changeset
   386
      result = []
2758
688753f1d406 Changed the parameter from ancestor to ancestors to accommodate a list of ancestors.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2757
diff changeset
   387
      logging.exception("%s, model: %s filter: %s, ancestors: %s, order: %s" % 
688753f1d406 Changed the parameter from ancestor to ancestors to accommodate a list of ancestors.
Madhusudan.C.S <madhusudancs@gmail.com>
parents: 2757
diff changeset
   388
                        (exception, self._model, filter, ancestors, order))
2346
d830123c1be1 Do not die on NeedIndexErrors
Sverre Rabbelier <sverre@rabbelier.nl>
parents: 2230
diff changeset
   389
      # TODO: send email
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   390
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   391
    if unique:
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   392
      return result[0] if result else None
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   393
2854
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   394
    for field in prefetch:
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   395
      self.prefetchField(field, result)
003a84e774e2 Add support for prefetching fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2853
diff changeset
   396
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   397
    return result
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   398
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   399
  def getQueryForFields(self, filter=None, ancestors=None, order=None):
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   400
    """Returns a query with the specified properties.
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   401
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   402
    Args:
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   403
      filter: a dict for the properties that the entities should have
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   404
      ancestors: list with ancestor properties to set for this query
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   405
      order: a list with the sort order
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   406
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   407
    Returns:
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   408
      - Query object instantiated with the given properties
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   409
    """
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   410
2851
792e2c58dc62 Store queries in memcache
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2758
diff changeset
   411
    from google.appengine.api import memcache
2853
80a71738cb4f only store queries in debug mode
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2852
diff changeset
   412
    from soc.logic import system
80a71738cb4f only store queries in debug mode
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2852
diff changeset
   413
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   414
    if not filter:
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   415
      filter = {}
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   416
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   417
    if not ancestors:
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   418
      ancestors = []
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   419
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   420
    if not order:
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   421
      order = []
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   422
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   423
    orderset = set([i.strip('-') for i in order])
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   424
    if len(orderset) != len(order):
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   425
      raise InvalidArgumentError
1179
427d2ec42823 Rewrite getForFields to use GQL instead of the Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1165
diff changeset
   426
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   427
    query = db.Query(self._model)
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   428
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   429
    for key, value in filter.iteritems():
1696
7b120f7f9a7a Small optimization in getForFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1694
diff changeset
   430
      if isinstance(value, list) and len(value) == 1:
7b120f7f9a7a Small optimization in getForFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1694
diff changeset
   431
        value = value[0]
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   432
      if isinstance(value, list):
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   433
        op = '%s IN' % key
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   434
        query.filter(op, value)
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   435
      else:
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   436
        query.filter(key, value)
723
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
   437
2756
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   438
    for ancestor in ancestors:
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   439
      query.ancestor(ancestor)
054810192277 Added ancestors property to getQueryForFields for queries with ancestor filter.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2736
diff changeset
   440
1614
797f5ae462e7 Convert getForFields back to the Query API and add tests
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1604
diff changeset
   441
    for key in order:
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   442
      query.order(key)
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   443
1694
d388ff2fbe90 Refactored part of getForFields into a getQueryForFields method.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1672
diff changeset
   444
    return query
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   445
2736
8f3935f0f4ba Argument store added to updateEntityProperties.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2709
diff changeset
   446
  def updateEntityProperties(self, entity, entity_properties, silent=False,
8f3935f0f4ba Argument store added to updateEntityProperties.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2709
diff changeset
   447
                             store=True):
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   448
    """Update existing entity using supplied properties.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   449
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   450
    Args:
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   451
      entity: a model entity
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   452
      entity_properties: keyword arguments that correspond to entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   453
        properties and their values
1573
063306b7210e Added missing comment to soc/logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1549
diff changeset
   454
      silent: iff True does not call _onUpdate method
2736
8f3935f0f4ba Argument store added to updateEntityProperties.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2709
diff changeset
   455
      store: iff True updated entity is actually stored in the data model
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   456
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   457
    Returns:
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   458
      The original entity with any supplied properties changed.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   459
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   460
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   461
    if not entity:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   462
      raise NoEntityError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   463
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   464
    if not entity_properties:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   465
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   466
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   467
    properties = self._model.properties()
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   468
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   469
    for name, prop in properties.iteritems():
2030
a21ee5f0591d Fixed typo in docstring for logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1780
diff changeset
   470
      # if the property is not updateable or is not updated, skip it
2968
7ba28890eb75 Prevent modification of key fields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2897
diff changeset
   471
      if self.skipField(name) or (name not in entity_properties):
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   472
        continue
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   473
1517
a467d13e34ea Pass _updateField the entity_properties dict instead of just the value
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1516
diff changeset
   474
      if self._updateField(entity, entity_properties, name):
a467d13e34ea Pass _updateField the entity_properties dict instead of just the value
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1516
diff changeset
   475
        value = entity_properties[name]
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   476
        prop.__set__(entity, value)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   477
2736
8f3935f0f4ba Argument store added to updateEntityProperties.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2709
diff changeset
   478
    if store:
8f3935f0f4ba Argument store added to updateEntityProperties.
Daniel Hans <Daniel.M.Hans@gmail.com>
parents: 2709
diff changeset
   479
      entity.put()
1549
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   480
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   481
    # call the _onUpdate method
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   482
    if not silent:
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   483
      self._onUpdate(entity)
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   484
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   485
    return entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   486
2757
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   487
  def updateOrCreateFromKeyName(self, properties, key_name, silent=False):
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   488
    """Update existing entity, or create new one with supplied properties.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   489
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   490
    Args:
317
87215136c268 Remove spaces between dict key name and colon. Fix some typos based on comments http://code.google.com/p/soc/source/detail?r=739.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 308
diff changeset
   491
      properties: dict with entity properties and their values
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   492
      key_name: the key_name of the entity that uniquely identifies it
2757
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   493
      silent: if True, do not run the _onCreate hook
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   494
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   495
    Returns:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   496
      the entity corresponding to the key_name, with any supplied
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   497
      properties changed, or a new entity now associated with the
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   498
      supplied key_name and properties.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   499
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   500
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   501
    entity = self.getFromKeyName(key_name)
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   502
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   503
    create_entity = not entity
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   504
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   505
    if create_entity:
1518
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   506
      for property_name in properties:
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   507
        self._createField(properties, property_name)
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   508
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   509
      # entity did not exist, so create one in a transaction
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   510
      entity = self._model.get_or_insert(key_name, **properties)
2757
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   511
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   512
      if not silent:
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   513
        # a new entity has been created call _onCreate
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   514
        self._onCreate(entity)
1516
8df06dc877aa Do not update newly created model properties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1515
diff changeset
   515
    else:
8df06dc877aa Do not update newly created model properties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1515
diff changeset
   516
      # If someone else already created the entity (due to a race), we
8df06dc877aa Do not update newly created model properties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1515
diff changeset
   517
      # should not update the propties (as they 'won' the race).
2757
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   518
      entity = self.updateEntityProperties(entity, properties, silent=silent)
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   519
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   520
    return entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   521
2221
1177ab97c2f0 Add a silent option to updateOrCreateFromFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2203
diff changeset
   522
  def updateOrCreateFromFields(self, properties, silent=False):
2757
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   523
    """Update existing entity or creates a new entity with the supplied 
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   524
    properties containing the key fields.
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   525
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   526
    Args:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   527
      properties: dict with entity properties and their values
2221
1177ab97c2f0 Add a silent option to updateOrCreateFromFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2203
diff changeset
   528
      silent: if True, do not run the _onCreate hook
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   529
    """
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   530
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   531
    for property_name in properties:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   532
      self._createField(properties, property_name)
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   533
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   534
    if self._id_based:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   535
      entity = self._model(**properties)
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   536
      entity.put()
2757
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   537
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   538
      if not silent:
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   539
        # call the _onCreate hook
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   540
        self._onCreate(entity)
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   541
    else:
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   542
      key_name = self.getKeyNameFromFields(properties)
2757
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   543
      entity = self.updateOrCreateFromKeyName(properties, key_name,
7d0d0ce76bd9 updateOrCreateFromFields is made to call updateOrCreateFromKeyName.
Madhusudan C.S. <madhusudancs@gmail.com>
parents: 2756
diff changeset
   544
                                              silent=silent)
2221
1177ab97c2f0 Add a silent option to updateOrCreateFromFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2203
diff changeset
   545
2203
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   546
    return entity
e2c6e6722d69 Add support for ID based entities
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2190
diff changeset
   547
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   548
  def isDeletable(self, entity):
368
f90f9b22751a Move TODO about isDeletable Sponsor logic method to sponsor.py module and extend a little bit doc string.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 363
diff changeset
   549
    """Returns whether the specified entity can be deleted.
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   550
368
f90f9b22751a Move TODO about isDeletable Sponsor logic method to sponsor.py module and extend a little bit doc string.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 363
diff changeset
   551
    Args:
f90f9b22751a Move TODO about isDeletable Sponsor logic method to sponsor.py module and extend a little bit doc string.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 363
diff changeset
   552
      entity: an existing entity in datastore
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   553
    """
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   554
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   555
    return True
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   556
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   557
  def delete(self, entity):
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   558
    """Delete existing entity from datastore.
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   559
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   560
    Args:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   561
      entity: an existing entity in datastore
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   562
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   563
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   564
    entity.delete()
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   565
    # entity has been deleted call _onDelete
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   566
    self._onDelete(entity)
1515
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   567
1601
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   568
  def getAll(self, query):
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   569
    """Retrieves all entities for the specified query.
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   570
    """
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   571
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   572
    chunk = 999
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   573
    offset = 0
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   574
    result = []
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   575
    more = True
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   576
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   577
    while(more):
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   578
      data = query.fetch(chunk+1, offset)
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   579
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   580
      more = len(data) > chunk
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   581
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   582
      if more:
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   583
        del data[chunk]
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   584
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   585
      result.extend(data)
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   586
      offset = offset + chunk
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   587
172e7de6c004 Make it possible to work on all entities in a query
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1574
diff changeset
   588
    return result
2364
a1cbd3143277 Rename bathSize variable to batch_size in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2346
diff changeset
   589
  # pylint: disable-msg=C0103
a1cbd3143277 Rename bathSize variable to batch_size in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2346
diff changeset
   590
  def entityIterator(self, queryGen, batch_size = 100):
2230
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   591
    """Iterator that yields an entity in batches.
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   592
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   593
    Args:
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   594
      queryGen: should return a Query object
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   595
      batchSize: how many entities to retrieve in one datastore call
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   596
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   597
    Retrieved from http://tinyurl.com/d887ll (AppEngine cookbook).
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   598
    """
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   599
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   600
     # AppEngine will not fetch more than 1000 results
2364
a1cbd3143277 Rename bathSize variable to batch_size in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2346
diff changeset
   601
    batch_size = min(batch_size, 1000)
2230
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   602
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   603
    done = False
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   604
    count = 0
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   605
    key = None
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   606
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   607
    while not done:
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   608
      query = queryGen()
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   609
      if key:
2364
a1cbd3143277 Rename bathSize variable to batch_size in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2346
diff changeset
   610
        query.filter("__key__ > ", key)
a1cbd3143277 Rename bathSize variable to batch_size in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2346
diff changeset
   611
      results = query.fetch(batch_size)
2230
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   612
      for result in results:
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   613
        count += 1
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   614
        yield result
2364
a1cbd3143277 Rename bathSize variable to batch_size in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 2346
diff changeset
   615
      if batch_size > len(results):
2230
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   616
        done = True
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   617
      else:
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   618
        key = results[-1].key()
f3d59025d254 Add entityIterator to base Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 2221
diff changeset
   619
1518
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   620
  def _createField(self, entity_properties, name):
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   621
    """Hook called when a field is created.
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   622
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   623
    To be exact, this method is called for each field (that has a value
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   624
    specified) on an entity that is being created.
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   625
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   626
    Base classes should override if any special actions need to be
1604
297444daac68 Two docstring fixes.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1601
diff changeset
   627
    taken when a field is created.
1518
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   628
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   629
    Args:
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   630
      entity_properties: keyword arguments that correspond to entity
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   631
        properties and their values
1518
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   632
      name: the name of the field to be created
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   633
    """
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   634
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   635
    if not entity_properties or (name not in entity_properties):
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   636
      raise InvalidArgumentError
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   637
1517
a467d13e34ea Pass _updateField the entity_properties dict instead of just the value
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1516
diff changeset
   638
  def _updateField(self, entity, entity_properties, name):
1515
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   639
    """Hook called when a field is updated.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   640
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   641
    Base classes should override if any special actions need to be
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   642
    taken when a field is updated. The field is not updated if the
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   643
    method does not return a True value.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   644
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   645
    Args:
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   646
      entity: the unaltered entity
1626
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   647
      entity_properties: keyword arguments that correspond to entity
fe455c93cbf6 Remove unused imports, add missing blank lines, fix too long lines, fix docstring parameters to match the ones in method declaration, rename to short variable names in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 1614
diff changeset
   648
        properties and their values
1515
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   649
      name: the name of the field to be changed
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   650
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   651
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   652
    if not entity:
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   653
      raise NoEntityError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   654
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   655
    if not entity_properties or (name not in entity_properties):
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   656
      raise InvalidArgumentError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   657
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   658
    return True
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   659
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   660
  def _onCreate(self, entity):
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   661
    """Called when an entity has been created.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   662
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   663
    Classes that override this can use it to do any post-creation operations.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   664
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   665
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   666
    if not entity:
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   667
      raise NoEntityError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   668
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   669
    sidebar.flush()
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   670
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   671
  def _onUpdate(self, entity):
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   672
    """Called when an entity has been updated.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   673
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   674
    Classes that override this can use it to do any post-update operations.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   675
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   676
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   677
    if not entity:
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   678
      raise NoEntityError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   679
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   680
  def _onDelete(self, entity):
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   681
    """Called when an entity has been deleted.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   682
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   683
    Classes that override this can use it to do any post-deletion operations.
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   684
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   685
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   686
    if not entity:
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   687
      raise NoEntityError