| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 1 | from django.views.generic import View |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 2 | from django.conf.urls import patterns, url, include |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 3 | from rest_framework.routers import DefaultRouter |
| 4 | import os, sys |
| 5 | import inspect |
| 6 | import importlib |
| 7 | |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 8 | urlpatterns = [] |
| 9 | |
| 10 | def import_module_from_filename(dirname, fn): |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 11 | sys_path_save = sys.path |
| 12 | try: |
| 13 | # __import__() and importlib.import_module() both import modules from |
| 14 | # sys.path. So we make sure that the path where we can find the views is |
| 15 | # the first thing in sys.path. |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 16 | sys.path = [dirname] + sys.path |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 17 | |
| 18 | module = __import__(fn[:-3]) |
| 19 | finally: |
| 20 | sys.path = sys_path_save |
| 21 | |
| 22 | return module |
| 23 | |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 24 | def import_api_methods(dirname=None, api_path="api"): |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 25 | subdirs=[] |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 26 | urlpatterns=[] |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 27 | |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 28 | if not dirname: |
| 29 | dirname = os.path.dirname(os.path.abspath(__file__)) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 30 | |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 31 | view_urls = [] |
| 32 | for fn in os.listdir(dirname): |
| 33 | pathname = os.path.join(dirname,fn) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 34 | if os.path.isfile(pathname) and fn.endswith(".py") and (fn!="__init__.py"): |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 35 | module = import_module_from_filename(dirname, fn) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 36 | for classname in dir(module): |
| 37 | c = getattr(module, classname, None) |
| 38 | |
| 39 | if inspect.isclass(c) and issubclass(c, View) and (classname not in globals()): |
| 40 | globals()[classname] = c |
| 41 | |
| 42 | method_kind = getattr(c, "method_kind", None) |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 43 | method_name = getattr(c, "method_name", None) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 44 | if method_kind and method_name: |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 45 | method_name = os.path.join(api_path, method_name) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 46 | view_urls.append( (method_kind, method_name, classname, c) ) |
| 47 | |
| 48 | elif os.path.isdir(pathname): |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 49 | urlpatterns.extend(import_api_methods(pathname, os.path.join(api_path, fn))) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 50 | |
| 51 | for view_url in view_urls: |
| 52 | if view_url[0] == "list": |
| 53 | urlpatterns.append(url(r'^' + view_url[1] + '/$', view_url[3].as_view(), name=view_url[1]+'list')) |
| 54 | elif view_url[0] == "detail": |
| 55 | urlpatterns.append(url(r'^' + view_url[1] + '/(?P<pk>[a-zA-Z0-9\-]+)/$', view_url[3].as_view(), name=view_url[1]+'detail')) |
| 56 | elif view_url[0] == "viewset": |
| 57 | viewset = view_url[3] |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 58 | urlpatterns.extend(viewset.get_urlpatterns(api_path=api_path+"/")) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 59 | |
| 60 | return urlpatterns |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame^] | 61 | |
| 62 | urlpatterns = import_api_methods() |
| 63 | |