|
@@ -14,7 +14,10 @@ from django.db import models
|
|
|
from django.http import Http404
|
|
|
from django.template.engine import Engine
|
|
|
from django.utils.decorators import method_decorator
|
|
|
-from django.utils.inspect import func_has_no_args
|
|
|
+from django.utils.inspect import (
|
|
|
+ func_accepts_kwargs, func_accepts_var_args, func_has_no_args,
|
|
|
+ get_func_full_args,
|
|
|
+)
|
|
|
from django.utils.translation import ugettext as _
|
|
|
from django.views.generic import TemplateView
|
|
|
|
|
@@ -219,7 +222,7 @@ class ModelDetailView(BaseAdminDocsView):
|
|
|
fields.append({
|
|
|
'name': field.name,
|
|
|
'data_type': data_type,
|
|
|
- 'verbose': verbose,
|
|
|
+ 'verbose': verbose or '',
|
|
|
'help_text': field.help_text,
|
|
|
})
|
|
|
|
|
@@ -242,9 +245,10 @@ class ModelDetailView(BaseAdminDocsView):
|
|
|
'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) and func_has_no_args(func):
|
|
|
+ if inspect.isfunction(func):
|
|
|
try:
|
|
|
for exclude in MODEL_METHODS_EXCLUDE:
|
|
|
if func_name.startswith(exclude):
|
|
@@ -254,11 +258,29 @@ class ModelDetailView(BaseAdminDocsView):
|
|
|
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,
|
|
|
- })
|
|
|
+ # 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)
|
|
|
+ print_arguments = arguments
|
|
|
+ # 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:
|
|
@@ -282,6 +304,7 @@ class ModelDetailView(BaseAdminDocsView):
|
|
|
'summary': title,
|
|
|
'description': body,
|
|
|
'fields': fields,
|
|
|
+ 'methods': methods,
|
|
|
})
|
|
|
return super(ModelDetailView, self).get_context_data(**kwargs)
|
|
|
|