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