old_contents: #!/usr/bin/python2.5
  #
  # Copyright 2009 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.
  
  """The module conversion updates are defined in this module.
  """
  
  __authors__ = [
    '"Lennard de Rijk" <ljvderijk@gmail.com>',
    ]
  
  
  from google.appengine.api.labs import taskqueue
  from google.appengine.ext import db
  
  from django.http import HttpResponse
  
  from soc.tasks.helper import error_handler
  
  
  # batch size to use when going through the entities
  DEF_BATCH_SIZE = 10
  
  
  def startUpdateWithUrl(request, task_url):
    """Spawns an update task for the given task URL.
  
    Args:
      request: Django Request object
      task_url: The URL used to run this update task
  
    Returns:
      True iff the new task is successfully added to the Task Queue API
    """
  
    new_task = taskqueue.Task(url=task_url)
    new_task.add()
  
    return True
  
  
  def runProgramConversionUpdate(request, *args, **kwargs):
    """Appengine Task that converts Programs into GSoCPrograms.
  
    The POST dict can contain the key where to start the conversion.
  
    Args:
      request: Django Request object
    """
  
    from soc.logic.models.program import logic as program_logic
  
    from soc.modules.gsoc.models.program import GSoCProgram
  
    fields = {}
  
    post_dict = request.POST
  
    start_key = post_dict.get('start_key')
  
    if start_key:
      # retrieve the last Program entity that was converted
      start = program_logic.getFromKeyName(start_key)
  
      if not start:
        # invalid starting key specified, log and return OK
        return error_handler.logErrorAndReturnOK(
            'Invalid Program Key specified: %s' %(start_key))
  
      fields['__key__ >'] = start.key()
  
    # get batch_size number of Programs
    entities = program_logic.getForFields(fields, limit=DEF_BATCH_SIZE)
  
    # get all the properties that are part of each Programs
    program_model = program_logic.getModel()
    program_properties = program_model.properties().keys()
  
    # use this to store all the new GSoCPrograms
    gsoc_programs = []
  
    for entity in entities:
      gsoc_properties = {}
  
      for program_property in program_properties:
        # copy over all the information from the program entity
        gsoc_properties[program_property] = getattr(entity, program_property)
  
      # create the new GSoCProgram entity and prepare it to be stored
      gsoc_program_entity = GSoCProgram(key_name=entity.key().name(), **gsoc_properties)
      gsoc_programs.append(gsoc_program_entity)
  
      # store all the new GSoCPrograms
      db.put(gsoc_programs)
  
    if len(entities) == DEF_BATCH_SIZE:
      # spawn new task starting from the last
      new_start = entities[DEF_BATCH_SIZE-1].key().id_or_name()
  
      # pass along these params as POST to the new task
      task_params = {'start_key': new_start}
  
      new_task = taskqueue.Task(params=task_params,
                                url=request.META['PATH_INFO'])
      new_task.add()
  
    # task completed, return OK
    return HttpResponse('OK')
  
new_contents: #!/usr/bin/python2.5
  #
  # Copyright 2009 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.
  
  """The module conversion updates are defined in this module.
  """
  
  __authors__ = [
    '"Lennard de Rijk" <ljvderijk@gmail.com>',
    ]
  
  
  from google.appengine.api.labs import taskqueue
  from google.appengine.ext import db
  
  from django.http import HttpResponse
  
  from soc.logic.models.program import logic as program_logic
  from soc.tasks.helper import decorators
  from soc.tasks.helper import error_handler
  
  
  # batch size to use when going through the entities
  DEF_BATCH_SIZE = 10
  
  
  def startUpdateWithUrl(request, task_url):
    """Spawns an update task for the given task URL.
  
    Args:
      request: Django Request object
      task_url: The URL used to run this update task
  
    Returns:
      True iff the new task is successfully added to the Task Queue API
    """
  
    new_task = taskqueue.Task(url=task_url)
    new_task.add()
  
    return True
  
  
  
  @decorators.iterative_task(program_logic)
  def runProgramConversionUpdate(request, entities, context, *args, **kwargs):
    """Appengine Task that converts Programs into GSoCPrograms.
  
    Args:
      request: Django Request object
      entities: list of Program entities to convert
      context: the context of this task
    """
  
    from soc.modules.gsoc.models.program import GSoCProgram
  
    # get all the properties that are part of each Programs
    program_model = program_logic.getModel()
    program_properties = program_model.properties().keys()
  
    # use this to store all the new GSoCPrograms
    gsoc_programs = []
  
    for entity in entities:
      gsoc_properties = {}
  
      for program_property in program_properties:
        # copy over all the information from the program entity
        gsoc_properties[program_property] = getattr(entity, program_property)
  
      # create the new GSoCProgram entity and prepare it to be stored
      gsoc_program_entity = GSoCProgram(key_name=entity.key().name(), **gsoc_properties)
      gsoc_programs.append(gsoc_program_entity)
  
      # store all the new GSoCPrograms
      db.put(gsoc_programs)
  
    # task completed, return
    return
  
subject: Use the iterative task iterator for the ProgramConversion update.