app/soc/logic/sponsor.py
author Todd Larsen <tlarsen@google.com>
Fri, 03 Oct 2008 01:32:34 +0000
changeset 263 9b39d93b677f
parent 258 12f4f7d16fac
child 286 d4cf44962f50
permissions -rw-r--r--
Make findNearestUsers() code in soc/logic/site/id_user.py more generic and move it to soc/logic/model.py. Orginal findNearest...() functions in id_user.py are now convenience wrappers. Add typed-query string construction functions to model.py. Move getFulLClassName() from key_name.py model.py, since it has more to do with Model types than key names. Swap 'offset' and 'limit' and make 'limit' arguments non-optional. Also, stop adding 1 inside the ...ForLimitAndOffset() functions and make the callers do it (since it was being added for a very UI-specific reason of whether or not to display a "Next>" link). Patch by: Todd Larsen Review by: Pawel Solyga Review URL: http://codereviews.googleopensourceprograms.com/1401

#!/usr/bin/python2.5
#
# Copyright 2008 the Melange authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Sponsor (Model) query functions.
"""

__authors__ = [
  '"Pawel Solyga" <pawel.solyga@gmail.com>',
  ]


from soc.logic import key_name
from soc.logic import out_of_band

import soc.models.sponsor
import soc.logic.model


def doesLinkNameExist(link_name=None):
  """Returns True if link name exists in the Datastore.

  Args:
    link_name: link name used in URLs to identify Sponsor
  """
  if getSponsorFromLinkName(link_name):
    return True
  else:
    return False


def getSponsorFromLinkName(link_name):
  """Returns Sponsor entity for a given link name, or None if not found.  
    
  Args:
    link_name: a link name of the Sponsor that uniquely identifies it
  """
  # lookup by Sponsor key name
  sponsor_key_name = getSponsorKeyNameForLinkName(link_name)
  
  if key_name:
    sponsor = soc.models.sponsor.Sponsor.get_by_key_name(sponsor_key_name)
  else:
    sponsor = None
  
  return sponsor


def getSponsorIfLinkName(link_name=None):
  """Returns Sponsor entity for supplied link name if one exists.

  Args:
    link_name: a link name of the Sponsor that uniquely identifies it

  Returns:
    * None if link name is false.
    * Sponsor entity for supplied linkname

  Raises:
    out_of_band.ErrorResponse if link name is not false, but no Sponsor entity
    with the supplied link name exists in the Datastore
  """
  if not link_name:
    # exit without error, to let view know that link_name was not supplied
    return None

  linkname_sponsor = getSponsorFromLinkName(link_name=link_name)

  if linkname_sponsor:
    # a Sponsor exist for this linkname, so return that Sponsor entity
    return linkname_sponsor

  # else: a linkname was supplied, but there is no Sponsor that has it
  raise out_of_band.ErrorResponse(
      'There is no sponsor with a "link name" of "%s".' % link_name, status=404)


def getSponsorKeyNameForLinkName(link_name):
  """Return a Datastore key_name for a Sponsor from the link name.
  
  Args:
    link_name: a link name of the Sponsor that uniquely identifies it
  """
  if not link_name:
    return None

  return key_name.nameSponsor(link_name)


def getSponsorsForLimitAndOffset(limit, offset=0):
  """Returns Sponsors entities for given offset and limit or None if not found.

  Args:
    limit: max amount of entities to return
    offset: optional offset in entities list which defines first entity to
      return; default is zero (first entity)
  """
  query = soc.models.sponsor.Sponsor.all()
  return query.fetch(limit, offset)


def updateOrCreateSponsorFromLinkName(sponsor_link_name, **sponsor_properties):
  """Update existing Sponsor entity, or create new one with supplied properties.

  Args:
    sponsor_name: a linkname of the Sponsor that uniquely identifies it
    **sponsor_properties: keyword arguments that correspond to Sponsor entity
      properties and their values

  Returns:
    the Sponsor entity corresponding to the path, with any supplied
    properties changed, or a new Sponsor entity now associated with the 
    supplied path and properties.
  """
  # attempt to retrieve the existing Sponsor
  sponsor = getSponsorFromLinkName(sponsor_link_name)

  if not sponsor:
    # sponsor did not exist, so create one in a transaction
    sponsor_key_name = getSponsorKeyNameForLinkName(sponsor_link_name)
    sponsor = soc.models.sponsor.Sponsor.get_or_insert(
      sponsor_key_name, **sponsor_properties)

  # there is no way to be sure if get_or_insert() returned a new Sponsor or
  # got an existing one due to a race, so update with sponsor_properties anyway,
  # in a transaction
  return soc.logic.model.updateModelProperties(sponsor, **sponsor_properties)