app/soc/modules/core.py
changeset 2954 9ea3b04d929c
parent 2909 81eaf0a9101f
child 2955 b799af27440e
equal deleted inserted replaced
2953:3c024d61290c 2954:9ea3b04d929c
   133     if not callable(func):
   133     if not callable(func):
   134       return False
   134       return False
   135 
   135 
   136     return func
   136     return func
   137 
   137 
   138   ##
       
   139   ## Core code
       
   140   ##
       
   141 
       
   142   def startNewRequest(self, request):
       
   143     """Prepares core to handle a new request.
       
   144 
       
   145     Args:
       
   146       request: a Django HttpRequest object
       
   147     """
       
   148 
       
   149     self.in_request = True
       
   150     self.per_request_value = {}
       
   151     self.setRequestValue('request', request)
       
   152 
       
   153   def endRequest(self, request, optional):
       
   154     """Performs cleanup after current request.
       
   155 
       
   156     Args:
       
   157       request: a Django HttpRequest object
       
   158       optional: whether to noop when not in a request
       
   159     """
       
   160 
       
   161     # already cleaned up, as expected
       
   162     if optional and not self.in_request:
       
   163       return
       
   164 
       
   165     old_request = self.getRequestValue('request')
       
   166     self.per_request_value = {}
       
   167     self.in_request = False
       
   168 
       
   169     if id(old_request) != id(request):
       
   170       logging.error("ending request: \n'%s'\n != \n'%s'\n" % (
       
   171           old_request, request))
       
   172 
       
   173   def getRequestValue(self, key, default=None):
       
   174     """Gets a per-request value.
       
   175 
       
   176     Args:
       
   177       key: the key of the to be retrieved value
       
   178       default: the default value (returned if no value is set)
       
   179     """
       
   180 
       
   181     assert self.in_request
       
   182     return self.per_request_value.get(key, default)
       
   183 
       
   184   def setRequestValue(self, key, value):
       
   185     """Sets a per-request value.
       
   186 
       
   187     Args:
       
   188       key: the key of the to be set value
       
   189       value: the value that should be set
       
   190     """
       
   191 
       
   192     assert self.in_request
       
   193     self.per_request_value[key] = value
       
   194 
       
   195   def getPatterns(self):
       
   196     """Returns the Django patterns for this site.
       
   197     """
       
   198 
       
   199     self.callService('registerWithSitemap', True)
       
   200     return defaults.patterns(None, *self.sitemap)
       
   201 
       
   202   @soc.cache.sidebar.cache
       
   203   def getSidebar(self, id, user):
       
   204     """Constructs a sidebar for the current user.
       
   205     """
       
   206 
       
   207     self.callService('registerWithSidebar', True)
       
   208 
       
   209     sidebar = []
       
   210 
       
   211     for i in self.sidebar:
       
   212       menus = i(id, user)
       
   213 
       
   214       for menu in (menus if menus else []):
       
   215         sidebar.append(menu)
       
   216 
       
   217     return sorted(sidebar, key=lambda x: x.get('group'))
       
   218 
       
   219   def callService(self, service, unique, *args, **kwargs):
   138   def callService(self, service, unique, *args, **kwargs):
   220     """Calls the specified service on all callbacks.
   139     """Calls the specified service on all callbacks.
   221     """
   140     """
   222 
   141 
   223     if unique and (service in self.services):
   142     if unique and (service in self.services):
   234       results.append(result)
   153       results.append(result)
   235 
   154 
   236     self.services.append(service)
   155     self.services.append(service)
   237     return results
   156     return results
   238 
   157 
       
   158   ##
       
   159   ## Core code
       
   160   ##
       
   161 
       
   162   def getRequestValue(self, key, default=None):
       
   163     """Gets a per-request value.
       
   164 
       
   165     Args:
       
   166       key: the key of the to be retrieved value
       
   167       default: the default value (returned if no value is set)
       
   168     """
       
   169 
       
   170     assert self.in_request
       
   171     return self.per_request_value.get(key, default)
       
   172 
       
   173   def setRequestValue(self, key, value):
       
   174     """Sets a per-request value.
       
   175 
       
   176     Args:
       
   177       key: the key of the to be set value
       
   178       value: the value that should be set
       
   179     """
       
   180 
       
   181     assert self.in_request
       
   182     self.per_request_value[key] = value
       
   183 
       
   184   def getPatterns(self):
       
   185     """Returns the Django patterns for this site.
       
   186     """
       
   187 
       
   188     self.callService('registerWithSitemap', True)
       
   189     return defaults.patterns(None, *self.sitemap)
       
   190 
       
   191   @soc.cache.sidebar.cache
       
   192   def getSidebar(self, id, user):
       
   193     """Constructs a sidebar for the current user.
       
   194     """
       
   195 
       
   196     self.callService('registerWithSidebar', True)
       
   197 
       
   198     sidebar = []
       
   199 
       
   200     for i in self.sidebar:
       
   201       menus = i(id, user)
       
   202 
       
   203       for menu in (menus if menus else []):
       
   204         sidebar.append(menu)
       
   205 
       
   206     return sorted(sidebar, key=lambda x: x.get('group'))
       
   207 
       
   208   ###
       
   209   ### Core control code
       
   210   ###
       
   211   ### Called by other setup code to get the Core in a desired state.
       
   212   ###
       
   213 
       
   214   def startNewRequest(self, request):
       
   215     """Prepares core to handle a new request.
       
   216 
       
   217     Args:
       
   218       request: a Django HttpRequest object
       
   219     """
       
   220 
       
   221     self.in_request = True
       
   222     self.per_request_value = {}
       
   223     self.setRequestValue('request', request)
       
   224 
       
   225   def endRequest(self, request, optional):
       
   226     """Performs cleanup after current request.
       
   227 
       
   228     Args:
       
   229       request: a Django HttpRequest object
       
   230       optional: whether to noop when not in a request
       
   231     """
       
   232 
       
   233     # already cleaned up, as expected
       
   234     if optional and not self.in_request:
       
   235       return
       
   236 
       
   237     old_request = self.getRequestValue('request')
       
   238     self.per_request_value = {}
       
   239     self.in_request = False
       
   240 
       
   241     if id(old_request) != id(request):
       
   242       logging.error("ending request: \n'%s'\n != \n'%s'\n" % (
       
   243           old_request, request))
       
   244 
   239   def registerModuleCallbacks(self):
   245   def registerModuleCallbacks(self):
   240     """Retrieves all callbacks for the modules of this site.
   246     """Retrieves all callbacks for the modules of this site.
   241 
   247 
   242     Callbacks for modules without a version number or the wrong API_VERSION
   248     Callbacks for modules without a version number or the wrong API_VERSION
   243     number are dropped.  They won't be called.
   249     number are dropped.  They won't be called.