Пример #1
0
    def get_context_data(self, **kwargs):
        load_all_installed_template_libraries()

        tags = []
        app_libs = list(libraries.items())
        builtin_libs = [(None, lib) for lib in builtins]
        for module_name, library in builtin_libs + app_libs:
            for tag_name, tag_func in library.tags.items():
                title, body, metadata = utils.parse_docstring(tag_func.__doc__)
                if title:
                    title = utils.parse_rst(title, 'tag', _('tag:') + tag_name)
                if body:
                    body = utils.parse_rst(body, 'tag', _('tag:') + tag_name)
                for key in metadata:
                    metadata[key] = utils.parse_rst(metadata[key], 'tag', _('tag:') + tag_name)
                if library in builtins:
                    tag_library = ''
                else:
                    tag_library = module_name.split('.')[-1]
                tags.append({
                    'name': tag_name,
                    'title': title,
                    'body': body,
                    'meta': metadata,
                    'library': tag_library,
                })
        kwargs.update({'tags': tags})
        return super(TemplateTagIndexView, self).get_context_data(**kwargs)
Пример #2
0
 def get_context_data(self, **kwargs):
     filters = []
     try:
         engine = Engine.get_default()
     except ImproperlyConfigured:
         # Non-trivial TEMPLATES secure aren't supported (#24125).
         pass
     else:
         app_libs = sorted(engine.template_libraries.items())
         builtin_libs = [("", lib) for lib in engine.template_builtins]
         for module_name, library in builtin_libs + app_libs:
             for filter_name, filter_func in library.filters.items():
                 title, body, metadata = utils.parse_docstring(filter_func.__doc__)
                 if title:
                     title = utils.parse_rst(title, "filter", _("filter:") + filter_name)
                 if body:
                     body = utils.parse_rst(body, "filter", _("filter:") + filter_name)
                 for key in metadata:
                     metadata[key] = utils.parse_rst(metadata[key], "filter", _("filter:") + filter_name)
                 tag_library = module_name.split(".")[-1]
                 filters.append(
                     {"name": filter_name, "title": title, "body": body, "meta": metadata, "library": tag_library}
                 )
     kwargs.update({"filters": filters})
     return super(TemplateFilterIndexView, self).get_context_data(**kwargs)
Пример #3
0
 def get_context_data(self, **kwargs):
     filters = []
     try:
         engine = Engine.get_default()
     except ImproperlyConfigured:
         # Non-trivial TEMPLATES settings aren't supported (#24125).
         pass
     else:
         app_libs = sorted(engine.template_libraries.items())
         builtin_libs = [('', lib) for lib in engine.template_builtins]
         for module_name, library in builtin_libs + app_libs:
             for filter_name, filter_func in library.filters.items():
                 title, body, metadata = utils.parse_docstring(filter_func.__doc__)
                 if title:
                     title = utils.parse_rst(title, 'filter', _('filter:') + filter_name)
                 if body:
                     body = utils.parse_rst(body, 'filter', _('filter:') + filter_name)
                 for key in metadata:
                     metadata[key] = utils.parse_rst(metadata[key], 'filter', _('filter:') + filter_name)
                 tag_library = module_name.split('.')[-1]
                 filters.append({
                     'name': filter_name,
                     'title': title,
                     'body': body,
                     'meta': metadata,
                     'library': tag_library,
                 })
     kwargs.update({'filters': filters})
     return super().get_context_data(**kwargs)
Пример #4
0
def template_tag_index(request):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    load_all_installed_template_libraries()

    tags = []
    for module_name, library in template.libraries.items():
        for tag_name, tag_func in library.tags.items():
            title, body, metadata = utils.parse_docstring(tag_func.__doc__)
            if title:
                title = utils.parse_rst(title, 'tag', _('tag:') + tag_name)
            if body:
                body = utils.parse_rst(body, 'tag', _('tag:') + tag_name)
            for key in metadata:
                metadata[key] = utils.parse_rst(metadata[key], 'tag', _('tag:') + tag_name)
            if library in template.builtins:
                tag_library = None
            else:
                tag_library = module_name.split('.')[-1]
            tags.append({
                'name': tag_name,
                'title': title,
                'body': body,
                'meta': metadata,
                'library': tag_library,
            })
    root_path = re.sub(re.escape('doc/tags/') + '$', '', request.path)
    return render_to_response('admin_doc/template_tag_index.html', {
        'root_path': root_path,
        'tags': tags
    }, context_instance=RequestContext(request))
Пример #5
0
    def get_context_data(self, **kwargs):
        load_all_installed_template_libraries()

        filters = []
        app_libs = list(six.iteritems(template.libraries))
        builtin_libs = [(None, lib) for lib in template.builtins]
        for module_name, library in builtin_libs + app_libs:
            for filter_name, filter_func in library.filters.items():
                title, body, metadata = utils.parse_docstring(filter_func.__doc__)
                if title:
                    title = utils.parse_rst(title, 'filter', _('filter:') + filter_name)
                if body:
                    body = utils.parse_rst(body, 'filter', _('filter:') + filter_name)
                for key in metadata:
                    metadata[key] = utils.parse_rst(metadata[key], 'filter', _('filter:') + filter_name)
                if library in template.builtins:
                    tag_library = ''
                else:
                    tag_library = module_name.split('.')[-1]
                filters.append({
                    'name': filter_name,
                    'title': title,
                    'body': body,
                    'meta': metadata,
                    'library': tag_library,
                })
        kwargs.update({'filters': filters})
        return super(TemplateFilterIndexView, self).get_context_data(**kwargs)
Пример #6
0
def _get_filters():
    load_all_installed_template_libraries()

    filters = []
    for module_name, library in template.libraries.items():
        for filter_name, filter_func in library.filters.items():
            title, body, metadata = utils.parse_docstring(filter_func.__doc__)
            if title:
                title = utils.parse_rst(title, 'filter', ('filter:') + filter_name)
            if body:
                body = utils.parse_rst(body, 'filter', ('filter:') + filter_name)
            for key in metadata:
                metadata[key] = utils.parse_rst(metadata[key], 'filter', ('filter:') + filter_name)
            if library in template.builtins:
                tag_library = None
            else:
                tag_library = module_name.split('.')[-1]
            filters.append({
                'name': filter_name,
                'title': title,
                'body': body,
                'meta': metadata,
                'library': tag_library,
            })
    return filters
Пример #7
0
def template_filter_index(request):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    load_all_installed_template_libraries()

    filters = []
    app_libs = template.libraries.items()
    builtin_libs = [(None, lib) for lib in template.builtins]
    for module_name, library in builtin_libs + app_libs:
        for filter_name, filter_func in library.filters.items():
            title, body, metadata = utils.parse_docstring(filter_func.__doc__)
            if title:
                title = utils.parse_rst(title, "filter", _("filter:") + filter_name)
            if body:
                body = utils.parse_rst(body, "filter", _("filter:") + filter_name)
            for key in metadata:
                metadata[key] = utils.parse_rst(metadata[key], "filter", _("filter:") + filter_name)
            if library in template.builtins:
                tag_library = None
            else:
                tag_library = module_name.split(".")[-1]
            filters.append(
                {"name": filter_name, "title": title, "body": body, "meta": metadata, "library": tag_library}
            )
    return render_to_response(
        "admin_doc/template_filter_index.html",
        {"root_path": get_root_path(), "filters": filters},
        context_instance=RequestContext(request),
    )
Пример #8
0
def template_tag_index(request):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    load_all_installed_template_libraries()

    tags = []
    app_libs = list(six.iteritems(template.libraries))
    builtin_libs = [(None, lib) for lib in template.builtins]
    for module_name, library in builtin_libs + app_libs:
        for tag_name, tag_func in library.tags.items():
            title, body, metadata = utils.parse_docstring(tag_func.__doc__)
            if title:
                title = utils.parse_rst(title, 'tag', _('tag:') + tag_name)
            if body:
                body = utils.parse_rst(body, 'tag', _('tag:') + tag_name)
            for key in metadata:
                metadata[key] = utils.parse_rst(metadata[key], 'tag', _('tag:') + tag_name)
            if library in template.builtins:
                tag_library = None
            else:
                tag_library = module_name.split('.')[-1]
            tags.append({
                'name': tag_name,
                'title': title,
                'body': body,
                'meta': metadata,
                'library': tag_library,
            })
    return render_to_response('admin_doc/template_tag_index.html', {
        'root_path': urlresolvers.reverse('admin:index'),
        'tags': tags
    }, context_instance=RequestContext(request))
Пример #9
0
def template_filter_index(request):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    load_all_installed_template_libraries()

    filters = []
    for module_name, library in template.libraries.items():
        for filter_name, filter_func in library.filters.items():
            title, body, metadata = utils.parse_docstring(filter_func.__doc__)
            if title:
                title = utils.parse_rst(title, 'filter', _('filter:') + filter_name)
            if body:
                body = utils.parse_rst(body, 'filter', _('filter:') + filter_name)
            for key in metadata:
                metadata[key] = utils.parse_rst(metadata[key], 'filter', _('filter:') + filter_name)
            if library in template.builtins:
                tag_library = None
            else:
                tag_library = module_name.split('.')[-1]
            filters.append({
                'name': filter_name,
                'title': title,
                'body': body,
                'meta': metadata,
                'library': tag_library,
            })
    return render_to_response('admin_doc/template_filter_index.html', {
        'root_path': get_root_path(),
        'filters': filters
    }, context_instance=RequestContext(request))
Пример #10
0
 def test_title_output(self):
     title, description, metadata = parse_docstring(self.docstring)
     title_output = parse_rst(title, 'model', 'model:admindocs')
     self.assertIn('TITLE', title_output)
     title_rendered = (
         '<p>This __doc__ output is required for testing. I copied this '
         'example from\n<a class="reference external" '
         'href="/admindocs/models/admindocs/">admindocs</a> documentation. '
         '(TITLE)</p>\n'
     )
     self.assertHTMLEqual(title_output, title_rendered)
Пример #11
0
 def test_description_output(self):
     title, description, metadata = parse_docstring(self.docstring)
     description_output = parse_rst(description, 'model', 'model:admindocs')
     description_rendered = (
         '<p>Display an individual <a class="reference external" '
         'href="/admindocs/models/myapp.mymodel/">myapp.MyModel</a>.</p>\n'
         '<p><strong>Context</strong></p>\n<p><tt class="docutils literal">'
         'RequestContext</tt></p>\n<dl class="docutils">\n<dt><tt class="'
         'docutils literal">mymodel</tt></dt>\n<dd>An instance of <a class="'
         'reference external" href="/admindocs/models/myapp.mymodel/">'
         'myapp.MyModel</a>.</dd>\n</dl>\n<p><strong>Template:</strong></p>'
         '\n<p><a class="reference external" href="/admindocs/templates/'
         'myapp/my_template.html/">myapp/my_template.html</a> (DESCRIPTION)'
         '</p>\n'
     )
     self.assertHTMLEqual(description_output, description_rendered)
Пример #12
0
 def test_parse_docstring(self):
     title, description, metadata = utils.parse_docstring(self.docstring)
     docstring_title = (
         'This __doc__ output is required for testing. I copied this example from\n'
         '`admindocs` documentation. (TITLE)'
     )
     docstring_description = (
         'Display an individual :model:`myapp.MyModel`.\n\n'
         '**Context**\n\n``RequestContext``\n\n``mymodel``\n'
         '    An instance of :model:`myapp.MyModel`.\n\n'
         '**Template:**\n\n:template:`myapp/my_template.html` '
         '(DESCRIPTION)'
     )
     self.assertEqual(title, docstring_title)
     self.assertEqual(description, docstring_description)
     self.assertEqual(metadata, {'some_metadata': 'some data'})
Пример #13
0
 def get_context_data(self, **kwargs):
     view = self.kwargs["view"]
     urlconf = urlresolvers.get_urlconf()
     if urlresolvers.get_resolver(urlconf)._is_callback(view):
         mod, func = urlresolvers.get_mod_func(view)
         view_func = getattr(import_module(mod), func)
     else:
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     if title:
         title = utils.parse_rst(title, "view", _("view:") + view)
     if body:
         body = utils.parse_rst(body, "view", _("view:") + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], "model", _("view:") + view)
     kwargs.update({"name": view, "summary": title, "body": body, "meta": metadata})
     return super(ViewDetailView, self).get_context_data(**kwargs)
Пример #14
0
 def get_context_data(self, **kwargs):
     view = self.kwargs['view']
     view_func = self._get_view_func(view)
     if view_func is None:
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     title = title and utils.parse_rst(title, 'view', _('view:') + view)
     body = body and utils.parse_rst(body, 'view', _('view:') + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
     return super().get_context_data(**{
         **kwargs,
         'name': view,
         'summary': title,
         'body': body,
         'meta': metadata,
     })
Пример #15
0
 def get_context_data(self, **kwargs):
     view = self.kwargs["view"]
     view_func = self._get_view_func(view)
     if view_func is None:
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     title = title and utils.parse_rst(title, "view", _("view:") + view)
     body = body and utils.parse_rst(body, "view", _("view:") + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], "model", _("view:") + view)
     return super().get_context_data(
         **{
             **kwargs,
             "name": view,
             "summary": title,
             "body": body,
             "meta": metadata,
         }
     )
Пример #16
0
 def get_context_data(self, **kwargs):
     view = self.kwargs['view']
     view_func = self._get_view_func(view)
     if view_func is None:
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     if title:
         title = utils.parse_rst(title, 'view', _('view:') + view)
     if body:
         body = utils.parse_rst(body, 'view', _('view:') + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
     kwargs.update({
         'name': view,
         'summary': title,
         'body': body,
         'meta': metadata,
     })
     return super(ViewDetailView, self).get_context_data(**kwargs)
Пример #17
0
 def get_context_data(self, **kwargs):
     view = self.kwargs['view']
     view_func = self._get_view_func(view)
     if view_func is None:
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     if title:
         title = utils.parse_rst(title, 'view', _('view:') + view)
     if body:
         body = utils.parse_rst(body, 'view', _('view:') + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], 'model',
                                         _('view:') + view)
     kwargs.update({
         'name': view,
         'summary': title,
         'body': body,
         'meta': metadata,
     })
     return super(ViewDetailView, self).get_context_data(**kwargs)
Пример #18
0
 def get_context_data(self, **kwargs):
     view = self.kwargs['view']
     mod, func = urlresolvers.get_mod_func(view)
     try:
         view_func = getattr(import_module(mod), func)
     except (ImportError, AttributeError):
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     if title:
         title = utils.parse_rst(title, 'view', _('view:') + view)
     if body:
         body = utils.parse_rst(body, 'view', _('view:') + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
     kwargs.update({
         'name': view,
         'summary': title,
         'body': body,
         'meta': metadata,
     })
     return super(ViewDetailView, self).get_context_data(**kwargs)
Пример #19
0
def doc_functions(request):
    group_list = []
    for group_name, functions in AVAILABLE_API_FUNCTIONS.items():
        function_list = []
        for name, function in functions.items():
            heading, body, metadata = parse_docstring(function.__doc__)
            body = trim_docstring(body)
            function_list.append({
                'name':
                name,
                'description':
                build_function_description(function),
                'docstring':
                trim_docstring('{0}\n\n{1}'.format(heading, body)),
            })
        function_list.sort(key=itemgetter('name'))

        group_list.append({'name': group_name, 'function_list': function_list})
    group_list.sort(key=itemgetter('name'))
    return TemplateResponse(request, 'api/list_functions.html',
                            {'group_list': group_list})
Пример #20
0
def view_detail(request, view):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    mod, func = urlresolvers.get_mod_func(view)
    try:
        view_func = getattr(import_module(mod), func)
    except (ImportError, AttributeError):
        raise Http404
    title, body, metadata = utils.parse_docstring(view_func.__doc__)
    if title:
        title = utils.parse_rst(title, "view", _("view:") + view)
    if body:
        body = utils.parse_rst(body, "view", _("view:") + view)
    for key in metadata:
        metadata[key] = utils.parse_rst(metadata[key], "model", _("view:") + view)

    name = view.split(".")[-1].replace("_", "/")
    param = {"root_path": get_root_path(), "name": name, "summary": title, "body": body, "meta": metadata}

    return render_to_response("doc/view_detail.tpl", param, context_instance=RequestContext(request))
Пример #21
0
 def get_context_data(self, **kwargs):
     view = self.kwargs['view']
     urlconf = urlresolvers.get_urlconf()
     if urlresolvers.get_resolver(urlconf)._is_callback(view):
         mod, func = urlresolvers.get_mod_func(view)
         view_func = getattr(import_module(mod), func)
     else:
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     if title:
         title = utils.parse_rst(title, 'view', _('view:') + view)
     if body:
         body = utils.parse_rst(body, 'view', _('view:') + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
     kwargs.update({
         'name': view,
         'summary': title,
         'body': body,
         'meta': metadata,
     })
     return super(ViewDetailView, self).get_context_data(**kwargs)
Пример #22
0
def view_detail(request, view):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    mod, func = urlresolvers.get_mod_func(view)
    try:
        view_func = getattr(__import__(mod, {}, {}, ['']), func)
    except (ImportError, AttributeError):
        raise Http404
    title, body, metadata = utils.parse_docstring(view_func.__doc__)
    if title:
        title = utils.parse_rst(title, 'view', _('view:') + view)
    if body:
        body = utils.parse_rst(body, 'view', _('view:') + view)
    for key in metadata:
        metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
    return render_to_response('admin_doc/view_detail.html', {
        'name': view,
        'summary': title,
        'body': body,
        'meta': metadata,
    }, context_instance=RequestContext(request))
Пример #23
0
    def get_context_data(self, **kwargs):
        load_all_installed_template_libraries()

        tags = []
        app_libs = list(six.iteritems(template.libraries))
        builtin_libs = [(None, lib) for lib in template.builtins]
        for module_name, library in builtin_libs + app_libs:
            for tag_name, tag_func in library.tags.items():
                title, body, metadata = utils.parse_docstring(tag_func.__doc__)
                if title:
                    title = utils.parse_rst(title, "tag", _("tag:") + tag_name)
                if body:
                    body = utils.parse_rst(body, "tag", _("tag:") + tag_name)
                for key in metadata:
                    metadata[key] = utils.parse_rst(metadata[key], "tag", _("tag:") + tag_name)
                if library in template.builtins:
                    tag_library = ""
                else:
                    tag_library = module_name.split(".")[-1]
                tags.append({"name": tag_name, "title": title, "body": body, "meta": metadata, "library": tag_library})
        kwargs.update({"tags": tags})
        return super(TemplateTagIndexView, self).get_context_data(**kwargs)
Пример #24
0
 def get_context_data(self, **kwargs):
     view = self.kwargs['view']
     mod, func = urlresolvers.get_mod_func(view)
     try:
         view_func = getattr(import_module(mod), func)
     except (ImportError, AttributeError):
         raise Http404
     title, body, metadata = utils.parse_docstring(view_func.__doc__)
     if title:
         title = utils.parse_rst(title, 'view', _('view:') + view)
     if body:
         body = utils.parse_rst(body, 'view', _('view:') + view)
     for key in metadata:
         metadata[key] = utils.parse_rst(metadata[key], 'model',
                                         _('view:') + view)
     kwargs.update({
         'name': view,
         'summary': title,
         'body': body,
         'meta': metadata,
     })
     return super(ViewDetailView, self).get_context_data(**kwargs)
Пример #25
0
def view_detail(request, view):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    mod, func = urlresolvers.get_mod_func(view)
    try:
        view_func = getattr(__import__(mod, {}, {}, ['']), func)
    except (ImportError, AttributeError):
        raise Http404
    title, body, metadata = utils.parse_docstring(view_func.__doc__)
    if title:
        title = utils.parse_rst(title, 'view', _('view:') + view)
    if body:
        body = utils.parse_rst(body, 'view', _('view:') + view)
    for key in metadata:
        metadata[key] = utils.parse_rst(metadata[key], 'model', _('view:') + view)
    return render_to_response('admin_doc/view_detail.html', {
        'root_path': get_root_path(),
        'name': view,
        'summary': title,
        'body': body,
        'meta': metadata,
    }, context_instance=RequestContext(request))
Пример #26
0
 def get_context_data(self, **kwargs):
     filters = []
     try:
         engine = Engine.get_default()
     except ImproperlyConfigured:
         # Non-trivial TEMPLATES settings aren't supported (#24125).
         pass
     else:
         app_libs = sorted(engine.template_libraries.items())
         builtin_libs = [("", lib) for lib in engine.template_builtins]
         for module_name, library in builtin_libs + app_libs:
             for filter_name, filter_func in library.filters.items():
                 title, body, metadata = utils.parse_docstring(filter_func.__doc__)
                 if title:
                     title = utils.parse_rst(
                         title, "filter", _("filter:") + filter_name
                     )
                 if body:
                     body = utils.parse_rst(
                         body, "filter", _("filter:") + filter_name
                     )
                 for key in metadata:
                     metadata[key] = utils.parse_rst(
                         metadata[key], "filter", _("filter:") + filter_name
                     )
                 tag_library = module_name.split(".")[-1]
                 filters.append(
                     {
                         "name": filter_name,
                         "title": title,
                         "body": body,
                         "meta": metadata,
                         "library": tag_library,
                     }
                 )
     kwargs.update({"filters": filters})
     return super().get_context_data(**kwargs)
Пример #27
0
def template_filter_index(request):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    load_all_installed_template_libraries()

    filters = []
    app_libs = list(six.iteritems(template.libraries))
    builtin_libs = [(None, lib) for lib in template.builtins]
    for module_name, library in builtin_libs + app_libs:
        for filter_name, filter_func in library.filters.items():
            title, body, metadata = utils.parse_docstring(filter_func.__doc__)
            if title:
                title = utils.parse_rst(title, 'filter',
                                        _('filter:') + filter_name)
            if body:
                body = utils.parse_rst(body, 'filter',
                                       _('filter:') + filter_name)
            for key in metadata:
                metadata[key] = utils.parse_rst(metadata[key], 'filter',
                                                _('filter:') + filter_name)
            if library in template.builtins:
                tag_library = ''
            else:
                tag_library = module_name.split('.')[-1]
            filters.append({
                'name': filter_name,
                'title': title,
                'body': body,
                'meta': metadata,
                'library': tag_library,
            })
    return render_to_response('admin_doc/template_filter_index.html', {
        'root_path': urlresolvers.reverse('admin:index'),
        'filters': filters
    },
                              context_instance=RequestContext(request))
Пример #28
0
    def get_context_data(self, **kwargs):
        model_name = self.kwargs['model_name']
        # Get the model class.
        try:
            app_config = apps.get_app_config(self.kwargs['app_label'])
        except LookupError:
            raise Http404(_("App %(app_label)r not found") % self.kwargs)
        try:
            model = app_config.get_model(model_name)
        except LookupError:
            raise Http404(_("Model %(model_name)r not found in app %(app_label)r") % self.kwargs)

        opts = model._meta

        title, body, metadata = utils.parse_docstring(model.__doc__)
        if title:
            title = utils.parse_rst(title, 'model', _('model:') + model_name)
        if body:
            body = utils.parse_rst(body, 'model', _('model:') + model_name)

        # Gather fields/field descriptions.
        fields = []
        for field in opts.fields:
            # ForeignKey is a special case since the field will actually be a
            # descriptor that returns the other object
            if isinstance(field, models.ForeignKey):
                data_type = field.rel.to.__name__
                app_label = field.rel.to._meta.app_label
                verbose = utils.parse_rst(
                    (_("the related `%(app_label)s.%(data_type)s` object") % {
                        'app_label': app_label, 'data_type': data_type,
                    }),
                    'model',
                    _('model:') + data_type,
                )
            else:
                data_type = get_readable_field_data_type(field)
                verbose = field.verbose_name
            fields.append({
                'name': field.name,
                'data_type': data_type,
                'verbose': verbose,
                'help_text': field.help_text,
            })

        # Gather many-to-many fields.
        for field in opts.many_to_many:
            data_type = field.rel.to.__name__
            app_label = field.rel.to._meta.app_label
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': app_label,
                'object_name': data_type,
            }
            fields.append({
                'name': "%s.all" % field.name,
                "data_type": 'List',
                'verbose': utils.parse_rst(_("all %s") % verbose, 'model', _('model:') + opts.model_name),
            })
            fields.append({
                'name': "%s.count" % field.name,
                'data_type': 'Integer',
                'verbose': utils.parse_rst(_("number of %s") % verbose, 'model', _('model:') + opts.model_name),
            })

        # Gather model methods.
        for func_name, func in model.__dict__.items():
            if (inspect.isfunction(func) and len(inspect.getargspec(func)[0]) == 1):
                try:
                    for exclude in MODEL_METHODS_EXCLUDE:
                        if func_name.startswith(exclude):
                            raise StopIteration
                except StopIteration:
                    continue
                verbose = func.__doc__
                if verbose:
                    verbose = utils.parse_rst(utils.trim_docstring(verbose), 'model', _('model:') + opts.model_name)
                fields.append({
                    'name': func_name,
                    'data_type': get_return_data_type(func_name),
                    'verbose': verbose,
                })

        # Gather related objects
        for rel in opts.get_all_related_objects() + opts.get_all_related_many_to_many_objects():
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': rel.opts.app_label,
                'object_name': rel.opts.object_name,
            }
            accessor = rel.get_accessor_name()
            fields.append({
                'name': "%s.all" % accessor,
                'data_type': 'List',
                'verbose': utils.parse_rst(_("all %s") % verbose, 'model', _('model:') + opts.model_name),
            })
            fields.append({
                'name': "%s.count" % accessor,
                'data_type': 'Integer',
                'verbose': utils.parse_rst(_("number of %s") % verbose, 'model', _('model:') + opts.model_name),
            })
        kwargs.update({
            'name': '%s.%s' % (opts.app_label, opts.object_name),
            'summary': title,
            'description': body,
            'fields': fields,
        })
        return super(ModelDetailView, self).get_context_data(**kwargs)
Пример #29
0
import inspect
Пример #30
0
    def get_context_data(self, **kwargs):
        model_name = self.kwargs['model_name']
        # Get the model class.
        try:
            app_config = apps.get_app_config(self.kwargs['app_label'])
        except LookupError:
            raise Http404(_("App %(app_label)r not found") % self.kwargs)
        try:
            model = app_config.get_model(model_name)
        except LookupError:
            raise Http404(
                _("Model %(model_name)r not found in app %(app_label)r") %
                self.kwargs)

        opts = model._meta

        title, body, metadata = utils.parse_docstring(model.__doc__)
        if title:
            title = utils.parse_rst(title, 'model', _('model:') + model_name)
        if body:
            body = utils.parse_rst(body, 'model', _('model:') + model_name)

        # Gather fields/field descriptions.
        fields = []
        for field in opts.fields:
            # ForeignKey is a special case since the field will actually be a
            # descriptor that returns the other object
            if isinstance(field, models.ForeignKey):
                data_type = field.rel.to.__name__
                app_label = field.rel.to._meta.app_label
                verbose = utils.parse_rst(
                    (_("the related `%(app_label)s.%(data_type)s` object") % {
                        'app_label': app_label,
                        'data_type': data_type,
                    }),
                    'model',
                    _('model:') + data_type,
                )
            else:
                data_type = get_readable_field_data_type(field)
                verbose = field.verbose_name
            fields.append({
                'name': field.name,
                'data_type': data_type,
                'verbose': verbose,
                'help_text': field.help_text,
            })

        # Gather many-to-many fields.
        for field in opts.many_to_many:
            data_type = field.rel.to.__name__
            app_label = field.rel.to._meta.app_label
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': app_label,
                'object_name': data_type,
            }
            fields.append({
                'name':
                "%s.all" % field.name,
                "data_type":
                'List',
                'verbose':
                utils.parse_rst(
                    _("all %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })
            fields.append({
                'name':
                "%s.count" % field.name,
                'data_type':
                'Integer',
                'verbose':
                utils.parse_rst(
                    _("number of %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })

        # Gather model methods.
        for func_name, func in model.__dict__.items():
            if (inspect.isfunction(func)
                    and len(inspect.getargspec(func)[0]) == 1):
                try:
                    for exclude in MODEL_METHODS_EXCLUDE:
                        if func_name.startswith(exclude):
                            raise StopIteration
                except StopIteration:
                    continue
                verbose = func.__doc__
                if verbose:
                    verbose = utils.parse_rst(utils.trim_docstring(verbose),
                                              'model',
                                              _('model:') + opts.model_name)
                fields.append({
                    'name': func_name,
                    'data_type': get_return_data_type(func_name),
                    'verbose': verbose,
                })

        # Gather related objects
        for rel in opts.related_objects:
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': rel.related_model._meta.app_label,
                'object_name': rel.related_model._meta.object_name,
            }
            accessor = rel.get_accessor_name()
            fields.append({
                'name':
                "%s.all" % accessor,
                'data_type':
                'List',
                'verbose':
                utils.parse_rst(
                    _("all %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })
            fields.append({
                'name':
                "%s.count" % accessor,
                'data_type':
                'Integer',
                'verbose':
                utils.parse_rst(
                    _("number of %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })
        kwargs.update({
            'name': '%s.%s' % (opts.app_label, opts.object_name),
            'summary': title,
            'description': body,
            'fields': fields,
        })
        return super(ModelDetailView, self).get_context_data(**kwargs)
Пример #31
0
    def get_context_data(self, **kwargs):
        model_name = self.kwargs["model_name"]
        # Get the model class.
        try:
            app_config = apps.get_app_config(self.kwargs["app_label"])
        except LookupError:
            raise Http404(_("App %(app_label)r not found") % self.kwargs)
        try:
            model = app_config.get_model(model_name)
        except LookupError:
            raise Http404(
                _("Model %(model_name)r not found in app %(app_label)r") %
                self.kwargs)

        opts = model._meta

        title, body, metadata = utils.parse_docstring(model.__doc__)
        title = title and utils.parse_rst(title, "model",
                                          _("model:") + model_name)
        body = body and utils.parse_rst(body, "model",
                                        _("model:") + model_name)

        # Gather fields/field descriptions.
        fields = []
        for field in opts.fields:
            # ForeignKey is a special case since the field will actually be a
            # descriptor that returns the other object
            if isinstance(field, models.ForeignKey):
                data_type = field.remote_field.model.__name__
                app_label = field.remote_field.model._meta.app_label
                verbose = utils.parse_rst(
                    (_("the related `%(app_label)s.%(data_type)s` object") % {
                        "app_label": app_label,
                        "data_type": data_type,
                    }),
                    "model",
                    _("model:") + data_type,
                )
            else:
                data_type = get_readable_field_data_type(field)
                verbose = field.verbose_name
            fields.append({
                "name": field.name,
                "data_type": data_type,
                "verbose": verbose or "",
                "help_text": field.help_text,
            })

        # Gather many-to-many fields.
        for field in opts.many_to_many:
            data_type = field.remote_field.model.__name__
            app_label = field.remote_field.model._meta.app_label
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                "app_label": app_label,
                "object_name": data_type,
            }
            fields.append({
                "name":
                "%s.all" % field.name,
                "data_type":
                "List",
                "verbose":
                utils.parse_rst(
                    _("all %s") % verbose, "model",
                    _("model:") + opts.model_name),
            })
            fields.append({
                "name":
                "%s.count" % field.name,
                "data_type":
                "Integer",
                "verbose":
                utils.parse_rst(
                    _("number of %s") % verbose,
                    "model",
                    _("model:") + opts.model_name,
                ),
            })

        methods = []
        # Gather model methods.
        for func_name, func in model.__dict__.items():
            if inspect.isfunction(func) or isinstance(
                    func, (cached_property, property)):
                try:
                    for exclude in MODEL_METHODS_EXCLUDE:
                        if func_name.startswith(exclude):
                            raise StopIteration
                except StopIteration:
                    continue
                verbose = func.__doc__
                verbose = verbose and (utils.parse_rst(
                    cleandoc(verbose), "model",
                    _("model:") + opts.model_name))
                # Show properties, cached_properties, and methods without
                # arguments as fields. Otherwise, show as a 'method with
                # arguments'.
                if isinstance(func, (cached_property, property)):
                    fields.append({
                        "name": func_name,
                        "data_type": get_return_data_type(func_name),
                        "verbose": verbose or "",
                    })
                elif (method_has_no_args(func)
                      and not func_accepts_kwargs(func)
                      and not func_accepts_var_args(func)):
                    fields.append({
                        "name": func_name,
                        "data_type": get_return_data_type(func_name),
                        "verbose": verbose or "",
                    })
                else:
                    arguments = get_func_full_args(func)
                    # Join arguments with ', ' and in case of default value,
                    # join it with '='. Use repr() so that strings will be
                    # correctly displayed.
                    print_arguments = ", ".join([
                        "=".join([arg_el[0], *map(repr, arg_el[1:])])
                        for arg_el in arguments
                    ])
                    methods.append({
                        "name": func_name,
                        "arguments": print_arguments,
                        "verbose": verbose or "",
                    })

        # Gather related objects
        for rel in opts.related_objects:
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                "app_label": rel.related_model._meta.app_label,
                "object_name": rel.related_model._meta.object_name,
            }
            accessor = rel.get_accessor_name()
            fields.append({
                "name":
                "%s.all" % accessor,
                "data_type":
                "List",
                "verbose":
                utils.parse_rst(
                    _("all %s") % verbose, "model",
                    _("model:") + opts.model_name),
            })
            fields.append({
                "name":
                "%s.count" % accessor,
                "data_type":
                "Integer",
                "verbose":
                utils.parse_rst(
                    _("number of %s") % verbose,
                    "model",
                    _("model:") + opts.model_name,
                ),
            })
        return super().get_context_data(
            **{
                **kwargs,
                "name": opts.label,
                "summary": title,
                "description": body,
                "fields": fields,
                "methods": methods,
            })
Пример #32
0
 def test_parse_rst_with_docstring_no_leading_line_feed(self):
     title, body, _ = parse_docstring('firstline\n\n    second line')
     with captured_stderr() as stderr:
         self.assertEqual(parse_rst(title, ''), '<p>firstline</p>\n')
         self.assertEqual(parse_rst(body, ''), '<p>second line</p>\n')
     self.assertEqual(stderr.getvalue(), '')
Пример #33
0
    def get_context_data(self, **kwargs):
        model_name = self.kwargs['model_name']
        # Get the model class.
        try:
            app_config = apps.get_app_config(self.kwargs['app_label'])
        except LookupError:
            raise Http404(_("App %(app_label)r not found") % self.kwargs)
        try:
            model = app_config.get_model(model_name)
        except LookupError:
            raise Http404(_("Model %(model_name)r not found in app %(app_label)r") % self.kwargs)

        opts = model._meta

        title, body, metadata = utils.parse_docstring(model.__doc__)
        if title:
            title = utils.parse_rst(title, 'model', _('model:') + model_name)
        if body:
            body = utils.parse_rst(body, 'model', _('model:') + model_name)

        # Gather fields/field descriptions.
        fields = []
        for field in opts.fields:
            # ForeignKey is a special case since the field will actually be a
            # descriptor that returns the other object
            if isinstance(field, models.ForeignKey):
                data_type = field.remote_field.model.__name__
                app_label = field.remote_field.model._meta.app_label
                verbose = utils.parse_rst(
                    (_("the related `%(app_label)s.%(data_type)s` object") % {
                        'app_label': app_label, 'data_type': data_type,
                    }),
                    'model',
                    _('model:') + data_type,
                )
            else:
                data_type = get_readable_field_data_type(field)
                verbose = field.verbose_name
            fields.append({
                'name': field.name,
                'data_type': data_type,
                'verbose': verbose or '',
                'help_text': field.help_text,
            })

        # Gather many-to-many fields.
        for field in opts.many_to_many:
            data_type = field.remote_field.model.__name__
            app_label = field.remote_field.model._meta.app_label
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': app_label,
                'object_name': data_type,
            }
            fields.append({
                'name': "%s.all" % field.name,
                "data_type": 'List',
                'verbose': utils.parse_rst(_("all %s") % verbose, 'model', _('model:') + opts.model_name),
            })
            fields.append({
                'name': "%s.count" % field.name,
                'data_type': 'Integer',
                'verbose': utils.parse_rst(_("number of %s") % verbose, 'model', _('model:') + opts.model_name),
            })

        methods = []
        # Gather model methods.
        for func_name, func in model.__dict__.items():
            if inspect.isfunction(func):
                try:
                    for exclude in MODEL_METHODS_EXCLUDE:
                        if func_name.startswith(exclude):
                            raise StopIteration
                except StopIteration:
                    continue
                verbose = func.__doc__
                if verbose:
                    verbose = utils.parse_rst(utils.trim_docstring(verbose), 'model', _('model:') + opts.model_name)
                # If a method has no arguments, show it as a 'field', otherwise
                # as a 'method with arguments'.
                if func_has_no_args(func) and not func_accepts_kwargs(func) and not func_accepts_var_args(func):
                    fields.append({
                        'name': func_name,
                        'data_type': get_return_data_type(func_name),
                        'verbose': verbose or '',
                    })
                else:
                    arguments = get_func_full_args(func)
                    # Join arguments with ', ' and in case of default value,
                    # join it with '='. Use repr() so that strings will be
                    # correctly displayed.
                    print_arguments = ', '.join([
                        '='.join(list(arg_el[:1]) + [repr(el) for el in arg_el[1:]])
                        for arg_el in arguments
                    ])
                    methods.append({
                        'name': func_name,
                        'arguments': print_arguments,
                        'verbose': verbose or '',
                    })

        # Gather related objects
        for rel in opts.related_objects:
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': rel.related_model._meta.app_label,
                'object_name': rel.related_model._meta.object_name,
            }
            accessor = rel.get_accessor_name()
            fields.append({
                'name': "%s.all" % accessor,
                'data_type': 'List',
                'verbose': utils.parse_rst(_("all %s") % verbose, 'model', _('model:') + opts.model_name),
            })
            fields.append({
                'name': "%s.count" % accessor,
                'data_type': 'Integer',
                'verbose': utils.parse_rst(_("number of %s") % verbose, 'model', _('model:') + opts.model_name),
            })
        kwargs.update({
            'name': '%s.%s' % (opts.app_label, opts.object_name),
            'summary': title,
            'description': body,
            'fields': fields,
            'methods': methods,
        })
        return super().get_context_data(**kwargs)
Пример #34
0
    def get_context_data(self, **kwargs):
        model_name = self.kwargs['model_name']
        # Get the model class.
        try:
            app_config = apps.get_app_config(self.kwargs['app_label'])
        except LookupError:
            raise Http404(_("App %(app_label)r not found") % self.kwargs)
        try:
            model = app_config.get_model(model_name)
        except LookupError:
            raise Http404(
                _("Model %(model_name)r not found in app %(app_label)r") %
                self.kwargs)

        opts = model._meta

        title, body, metadata = utils.parse_docstring(model.__doc__)
        if title:
            title = utils.parse_rst(title, 'model', _('model:') + model_name)
        if body:
            body = utils.parse_rst(body, 'model', _('model:') + model_name)

        # Gather fields/field descriptions.
        fields = []
        for field in opts.fields:
            # ForeignKey is a special case since the field will actually be a
            # descriptor that returns the other object
            if isinstance(field, models.ForeignKey):
                data_type = field.remote_field.model.__name__
                app_label = field.remote_field.model._meta.app_label
                verbose = utils.parse_rst(
                    (_("the related `%(app_label)s.%(data_type)s` object") % {
                        'app_label': app_label,
                        'data_type': data_type,
                    }),
                    'model',
                    _('model:') + data_type,
                )
            else:
                data_type = get_readable_field_data_type(field)
                verbose = field.verbose_name
            fields.append({
                'name': field.name,
                'data_type': data_type,
                'verbose': verbose or '',
                'help_text': field.help_text,
            })

        # Gather many-to-many fields.
        for field in opts.many_to_many:
            data_type = field.remote_field.model.__name__
            app_label = field.remote_field.model._meta.app_label
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': app_label,
                'object_name': data_type,
            }
            fields.append({
                'name':
                "%s.all" % field.name,
                "data_type":
                'List',
                'verbose':
                utils.parse_rst(
                    _("all %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })
            fields.append({
                'name':
                "%s.count" % field.name,
                'data_type':
                'Integer',
                'verbose':
                utils.parse_rst(
                    _("number of %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })

        methods = []
        # Gather model methods.
        for func_name, func in model.__dict__.items():
            if inspect.isfunction(func):
                try:
                    for exclude in MODEL_METHODS_EXCLUDE:
                        if func_name.startswith(exclude):
                            raise StopIteration
                except StopIteration:
                    continue
                verbose = func.__doc__
                if verbose:
                    verbose = utils.parse_rst(utils.trim_docstring(verbose),
                                              'model',
                                              _('model:') + opts.model_name)
                # If a method has no arguments, show it as a 'field', otherwise
                # as a 'method with arguments'.
                if func_has_no_args(func) and not func_accepts_kwargs(
                        func) and not func_accepts_var_args(func):
                    fields.append({
                        'name': func_name,
                        'data_type': get_return_data_type(func_name),
                        'verbose': verbose or '',
                    })
                else:
                    arguments = get_func_full_args(func)
                    # Join arguments with ', ' and in case of default value,
                    # join it with '='. Use repr() so that strings will be
                    # correctly displayed.
                    print_arguments = ', '.join([
                        '='.join(
                            list(arg_el[:1]) + [repr(el) for el in arg_el[1:]])
                        for arg_el in arguments
                    ])
                    methods.append({
                        'name': func_name,
                        'arguments': print_arguments,
                        'verbose': verbose or '',
                    })

        # Gather related objects
        for rel in opts.related_objects:
            verbose = _("related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': rel.related_model._meta.app_label,
                'object_name': rel.related_model._meta.object_name,
            }
            accessor = rel.get_accessor_name()
            fields.append({
                'name':
                "%s.all" % accessor,
                'data_type':
                'List',
                'verbose':
                utils.parse_rst(
                    _("all %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })
            fields.append({
                'name':
                "%s.count" % accessor,
                'data_type':
                'Integer',
                'verbose':
                utils.parse_rst(
                    _("number of %s") % verbose, 'model',
                    _('model:') + opts.model_name),
            })
        kwargs.update({
            'name': '%s.%s' % (opts.app_label, opts.object_name),
            'summary': title,
            'description': body,
            'fields': fields,
            'methods': methods,
        })
        return super(ModelDetailView, self).get_context_data(**kwargs)
Пример #35
0
def dbmodel(request):
    '''
    Generate database model visualization for specified applications
    '''
    def get_id4model(app_label, model):
        '''
         Get id and url for a model
        '''
        url = "../models/" + app_label + "." + model + "/"
        return url

    graph_settings = getattr(settings, 'DBMODEL_SETTINGS', {})
    apps = graph_settings.get('apps', [])

    #pylint: disable=E1101
    models = ContentType.objects.filter(app_label__in=apps)

    nodes = []
    edges = []

    for model in models:

        id_ = get_id4model(model.app_label, model.model)
        if not model.model_class():
            continue

        doc_ = model.model_class().__doc__
        title, body, metadata = utils.parse_docstring(doc_)
        if title:
            title = utils.parse_rst(title, None, None)
        if body:
            body = utils.parse_rst(body, None, None)

        model.rstdoc = title + body

        label = "%s" % (model.model)
        fields = [f for f in model.model_class()._meta.fields]
        many = [f for f in model.model_class()._meta.many_to_many]
        # if graph_settings.get('show_fields', True):
        #     label += "\n%s\n"%("-"*len(model.model))
        #     label += "\n".join([str(f.name) for f in fields])

        fields_table = '''
<th><td><span style="background-color:#eeee00;color:#0000ff;font-size:22px">%s</span></td></th>
''' % model.model

        for field in fields:
            color = '#000000'
            if field.unique:
                color = '#0000ff'
            fields_table += '''
        <tr><td><span style="color:%s;">%s</span></td></tr>
                ''' % (color, field.name)

        row_height = 14
        table_height = row_height * (len(fields) + 3) * 1.8

        imagesrc = '''
<svg xmlns="http://www.w3.org/2000/svg" width="256px" height="''' + str(
            table_height) + '''px">
<rect x="0" y="0" width="100%" height="100%" fill="#ffffff" stroke-width="20" stroke="#ffffff" ></rect>
    <foreignObject x="10" y="10" width="100%" height="100%">
    <div xmlns="http://www.w3.org/1999/xhtml" style="font-size:''' + str(
                row_height) + '''px">
    <table> ''' + fields_table + ''' </table> 
    </div>
    </foreignObject>
</svg>
'''

        edge_color = {'inherit': 'from'}

        for field_ in fields + many:
            if field_.remote_field:
                rf_ = field_.remote_field
                metaref = rf_.model._meta
                if metaref.app_label != model.app_label:
                    edge_color = {'inherit': 'both'}

                edge = {
                    'from': id_,
                    'to': get_id4model(metaref.app_label, metaref.model_name),
                    # "%s__%s" % (metaref.app_label, metaref.model_name),
                    'color': edge_color,
                }

                if str(field_.name).endswith('_ptr'):
                    #fields that end in _ptr are pointing to a parent object
                    edge.update({
                        'arrows': {
                            'to': {
                                'scaleFactor': 0.75
                            }
                        },  #needed to draw from-to
                        'font': {
                            'align': 'middle'
                        },
                        'label': 'is a',
                        'dashes': True
                    })
                elif isinstance(field_, related.ForeignKey):
                    edge.update({'arrows': {'to': {'scaleFactor': 0.75}}})
                elif isinstance(field_, related.OneToOneField):
                    edge.update({'font': {'align': 'middle'}, 'label': '|'})
                elif isinstance(field_, related.ManyToManyField):
                    edge.update({
                        'color': {
                            'color': 'gray'
                        },
                        'arrows': {
                            'to': {
                                'scaleFactor': 1
                            },
                            'from': {
                                'scaleFactor': 1
                            }
                        },
                    })

                edges.append(edge)

        nodes.append({
            'id':
            id_,
            'label':
            label,
            'imagesrc':
            imagesrc,
            'shape':
            'image',
            'size':
            table_height * 1.8,
            'group':
            model.app_label,
            'title':
            get_template("dbmodel/dbnode.html").render(
                # Context(
                {
                    'model': model,
                    'fields': fields,
                }
                # )
            ),
        })

    data = {'nodes': json.dumps(nodes), 'edges': json.dumps(edges)}
    return render(request, 'dbmodel/dbdiagram.html', data)