app/soc/logic/models/base.py
author Lennard de Rijk <ljvderijk@gmail.com>
Sat, 21 Feb 2009 10:53:52 +0000
changeset 1421 7602d41f0ed8
parent 1308 35b75ffcbb37
child 1507 2de05960936b
permissions -rw-r--r--
Made some changes to StudentProposal. Abstract is now required and content field has been added. New is now the default status. This will be used to easily distinguish between applications that didn't have their initial ranking/scoring yet. Patch by: Lennard de Rijk Reviewed by: to-be-reviewed
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
  """
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
    42
  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
    43
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
    44
642
671dc971c3d1 Allow for extra dynamic fields for the create form
Sverre Rabbelier <srabbelier@gmail.com>
parents: 634
diff changeset
    45
class Logic(object):
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    46
  """Base logic for entity classes.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    47
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    48
  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
    49
  on arguments passed to __init__.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    50
  """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    51
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    52
  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
    53
               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
    54
    """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
    55
    """
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    56
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
    57
    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
    58
    self._base_model = base_model
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    59
    self._scope_logic = scope_logic
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    60
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
    61
    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
    62
      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
    63
    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
    64
      self._name =  self._model.__name__
655
9635cbaa2dcd Cleanups to the logic module
Sverre Rabbelier <srabbelier@gmail.com>
parents: 642
diff changeset
    65
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
    66
    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
    67
      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
    68
    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
    69
      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
    70
606
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    71
  def getModel(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
    72
    """Returns the model this logic class uses.
606
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    73
    """
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    74
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    75
    return self._model
65d35584ee31 Make forms generic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 596
diff changeset
    76
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    77
  def getScopeLogic(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
    78
    """Returns the logic of the enclosing scope.
671
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    79
    """
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    80
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    81
    return self._scope_logic
2c02178037ff Apply DI on the scope logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 669
diff changeset
    82
679
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    83
  def getScopeDepth(self):
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
    84
    """Returns the scope depth for this entity.
679
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    85
689
46db8c4bbffc Add missing dots in docstrings in modules.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 679
diff changeset
    86
    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
    87
    """
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    88
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    89
    if not self._scope_logic:
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    90
      return 0
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    91
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    92
    depth = self._scope_logic.logic.getScopeDepth()
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    93
    return None if (depth is None) else (depth + 1)
77a286ff6667 Introduce dynamic scope_path regexps
Sverre Rabbelier <srabbelier@gmail.com>
parents: 673
diff changeset
    94
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
    95
  def _updateField(self, entity, name, value):
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    96
    """Hook called when a field is updated.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    97
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    98
    Base classes should override if any special actions need to be
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
    99
    taken when a field is updated. The field is not updated if the
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   100
    method does not return a True value.
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   101
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   102
    Args:
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   103
      entity: the unaltered entity
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   104
      name: the name of the field to be changed
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   105
      value: the new value
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   106
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   107
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   108
    return True
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   109
  
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   110
  def _onCreate(self, entity):
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   111
    """Called when an entity has been created.
1106
e14b0995cf29 Flush sidebar when creating a new entity
Sverre Rabbelier <srabbelier@gmail.com>
parents: 986
diff changeset
   112
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   113
    Classes that override this can use it to do any post-creation operations.
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   114
    """
1106
e14b0995cf29 Flush sidebar when creating a new entity
Sverre Rabbelier <srabbelier@gmail.com>
parents: 986
diff changeset
   115
e14b0995cf29 Flush sidebar when creating a new entity
Sverre Rabbelier <srabbelier@gmail.com>
parents: 986
diff changeset
   116
    sidebar.flush()
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   117
  
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   118
  def _onUpdate(self, entity):
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   119
    """Called when an entity has been updated.
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   120
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   121
    Classes that override this can use it to do any post-update operations.
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   122
    """
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   123
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   124
    pass
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   125
  
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   126
  def _onDelete(self, entity):
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   127
    """Called when an entity has been deleted.
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   128
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   129
    Classes that override this can use it to do any post-deletion operations.
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   130
    """
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   131
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   132
    pass
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   133
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   134
  def getKeyNameFromFields(self, fields):
1218
569a3fe9cb88 Cleaned up getKeyNameFromFields in Logic base.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1183
diff changeset
   135
    """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
   136
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
   137
    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
   138
    <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
   139
    """
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   140
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   141
    key_field_names = self.getKeyFieldNames()
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   142
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   143
    # 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
   144
    if not all(field in fields.keys() for field in key_field_names):
447
83b49d60effd Some indention fixes and remove not needed variable in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 442
diff changeset
   145
      raise Error("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
   146
1218
569a3fe9cb88 Cleaned up getKeyNameFromFields in Logic base.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1183
diff changeset
   147
    if not all(fields.get(field) for field in key_field_names):
447
83b49d60effd Some indention fixes and remove not needed variable in soc.logic.models.base module.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 442
diff changeset
   148
      raise Error("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
   149
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
   150
    # 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
   151
    keyvalues = []
1851d67a1004 Add a generic method for getting a Keyname
Sverre Rabbelier <srabbelier@gmail.com>
parents: 429
diff changeset
   152
    for key_field_name in key_field_names:
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   153
      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
   154
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
   155
    # 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
   156
    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
   157
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
   158
  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
   159
    """Returns fully-qualified model module.class name string.
94834a1e6c01 Attempt to rename User.id to User.account, in preparation for making User be
Todd Larsen <tlarsen@google.com>
parents: 459
diff changeset
   160
    """ 
533
ba3309b2fd30 Move LINK_ID and SCOPE_PATH regular expressions to soc/models/linkable.py.
Todd Larsen <tlarsen@google.com>
parents: 512
diff changeset
   161
    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
   162
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   163
  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
   164
    """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
   165
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   166
    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
   167
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   168
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   169
      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
   170
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   171
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   172
    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
   173
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   174
  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
   175
    """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
   176
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   177
    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
   178
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   179
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   180
      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
   181
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   182
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   183
    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
   184
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   185
  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
   186
    """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
   187
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   188
    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
   189
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   190
535
9045b8888772 Refactor classes in soc/logic/models to make more use of inheritance. Add
Todd Larsen <tlarsen@google.com>
parents: 534
diff changeset
   191
    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
   192
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   193
  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
   194
    """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
   195
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   196
    Args:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   197
      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
   198
    """
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   199
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   200
    if not entity:
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   201
      return None
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   202
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   203
    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
   204
    suffix = '/'.join(key_values)
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   205
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   206
    return suffix
2af7f84f4fc7 Moved all key_name related things to the logic modules
Sverre Rabbelier <srabbelier@gmail.com>
parents: 407
diff changeset
   207
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   208
  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
   209
    """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
   210
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   211
    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
   212
    required translations/modifications performed.
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   213
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   214
    Args:
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   215
      dictionary: The arguments to massage
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   216
    """
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   217
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   218
    keys = self.getKeyFieldNames()
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   219
    values = self.getKeyValuesFromFields(dictionary)
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   220
    key_fields = dicts.zip(keys, values)
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   221
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   222
    return key_fields
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   223
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   224
  def getFromKeyName(self, key_name):
487
1a7591ff0051 Fixed a typo in soc.logic.models.base
Sverre Rabbelier <srabbelier@gmail.com>
parents: 481
diff changeset
   225
    """"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
   226
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   227
    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
   228
      key_name: key name of entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   229
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   230
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   231
    return self._model.get_by_key_name(key_name)
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   232
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   233
  def getFromKeyFields(self, fields):
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   234
    """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
   235
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   236
    Args:
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
   237
      fields: a dict containing the fields of the entity that 
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
        uniquely identifies it
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   239
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   240
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
   241
    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
   242
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   243
    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
   244
      key_name = self.getKeyNameFromFields(key_fields)
672
c8f9281f535b Some more cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 671
diff changeset
   245
      entity = self.getFromKeyName(key_name)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   246
    else:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   247
      entity = None
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
    return entity
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   250
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   251
  def getFromKeyFieldsOr404(self, fields):
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   252
    """Like getFromKeyFields but expects to find an entity.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   253
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   254
    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
   255
      out_of_band.Error if no entity is found
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   256
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   257
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
   258
    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
   259
bea3987b2040 Updated docstrings and used keyfields where necessary in soc/logic/models/base.py
Lennard de Rijk <ljvderijk@gmail.com>
parents: 1218
diff changeset
   260
    entity = self.getFromKeyFields(key_fields)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   261
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   262
    if entity:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   263
      return entity
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   264
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
   265
    format_text = ugettext('"%(key)s" is "%(value)s"')
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   266
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   267
    msg_pairs = [format_text % {'key': key, 'value': value}
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
   268
      for key, value in key_fields.iteritems()]
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   269
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   270
    joined_pairs = ' and '.join(msg_pairs)
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   271
970
8b5611d5b053 Use ugettext instead of ugettext_lazy
Sverre Rabbelier <srabbelier@gmail.com>
parents: 961
diff changeset
   272
    msg = ugettext(
402
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   273
      'There is no "%(name)s" where %(pairs)s.') % {
021e86368600 Incorperated suggestions by Todd
Sverre Rabbelier <srabbelier@gmail.com>
parents: 399
diff changeset
   274
        'name': self._name, 'pairs': joined_pairs}
396
6af084bd290c Improve the error message for getIfFields
Sverre Rabbelier <srabbelier@gmail.com>
parents: 390
diff changeset
   275
592
be98a2f5d8a2 Fixed an outstanding TODO for tlarsen
Sverre Rabbelier <srabbelier@gmail.com>
parents: 565
diff changeset
   276
    raise out_of_band.Error(msg, status=404)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   277
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   278
  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
   279
    """Returns all entities that have the specified properties.
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   280
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   281
    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
   282
      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
   283
      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
   284
      limit: the amount of entities to fetch at most
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   285
      offset: the position to start at
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   286
    """
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   287
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   288
    if unique:
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   289
      limit = 1
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   290
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   291
    if filter:
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   292
      format_eq = '%(key)s = :%(num)d'
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   293
      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
   294
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   295
      n = 1
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   296
      conditionals = []
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   297
      args = []
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   298
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   299
      for key, value in filter.iteritems():
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   300
        if isinstance(value, list):
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   301
          count = len(value)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   302
          args.extend(value)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   303
          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
   304
          sub = format_in % {'key': key, 'values': values}
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   305
          n = n + count
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   306
        else:
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   307
          sub = format_eq % {'key': key, 'num': n}
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   308
          args.append(value)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   309
          n = n + 1
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   310
        conditionals.append(sub)
723
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
   311
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   312
      joined_pairs = ' AND '.join(conditionals)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   313
      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
   314
1183
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   315
      q = self._model.gql(condition, *args)
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   316
    else:
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   317
      q = self._model.all()
03db1f6d222a Make getForFields work with no filter
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1179
diff changeset
   318
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   319
    result = q.fetch(limit, offset)
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   320
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   321
    if unique:
1165
4db62684ce13 Unify 'getForFields' and 'getForLimitAndOffset'
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1115
diff changeset
   322
      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
   323
69e5130e4a0a Make getForFields use the db.Query API
Sverre Rabbelier <srabbelier@gmail.com>
parents: 689
diff changeset
   324
    return result
433
001b981be45e Add a getForFields method
Sverre Rabbelier <srabbelier@gmail.com>
parents: 432
diff changeset
   325
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   326
  def updateEntityProperties(self, entity, entity_properties):
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   327
    """Update existing entity using supplied properties.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   328
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   329
    Args:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   330
      model: a model entity
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   331
      model_properties: keyword arguments that correspond to entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   332
        properties and their values
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   333
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   334
    Returns:
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   335
      The original entity with any supplied properties changed.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   336
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   337
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   338
    def update():
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   339
      return self._unsafeUpdateEntityProperties(entity, entity_properties)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   340
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   341
    entity = db.run_in_transaction(update)
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   342
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   343
    # call the _onUpdate method
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   344
    self._onUpdate(entity)
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   345
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   346
    return entity
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   347
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   348
  def _silentUpdateEntityProperties(self, entity, entity_properties):
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   349
    """See _unsafeUpdateEntityProperties.
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   350
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   351
    Does not call _onUpdate.
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   352
    """
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   353
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   354
    def update():
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   355
      return self._unsafeUpdateEntityProperties(entity, entity_properties)
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   356
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   357
    return db.run_in_transaction(update)
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   358
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   359
  def _unsafeUpdateEntityProperties(self, entity, entity_properties):
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   360
    """See updateEntityProperties.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   361
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   362
    Like updateEntityProperties(), but not run within a transaction.
308
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
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   365
    properties = entity.properties()
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   366
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   367
    for prop in properties.values():
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   368
      name = prop.name
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   369
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   370
      if not name in self._skip_properties and name in entity_properties:
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   371
        value = entity_properties[prop.name]
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   372
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   373
        if self._updateField(entity, name, value):
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   374
          prop.__set__(entity, value)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   375
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   376
    entity.put()
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   377
    return entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   378
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   379
  def updateOrCreateFromKeyName(self, properties, key_name):
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   380
    """Update existing entity, or create new one with supplied properties.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   381
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   382
    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
   383
      properties: dict with entity properties and their values
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   384
      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
   385
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   386
    Returns:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   387
      the entity corresponding to the key_name, with any supplied
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   388
      properties changed, or a new entity now associated with the
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   389
      supplied key_name and properties.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   390
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   391
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   392
    entity = self.getFromKeyName(key_name)
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   393
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   394
    create_entity = not entity
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   395
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   396
    if create_entity:
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   397
      # entity did not exist, so create one in a transaction
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   398
      entity = self._model.get_or_insert(key_name, **properties)
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   399
      
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   400
    
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   401
    # there is no way to be sure if get_or_insert() returned a new entity or
354
b931c74abbee Fix mistakes in docs and comments in logic/models/base.py.
Pawel Solyga <Pawel.Solyga@gmail.com>
parents: 317
diff changeset
   402
    # got an existing one due to a race, so update with properties anyway,
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   403
    # in a transaction
986
e9611a2288ca Rename ModelProperties to EntityProperties
Sverre Rabbelier <srabbelier@gmail.com>
parents: 970
diff changeset
   404
    entity = self._silentUpdateEntityProperties(entity, properties)
608
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   405
    
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   406
    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
   407
      # 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
   408
      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
   409
    else:
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   410
      # 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
   411
      self._onUpdate(entity)
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   412
      
77bffba4e946 Added _onCreate _onUpdate and _onDelete methods to logic/models/base.py.
Lennard de Rijk <ljvderijk@gmail.com>
parents: 606
diff changeset
   413
    return entity
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   414
435
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   415
  def updateOrCreateFromFields(self, properties, fields):
829fe8302a8b Refactor out the abundance of dictionary (un)packing
Sverre Rabbelier <srabbelier@gmail.com>
parents: 433
diff changeset
   416
    """Like updateOrCreateFromKeyName, but resolves fields to a key_name first.
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   417
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   418
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   419
    # attempt to retrieve the existing entity
1115
0a723ff3d27c Cleanups in base.Logic
Sverre Rabbelier <srabbelier@gmail.com>
parents: 1106
diff changeset
   420
    key_name  = self.getKeyNameFromFields(fields)
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   421
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   422
    return self.updateOrCreateFromKeyName(properties, key_name)
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   423
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   424
  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
   425
    """Returns whether the specified entity can be deleted.
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
   426
    
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
   427
    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
   428
      entity: an existing entity in datastore
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   429
    """
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
   430
    
363
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   431
    return True
d35ffa6ca643 Add a framework for generic views
Sverre Rabbelier <srabbelier@gmail.com>
parents: 354
diff changeset
   432
308
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   433
  def delete(self, entity):
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   434
    """Delete existing entity from datastore.
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   435
    
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   436
    Args:
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   437
      entity: an existing entity in datastore
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   438
    """
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   439
740090cd17c9 Added invididual model logic files
Sverre Rabbelier <srabbelier@gmail.com>
parents:
diff changeset
   440
    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
   441
    # 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
   442
    self._onDelete(entity)