class EmployeeRouter(DefaultRouter): """ A router for manage APIs. """ routes = [ Route(url=r'^{prefix}/*$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', initkwargs={'suffix': 'List'}), Route(url=r'^{prefix}/{lookup}$', mapping={ 'get': 'retrieve', 'delete': 'destroy', 'put': 'update' }, name='{basename}-detail', initkwargs={'suffix': 'Detail'}) # , # DynamicDetailRoute( # url=r'^{prefix}/{lookup}/{methodnamehyphen}$', # name='{basename}-{methodnamehyphen}', # initkwargs={} # ) ]
class CreateDeleteRouter(SimpleRouter): """ A router for create / delete APIs """ routes = [ # Create route. Route(url=r'^{prefix}{trailing_slash}$', mapping={'post': 'create'}, name='{basename}-link', initkwargs={'suffix': 'Create'}), # Dynamically generated list routes. DynamicListRoute(url=r'^{prefix}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), # Delete route Route(url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={'delete': 'destroy'}, name='{basename}-unlink', initkwargs={'suffix': 'Instance'}), # Dynamically generated detail routes. DynamicDetailRoute( url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), ]
class SubRouter(SimpleRouter): """ Like SimpleRouter, but with the lookup before the prefix, so that it can be easily used for sub-actions that are children of a main router. This is a convenient way of linking one or more viewsets to a parent one without having to set multiple @action and @link manually. """ routes = [ # List route. Route(url=r'^{lookup}/{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', initkwargs={'suffix': 'List'}), # Detail route. Route(url=r'^{lookup}/{prefix}{trailing_slash}$', mapping={ 'get': 'retrieve', 'put': 'update', 'post': 'detail_post', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', initkwargs={'suffix': 'Instance'}) ]
class CustomSimpleRouter(SimpleRouter): routes = [ # List route Route( url=r"^{prefix}{trailing_slash}$", mapping={ "get": "list", "post": "create", "put": "bulk_update", # "delete": "destroy", }, name="{basename}-list", detail=False, initkwargs={"suffix": "List"}, ), # Detail route Route( url=r"^{prefix}/{lookup}{trailing_slash}$", mapping={ "get": "retrieve", "put": "update", "patch": "partial_update", "delete": "destroy", }, name="{basename}-detail", detail=False, initkwargs={"suffix": "Instance"}, ), ]
class CustomRouter(DefaultRouter): routes = [ # List route. Route(url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), # Dynamically generated list routes. Generated using # @action(detail=False) decorator on methods of the viewset. DynamicRoute(url=r'^{prefix}/{url_path}{trailing_slash}$', name='{basename}-{url_name}', detail=False, initkwargs={}), # Detail route. Route(url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ 'get': 'retrieve', 'put': 'partial_update', 'post': 'update', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Instance'}), # Dynamically generated detail routes. Generated using # @action(detail=True) decorator on methods of the viewset. DynamicRoute(url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$', name='{basename}-{url_name}', detail=True, initkwargs={}), ]
class SearchRouter(DefaultRouter): routes = [ Route( url=r'^{prefix}$', mapping={'get': 'list'}, name='{basename}-list', initkwargs={'suffix': 'List'} ), Route( url=r'^{prefix}/{lookup}$', mapping={'get': 'retrieve'}, name='{basename}-detail', initkwargs={'suffix': 'Detail'} ), DynamicDetailRoute( url=r'^{prefix}/{methodname}/(?P<query_term>[^/.]+)/$', name='{basename}-{methodname}', initkwargs={} ), DynamicListRoute( url=r'^{prefix}/{methodname}/$', name='{basename}-{methodname}', initkwargs={} ) ]
class HireServiceRouter(routers.SimpleRouter): routes = [ Route(url=r'^{prefix}/$', mapping={ 'get': 'list', 'post': 'create', 'put': 'bulk_update' }, name='{basename}-list', initkwargs={'suffix': 'List'}), Route(url=r'^{prefix}/{lookup}/$', mapping={ 'put': 'update', 'patch': 'partial_update', 'delete': 'delete', 'get': 'retrieve' }, name='{basename}-detail', initkwargs={'suffix': 'Detail'}), Route(url=r'^{prefix}/{lookup}/cancelability/$', mapping={'get': 'cancelability'}, name='{basename}-service-cancelability', initkwargs={'suffix': 'Cancelability'}), Route(url=r'^{prefix}/{lookup}/notify-customer/$', mapping={'post': 'notify_customer'}, name='{basename}-service-notify-customer', initkwargs={'suffix': 'NotifyCustomer'}) ]
class OptionalSlashRouter(SimpleRouter): routes = [ # List route. Route( url=r'^{prefix}/?$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', initkwargs={'suffix': 'List'} ), # Detail route. Route( url=r'^{prefix}/{lookup}/?$', mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', initkwargs={'suffix': 'Instance'} ), # Dynamically generated routes. # Generated using @action or @link decorators on methods of the viewset. Route( url=r'^{prefix}/{lookup}/{methodname}/?$', mapping={ '{httpmethod}': '{methodname}', }, name='{basename}-{methodnamehyphen}', initkwargs={} ), ]
class ApiRouter(DefaultRouter): """Generate URL patterns for list, detail, and viewset-specific HTTP routes. """ routes = [ # List route. Route(url=r"^{prefix}/?$", mapping={ 'get': 'list', 'post': 'create' }, name="{basename}-list", initkwargs={'suffix': 'List'}), # Detail route. Route(url=r"^{prefix}/{lookup}/?$", mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name="{basename}-detail", initkwargs={'suffix': 'Instance'}), # Dynamically generated routes, from @action or @link decorators # on methods of the viewset. Route(url=r"^{prefix}/{lookup}/{methodname}/?$", mapping={ "{httpmethod}": "{methodname}", }, name="{basename}-{methodnamehyphen}", initkwargs={}), ]
class CustomDefaultRouter(SimpleRouter): """ Default router for APIs that generates routes for GET, POST, PUT and DELETE methods. """ routes = [ # List route. Route(url=r'^{prefix}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), # Detail route. Route(url=r'^{prefix}/{lookup}$', mapping={ 'get': 'retrieve', 'put': 'update', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Instance'}), DynamicRoute(url=r'^{prefix}/{lookup}/{url_path}$', name='{basename}-{url_name}', detail=True, initkwargs={}), ]
class SensorThingsRouter(DefaultRouter): """A router that has the lookup field in parentheses.""" APIRootView = SensorThingsAPI routes = [ Route(url=r'^{prefix}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), DynamicRoute(url=r'^{prefix}/{url_path}$', name='{basename}-{url_name}', detail=False, initkwargs={}), Route(url=r'^{prefix}\({lookup}\)$', mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Instance'}), DynamicRoute(url=r'^{prefix}\({lookup}\)/{url_path}$', name='{basename}-{url_name}', detail=True, initkwargs={}), ]
def __init__(self, muninn_archive=None, *args, **kwargs): ''' `muninn_archive` specifies an archive (defined in the settings) that will be registered automatically. Use as a shorthand for use cases whre there is only one archive to be served under a URL path. ''' super(MuninnRouter, self).__init__(*args, **kwargs) # Add detail route that understands `product_type/product_name` route_kwargs = { 'url': u'^{prefix}/(?P<product_type>[^/.]+)/(?P<product_name>[^/.]+){trailing_slash}$', 'mapping': { u'put': u'update', u'delete': u'destroy', u'patch': u'partial_update', u'get': u'retrieve' }, 'name': u'{basename}-detail', 'detail': True, 'initkwargs': { u'suffix': u'Instance' } } try: product_name_route = Route(**route_kwargs) except TypeError: # DRF below 1.8: del route_kwargs['detail'] product_name_route = Route(**route_kwargs) self.routes.append(product_name_route) if muninn_archive: self.register_muninn(muninn_archive, prefix='')
class CustomReadOnlyRouter(SimpleRouter): """ A router for read-only APIs, which doesn't use trailing slashes. """ routes = [ Route(url=r'^{prefix}/$', mapping={ 'get': 'list', 'post': 'create' }, detail=False, name='{basename}-list', initkwargs={'suffix': 'List'}), DynamicRoute(url=r'^{prefix}/{url_path}/$', name='{basename}-{url_name}', detail=False, initkwargs={}), Route(url=r'^{prefix}/{lookup}/$', mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Detail'}), DynamicRoute(url=r'^{prefix}/{url_path}/{lookup}/$', name='{basename}-{url_name}', detail=True, initkwargs={}) ]
def extra_routes(cls): routes = [] ct = get_ct(cls.model) for pct in get_related_parents(ct): if not pct.is_registered(): continue if pct.urlbase == '': purlbase = '' else: purlbase = pct.urlbase + '/' routes.append(Route( ( '^' + purlbase + r'(?P<related_' + pct.identifier + '>[^\/\?]+)/{prefix}{trailing_slash}$' ), mapping={'get': 'list'}, name="{basename}-for-related-%s" % pct.identifier, initkwargs={'suffix': 'List'}, )) for cct in get_related_children(ct): if not cct.is_registered(): continue cbase = cct.urlbase routes.append(Route( url='^%s-by-{prefix}' % cbase, mapping={'get': 'list'}, name="%s-by-%s" % (cct.identifier, ct.identifier), initkwargs={'target': cbase, 'suffix': 'List'}, )) return routes
class CustomRouter(DefaultRouter): routes = [ Route(url=r'^{prefix}/getAllWithOutPagination$', mapping={'get': 'list'}, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), Route(url=r'^{prefix}/getOne/{lookup}$', mapping={'get': 'retrieve'}, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Detail'}), Route(url=r'^{prefix}/create$', mapping={'post': 'create'}, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), Route(url=r'^{prefix}/update$', mapping={'post': 'update'}, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Detail'}), Route(url=r'^{prefix}/delete/{lookup}$', mapping={'get': 'destroy'}, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Detail'}), DynamicRoute(url=r'^{prefix}/{url_path}/{lookup}$', name='{basename}-{url_name}', detail=False, initkwargs={}), ]
class MisagoApiRouter(DefaultRouter): routes = [ # List route. Route(url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', initkwargs={'suffix': 'List'}), # Dynamically generated list routes. # Generated using @list_route decorator # on methods of the viewset. DynamicListRoute(url=r'^{prefix}/{methodnamehyphen}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), # Detail route. Route(url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', initkwargs={'suffix': 'Instance'}), # Dynamically generated detail routes. # Generated using @detail_route decorator on methods of the viewset. DynamicDetailRoute( url=r'^{prefix}/{lookup}/{methodnamehyphen}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), ]
class JobRouter(SimpleRouter): ''' A dedicated router for UWS services. The main difference is that a POST on an instance maps to update, not PUT. Also actions are removed. ''' routes = [ Route(url=r'^{prefix}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), Route(url=r'^{prefix}/{lookup}$', mapping={ 'get': 'retrieve', 'post': 'update', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Instance'}), DynamicRoute(url=r'^{prefix}/{lookup}/{url_path}$', name='{basename}-{url_name}', detail=True, initkwargs={}) ]
class MetricRouter(SimpleRouter): """ A router for Metric APIs """ routes = [ Route(url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create', }, name='{basename}-list', initkwargs={'suffix': 'List'}), DynamicListRoute(url=r'^{prefix}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), Route( url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ # 'get': 'retrieve', # 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', initkwargs={'suffix': 'Instance'}), DynamicDetailRoute( url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), ]
class CustomRouter(SimpleRouter): """ A router for read-only APIs, which doesn't use trailing slashes. """ routes = [ Route( url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}_list', detail=False, initkwargs={'suffix': 'List'} ), # Detail route. Route( url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ 'get': 'retrieve', 'post': 'create_msg', 'delete': 'leave_dialog', }, name='{basename}_detail', detail=True, initkwargs={'suffix': 'Instance'} ), ]
def get_routes(self, viewset): routes = super(ModelRouter, self).get_routes(viewset) model = getattr(viewset, "model", None) if not model: return routes # Custom routes # Re-register list view, with an additional keyword to filter this # model by parent models (e.g. foreign keys) # /[parentmodel_url]/[foreignkey_value]/[model_url] try: ct = get_ct(model) except (RuntimeError, DatabaseError): # This can happen before contenttypes is migrated return routes for pct, fields in ct.get_foreign_keys().items(): if not pct.is_registered(): continue if len(fields) > 1: # Multiple foreign keys to same parent model; can't # automatically determine which one to use continue if pct.urlbase == '': purlbase = '' else: purlbase = pct.urlbase + '/' routes.append( Route( url=('^' + purlbase + r'(?P<' + fields[0] + r'>[^\/\?]+)/{prefix}{trailing_slash}$'), mapping={'get': 'list'}, name="{basename}-for-%s" % fields[0], detail=False, initkwargs={'suffix': 'List'}, )) for cct in ct.get_children(): if not cct.is_registered(): continue cbase = cct.urlbase routes.append( Route( url='^%s-by-{prefix}' % cbase, mapping={'get': 'list'}, name="%s-by-%s" % (cct.identifier, ct.identifier), detail=False, initkwargs={ 'target': cbase, 'suffix': 'List' }, )) if hasattr(viewset, 'extra_routes'): routes += viewset.extra_routes() return routes
class EndpointRouterMixin: endpoint_routes = [ # List route. Route(url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create' }, name='{basename}-list', initkwargs={'suffix': 'List'}), # Dynamically generated list routes. # Generated using @list_route decorator # on methods of the viewset. DynamicListRoute(url=r'^{prefix}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), # Edit route. Route(url=r'^{prefix}/{lookup}/edit{trailing_slash}$', mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', initkwargs={'suffix': 'Instance'}), # Dynamically generated detail routes. # Generated using @detail_route decorator on methods of the viewset. DynamicDetailRoute( url=r'^{prefix}/{lookup}/{methodname}{trailing_slash}$', name='{basename}-{methodnamehyphen}', initkwargs={}), # Endpoint route. Route(url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ 'get': 'endpoint_get', 'put': 'endpoint_put', 'post': 'endpoint_post', 'patch': 'endpoint_patch', 'delete': 'endpoint_delete' }, name='{basename}-endpoint', initkwargs={'suffix': 'Instance'}), ] def __init__(self, *args, **kwargs): # Save original routes so we can switch them later on without modifying logic too much. self._routes = self.routes super().__init__(*args, **kwargs) def get_routes(self, viewset): if getattr(viewset, 'as_endpoint', False): self.routes = self.endpoint_routes else: self.routes = self._routes return super().get_routes(viewset)
class ListPatchRouter(ExtendedSimpleRouter): """A router that allows performing PATCH requests against the `list` endpoint This router is used in order to provide API endpoints that respond to PATCH requsts against a viewset's `list` endpoint. It is useful for situations where it is necessary to perform a batch update of multiple resources. For a use case, consider the selection of which remote resources should be harvestable by the local GeoNode: - User is shown a (paginated) list of resources that are available on the remote service - User must now choose which of these harvestable resources should be harvested - Instead of forcing the user to make multiple PATCH requests to each harvestable resource's detail page in order to set the resource's `should_be_harvested` property, user can perform a PATCH request to `harvesters/{harvester-id}/harvestable-resources` and set multiple resources' `should_be_harvested` at the same time """ routes = [ # List route. Route(url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create', 'patch': 'update_list', }, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), # Dynamically generated list routes. Generated using # @action(detail=False) decorator on methods of the viewset. DynamicRoute(url=r'^{prefix}/{url_path}{trailing_slash}$', name='{basename}-{url_name}', detail=False, initkwargs={}), # Detail route. Route(url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Instance'}), # Dynamically generated detail routes. Generated using # @action(detail=True) decorator on methods of the viewset. DynamicRoute(url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$', name='{basename}-{url_name}', detail=True, initkwargs={}), ]
class CustomRouterRetrieveHasNoParam(SimpleRouter): routes = [ # Detail route. Route( url=r'^/{prefix}$', mapping={ 'get': 'retrieve', 'put': 'update', 'patch': 'partial_update', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Instance'} ), Route( url=r'^/{prefix}/create$', mapping={ 'post': 'create' }, name='{basename}-create', detail=False, initkwargs={'suffix': 'Create'} ), Route( url=r'^/{prefix}/list$', mapping={ 'get': 'list', }, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'} ), # Dynamically generated list routes. Generated using # @action(detail=False) decorator on methods of the viewset. DynamicRoute( url=r'^/{prefix}/{url_path}$', name='{basename}-{url_name}', detail=False, initkwargs={} ), # Dynamically generated detail routes. Generated using # @action(detail=True) decorator on methods of the viewset. DynamicRoute( url=r'^/{prefix}/{lookup}/{url_path}$', name='{basename}-{url_name}', detail=True, initkwargs={} ), ]
class ZipCodeRouter(SimpleRouter): routes = [ Route(url=r'^$', mapping={'get': 'list'}, name='{basename}-list', initkwargs={'suffix': 'List'}), Route(url=r'^{lookup}/$', mapping={'get': 'retrieve'}, name='{basename}-detail', initkwargs={'suffix': 'Detail'}), ]
class CustomizeRouter(SimpleRouter): routes = [ Route(url=r'^{prefix}$', mapping={'get': 'list'}, name='{basename}-list', detail=False, initkwargs={}), Route(url=r'^{prefix}/{lookup}$', mapping={'get': 'retrieve'}, name='{basename}-detail', detail=True, initkwargs={}), ]
class CustomReadOnlyRouter(SimpleRouter): routes = [ Route(url=r'^{prefix}s{trailing_slash}$', mapping={'get': 'list'}, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'}), Route(url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={'get': 'detail_with_recommends'}, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Detail'}) ]
class ReadOnlyRouter(DefaultRouter): """ A router for read-only APIs, which USES trailing slashes. """ routes = [ Route(url=r'^{prefix}{trailing_slash}$', mapping={'get': 'list'}, name='{basename}-list', initkwargs={'suffix': 'List'}), Route(url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={'get': 'retrieve'}, name='{basename}-detail', initkwargs={'suffix': 'Detail'}) ]
class OPENIPAMAPIRouter(SimpleRouter): """ A router to match existing url patterns """ routes = [ Route( url=r"^{prefix}/$", mapping={"get": "list"}, name="api_{basename}_list", detail=False, initkwargs={"suffix": "List"}, ), Route( url=r"^{prefix}/add/$", mapping={"post": "create"}, name="api_{basename}_create", detail=False, initkwargs={"suffix": "Create"}, ), Route( url=r"^{prefix}/{lookup}/$", mapping={"get": "retrieve"}, name="api_{basename}_detail", detail=True, initkwargs={"suffix": "Detail"}, ), Route( url=r"^{prefix}/{lookup}/update/$", mapping={ "get": "retrieve", "post": "update", "put": "update" }, name="api_{basename}_update", detail=True, initkwargs={"suffix": "Update"}, ), Route( url=r"^{prefix}/{lookup}/delete/$", mapping={ "get": "retrieve", "delete": "destroy", "post": "destroy" }, name="api_{basename}_delete", detail=True, initkwargs={"suffix": "Delete"}, ), ]
def get_routes(self, viewset): """ Augment `self.routes` with any dynamically generated routes. Returns a list of the Route namedtuple. """ known_actions = flatten([route.mapping.values() for route in self.routes]) # Determine any `@action` or `@link` decorated methods on the viewset dynamic_routes = [] for methodname in dir(viewset): attr = getattr(viewset, methodname) httpmethods = getattr(attr, 'bind_to_methods', None) if httpmethods: if methodname in known_actions: raise ImproperlyConfigured('Cannot use @action or @link decorator on ' 'method "%s" as it is an existing route' % methodname) httpmethods = [method.lower() for method in httpmethods] dynamic_routes.append((httpmethods, methodname)) ret = [] for route in self.routes: if route.mapping == {'{httpmethod}': '{methodname}'}: # Dynamic routes (@link or @action decorator) for httpmethods, methodname in dynamic_routes: method_kwargs = getattr(viewset, methodname).kwargs url_path = method_kwargs.pop("url_path", None) or methodname initkwargs = route.initkwargs.copy() initkwargs.update(method_kwargs) if getattr(getattr(viewset, methodname), 'for_list', False): ret.insert(0, Route( url=replace_methodname(route.url, url_path).replace('{lookup}/', ''), mapping=dict((httpmethod, methodname) for httpmethod in httpmethods), name=replace_methodname(route.name, url_path), initkwargs=initkwargs, )) else: ret.append(Route( url=replace_methodname(route.url, url_path), mapping=dict((httpmethod, methodname) for httpmethod in httpmethods), name=replace_methodname(route.name, url_path), initkwargs=initkwargs, )) else: # Standard route ret.append(route) return ret
class NoLookupUpdateRouter(SimpleRouter): """ A router no {loopup} for mine Update https://www.django-rest-framework.org/api-guide/routers/#defaultrouter """ routes = [ # List route. Route( url=r'^{prefix}{trailing_slash}$', mapping={ 'get': 'list', 'post': 'create', 'put': 'update', 'patch': 'partial_update', }, name='{basename}-list', detail=False, initkwargs={'suffix': 'List'} ), # Dynamically generated list routes. Generated using # @action(detail=False) decorator on methods of the viewset. DynamicRoute( url=r'^{prefix}/{url_path}{trailing_slash}$', name='{basename}-{url_name}', detail=False, initkwargs={} ), # Detail route. Route( url=r'^{prefix}/{lookup}{trailing_slash}$', mapping={ 'get': 'retrieve', 'delete': 'destroy' }, name='{basename}-detail', detail=True, initkwargs={'suffix': 'Instance'} ), # Dynamically generated detail routes. Generated using # @action(detail=True) decorator on methods of the viewset. DynamicRoute( url=r'^{prefix}/{lookup}/{url_path}{trailing_slash}$', name='{basename}-{url_name}', detail=True, initkwargs={} ), ]