diff -r 24db4afbc82e -r 5931e6d6056f app/soc/tasks/helper/decorators.py --- a/app/soc/tasks/helper/decorators.py Wed Sep 30 21:10:36 2009 +0200 +++ b/app/soc/tasks/helper/decorators.py Wed Sep 30 21:26:50 2009 +0200 @@ -27,6 +27,8 @@ from functools import wraps +from google.appengine.ext import db + from soc.tasks import responses as task_responses @@ -51,72 +53,68 @@ return wrapper -def iterative_task(func): +def iterative_task(logic, **task_default): """Iterative wrapper method + + Args: + logic: the Logic instance to get entities for + task_default: keyword arguments which can contain the following options: + fields: dictionary to filter the entities on + start_key: the default key where to start this iterative task """ - @wraps(func) - def wrapper(request, *args, **kwargs): - """Decorator wrapper method + def wrapper(func): + def iterative_wrapped(request, *args, **kwargs): + """Decorator wrapper method - Params usage: - logic: name of the logic for the data model to iterate through - filter: a dict for the properties that the entities should have - order: a list with the sort order - json: json object with additional parameters + Args: + request: Django HTTP Request object - Returns: - Standard http django response - """ - - post_dict = request.POST + request.POST usage: + fields: a JSON dict for the properties that the entities should have. + This updates values from the task_default entry. + start_key: the key of the next entity to fetch - if 'logic' not in post_dict: - return task_responses.terminateTask() - - _temp = __import__(post_dict['logic'], globals(), locals(), ['logic'], -1) - logic = _temp.logic + Returns: + Standard HTTP Django response + """ - filter = None - if 'filter' in post_dict: - filter = simplejson.loads(post_dict['filter']) + post_dict = request.POST - order = None - if 'order' in post_dict: - order = simplejson.loads(post_dict['order']) - - start_key = None - if 'start_key' in post_dict: - start_key = db.Key(post_dict['start_key']) + fields = task_default.get('fields', {}) + if 'fields' in post_dict: + fields.update(simplejson.loads(post_dict['fields'])) - json = None - if 'json' in post_dict: - json = post_dict['json'] - - entities, next_start_key = logic.getBatchOfData(filter, order, start_key) + start_key = task_default.get('start_key', None) + if 'start_key' in post_dict: + # get the key where to start this iteration + start_key = post_dict['start_key'] + if start_key: + start_key = db.Key(start_key) - try: - new_json = func(request, entities=entities, json=json, *args, **kwargs) - except task_responses.FatalTaskError, error: - logging.error(error) - return task_responses.terminateTask() - except Exception, exception: - logging.error(exception) - return task_responses.repeatTask() + # get the entities for this iteration + entities, next_start_key = logic.getBatchOfData(filter=fields, + start_key=start_key) - if next_start_key: + # copy the post_dict so that the wrapped function can edit what it needs context = post_dict.copy() - if 'json' in context: - del context['json'] - - context.update({'start_key': next_start_key}) + try: + func(request, entities=entities, context=context, *args, **kwargs) + except task_responses.FatalTaskError, error: + logging.error(error) + return task_responses.terminateTask() + except Exception, exception: + logging.error(exception) + return task_responses.repeatTask() - if new_json is not None: - context.update({'json': new_json}) + if next_start_key: + # set the key to use for the next iteration + context.update({'start_key': next_start_key}) - task_responses.startTask(url=request.path, context=context) + task_responses.startTask(url=request.path, context=context) - return task_responses.terminateTask() + return task_responses.terminateTask() - return wrapper \ No newline at end of file + return iterative_wrapped + return wrapper