cool.views.sites 源代码

# encoding: utf-8

from collections import OrderedDict

from django.contrib.admin.sites import AlreadyRegistered
from django.urls import re_path

from .options import ViewMetaclass


[文档]class ViewSite: """ APIView class 管理类 """ def __init__(self, name=None, app_name=None): self._registry = OrderedDict() self.name = name self.app_name = app_name def __call__(self, *args, **options): """Use as a decorator to register view class""" if args: assert len(args) == 1 view_class = args[0] self.register(view_class) return view_class else: def wrapper(view_class): self.register(view_class, **options) return view_class return wrapper def register(self, view_class, **options): if not isinstance(type(view_class), ViewMetaclass): if type(view_class) is type: view_class = ViewMetaclass( view_class.__name__, (view_class, ), {'__module__': view_class.__module__} ) if options: class Meta: pass for att, val in options.items(): setattr(Meta, att, val) attrs = { '__module__': view_class.__module__, 'Meta': Meta, } view_class = type(view_class)(view_class.__name__, (view_class, ), attrs) path = view_class._meta.path.strip('/') if path in self._registry: raise AlreadyRegistered("path '%s' has been already registered" % path) self._registry[path] = view_class def get_urls(self): urls = [] for path, view_class in self._registry.items(): urls.append(re_path(r'^%s/?$' % path, view_class.as_view(), name=view_class._meta.name)) return urls @property def urls(self): return self.get_urls(), self.app_name, self.name @property def urlpatterns(self): return self.get_urls()