          if self.endpoints is None:
              self.endpoints = self.get_api_endpoints(self.patterns)
  
          links = []
          for key, path, method, callback in self.endpoints:
              view = callback.cls()
              for attr, val in getattr(callback, 'initkwargs', {}).items():
                  setattr(view, attr, val)
              view.args = ()
              view.kwargs = {}
 
</s> remove         for key, link in links:
            insert_into(content, key, link)
 </s> add         for category, action, link in links:
            if category is None:
                content[action] = link
            elif category in content:
                content[category][action] = link
            else:
                content[category] = {action: link} </s> remove                         key = self.get_key(path, method, callback)
                        endpoint = (key, path, method, callback)
 </s> add                         action = self.get_action(path, method, callback)
                        endpoint = (path, method, action, callback) </s> remove def insert_into(target, keys, item):
    """
    Insert `item` into the nested dictionary `target`.

    For example:

        target = {}
        insert_into(target, ('users', 'list'), Link(...))
        insert_into(target, ('users', 'detail'), Link(...))
        assert target == {'users': {'list': Link(...), 'detail': Link(...)}}
    """
    for key in keys[:1]:
        if key not in target:
            target[key] = {}
        target = target[key]
    target[keys[-1]] = item


 </s> add  </s> remove         action = actions[method.lower()]

        if category:
            return (category, action)
        return (action,)
 </s> add         return actions[method.lower()]

    def get_categories(self, paths):
        categories = set()
        split_paths = set([
            tuple(path.split("{")[0].strip('/').split('/'))
            for path in paths
        ])

        while split_paths:
            for split_path in list(split_paths):
                if len(split_path) == 0:
                    split_paths.remove(split_path)
                elif len(split_path) == 1:
                    categories.add(split_path[0])
                    split_paths.remove(split_path)
                elif split_path[0] in categories:
                    split_paths.remove(split_path)

        return categories

    def get_category(self, categories, path):
        path_components = path.split("{")[0].strip('/').split('/')
        for path_component in path_components:
            if path_component in categories:
                return path_component
        return None </s> remove         category = None
        for item in path.strip('/').split('/'):
            if '{' in item:
                break
            category = item

 </s> add 
        for path, method, category, action, callback in self.endpoints:
          if self.endpoints is None:
              self.endpoints = self.get_api_endpoints(self.patterns)
  
          links = []
        for path, method, category, action, callback in self.endpoints:
              view = callback.cls()
              for attr, val in getattr(callback, 'initkwargs', {}).items():
                  setattr(view, attr, val)
              view.args = ()
              view.kwargs = {}
keep keep keep keep replace keep keep keep keep keep
 Fix schema categories for custom list actions (#4386) 
rest_framework/schemas.py