Source code for rest_witchcraft.routers

from django_sorcery.db import meta

from rest_framework import routers


[docs]class DefaultRouter(routers.DefaultRouter):
[docs] def get_default_base_name(self, viewset): model = getattr(viewset, "get_model", lambda: None)() assert model is not None, ( "`base_name` argument not specified, and could not automatically determine the name from the viewset, " "as either queryset is is missing or is not a sqlalchemy query, or the serializer_class is not a " "sqlalchemy model serializer" ) return model.__name__.lower()
# for backwards compatibility DRF<3.9 get_default_basename = get_default_base_name
[docs] def get_lookup_regex(self, viewset, lookup_prefix=""): """Given a viewset, return the portion of the url regex that is used to match against a single instance. Can be overwritten by providing a `lookup_url_regex` on the viewset. """ lookup_url_regex = getattr(viewset, "lookup_url_regex", None) if lookup_url_regex: return lookup_url_regex model = getattr(viewset, "get_model", lambda: None)() if model: info = meta.model_info(model) base_regex = "(?P<{lookup_prefix}{lookup_url_kwarg}>{lookup_value})" lookup_keys = [getattr(viewset, "lookup_url_kwarg", None) or getattr(viewset, "lookup_field", None)] if not lookup_keys[0] or len(info.primary_keys) > 1: lookup_keys = list(info.primary_keys) regexes = [ base_regex.format( lookup_prefix=lookup_prefix, lookup_url_kwarg=key, lookup_value="[^/.]+", ) for key in lookup_keys ] return "/".join(regexes) return super().get_lookup_regex(viewset, lookup_prefix)