Exemple #1
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)
    return render_to_response('admin_doc/view_detail.html', {
        'root_path': urlresolvers.reverse('admin:index'),
        'name': view,
        'summary': title,
        'body': body,
        'meta': metadata,
    },
                              context_instance=RequestContext(request))
Exemple #2
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))
Exemple #3
0
 def get_context_data(self, **kwargs):
     tags = []
     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 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)
                 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)
 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)
Exemple #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)
Exemple #6
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)
Exemple #7
0
 def get_context_data(self, **kwargs):
     tags = []
     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 tag_name, tag_func in library.tags.items():
                 title, body, metadata = utils.parse_docstring(tag_func.__doc__)
                 title = title and utils.parse_rst(
                     title, "tag", _("tag:") + tag_name
                 )
                 body = body and utils.parse_rst(body, "tag", _("tag:") + tag_name)
                 for key in metadata:
                     metadata[key] = utils.parse_rst(
                         metadata[key], "tag", _("tag:") + tag_name
                     )
                 tag_library = module_name.split(".")[-1]
                 tags.append(
                     {
                         "name": tag_name,
                         "title": title,
                         "body": body,
                         "meta": metadata,
                         "library": tag_library,
                     }
                 )
     return super().get_context_data(**{**kwargs, "tags": tags})
Exemple #8
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)
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
Exemple #10
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))
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 list(template.libraries.items()):
        for tag_name, tag_func in list(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))
Exemple #12
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)
Exemple #13
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),
    )
Exemple #14
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))
Exemple #15
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': urlresolvers.reverse('admin:index'),
        'filters': filters
    }, context_instance=RequestContext(request))
Exemple #16
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__)
                 title = title and utils.parse_rst(
                     title, 'filter',
                     _('filter:') + filter_name)
                 body = body and 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,
                 })
     return super().get_context_data(**{**kwargs, 'filters': filters})
Exemple #17
0
 def test_parse_rst(self):
     """
     parse_rst() should use `cmsreference` as the default role.
     """
     markup = '<p><a class="reference external" href="/admindocs/%s">title</a></p>\n'
     self.assertEqual(parse_rst('`title`', 'model'), markup % 'models/title/')
     self.assertEqual(parse_rst('`title`', 'view'), markup % 'views/title/')
     self.assertEqual(parse_rst('`title`', 'template'), markup % 'templates/title/')
     self.assertEqual(parse_rst('`title`', 'filter'), markup % 'filters/#title')
     self.assertEqual(parse_rst('`title`', 'tag'), markup % 'tags/#title')
Exemple #18
0
 def test_parse_rst(self):
     """
     parse_rst() should use `cmsreference` as the default role.
     """
     markup = '<p><a class="reference external" href="/admindocs/%s">title</a></p>\n'
     self.assertEqual(parse_rst('`title`', 'model'), markup % 'models/title/')
     self.assertEqual(parse_rst('`title`', 'view'), markup % 'views/title/')
     self.assertEqual(parse_rst('`title`', 'template'), markup % 'templates/title/')
     self.assertEqual(parse_rst('`title`', 'filter'), markup % 'filters/#title')
     self.assertEqual(parse_rst('`title`', 'tag'), markup % 'tags/#title')
Exemple #19
0
 def test_parse_rst(self):
     """
     parse_rst() should use `cmsreference` as the default role.
     """
     markup = '<p><a class="reference external" href="/admindocs/%s">title</a></p>\n'
     self.assertEqual(parse_rst("`title`", "model"), markup % "models/title/")
     self.assertEqual(parse_rst("`title`", "view"), markup % "views/title/")
     self.assertEqual(parse_rst("`title`", "template"), markup % "templates/title/")
     self.assertEqual(parse_rst("`title`", "filter"), markup % "filters/#title")
     self.assertEqual(parse_rst("`title`", "tag"), markup % "tags/#title")
Exemple #20
0
 def test_parse_rst(self):
     """
     Tests that ``django.contrib.admindocs.utils.parse_rst`` uses
     ``cmsreference`` as the default role.
     """
     markup = '<p><a class="reference external" href="/admindocs/%s">' "title</a></p>\n"
     self.assertEqual(utils.parse_rst("`title`", "model"), markup % "models/title/")
     self.assertEqual(utils.parse_rst("`title`", "view"), markup % "views/title/")
     self.assertEqual(utils.parse_rst("`title`", "template"), markup % "templates/title/")
     self.assertEqual(utils.parse_rst("`title`", "filter"), markup % "filters/#title")
     self.assertEqual(utils.parse_rst("`title`", "tag"), markup % "tags/#title")
Exemple #21
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}
     )
Exemple #22
0
def generate_docs(request, app='tiger'):
    """
    Generate documentation from the models in the specified app
    """
    #try:
    model_set = get_models(models.get_app(app))
    #except:
    #    return Http404

    context = {}
    context['models'] = []
    for model in model_set:
        m = {}
        m['name'] = model.__name__
        m['attrs'] = []
        m['desc'] = utils.parse_rst(
            utils.parse_docstring(model.__doc__ or '')[0], '')
        for f in django_db_fields_source_order(model):
            m['attrs'].append({
                'name': f.name,
                'type': f.db_type(),
                'null': f.null and 'NULL' or 'NOT NULL',
                'desc': f.help_text or f.verbose_name,
                'role': django_field_to_role(f)
            })

        context['models'].append(m)

    return render_to_response('model_docs.html',
                              context_instance=RequestContext(
                                  request, context))
Exemple #23
0
 def test_parse_rst(self):
     """
     Tests that ``django.contrib.admindocs.utils.parse_rst`` uses
     ``cmsreference`` as the default role.
     """
     markup = ('<p><a class="reference external" href="/admindocs/%s">'
               'title</a></p>\n')
     self.assertEqual(utils.parse_rst('`title`', 'model'),
                      markup % 'models/title/')
     self.assertEqual(utils.parse_rst('`title`', 'view'),
                      markup % 'views/title/')
     self.assertEqual(utils.parse_rst('`title`', 'template'),
                      markup % 'templates/title/')
     self.assertEqual(utils.parse_rst('`title`', 'filter'),
                      markup % 'filters/#title')
     self.assertEqual(utils.parse_rst('`title`', 'tag'),
                      markup % 'tags/#title')
Exemple #24
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,
     })
Exemple #25
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)
Exemple #26
0
 def test_parse_rst(self):
     """
     Tests that ``django.contrib.admindocs.utils.parse_rst`` uses
     ``cmsreference`` as the default role.
     """
     markup = ('<p><a class="reference external" href="/admindocs/%s">'
               'title</a></p>\n')
     self.assertEqual(utils.parse_rst('`title`', 'model'),
                      markup % 'models/title/')
     self.assertEqual(utils.parse_rst('`title`', 'view'),
                      markup % 'views/title/')
     self.assertEqual(utils.parse_rst('`title`', 'template'),
                      markup % 'templates/title/')
     self.assertEqual(utils.parse_rst('`title`', 'filter'),
                      markup % 'filters/#title')
     self.assertEqual(utils.parse_rst('`title`', 'tag'),
                      markup % 'tags/#title')
Exemple #27
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,
     })
Exemple #28
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)
Exemple #29
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)
Exemple #30
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)
Exemple #31
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)
Exemple #32
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))
Exemple #33
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)
Exemple #34
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)
Exemple #35
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)
Exemple #36
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))
Exemple #37
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)
Exemple #38
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)
Exemple #39
0
    def get_context_data(self, **kwargs):
        # Get the model class.
        try:
            app_mod = models.get_app(self.kwargs['app_label'])
        except ImproperlyConfigured:
            raise Http404(_("App %r not found") % self.kwargs['app_label'])
        model = None
        for m in models.get_models(app_mod):
            if m._meta.model_name == self.kwargs['model_name']:
                model = m
                break
        if model is None:
            raise Http404(
                _("Model %(model_name)r not found in app %(app_label)r") % {
                    'model_name': self.kwargs['model_name'],
                    'app_label': self.kwargs['app_label']
                })

        opts = model._meta

        # 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),
            # Translators: %s is an object type name
            'summary': _("Attributes on %s objects") % opts.object_name,
            'description': model.__doc__,
            'fields': fields,
        })
        return super(ModelDetailView, self).get_context_data(**kwargs)
Exemple #40
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)
Exemple #41
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.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)
Exemple #42
0
    def get_context_data(self, **kwargs):
        # 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(self.kwargs['model_name'])
        except LookupError:
            raise Http404(_("Model %(model_name)r not found in app %(app_label)r") % self.kwargs)

        opts = model._meta

        # 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),
            # Translators: %s is an object type name
            'summary': _("Attributes on %s objects") % opts.object_name,
            'description': model.__doc__,
            'fields': fields,
        })
        return super(ModelDetailView, self).get_context_data(**kwargs)
Exemple #43
0
 def test_initial_header_level(self):
     header = 'should be h3...\n\nHeader\n------\n'
     output = parse_rst(header, 'header')
     self.assertIn('<h3>Header</h3>', output)
Exemple #44
0
 def test_initial_header_level(self):
     header = "should be h3...\n\nHeader\n------\n"
     output = parse_rst(header, "header")
     self.assertIn("<h3>Header</h3>", output)
Exemple #45
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)
Exemple #46
0
def model_detail(request, app_label, model_name):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)
        
    # Get the model class.
    try:
        app_mod = models.get_app(app_label)
    except ImproperlyConfigured:
        raise Http404, _("App %r not found") % app_label
    model = None
    for m in models.get_models(app_mod):
        if m._meta.object_name.lower() == model_name:
            model = m
            break
    if model is None:
        raise Http404, _("Model %(model_name)r not found in app %(app_label)r") % {'model_name': model_name, 'app_label': app_label}

    opts = model._meta

    # 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 = related_object_name = 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 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.module_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():
        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.module_name),
        })
        fields.append({
            'name'      : "%s.count" % accessor,
            'data_type' : 'Integer',
            'verbose'   : utils.parse_rst(_("number of %s") % verbose , 'model', _('model:') + opts.module_name),
        })
    return render_to_response('admin_doc/model_detail.html', {
        'root_path': get_root_path(),
        'name': '%s.%s' % (opts.app_label, opts.object_name),
        'summary': _("Fields on %s objects") % opts.object_name,
        'description': model.__doc__,
        'fields': fields,
    }, context_instance=RequestContext(request))
Exemple #47
0
def model_detail(request, app_label, model_name):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    # Get the model class.
    try:
        app_mod = models.get_app(app_label)
    except ImproperlyConfigured:
        raise Http404, _("App %r not found") % app_label
    model = None
    for m in models.get_models(app_mod):
        if m._meta.object_name.lower() == model_name:
            model = m
            break
    if model is None:
        raise Http404, _(
            "Model %(model_name)r not found in app %(app_label)r") % {
                'model_name': model_name,
                'app_label': app_label
            }

    opts = model._meta

    # 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 = related_object_name = 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 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.module_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():
        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.module_name),
        })
        fields.append({
            'name':
            "%s.count" % accessor,
            'data_type':
            'Integer',
            'verbose':
            utils.parse_rst(
                _("number of %s") % verbose, 'model',
                _('model:') + opts.module_name),
        })
    return render_to_response(
        'admin_doc/model_detail.html', {
            'root_path': get_root_path(),
            'name': '%s.%s' % (opts.app_label, opts.object_name),
            'summary': _("Fields on %s objects") % opts.object_name,
            'description': model.__doc__,
            'fields': fields,
        },
        context_instance=RequestContext(request))
def custom_model_detail(request, app_label, model_name):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    # Get the model class.
    try:
        app_mod = models.get_app(app_label)
    except ImproperlyConfigured:
        raise Http404(_("App %r not found") % app_label)
    model = None
    for m in models.get_models(app_mod):
        if m._meta.model_name == model_name:
            model = m
            break
    if model is None:
        raise Http404(
            _("Model %(model_name)r not found in app %(app_label)r") % {
                'model_name': model_name,
                'app_label': app_label
            })

    opts = model._meta

    # Gather fields/field descriptions.
    fields = []
    fk_fields = []
    # field_hash = {}
    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)
            fk_fields.append(field.name)
        else:
            data_type = get_readable_field_data_type(field)
            verbose = field.verbose_name

        # field_hash[field.name] = field

        is_meta = field.name.startswith('_')

        if is_meta == False:
            fields.append({
                'name': field.name,
                'data_type': data_type,
                'verbose': verbose,
                'help_text': field.help_text,
            })

    m2m_fields = []
    # 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_all = _(
            "%(verbose_name)s. All related `%(app_label)s.%(object_name)s` objects"
        ) % {
            'verbose_name': field.verbose_name,
            'app_label': app_label,
            'object_name': data_type
        }
        verbose_count = _(
            "Number of related `%(app_label)s.%(object_name)s` objects") % {
                'app_label': app_label,
                'object_name': data_type
            }

        #verbose_all = utils.parse_rst(_("%s%s"%(verbose_description, verbose)) , 'model', _('model:') + opts.model_name),

        fields.append({
            'name':
            "%s.all" % field.name,
            "data_type":
            'List',
            'verbose':
            utils.parse_rst(verbose_all, 'model',
                            _('model:') + opts.model_name),
        })
        fields.append({
            'name':
            "%s.count" % field.name,
            'data_type':
            'Integer',
            'verbose':
            utils.parse_rst(verbose_count, 'model',
                            _('model:') + opts.model_name),
        })
        m2m_fields.append(field.name)

    # 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),
        })
        m2m_fields.append(accessor)

    # 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)
            else:
                verbose = ''

            data_type = get_return_data_type(func_name).strip()
            if data_type == '':
                data_type = 'Function'

            fields.append({
                'name': func_name,
                'data_type': data_type,
                'verbose': verbose,
            })
        else:

            verbose = func.__doc__

            ignore_list = [
                'DoesNotExist',
                'MultipleObjectsReturned',
                'objects',
                'unique_together',
            ]

            is_fk = func_name in fk_fields
            is_m2m = func_name in m2m_fields
            is_set = func_name.endswith('_set')
            is_display = func_name.endswith('_display')
            is_uppercase = func_name.isupper()
            is_meta = func_name.startswith('_')
            is_ignore = func_name in ignore_list
            is_static_method = False if not verbose else 'staticmethod' in verbose.lower(
            )

            add_item = is_fk == False \
                and is_set == False \
                and is_display == False \
                and is_uppercase == False \
                and is_meta == False \
                and is_ignore == False \
                and is_m2m == False \
                and is_static_method == False

            if add_item:

                if verbose:
                    verbose = utils.parse_rst(utils.trim_docstring(verbose),
                                              'model',
                                              _('model:') + opts.model_name)
                else:
                    verbose = ''
                data_type = get_return_data_type(func_name).strip()
                if data_type == '':
                    data_type = 'Property'

                fields.append({
                    'name': func_name,
                    'data_type': data_type,
                    'verbose': verbose,
                })

    return render_to_response(
        'admin_doc/model_detail.html',
        {
            'root_path':
            urlresolvers.reverse('admin:index'),
            'name':
            '%s.%s' % (opts.app_label, opts.object_name),
            # Translators: %s is an object type name
            'summary':
            _("Attributes on %s objects") % opts.object_name,
            'description':
            utils.parse_rst(model.__doc__, 'model',
                            _('model:') + opts.model_name),
            'fields':
            fields,
        },
        context_instance=RequestContext(request))
Exemple #49
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,
            })
def custom_model_detail(request, app_label, model_name):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    # Get the model class.
    try:
        app_mod = models.get_app(app_label)
    except ImproperlyConfigured:
        raise Http404(_("App %r not found") % app_label)
    model = None
    for m in models.get_models(app_mod):
        if m._meta.model_name == model_name:
            model = m
            break
    if model is None:
        raise Http404(_("Model %(model_name)r not found in app %(app_label)r") % {'model_name': model_name, 'app_label': app_label})

    opts = model._meta

    # Gather fields/field descriptions.
    fields = []
    fk_fields = []
    # field_hash = {}
    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)
            fk_fields.append(field.name)
        else:
            data_type = get_readable_field_data_type(field)
            verbose = field.verbose_name

        # field_hash[field.name] = field

        is_meta = field.name.startswith('_')

        if is_meta==False:
            fields.append({
                'name': field.name,
                'data_type': data_type,
                'verbose': verbose,
                'help_text': field.help_text,
            })

    m2m_fields = []
    # 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_all = _("%(verbose_name)s. All related `%(app_label)s.%(object_name)s` objects") % {'verbose_name':field.verbose_name, 'app_label': app_label, 'object_name': data_type}
        verbose_count = _("Number of related `%(app_label)s.%(object_name)s` objects") % {'app_label': app_label, 'object_name': data_type}
        
        #verbose_all = utils.parse_rst(_("%s%s"%(verbose_description, verbose)) , 'model', _('model:') + opts.model_name),

        fields.append({
            'name': "%s.all" % field.name,
            "data_type": 'List',
            'verbose': utils.parse_rst(verbose_all , 'model', _('model:') + opts.model_name),
        })
        fields.append({
            'name'      : "%s.count" % field.name,
            'data_type' : 'Integer',
            'verbose'   : utils.parse_rst(verbose_count , 'model', _('model:') + opts.model_name),
        })
        m2m_fields.append(field.name)
        

    # 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),
        })
        m2m_fields.append(accessor)
        

    # 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)
            else:
                verbose = ''
            
            data_type = get_return_data_type(func_name).strip()
            if data_type == '':
                data_type = 'Function'

            fields.append({
                'name': func_name,
                'data_type': data_type,
                'verbose': verbose,
            })
        else:
            
            verbose = func.__doc__

            ignore_list = ['DoesNotExist', 'MultipleObjectsReturned', 'objects', 'unique_together', ]

            is_fk = func_name in fk_fields
            is_m2m = func_name in m2m_fields
            is_set = func_name.endswith('_set')
            is_display = func_name.endswith('_display')
            is_uppercase = func_name.isupper()
            is_meta = func_name.startswith('_')
            is_ignore = func_name in ignore_list
            is_static_method = False if not verbose else 'staticmethod' in verbose.lower()

            add_item = is_fk == False \
                and is_set == False \
                and is_display == False \
                and is_uppercase == False \
                and is_meta == False \
                and is_ignore == False \
                and is_m2m == False \
                and is_static_method == False

            if add_item:
                
                if verbose:
                    verbose = utils.parse_rst(utils.trim_docstring(verbose), 'model', _('model:') + opts.model_name)
                else:
                    verbose = ''
                data_type = get_return_data_type(func_name).strip()
                if data_type == '':
                    data_type = 'Property'
            
                fields.append({
                    'name': func_name,
                    'data_type': data_type,
                    'verbose': verbose,                    
                })


    
    return render_to_response('admin_doc/model_detail.html', {
        'root_path': urlresolvers.reverse('admin:index'),
        'name': '%s.%s' % (opts.app_label, opts.object_name),
        # Translators: %s is an object type name
        'summary': _("Attributes on %s objects") % opts.object_name,
        'description': utils.parse_rst(model.__doc__ , 'model', _('model:') + opts.model_name),
        'fields': fields,
    }, context_instance=RequestContext(request))
Exemple #51
0
 def test_initial_header_level(self):
     header = 'should be h3...\n\nHeader\n------\n'
     output = parse_rst(header, 'header')
     self.assertIn('<h3>Header</h3>', output)
    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)
Exemple #53
0
def model_detail(request, app_label, model_name):
    if not utils.docutils_is_available:
        return missing_docutils_page(request)

    # Get the model class.
    try:
        app_mod = models.get_app(app_label)
    except ImproperlyConfigured:
        raise Http404(_("App %r not found") % app_label)
    model = None
    for m in models.get_models(app_mod):
        if m._meta.object_name.lower() == model_name:
            model = m
            break
    if model is None:
        raise Http404(
            _("Model %(model_name)r not found in app %(app_label)r")
            % {"model_name": model_name, "app_label": app_label}
        )

    opts = model._meta

    # 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 = related_object_name = 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 = related_object_name = 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.module_name),
            }
        )
        fields.append(
            {
                "name": "%s.count" % field.name,
                "data_type": "Integer",
                "verbose": utils.parse_rst(_("number of %s") % verbose, "model", _("model:") + opts.module_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.module_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.module_name),
            }
        )
        fields.append(
            {
                "name": "%s.count" % accessor,
                "data_type": "Integer",
                "verbose": utils.parse_rst(_("number of %s") % verbose, "model", _("model:") + opts.module_name),
            }
        )
    return render_to_response(
        "admin_doc/model_detail.html",
        {
            "root_path": get_root_path(),
            "name": "%s.%s" % (opts.app_label, opts.object_name),
            "summary": _("Fields on %s objects") % opts.object_name,
            "description": model.__doc__,
            "fields": fields,
        },
        context_instance=RequestContext(request),
    )
Exemple #54
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(), '')
Exemple #55
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)
import inspect