diff --git a/src/yard/api.py b/src/yard/api.py index 241207f..b66cd6c 100644 --- a/src/yard/api.py +++ b/src/yard/api.py @@ -48,13 +48,10 @@ def build_collection_pattern(): path = r'%s%s/?$' %(self.__path, resource_path) return build_pattern(path, self.__collection_routes, name) - self.__urlpatterns.append( single_pattern() ) - self.__urlpatterns.append( collection_pattern() ) - - #if has_any( resource_class, self.__single_routes ): - # self.__urlpatterns.append( build_single_pattern() ) - #if has_any( resource_class, self.__collection_routes ): - # self.__urlpatterns.append( build_collection_pattern() ) + if has_any( resource_class, self.__single_routes ): + self.__urlpatterns.append( build_single_pattern() ) + if has_any( resource_class, self.__collection_routes ): + self.__urlpatterns.append( build_collection_pattern() ) if hasattr(resource_class, 'model'): self.__mapping[ resource_class.model ] = resource_class diff --git a/src/yard/resources/__init__.py b/src/yard/resources/__init__.py index 3480f97..d7d9017 100644 --- a/src/yard/resources/__init__.py +++ b/src/yard/resources/__init__.py @@ -24,7 +24,7 @@ class Meta(object): class Pagination(object): pass - def __init__(self, api, routes): + def __init__(self, api, routes): self._api = api self.__routes = routes # maps http methods with respective views self.__meta = ResourceMeta( self.Meta ) @@ -33,15 +33,23 @@ def __init__(self, api, routes): self.fields = self.__get_fields() self.index_fields = getattr(self, "index_fields", self.fields) self.show_fields = getattr(self, "show_fields", self.fields) - self.description = getattr(self, "description", "not provided") + self.description = getattr(self, "description", "not provided") + self.__allowed_methods = [k for k,v in self.__routes.items() if hasattr(self, v)] + self.__builders = self.__create_json_builders() self.__meta.page_class = self.__pagination #TEMPORARY - + def __get_fields(self): if hasattr(self, "fields"): return self.fields elif not hasattr(self, "model"): return {} return model_to_fields(self.model) + + def __create_json_builders(self): + return { + id(i): JSONbuilder(self._api, i) + for i in [self.index_fields, self.show_fields, self.fields] if not callable(i) + } def __call__(self, request, **parameters): ''' @@ -77,12 +85,12 @@ def __resource_parameters(self, request, parameters): for i in self.__parameters.get( request ): resource_params.update( i ) return resource_params - + def __get_builder(self, fields, parameters): if callable(fields): current_fields = fields(parameters) return JSONbuilder( self._api, current_fields ), current_fields - return JSONbuilder( self._api, fields ), fields + return self.__builders[ id(fields) ], fields def __handle_response(self, request, response, current_fields, resource_parameters, builder): ''' @@ -146,7 +154,7 @@ def __serialize_all(self, resources, builder): return [builder.to_json(i) for i in resources] def serialize_all(self, resources, fields): - builder = JSONbuilder( self._api, fields ) + builder = self.__builders.get( id(fields) ) or JSONbuilder(self._api, fields) return self.__serialize_all( resources, builder ) def __serialize(self, resource, builder): @@ -156,7 +164,7 @@ def __serialize(self, resource, builder): return builder.to_json(resource) def serialize(self, resource, fields): - builder = JSONbuilder( self._api, fields ) + builder = self.__builders.get( id(fields) ) or JSONbuilder(self._api, fields) return self.__serialize( resource, builder ) # @@ -199,8 +207,8 @@ def handle_options(self, request, parameters): response = self.options(request, **parameters) builder, fields = self.__get_builder(self.fields, parameters) response = self.__handle_response(request, response, fields, parameters, builder) - response['Allow'] = ','.join([k for k,v in self.__routes.items() if hasattr(self, v)]) + response['Allow'] = self.__allowed_methods return response - + def options(self, request, **parameters): - return 200 + return 404 if len(self.__allowed_methods) <= 1 else 200