app/soc/logic/models/base.py
author Sverre Rabbelier <srabbelier@gmail.com>
Tue, 03 Mar 2009 19:27:55 +0000
changeset 1600 0aa3de1b2acc
parent 1574 d185fe0f1404
child 1601 172e7de6c004
permissions -rw-r--r--
Fix access bug due to forgotten normalization Prevent this from happening again by wrapping all occurences of users.get_current_account with accounts.getCurrentAccount, which will always normalize (unless explicitly told not to). Patch by: Sverre Rabbelier
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__ = [
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    21
  '"Todd Larsen" <tlarsen@google.com>',
429
e50e18936f06 Fixed typo in e-mail address
Sverre Rabbelier <srabbelier@gmail.com>
parents: 410
diff changeset
    22
  '"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
    23
  '"Lennard de Rijk" <ljvderijk@gmail.com>',
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    24
  '"Pawel Solyga" <pawel.solyga@gmail.com>',
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    25
  ]
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
723
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
    28
import itertools
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
    29
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    30
from google.appengine.ext import db
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    31
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
    32
from django.utils.translation import ugettext
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
    33
1106
e14b0995cf29 Flush sidebar when creating a new entity
Sverre Rabbelier <srabbelier@gmail.com>
parents: 986
diff changeset
    34
from soc.cache import sidebar
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
    35
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
    36
from soc.views import out_of_band
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    37
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    38
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
    39
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
    40
  """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
    41
  """
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    42
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    43
  pass
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    44
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    45
class InvalidArgumentError(Error):
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    46
  """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
    47
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    48
  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
    49
  """
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    50
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    51
  pass
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
class NoEntityError(InvalidArgumentError):
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    54
  """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
    55
  """
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
    56
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
    57
  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
    58
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
    59
642
671dc971c3d1 Allow for extra dynamic fields for the create form
Sverre Rabbelier <srabbelier@gmail.com>
parents: 634
diff changeset
    60
class Logic(object):
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    61
  """Base logic for entity classes.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    62
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    63
  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
    64
  on arguments passed to __init__.
308
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
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    67
  def __init__(self, model, base_model=None, scope_logic=None,
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
    68
               name=None, skip_properties=None):
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
    69
    """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
    70
    """
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    71
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
    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
    73
    self._base_model = base_model
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    74
    self._scope_logic = scope_logic
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    75
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
    76
    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
    77
      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
    78
    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
    79
      self._name =  self._model.__name__
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    80
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
    81
    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
    82
      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
    83
    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
    84
      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
    85
606
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    86
  def getModel(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
    87
    """Returns the model this logic class uses.
606
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    88
    """
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    89
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    90
    return self._model
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    91
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    92
  def getScopeLogic(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
    93
    """Returns the logic of the enclosing scope.
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    94
    """
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    95
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    96
    return self._scope_logic
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    97
679
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    98
  def getScopeDepth(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
    99
    """Returns the scope depth for this entity.
679
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   100
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
   101
    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
   102
    """
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   103
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   104
    if not self._scope_logic:
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   105
      return 0
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   106
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   107
    depth = self._scope_logic.logic.getScopeDepth()
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   108
    return None if (depth is None) else (depth + 1)
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
   109
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   110
  def getKeyNameFromFields(self, fields):
1218
569a3fe9cb88 Cleaned up getKeyNameFromFields in Logic base.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1183
diff changeset
   111
    """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
   112
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
   113
    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
   114
    <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
   115
    """
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   116
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   117
    if not fields:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   118
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   119
432
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   120
    key_field_names = self.getKeyFieldNames()
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   121
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   122
    # 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
   123
    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
   124
      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
   125
1218
569a3fe9cb88 Cleaned up getKeyNameFromFields in Logic base.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1183
diff changeset
   126
    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
   127
      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
   128
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
   129
    # 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
   130
    keyvalues = []
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   131
    for key_field_name in key_field_names:
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   132
      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
   133
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
   134
    # 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
   135
    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
   136
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
   137
  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
   138
    """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
   139
    """
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   140
533
ba3309b2fd30 Move LINK_ID and SCOPE_PATH regular expressions to soc/models/linkable.py.
Todd Larsen <tlarsen@google.com>
parents: 512
diff changeset
   141
    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
   142
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   143
  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
   144
    """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
   145
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   146
    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
   147
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   148
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   149
      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
   150
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   151
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   152
    if not entity:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   153
      raise NoEntityError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   154
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   155
    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
   156
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   157
  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
   158
    """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
   159
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   160
    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
   161
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   162
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   163
      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
   164
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   165
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   166
    if not all( (i in fields for i in ['scope_path', 'link_id']) ):
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   167
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   168
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   169
    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
   170
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   171
  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
   172
    """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
   173
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   174
    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
   175
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   176
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
    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
   178
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   179
  def getKeySuffix(self, entity):
499
d22e4fe8e64b Fix missing dots in doc strings and some other doc string corrections.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 487
diff changeset
   180
    """Returns a suffix for the specified entity or None if no entity specified.
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   181
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   182
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   183
      entity: the entity for which to get the suffix
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   184
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   185
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   186
    if not entity:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   187
      return None
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   188
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   189
    key_values = self.getKeyValuesFromEntity(entity)
410
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   190
    suffix = '/'.join(key_values)
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   191
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   192
    return suffix
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   193
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   194
  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
   195
    """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
   196
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   197
    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
   198
    required translations/modifications performed.
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   199
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   200
    Args:
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   201
      dictionary: The arguments to massage
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   202
    """
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   203
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   204
    if not dictionary:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   205
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   206
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   207
    keys = self.getKeyFieldNames()
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   208
    values = self.getKeyValuesFromFields(dictionary)
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   209
    key_fields = dicts.zip(keys, values)
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   210
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   211
    return key_fields
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   212
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   213
  def getFromKeyName(self, key_name):
487
1a7591ff0051 Fixed a typo in soc.logic.models.base
Sverre Rabbelier <srabbelier@gmail.com>
parents: 481
diff changeset
   214
    """"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
   215
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   216
    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
   217
      key_name: key name of entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   218
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   219
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   220
    if not key_name:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   221
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   222
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   223
    return self._model.get_by_key_name(key_name)
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   224
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   225
  def getFromKeyFields(self, fields):
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   226
    """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
   227
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   228
    Args:
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   229
      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
   230
        uniquely identifies it
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   231
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   232
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   233
    if not fields:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   234
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   235
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
   236
    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
   237
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   238
    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
   239
      key_name = self.getKeyNameFromFields(key_fields)
672
c8f9281f535b Some more cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 671
diff changeset
   240
      entity = self.getFromKeyName(key_name)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   241
    else:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   242
      entity = None
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   243
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   244
    return entity
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   245
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   246
  def getFromKeyFieldsOr404(self, fields):
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   247
    """Like getFromKeyFields but expects to find an entity.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   248
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   249
    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
   250
      out_of_band.Error if no entity is found
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   251
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   252
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   253
    entity = self.getFromKeyFields(fields)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   254
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   255
    if entity:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   256
      return entity
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   257
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
   258
    format_text = ugettext('"%(key)s" is "%(value)s"')
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   259
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   260
    msg_pairs = [format_text % {'key': key, 'value': value}
1574
d185fe0f1404 Fixed a bug in getFromKeyFieldsOr404
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1573
diff changeset
   261
      for key, value in fields.iteritems()]
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   262
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   263
    joined_pairs = ' and '.join(msg_pairs)
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   264
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
   265
    msg = ugettext(
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   266
      'There is no "%(name)s" where %(pairs)s.') % {
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   267
        'name': self._name, 'pairs': joined_pairs}
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   268
592
be98a2f5d8a2 Fixed an outstanding TODO for tlarsen
Sverre Rabbelier <srabbelier@gmail.com>
parents: 565
diff changeset
   269
    raise out_of_band.Error(msg, status=404)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   270
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   271
  def getForFields(self, filter=None, unique=False, limit=1000, offset=0):
499
d22e4fe8e64b Fix missing dots in doc strings and some other doc string corrections.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 487
diff changeset
   272
    """Returns all entities that have the specified properties.
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   273
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   274
    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
   275
      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
   276
      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
   277
      limit: the amount of entities to fetch at most
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   278
      offset: the position to start at
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   279
    """
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   280
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   281
    if unique:
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   282
      limit = 1
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   283
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   284
    if filter:
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   285
      format_eq = '%(key)s = :%(num)d'
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   286
      format_in = '%(key)s IN (%(values)s)'
1179
427d2ec42823 Rewrite getForFields to use GQL instead of the Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1165
diff changeset
   287
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   288
      n = 1
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   289
      conditionals = []
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   290
      args = []
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   291
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   292
      for key, value in filter.iteritems():
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   293
        if isinstance(value, list):
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   294
          count = len(value)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   295
          args.extend(value)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   296
          values = ', '.join([':%d' % i for i in range(n, n + count)])
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   297
          sub = format_in % {'key': key, 'values': values}
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   298
          n = n + count
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   299
        else:
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   300
          sub = format_eq % {'key': key, 'num': n}
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   301
          args.append(value)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   302
          n = n + 1
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   303
        conditionals.append(sub)
723
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
   304
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   305
      joined_pairs = ' AND '.join(conditionals)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   306
      condition = 'WHERE ' + joined_pairs
1179
427d2ec42823 Rewrite getForFields to use GQL instead of the Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1165
diff changeset
   307
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   308
      q = self._model.gql(condition, *args)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   309
    else:
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   310
      q = self._model.all()
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   311
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   312
    result = q.fetch(limit, offset)
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   313
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   314
    if unique:
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   315
      return result[0] if result else None
723
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
   316
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
   317
    return result
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   318
1510
bc6dc3bb8d2a Remove _silentUpdateEntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1507
diff changeset
   319
  def updateEntityProperties(self, entity, entity_properties, silent=False):
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   320
    """Update existing entity using supplied properties.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   321
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   322
    Args:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   323
      model: a model entity
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   324
      model_properties: keyword arguments that correspond to entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   325
        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
   326
      silent: iff True does not call _onUpdate method
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   327
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   328
    Returns:
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   329
      The original entity with any supplied properties changed.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   330
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   331
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   332
    if not entity:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   333
      raise NoEntityError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   334
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   335
    if not entity_properties:
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   336
      raise InvalidArgumentError
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   337
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   338
    properties = self._model.properties()
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   339
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   340
    for name, prop in properties.iteritems():
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   341
      # if the property is not updatable or is not updated, skip it
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   342
      if name in self._skip_properties or (name not in entity_properties):
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   343
        continue
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   344
1517
a467d13e34ea Pass _updateField the entity_properties dict instead of just the value
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1516
diff changeset
   345
      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
   346
        value = entity_properties[name]
1514
4a233f5a4264 Minor cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1513
diff changeset
   347
        prop.__set__(entity, value)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   348
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   349
    entity.put()
1549
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   350
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   351
    # call the _onUpdate method
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   352
    if not silent:
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   353
      self._onUpdate(entity)
bd07b231fe39 Removed updateEntityProperties's transactionality
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1518
diff changeset
   354
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   355
    return entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   356
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   357
  def updateOrCreateFromKeyName(self, properties, key_name):
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   358
    """Update existing entity, or create new one with supplied properties.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   359
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   360
    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
   361
      properties: dict with entity properties and their values
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   362
      key_name: the key_name of the entity that uniquely identifies it
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   363
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   364
    Returns:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   365
      the entity corresponding to the key_name, with any supplied
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   366
      properties changed, or a new entity now associated with the
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   367
      supplied key_name and properties.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   368
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   369
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   370
    entity = self.getFromKeyName(key_name)
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   371
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   372
    create_entity = not entity
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   373
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   374
    if create_entity:
1518
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   375
      for property_name in properties:
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   376
        self._createField(properties, property_name)
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   377
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   378
      # entity did not exist, so create one in a transaction
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   379
      entity = self._model.get_or_insert(key_name, **properties)
1516
8df06dc877aa Do not update newly created model properties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1515
diff changeset
   380
    else:
8df06dc877aa Do not update newly created model properties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1515
diff changeset
   381
      # 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
   382
      # should not update the propties (as they 'won' the race).
8df06dc877aa Do not update newly created model properties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1515
diff changeset
   383
      entity = self.updateEntityProperties(entity, properties, silent=True)
1510
bc6dc3bb8d2a Remove _silentUpdateEntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1507
diff changeset
   384
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   385
    if create_entity:
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   386
      # a new entity has been created call _onCreate
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   387
      self._onCreate(entity)
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   388
    else:
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   389
      # the entity has been updated call _onUpdate
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   390
      self._onUpdate(entity)
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   391
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   392
    return entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   393
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   394
  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
   395
    """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
   396
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
   397
    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
   398
      entity: an existing entity in datastore
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   399
    """
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   400
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   401
    return True
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   402
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   403
  def delete(self, entity):
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   404
    """Delete existing entity from datastore.
1513
13efb916a73c Add argument validation to base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1512
diff changeset
   405
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   406
    Args:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   407
      entity: an existing entity in datastore
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   408
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   409
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   410
    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
   411
    # 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
   412
    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
   413
1518
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   414
  def _createField(self, entity_properties, name):
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   415
    """Hook called when a field is created.
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   416
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   417
    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
   418
    specified) on an entity that is being created.
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   419
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   420
    Base classes should override if any special actions need to be
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   421
    taken when a field is updated.
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   422
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   423
    Args:
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   424
      name: the name of the field to be created
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   425
      value: the value
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   426
    """
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   427
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   428
    if not entity_properties or (name not in entity_properties):
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   429
      raise InvalidArgumentError
f6f43a1675eb Add a _createField hook
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1517
diff changeset
   430
1517
a467d13e34ea Pass _updateField the entity_properties dict instead of just the value
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1516
diff changeset
   431
  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
   432
    """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
   433
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   434
    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
   435
    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
   436
    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
   437
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   438
    Args:
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   439
      entity: the unaltered entity
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   440
      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
   441
      value: the new value
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   442
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   443
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   444
    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
   445
      raise NoEntityError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   446
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   447
    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
   448
      raise InvalidArgumentError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   449
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   450
    return True
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   451
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   452
  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
   453
    """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
   454
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   455
    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
   456
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   457
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   458
    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
   459
      raise NoEntityError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   460
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   461
    sidebar.flush()
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   462
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   463
  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
   464
    """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
   465
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   466
    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
   467
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   468
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   469
    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
   470
      raise NoEntityError
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   471
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   472
  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
   473
    """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
   474
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   475
    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
   476
    """
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   477
75de65fcb017 Move the hooks in base.Logic to the bottom of the class
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1514
diff changeset
   478
    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
   479
      raise NoEntityError