app/soc/views/helper/decorators.py
changeset 2982 eeee8c854438
parent 2904 395cff83dc83
child 2984 2b7ea1f2629a
equal deleted inserted replaced
2981:8a99de852dc2 2982:eeee8c854438
    29 
    29 
    30 from django import http
    30 from django import http
    31 from django.utils.translation import ugettext
    31 from django.utils.translation import ugettext
    32 
    32 
    33 from soc.logic import dicts
    33 from soc.logic import dicts
       
    34 from soc.logic import tasks
    34 from soc.views.helper import responses
    35 from soc.views.helper import responses
    35 
    36 
    36 
    37 
    37 class Error(Exception):
    38 class Error(Exception):
    38   """Base class for all exceptions raised by this module.
    39   """Base class for all exceptions raised by this module.
   114     except out_of_band.Error, error:
   115     except out_of_band.Error, error:
   115       return helper.responses.errorResponse(error, request)
   116       return helper.responses.errorResponse(error, request)
   116     return func(self, request, access_type, *args, **kwargs)
   117     return func(self, request, access_type, *args, **kwargs)
   117 
   118 
   118   return wrapper
   119   return wrapper
       
   120 
       
   121 
       
   122 def task(func):
       
   123   """Task decorator wrapper method
       
   124   """
       
   125 
       
   126   @wraps(func)
       
   127   def wrapper(request, *args, **kwargs):
       
   128     """Decorator wrapper method
       
   129     """
       
   130 
       
   131     try:
       
   132       return func(request, *args, **kwargs)
       
   133     except tasks.FatalTaskError, error:
       
   134       logging.exception(error)
       
   135       return tasks.terminateTask()
       
   136     except Exception, exception:
       
   137       logging.exception(exception)
       
   138       return tasks.repeatTask()
       
   139 
       
   140   return wrapper
       
   141 
       
   142 
       
   143 def iterative_task(func):
       
   144   """Iterative wrapper method
       
   145   """
       
   146 
       
   147   @wraps(func)
       
   148   def wrapper(request, *args, **kwargs):
       
   149     """Decorator wrapper method
       
   150 
       
   151     Params usage:
       
   152       logic: name of the logic for the data model to iterate through
       
   153       filter: a dict for the properties that the entities should have
       
   154       order: a list with the sort order
       
   155       json: json object with additional parameters
       
   156 
       
   157     Returns:
       
   158       Standard http django response
       
   159     """
       
   160 
       
   161     post_dict = request.POST
       
   162 
       
   163     if 'logic' not in post_dict:
       
   164        return tasks.terminateTask()
       
   165 
       
   166     _temp = __import__(post_dict['logic'], globals(), locals(), ['logic'], -1)
       
   167     logic = _temp.logic
       
   168 
       
   169     filter = None
       
   170     if 'filter' in post_dict:
       
   171       filter = simplejson.loads(post_dict['filter'])
       
   172 
       
   173     order = None
       
   174     if 'order' in post_dict:
       
   175       order = simplejson.loads(post_dict['order'])
       
   176 
       
   177     start_key = None
       
   178     if 'next_key' in post_dict:
       
   179       start_key = db.Key(post_dict['start_key'])
       
   180 
       
   181     json = None
       
   182     if 'json' in post_dict:
       
   183       json = post_dict['json']
       
   184 
       
   185     entities, start_key = logic.getBatchOfData(filter, order, start_key)
       
   186 
       
   187     try:
       
   188       new_json = func(request, entities=entities, json=json, *args, **kwargs)
       
   189     except tasks.FatalTaskError, error:
       
   190       logging.error(error)
       
   191       return tasks.terminateTask()
       
   192     except Exception, exception:
       
   193       logging.error(exception)
       
   194       return tasks.repeatTask()
       
   195 
       
   196     if start_key is None:
       
   197       logging.debug('Task sucessfully completed')
       
   198     else:
       
   199       context = post_dict.copy()
       
   200 
       
   201       if 'json' in context:
       
   202         del context['json']
       
   203 
       
   204       context.update({'start_key': start_key})
       
   205 
       
   206       if new_json is not None:
       
   207         context.update({'json': new_json})
       
   208 
       
   209       tasks.startTask(url=request.path, context=context)
       
   210 
       
   211     return tasks.terminateTask()
       
   212 
       
   213   return wrapper