app/soc/logic/sponsor.py
author Todd Larsen <tlarsen@google.com>
Sat, 04 Oct 2008 07:17:00 +0000
changeset 282 600e0a9bfa06
parent 263 9b39d93b677f
child 286 d4cf44962f50
permissions -rw-r--r--
A site layout ("site map") of the web application, including URL regular expression patterns, Django views, and metadata for constructing sidebar menus and (eventually) breadcrumbs. One function, soc.logic.site.map.getDjangoUrlPatterns(), converts these details into urlpatterns for use by Django. Patch by: Todd Larsen Review by: to-be-reviewed

#!/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)