| 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 | 2908713 | 2016-03-29 11:14:38 -0700 | [diff] [blame] | 8 | try: |
| 9 | from rest_framework.serializers import DictField |
| 10 | except: |
| 11 | raise Exception("Failed check for django-rest-framework >= 3.3.3") |
| 12 | |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame] | 13 | urlpatterns = [] |
| 14 | |
| 15 | def import_module_from_filename(dirname, fn): |
| Scott Baker | 795de95 | 2016-03-28 13:20:15 -0700 | [diff] [blame] | 16 | print "importing", dirname, fn |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 17 | sys_path_save = sys.path |
| 18 | try: |
| 19 | # __import__() and importlib.import_module() both import modules from |
| 20 | # sys.path. So we make sure that the path where we can find the views is |
| 21 | # the first thing in sys.path. |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame] | 22 | sys.path = [dirname] + sys.path |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 23 | |
| 24 | module = __import__(fn[:-3]) |
| 25 | finally: |
| 26 | sys.path = sys_path_save |
| 27 | |
| 28 | return module |
| 29 | |
| Scott Baker | a2c7627 | 2016-03-30 10:58:18 -0700 | [diff] [blame] | 30 | def import_module_by_dotted_name(name): |
| 31 | print "import", name |
| 32 | module = __import__(name) |
| 33 | for part in name.split(".")[1:]: |
| 34 | module = getattr(module, part) |
| 35 | return module |
| 36 | |
| 37 | def import_api_methods(dirname=None, api_path="api", api_module="api"): |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 38 | subdirs=[] |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame] | 39 | urlpatterns=[] |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 40 | |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame] | 41 | if not dirname: |
| 42 | dirname = os.path.dirname(os.path.abspath(__file__)) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 43 | |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame] | 44 | view_urls = [] |
| 45 | for fn in os.listdir(dirname): |
| 46 | pathname = os.path.join(dirname,fn) |
| Scott Baker | fd38f13 | 2016-03-28 13:51:52 -0700 | [diff] [blame] | 47 | if os.path.isfile(pathname) and fn.endswith(".py") and (fn!="__init__.py") and (fn!="import_methods.py"): |
| Scott Baker | a2c7627 | 2016-03-30 10:58:18 -0700 | [diff] [blame] | 48 | #module = import_module_from_filename(dirname, fn) |
| 49 | module = import_module_by_dotted_name(api_module + "." + fn[:-3]) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 50 | for classname in dir(module): |
| Scott Baker | 750eadd | 2016-03-31 12:00:35 -0700 | [diff] [blame] | 51 | # print " ",classname |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 52 | c = getattr(module, classname, None) |
| 53 | |
| 54 | if inspect.isclass(c) and issubclass(c, View) and (classname not in globals()): |
| 55 | globals()[classname] = c |
| 56 | |
| 57 | method_kind = getattr(c, "method_kind", None) |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame] | 58 | method_name = getattr(c, "method_name", None) |
| Scott Baker | 13a287e | 2016-04-01 16:27:53 -0700 | [diff] [blame] | 59 | if method_kind: |
| 60 | if method_name: |
| 61 | method_name = os.path.join(api_path, method_name) |
| 62 | else: |
| 63 | method_name = api_path |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 64 | view_urls.append( (method_kind, method_name, classname, c) ) |
| 65 | |
| 66 | elif os.path.isdir(pathname): |
| Scott Baker | a2c7627 | 2016-03-30 10:58:18 -0700 | [diff] [blame] | 67 | urlpatterns.extend(import_api_methods(pathname, os.path.join(api_path, fn), api_module+"." + fn)) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 68 | |
| 69 | for view_url in view_urls: |
| 70 | if view_url[0] == "list": |
| 71 | urlpatterns.append(url(r'^' + view_url[1] + '/$', view_url[3].as_view(), name=view_url[1]+'list')) |
| 72 | elif view_url[0] == "detail": |
| 73 | urlpatterns.append(url(r'^' + view_url[1] + '/(?P<pk>[a-zA-Z0-9\-]+)/$', view_url[3].as_view(), name=view_url[1]+'detail')) |
| 74 | elif view_url[0] == "viewset": |
| 75 | viewset = view_url[3] |
| Scott Baker | 795de95 | 2016-03-28 13:20:15 -0700 | [diff] [blame] | 76 | urlpatterns.extend(viewset.get_urlpatterns(api_path="^"+api_path+"/")) |
| Scott Baker | fb9544a | 2016-03-25 10:55:03 -0700 | [diff] [blame] | 77 | |
| 78 | return urlpatterns |
| Scott Baker | d9d55f2 | 2016-03-25 13:33:11 -0700 | [diff] [blame] | 79 | |
| 80 | urlpatterns = import_api_methods() |
| 81 | |