Started attackign the next flake8 violation
This commit is contained in:
parent
a023a84c06
commit
726ded5708
|
@ -1,5 +1,6 @@
|
||||||
VERSION = (1, 7, 0, 'alpha', 0)
|
VERSION = (1, 7, 0, 'alpha', 0)
|
||||||
|
|
||||||
|
|
||||||
def get_version(*args, **kwargs):
|
def get_version(*args, **kwargs):
|
||||||
# Don't litter django/__init__.py with all the get_version stuff.
|
# Don't litter django/__init__.py with all the get_version stuff.
|
||||||
# Only import if it's actually called.
|
# Only import if it's actually called.
|
||||||
|
|
|
@ -12,6 +12,7 @@ import os
|
||||||
import pstats
|
import pstats
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def gather_stats(p):
|
def gather_stats(p):
|
||||||
profiles = {}
|
profiles = {}
|
||||||
for f in os.listdir(p):
|
for f in os.listdir(p):
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
|
||||||
|
|
||||||
def unique_messages():
|
def unique_messages():
|
||||||
basedir = None
|
basedir = None
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,7 @@ handler403 = 'django.views.defaults.permission_denied'
|
||||||
handler404 = 'django.views.defaults.page_not_found'
|
handler404 = 'django.views.defaults.page_not_found'
|
||||||
handler500 = 'django.views.defaults.server_error'
|
handler500 = 'django.views.defaults.server_error'
|
||||||
|
|
||||||
|
|
||||||
def include(arg, namespace=None, app_name=None):
|
def include(arg, namespace=None, app_name=None):
|
||||||
if isinstance(arg, tuple):
|
if isinstance(arg, tuple):
|
||||||
# callable returning a namespace hint
|
# callable returning a namespace hint
|
||||||
|
@ -39,6 +40,7 @@ def include(arg, namespace=None, app_name=None):
|
||||||
|
|
||||||
return (urlconf_module, app_name, namespace)
|
return (urlconf_module, app_name, namespace)
|
||||||
|
|
||||||
|
|
||||||
def patterns(prefix, *args):
|
def patterns(prefix, *args):
|
||||||
pattern_list = []
|
pattern_list = []
|
||||||
for t in args:
|
for t in args:
|
||||||
|
@ -49,6 +51,7 @@ def patterns(prefix, *args):
|
||||||
pattern_list.append(t)
|
pattern_list.append(t)
|
||||||
return pattern_list
|
return pattern_list
|
||||||
|
|
||||||
|
|
||||||
def url(regex, view, kwargs=None, name=None, prefix=''):
|
def url(regex, view, kwargs=None, name=None, prefix=''):
|
||||||
if isinstance(view, (list, tuple)):
|
if isinstance(view, (list, tuple)):
|
||||||
# For include(...) processing.
|
# For include(...) processing.
|
||||||
|
|
|
@ -2,6 +2,7 @@ from django.conf import settings
|
||||||
from django.conf.urls import patterns, url
|
from django.conf.urls import patterns, url
|
||||||
from django.core.urlresolvers import LocaleRegexURLResolver
|
from django.core.urlresolvers import LocaleRegexURLResolver
|
||||||
|
|
||||||
|
|
||||||
def i18n_patterns(prefix, *args):
|
def i18n_patterns(prefix, *args):
|
||||||
"""
|
"""
|
||||||
Adds the language code prefix to every URL pattern within this
|
Adds the language code prefix to every URL pattern within this
|
||||||
|
|
|
@ -1,8 +1,10 @@
|
||||||
import re
|
import re
|
||||||
|
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django.conf.urls import patterns, url
|
from django.conf.urls import patterns, url
|
||||||
from django.core.exceptions import ImproperlyConfigured
|
from django.core.exceptions import ImproperlyConfigured
|
||||||
|
|
||||||
|
|
||||||
def static(prefix, view='django.views.static.serve', **kwargs):
|
def static(prefix, view='django.views.static.serve', **kwargs):
|
||||||
"""
|
"""
|
||||||
Helper function to return a URL pattern for serving files in debug mode.
|
Helper function to return a URL pattern for serving files in debug mode.
|
||||||
|
|
|
@ -11,6 +11,7 @@ from django.template.response import TemplateResponse
|
||||||
from django.utils.encoding import force_text
|
from django.utils.encoding import force_text
|
||||||
from django.utils.translation import ugettext_lazy, ugettext as _
|
from django.utils.translation import ugettext_lazy, ugettext as _
|
||||||
|
|
||||||
|
|
||||||
def delete_selected(modeladmin, request, queryset):
|
def delete_selected(modeladmin, request, queryset):
|
||||||
"""
|
"""
|
||||||
Default action which deletes the selected objects.
|
Default action which deletes the selected objects.
|
||||||
|
|
|
@ -6,6 +6,7 @@ import sys
|
||||||
|
|
||||||
js_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'static', 'admin', 'js')
|
js_path = os.path.join(os.path.dirname(os.path.dirname(__file__)), 'static', 'admin', 'js')
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
usage = "usage: %prog [file1..fileN]"
|
usage = "usage: %prog [file1..fileN]"
|
||||||
description = """With no file paths given this script will automatically
|
description = """With no file paths given this script will automatically
|
||||||
|
|
|
@ -16,6 +16,7 @@ from django.contrib.admin.utils import (get_model_from_relation,
|
||||||
reverse_field_path, get_limit_choices_to_from_path, prepare_lookup_value)
|
reverse_field_path, get_limit_choices_to_from_path, prepare_lookup_value)
|
||||||
from django.contrib.admin.options import IncorrectLookupParameters
|
from django.contrib.admin.options import IncorrectLookupParameters
|
||||||
|
|
||||||
|
|
||||||
class ListFilter(object):
|
class ListFilter(object):
|
||||||
title = None # Human-readable title to appear in the right sidebar.
|
title = None # Human-readable title to appear in the right sidebar.
|
||||||
template = 'admin/filter.html'
|
template = 'admin/filter.html'
|
||||||
|
|
|
@ -19,6 +19,7 @@ from django.conf import settings
|
||||||
|
|
||||||
ACTION_CHECKBOX_NAME = '_selected_action'
|
ACTION_CHECKBOX_NAME = '_selected_action'
|
||||||
|
|
||||||
|
|
||||||
class ActionForm(forms.Form):
|
class ActionForm(forms.Form):
|
||||||
action = forms.ChoiceField(label=_('Action:'))
|
action = forms.ChoiceField(label=_('Action:'))
|
||||||
select_across = forms.BooleanField(label='', required=False, initial=0,
|
select_across = forms.BooleanField(label='', required=False, initial=0,
|
||||||
|
@ -26,6 +27,7 @@ class ActionForm(forms.Form):
|
||||||
|
|
||||||
checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False)
|
checkbox = forms.CheckboxInput({'class': 'action-select'}, lambda value: False)
|
||||||
|
|
||||||
|
|
||||||
class AdminForm(object):
|
class AdminForm(object):
|
||||||
def __init__(self, form, fieldsets, prepopulated_fields, readonly_fields=None, model_admin=None):
|
def __init__(self, form, fieldsets, prepopulated_fields, readonly_fields=None, model_admin=None):
|
||||||
self.form, self.fieldsets = form, normalize_fieldsets(fieldsets)
|
self.form, self.fieldsets = form, normalize_fieldsets(fieldsets)
|
||||||
|
@ -53,6 +55,7 @@ class AdminForm(object):
|
||||||
return media
|
return media
|
||||||
media = property(_media)
|
media = property(_media)
|
||||||
|
|
||||||
|
|
||||||
class Fieldset(object):
|
class Fieldset(object):
|
||||||
def __init__(self, form, name=None, readonly_fields=(), fields=(), classes=(),
|
def __init__(self, form, name=None, readonly_fields=(), fields=(), classes=(),
|
||||||
description=None, model_admin=None):
|
description=None, model_admin=None):
|
||||||
|
@ -77,6 +80,7 @@ class Fieldset(object):
|
||||||
for field in self.fields:
|
for field in self.fields:
|
||||||
yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin)
|
yield Fieldline(self.form, field, self.readonly_fields, model_admin=self.model_admin)
|
||||||
|
|
||||||
|
|
||||||
class Fieldline(object):
|
class Fieldline(object):
|
||||||
def __init__(self, form, field, readonly_fields=None, model_admin=None):
|
def __init__(self, form, field, readonly_fields=None, model_admin=None):
|
||||||
self.form = form # A django.forms.Form instance
|
self.form = form # A django.forms.Form instance
|
||||||
|
@ -103,6 +107,7 @@ class Fieldline(object):
|
||||||
def errors(self):
|
def errors(self):
|
||||||
return mark_safe('\n'.join(self.form[f].errors.as_ul() for f in self.fields if f not in self.readonly_fields).strip('\n'))
|
return mark_safe('\n'.join(self.form[f].errors.as_ul() for f in self.fields if f not in self.readonly_fields).strip('\n'))
|
||||||
|
|
||||||
|
|
||||||
class AdminField(object):
|
class AdminField(object):
|
||||||
def __init__(self, form, field, is_first):
|
def __init__(self, form, field, is_first):
|
||||||
self.field = form[field] # A django.forms.BoundField instance
|
self.field = form[field] # A django.forms.BoundField instance
|
||||||
|
@ -128,6 +133,7 @@ class AdminField(object):
|
||||||
def errors(self):
|
def errors(self):
|
||||||
return mark_safe(self.field.errors.as_ul())
|
return mark_safe(self.field.errors.as_ul())
|
||||||
|
|
||||||
|
|
||||||
class AdminReadonlyField(object):
|
class AdminReadonlyField(object):
|
||||||
def __init__(self, form, field, is_first, model_admin=None):
|
def __init__(self, form, field, is_first, model_admin=None):
|
||||||
label = label_for_field(field, form._meta.model, model_admin)
|
label = label_for_field(field, form._meta.model, model_admin)
|
||||||
|
@ -183,6 +189,7 @@ class AdminReadonlyField(object):
|
||||||
result_repr = display_for_field(value, f)
|
result_repr = display_for_field(value, f)
|
||||||
return conditional_escape(result_repr)
|
return conditional_escape(result_repr)
|
||||||
|
|
||||||
|
|
||||||
class InlineAdminFormSet(object):
|
class InlineAdminFormSet(object):
|
||||||
"""
|
"""
|
||||||
A wrapper around an inline formset for use in the admin system.
|
A wrapper around an inline formset for use in the admin system.
|
||||||
|
@ -238,6 +245,7 @@ class InlineAdminFormSet(object):
|
||||||
return media
|
return media
|
||||||
media = property(_media)
|
media = property(_media)
|
||||||
|
|
||||||
|
|
||||||
class InlineAdminForm(AdminForm):
|
class InlineAdminForm(AdminForm):
|
||||||
"""
|
"""
|
||||||
A wrapper around an inline form for use in the admin system.
|
A wrapper around an inline form for use in the admin system.
|
||||||
|
@ -300,6 +308,7 @@ class InlineAdminForm(AdminForm):
|
||||||
from django.forms.formsets import ORDERING_FIELD_NAME
|
from django.forms.formsets import ORDERING_FIELD_NAME
|
||||||
return AdminField(self.form, ORDERING_FIELD_NAME, False)
|
return AdminField(self.form, ORDERING_FIELD_NAME, False)
|
||||||
|
|
||||||
|
|
||||||
class InlineFieldset(Fieldset):
|
class InlineFieldset(Fieldset):
|
||||||
def __init__(self, formset, *args, **kwargs):
|
def __init__(self, formset, *args, **kwargs):
|
||||||
self.formset = formset
|
self.formset = formset
|
||||||
|
@ -313,6 +322,7 @@ class InlineFieldset(Fieldset):
|
||||||
yield Fieldline(self.form, field, self.readonly_fields,
|
yield Fieldline(self.form, field, self.readonly_fields,
|
||||||
model_admin=self.model_admin)
|
model_admin=self.model_admin)
|
||||||
|
|
||||||
|
|
||||||
class AdminErrorList(forms.utils.ErrorList):
|
class AdminErrorList(forms.utils.ErrorList):
|
||||||
"""
|
"""
|
||||||
Stores all errors for the form/formsets in an add/change stage view.
|
Stores all errors for the form/formsets in an add/change stage view.
|
||||||
|
@ -325,6 +335,7 @@ class AdminErrorList(forms.utils.ErrorList):
|
||||||
for errors_in_inline_form in inline_formset.errors:
|
for errors_in_inline_form in inline_formset.errors:
|
||||||
self.extend(list(six.itervalues(errors_in_inline_form)))
|
self.extend(list(six.itervalues(errors_in_inline_form)))
|
||||||
|
|
||||||
|
|
||||||
def normalize_fieldsets(fieldsets):
|
def normalize_fieldsets(fieldsets):
|
||||||
"""
|
"""
|
||||||
Make sure the keys in fieldset dictionaries are strings. Returns the
|
Make sure the keys in fieldset dictionaries are strings. Returns the
|
||||||
|
@ -335,6 +346,7 @@ def normalize_fieldsets(fieldsets):
|
||||||
result.append((name, normalize_dictionary(options)))
|
result.append((name, normalize_dictionary(options)))
|
||||||
return result
|
return result
|
||||||
|
|
||||||
|
|
||||||
def normalize_dictionary(data_dict):
|
def normalize_dictionary(data_dict):
|
||||||
"""
|
"""
|
||||||
Converts all the keys in "data_dict" to strings. The keys must be
|
Converts all the keys in "data_dict" to strings. The keys must be
|
||||||
|
|
|
@ -25,6 +25,7 @@ register = Library()
|
||||||
|
|
||||||
DOT = '.'
|
DOT = '.'
|
||||||
|
|
||||||
|
|
||||||
@register.simple_tag
|
@register.simple_tag
|
||||||
def paginator_number(cl, i):
|
def paginator_number(cl, i):
|
||||||
"""
|
"""
|
||||||
|
@ -40,6 +41,7 @@ def paginator_number(cl, i):
|
||||||
mark_safe(' class="end"' if i == cl.paginator.num_pages-1 else ''),
|
mark_safe(' class="end"' if i == cl.paginator.num_pages-1 else ''),
|
||||||
i+1)
|
i+1)
|
||||||
|
|
||||||
|
|
||||||
@register.inclusion_tag('admin/pagination.html')
|
@register.inclusion_tag('admin/pagination.html')
|
||||||
def pagination(cl):
|
def pagination(cl):
|
||||||
"""
|
"""
|
||||||
|
@ -86,6 +88,7 @@ def pagination(cl):
|
||||||
'1': 1,
|
'1': 1,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def result_headers(cl):
|
def result_headers(cl):
|
||||||
"""
|
"""
|
||||||
Generates the list column headers.
|
Generates the list column headers.
|
||||||
|
@ -167,11 +170,13 @@ def result_headers(cl):
|
||||||
"class_attrib": format_html(' class="{0}"', ' '.join(th_classes)) if th_classes else '',
|
"class_attrib": format_html(' class="{0}"', ' '.join(th_classes)) if th_classes else '',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def _boolean_icon(field_val):
|
def _boolean_icon(field_val):
|
||||||
icon_url = static('admin/img/icon-%s.gif' %
|
icon_url = static('admin/img/icon-%s.gif' %
|
||||||
{True: 'yes', False: 'no', None: 'unknown'}[field_val])
|
{True: 'yes', False: 'no', None: 'unknown'}[field_val])
|
||||||
return format_html('<img src="{0}" alt="{1}" />', icon_url, field_val)
|
return format_html('<img src="{0}" alt="{1}" />', icon_url, field_val)
|
||||||
|
|
||||||
|
|
||||||
def items_for_result(cl, result, form):
|
def items_for_result(cl, result, form):
|
||||||
"""
|
"""
|
||||||
Generates the actual list of data.
|
Generates the actual list of data.
|
||||||
|
@ -266,6 +271,7 @@ def items_for_result(cl, result, form):
|
||||||
if form and not form[cl.model._meta.pk.name].is_hidden:
|
if form and not form[cl.model._meta.pk.name].is_hidden:
|
||||||
yield format_html('<td>{0}</td>', force_text(form[cl.model._meta.pk.name]))
|
yield format_html('<td>{0}</td>', force_text(form[cl.model._meta.pk.name]))
|
||||||
|
|
||||||
|
|
||||||
class ResultList(list):
|
class ResultList(list):
|
||||||
# Wrapper class used to return items in a list_editable
|
# Wrapper class used to return items in a list_editable
|
||||||
# changelist, annotated with the form object for error
|
# changelist, annotated with the form object for error
|
||||||
|
@ -275,6 +281,7 @@ class ResultList(list):
|
||||||
self.form = form
|
self.form = form
|
||||||
super(ResultList, self).__init__(*items)
|
super(ResultList, self).__init__(*items)
|
||||||
|
|
||||||
|
|
||||||
def results(cl):
|
def results(cl):
|
||||||
if cl.formset:
|
if cl.formset:
|
||||||
for res, form in zip(cl.result_list, cl.formset.forms):
|
for res, form in zip(cl.result_list, cl.formset.forms):
|
||||||
|
@ -283,12 +290,14 @@ def results(cl):
|
||||||
for res in cl.result_list:
|
for res in cl.result_list:
|
||||||
yield ResultList(None, items_for_result(cl, res, None))
|
yield ResultList(None, items_for_result(cl, res, None))
|
||||||
|
|
||||||
|
|
||||||
def result_hidden_fields(cl):
|
def result_hidden_fields(cl):
|
||||||
if cl.formset:
|
if cl.formset:
|
||||||
for res, form in zip(cl.result_list, cl.formset.forms):
|
for res, form in zip(cl.result_list, cl.formset.forms):
|
||||||
if form[cl.model._meta.pk.name].is_hidden:
|
if form[cl.model._meta.pk.name].is_hidden:
|
||||||
yield mark_safe(force_text(form[cl.model._meta.pk.name]))
|
yield mark_safe(force_text(form[cl.model._meta.pk.name]))
|
||||||
|
|
||||||
|
|
||||||
@register.inclusion_tag("admin/change_list_results.html")
|
@register.inclusion_tag("admin/change_list_results.html")
|
||||||
def result_list(cl):
|
def result_list(cl):
|
||||||
"""
|
"""
|
||||||
|
@ -305,6 +314,7 @@ def result_list(cl):
|
||||||
'num_sorted_fields': num_sorted_fields,
|
'num_sorted_fields': num_sorted_fields,
|
||||||
'results': list(results(cl))}
|
'results': list(results(cl))}
|
||||||
|
|
||||||
|
|
||||||
@register.inclusion_tag('admin/date_hierarchy.html')
|
@register.inclusion_tag('admin/date_hierarchy.html')
|
||||||
def date_hierarchy(cl):
|
def date_hierarchy(cl):
|
||||||
"""
|
"""
|
||||||
|
@ -382,6 +392,7 @@ def date_hierarchy(cl):
|
||||||
} for year in years]
|
} for year in years]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@register.inclusion_tag('admin/search_form.html')
|
@register.inclusion_tag('admin/search_form.html')
|
||||||
def search_form(cl):
|
def search_form(cl):
|
||||||
"""
|
"""
|
||||||
|
@ -393,6 +404,7 @@ def search_form(cl):
|
||||||
'search_var': SEARCH_VAR
|
'search_var': SEARCH_VAR
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@register.simple_tag
|
@register.simple_tag
|
||||||
def admin_list_filter(cl, spec):
|
def admin_list_filter(cl, spec):
|
||||||
tpl = get_template(spec.template)
|
tpl = get_template(spec.template)
|
||||||
|
@ -402,6 +414,7 @@ def admin_list_filter(cl, spec):
|
||||||
'spec': spec,
|
'spec': spec,
|
||||||
}))
|
}))
|
||||||
|
|
||||||
|
|
||||||
@register.inclusion_tag('admin/actions.html', takes_context=True)
|
@register.inclusion_tag('admin/actions.html', takes_context=True)
|
||||||
def admin_actions(context):
|
def admin_actions(context):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -2,6 +2,7 @@ from django import template
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
|
|
||||||
@register.inclusion_tag('admin/prepopulated_fields_js.html', takes_context=True)
|
@register.inclusion_tag('admin/prepopulated_fields_js.html', takes_context=True)
|
||||||
def prepopulated_fields_js(context):
|
def prepopulated_fields_js(context):
|
||||||
"""
|
"""
|
||||||
|
@ -19,6 +20,7 @@ def prepopulated_fields_js(context):
|
||||||
context.update({'prepopulated_fields': prepopulated_fields})
|
context.update({'prepopulated_fields': prepopulated_fields})
|
||||||
return context
|
return context
|
||||||
|
|
||||||
|
|
||||||
@register.inclusion_tag('admin/submit_line.html', takes_context=True)
|
@register.inclusion_tag('admin/submit_line.html', takes_context=True)
|
||||||
def submit_row(context):
|
def submit_row(context):
|
||||||
"""
|
"""
|
||||||
|
@ -43,6 +45,7 @@ def submit_row(context):
|
||||||
ctx['original'] = context['original']
|
ctx['original'] = context['original']
|
||||||
return ctx
|
return ctx
|
||||||
|
|
||||||
|
|
||||||
@register.filter
|
@register.filter
|
||||||
def cell_count(inline_admin_form):
|
def cell_count(inline_admin_form):
|
||||||
"""Returns the number of cells used in a tabular inline"""
|
"""Returns the number of cells used in a tabular inline"""
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.contrib.admin.models import LogEntry
|
||||||
|
|
||||||
register = template.Library()
|
register = template.Library()
|
||||||
|
|
||||||
|
|
||||||
class AdminLogNode(template.Node):
|
class AdminLogNode(template.Node):
|
||||||
def __init__(self, limit, varname, user):
|
def __init__(self, limit, varname, user):
|
||||||
self.limit, self.varname, self.user = limit, varname, user
|
self.limit, self.varname, self.user = limit, varname, user
|
||||||
|
@ -20,6 +21,7 @@ class AdminLogNode(template.Node):
|
||||||
context[self.varname] = LogEntry.objects.filter(user__pk__exact=user_id).select_related('content_type', 'user')[:int(self.limit)]
|
context[self.varname] = LogEntry.objects.filter(user__pk__exact=user_id).select_related('content_type', 'user')[:int(self.limit)]
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
@register.tag
|
@register.tag
|
||||||
def get_admin_log(parser, token):
|
def get_admin_log(parser, token):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -18,6 +18,7 @@ from django.utils import six
|
||||||
from django.utils.translation import ungettext
|
from django.utils.translation import ungettext
|
||||||
from django.core.urlresolvers import reverse, NoReverseMatch
|
from django.core.urlresolvers import reverse, NoReverseMatch
|
||||||
|
|
||||||
|
|
||||||
def lookup_needs_distinct(opts, lookup_path):
|
def lookup_needs_distinct(opts, lookup_path):
|
||||||
"""
|
"""
|
||||||
Returns True if 'distinct()' should be used to query the given lookup path.
|
Returns True if 'distinct()' should be used to query the given lookup path.
|
||||||
|
@ -31,6 +32,7 @@ def lookup_needs_distinct(opts, lookup_path):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
|
||||||
def prepare_lookup_value(key, value):
|
def prepare_lookup_value(key, value):
|
||||||
"""
|
"""
|
||||||
Returns a lookup value prepared to be used in queryset filtering.
|
Returns a lookup value prepared to be used in queryset filtering.
|
||||||
|
@ -46,6 +48,7 @@ def prepare_lookup_value(key, value):
|
||||||
value = True
|
value = True
|
||||||
return value
|
return value
|
||||||
|
|
||||||
|
|
||||||
def quote(s):
|
def quote(s):
|
||||||
"""
|
"""
|
||||||
Ensure that primary key values do not confuse the admin URLs by escaping
|
Ensure that primary key values do not confuse the admin URLs by escaping
|
||||||
|
|
|
@ -410,14 +410,17 @@ def check_type(cls, attr, type_):
|
||||||
raise ImproperlyConfigured("'%s.%s' should be a %s."
|
raise ImproperlyConfigured("'%s.%s' should be a %s."
|
||||||
% (cls.__name__, attr, type_.__name__))
|
% (cls.__name__, attr, type_.__name__))
|
||||||
|
|
||||||
|
|
||||||
def check_isseq(cls, label, obj):
|
def check_isseq(cls, label, obj):
|
||||||
if not isinstance(obj, (list, tuple)):
|
if not isinstance(obj, (list, tuple)):
|
||||||
raise ImproperlyConfigured("'%s.%s' must be a list or tuple." % (cls.__name__, label))
|
raise ImproperlyConfigured("'%s.%s' must be a list or tuple." % (cls.__name__, label))
|
||||||
|
|
||||||
|
|
||||||
def check_isdict(cls, label, obj):
|
def check_isdict(cls, label, obj):
|
||||||
if not isinstance(obj, dict):
|
if not isinstance(obj, dict):
|
||||||
raise ImproperlyConfigured("'%s.%s' must be a dictionary." % (cls.__name__, label))
|
raise ImproperlyConfigured("'%s.%s' must be a dictionary." % (cls.__name__, label))
|
||||||
|
|
||||||
|
|
||||||
def get_field(cls, model, label, field):
|
def get_field(cls, model, label, field):
|
||||||
try:
|
try:
|
||||||
return model._meta.get_field(field)
|
return model._meta.get_field(field)
|
||||||
|
@ -425,6 +428,7 @@ def get_field(cls, model, label, field):
|
||||||
raise ImproperlyConfigured("'%s.%s' refers to field '%s' that is missing from model '%s.%s'."
|
raise ImproperlyConfigured("'%s.%s' refers to field '%s' that is missing from model '%s.%s'."
|
||||||
% (cls.__name__, label, field, model._meta.app_label, model.__name__))
|
% (cls.__name__, label, field, model._meta.app_label, model.__name__))
|
||||||
|
|
||||||
|
|
||||||
def fetch_attr(cls, model, label, field):
|
def fetch_attr(cls, model, label, field):
|
||||||
try:
|
try:
|
||||||
return model._meta.get_field(field)
|
return model._meta.get_field(field)
|
||||||
|
|
|
@ -49,8 +49,8 @@ class FilteredSelectMultiple(forms.SelectMultiple):
|
||||||
% (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), static('admin/')))
|
% (name, self.verbose_name.replace('"', '\\"'), int(self.is_stacked), static('admin/')))
|
||||||
return mark_safe(''.join(output))
|
return mark_safe(''.join(output))
|
||||||
|
|
||||||
class AdminDateWidget(forms.DateInput):
|
|
||||||
|
|
||||||
|
class AdminDateWidget(forms.DateInput):
|
||||||
@property
|
@property
|
||||||
def media(self):
|
def media(self):
|
||||||
js = ["calendar.js", "admin/DateTimeShortcuts.js"]
|
js = ["calendar.js", "admin/DateTimeShortcuts.js"]
|
||||||
|
@ -62,8 +62,8 @@ class AdminDateWidget(forms.DateInput):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminDateWidget, self).__init__(attrs=final_attrs, format=format)
|
super(AdminDateWidget, self).__init__(attrs=final_attrs, format=format)
|
||||||
|
|
||||||
class AdminTimeWidget(forms.TimeInput):
|
|
||||||
|
|
||||||
|
class AdminTimeWidget(forms.TimeInput):
|
||||||
@property
|
@property
|
||||||
def media(self):
|
def media(self):
|
||||||
js = ["calendar.js", "admin/DateTimeShortcuts.js"]
|
js = ["calendar.js", "admin/DateTimeShortcuts.js"]
|
||||||
|
@ -75,6 +75,7 @@ class AdminTimeWidget(forms.TimeInput):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminTimeWidget, self).__init__(attrs=final_attrs, format=format)
|
super(AdminTimeWidget, self).__init__(attrs=final_attrs, format=format)
|
||||||
|
|
||||||
|
|
||||||
class AdminSplitDateTime(forms.SplitDateTimeWidget):
|
class AdminSplitDateTime(forms.SplitDateTimeWidget):
|
||||||
"""
|
"""
|
||||||
A SplitDateTime Widget that has some admin-specific styling.
|
A SplitDateTime Widget that has some admin-specific styling.
|
||||||
|
@ -90,6 +91,7 @@ class AdminSplitDateTime(forms.SplitDateTimeWidget):
|
||||||
_('Date:'), rendered_widgets[0],
|
_('Date:'), rendered_widgets[0],
|
||||||
_('Time:'), rendered_widgets[1])
|
_('Time:'), rendered_widgets[1])
|
||||||
|
|
||||||
|
|
||||||
class AdminRadioFieldRenderer(RadioFieldRenderer):
|
class AdminRadioFieldRenderer(RadioFieldRenderer):
|
||||||
def render(self):
|
def render(self):
|
||||||
"""Outputs a <ul> for this set of radio fields."""
|
"""Outputs a <ul> for this set of radio fields."""
|
||||||
|
@ -98,15 +100,18 @@ class AdminRadioFieldRenderer(RadioFieldRenderer):
|
||||||
format_html_join('\n', '<li>{0}</li>',
|
format_html_join('\n', '<li>{0}</li>',
|
||||||
((force_text(w),) for w in self)))
|
((force_text(w),) for w in self)))
|
||||||
|
|
||||||
|
|
||||||
class AdminRadioSelect(forms.RadioSelect):
|
class AdminRadioSelect(forms.RadioSelect):
|
||||||
renderer = AdminRadioFieldRenderer
|
renderer = AdminRadioFieldRenderer
|
||||||
|
|
||||||
|
|
||||||
class AdminFileWidget(forms.ClearableFileInput):
|
class AdminFileWidget(forms.ClearableFileInput):
|
||||||
template_with_initial = ('<p class="file-upload">%s</p>'
|
template_with_initial = ('<p class="file-upload">%s</p>'
|
||||||
% forms.ClearableFileInput.template_with_initial)
|
% forms.ClearableFileInput.template_with_initial)
|
||||||
template_with_clear = ('<span class="clearable-file-input">%s</span>'
|
template_with_clear = ('<span class="clearable-file-input">%s</span>'
|
||||||
% forms.ClearableFileInput.template_with_clear)
|
% forms.ClearableFileInput.template_with_clear)
|
||||||
|
|
||||||
|
|
||||||
def url_params_from_lookup_dict(lookups):
|
def url_params_from_lookup_dict(lookups):
|
||||||
"""
|
"""
|
||||||
Converts the type of lookups specified in a ForeignKey limit_choices_to
|
Converts the type of lookups specified in a ForeignKey limit_choices_to
|
||||||
|
@ -129,6 +134,7 @@ def url_params_from_lookup_dict(lookups):
|
||||||
params.update(dict(items))
|
params.update(dict(items))
|
||||||
return params
|
return params
|
||||||
|
|
||||||
|
|
||||||
class ForeignKeyRawIdWidget(forms.TextInput):
|
class ForeignKeyRawIdWidget(forms.TextInput):
|
||||||
"""
|
"""
|
||||||
A Widget for displaying ForeignKeys in the "raw_id" interface rather than
|
A Widget for displaying ForeignKeys in the "raw_id" interface rather than
|
||||||
|
@ -187,6 +193,7 @@ class ForeignKeyRawIdWidget(forms.TextInput):
|
||||||
except (ValueError, self.rel.to.DoesNotExist):
|
except (ValueError, self.rel.to.DoesNotExist):
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
|
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
|
||||||
"""
|
"""
|
||||||
A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
|
A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
|
||||||
|
@ -275,6 +282,7 @@ class RelatedFieldWidgetWrapper(forms.Widget):
|
||||||
def id_for_label(self, id_):
|
def id_for_label(self, id_):
|
||||||
return self.widget.id_for_label(id_)
|
return self.widget.id_for_label(id_)
|
||||||
|
|
||||||
|
|
||||||
class AdminTextareaWidget(forms.Textarea):
|
class AdminTextareaWidget(forms.Textarea):
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
final_attrs = {'class': 'vLargeTextField'}
|
final_attrs = {'class': 'vLargeTextField'}
|
||||||
|
@ -282,6 +290,7 @@ class AdminTextareaWidget(forms.Textarea):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminTextareaWidget, self).__init__(attrs=final_attrs)
|
super(AdminTextareaWidget, self).__init__(attrs=final_attrs)
|
||||||
|
|
||||||
|
|
||||||
class AdminTextInputWidget(forms.TextInput):
|
class AdminTextInputWidget(forms.TextInput):
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
final_attrs = {'class': 'vTextField'}
|
final_attrs = {'class': 'vTextField'}
|
||||||
|
@ -289,6 +298,7 @@ class AdminTextInputWidget(forms.TextInput):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminTextInputWidget, self).__init__(attrs=final_attrs)
|
super(AdminTextInputWidget, self).__init__(attrs=final_attrs)
|
||||||
|
|
||||||
|
|
||||||
class AdminEmailInputWidget(forms.EmailInput):
|
class AdminEmailInputWidget(forms.EmailInput):
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
final_attrs = {'class': 'vTextField'}
|
final_attrs = {'class': 'vTextField'}
|
||||||
|
@ -296,6 +306,7 @@ class AdminEmailInputWidget(forms.EmailInput):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminEmailInputWidget, self).__init__(attrs=final_attrs)
|
super(AdminEmailInputWidget, self).__init__(attrs=final_attrs)
|
||||||
|
|
||||||
|
|
||||||
class AdminURLFieldWidget(forms.URLInput):
|
class AdminURLFieldWidget(forms.URLInput):
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
final_attrs = {'class': 'vURLField'}
|
final_attrs = {'class': 'vURLField'}
|
||||||
|
@ -325,9 +336,11 @@ class AdminIntegerFieldWidget(forms.TextInput):
|
||||||
final_attrs.update(attrs)
|
final_attrs.update(attrs)
|
||||||
super(AdminIntegerFieldWidget, self).__init__(attrs=final_attrs)
|
super(AdminIntegerFieldWidget, self).__init__(attrs=final_attrs)
|
||||||
|
|
||||||
|
|
||||||
class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget):
|
class AdminBigIntegerFieldWidget(AdminIntegerFieldWidget):
|
||||||
class_name = 'vBigIntegerField'
|
class_name = 'vBigIntegerField'
|
||||||
|
|
||||||
|
|
||||||
class AdminCommaSeparatedIntegerFieldWidget(forms.TextInput):
|
class AdminCommaSeparatedIntegerFieldWidget(forms.TextInput):
|
||||||
def __init__(self, attrs=None):
|
def __init__(self, attrs=None):
|
||||||
final_attrs = {'class': 'vCommaSeparatedIntegerField'}
|
final_attrs = {'class': 'vCommaSeparatedIntegerField'}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
from django import http
|
from django import http
|
||||||
|
|
||||||
|
|
||||||
class XViewMiddleware(object):
|
class XViewMiddleware(object):
|
||||||
"""
|
"""
|
||||||
Adds an X-View header to internal HEAD requests -- used by the documentation system.
|
Adds an X-View header to internal HEAD requests -- used by the documentation system.
|
||||||
|
|
|
@ -11,6 +11,7 @@ from django.utils.translation import ugettext as _
|
||||||
class CustomField(models.Field):
|
class CustomField(models.Field):
|
||||||
description = "A custom field type"
|
description = "A custom field type"
|
||||||
|
|
||||||
|
|
||||||
class DescriptionLackingField(models.Field):
|
class DescriptionLackingField(models.Field):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@ except ImportError:
|
||||||
else:
|
else:
|
||||||
docutils_is_available = True
|
docutils_is_available = True
|
||||||
|
|
||||||
|
|
||||||
def trim_docstring(docstring):
|
def trim_docstring(docstring):
|
||||||
"""
|
"""
|
||||||
Uniformly trims leading/trailing whitespace from docstrings.
|
Uniformly trims leading/trailing whitespace from docstrings.
|
||||||
|
@ -30,6 +31,7 @@ def trim_docstring(docstring):
|
||||||
trimmed = [lines[0].lstrip()] + [line[indent:].rstrip() for line in lines[1:]]
|
trimmed = [lines[0].lstrip()] + [line[indent:].rstrip() for line in lines[1:]]
|
||||||
return "\n".join(trimmed).strip()
|
return "\n".join(trimmed).strip()
|
||||||
|
|
||||||
|
|
||||||
def parse_docstring(docstring):
|
def parse_docstring(docstring):
|
||||||
"""
|
"""
|
||||||
Parse out the parts of a docstring. Returns (title, body, metadata).
|
Parse out the parts of a docstring. Returns (title, body, metadata).
|
||||||
|
@ -55,6 +57,7 @@ def parse_docstring(docstring):
|
||||||
body = "\n\n".join(parts[1:])
|
body = "\n\n".join(parts[1:])
|
||||||
return title, body, metadata
|
return title, body, metadata
|
||||||
|
|
||||||
|
|
||||||
def parse_rst(text, default_reference_context, thing_being_parsed=None):
|
def parse_rst(text, default_reference_context, thing_being_parsed=None):
|
||||||
"""
|
"""
|
||||||
Convert the string from reST to an XHTML fragment.
|
Convert the string from reST to an XHTML fragment.
|
||||||
|
@ -92,6 +95,7 @@ ROLES = {
|
||||||
'tag': '%s/tags/#%s',
|
'tag': '%s/tags/#%s',
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
def create_reference_role(rolename, urlbase):
|
def create_reference_role(rolename, urlbase):
|
||||||
def _role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
def _role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
||||||
if options is None:
|
if options is None:
|
||||||
|
@ -102,6 +106,7 @@ def create_reference_role(rolename, urlbase):
|
||||||
return [node], []
|
return [node], []
|
||||||
docutils.parsers.rst.roles.register_canonical_role(rolename, _role)
|
docutils.parsers.rst.roles.register_canonical_role(rolename, _role)
|
||||||
|
|
||||||
|
|
||||||
def default_reference_role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
def default_reference_role(name, rawtext, text, lineno, inliner, options=None, content=None):
|
||||||
if options is None:
|
if options is None:
|
||||||
options = {}
|
options = {}
|
||||||
|
|
|
@ -21,10 +21,12 @@ from django.utils.translation import ugettext as _
|
||||||
# Exclude methods starting with these strings from documentation
|
# Exclude methods starting with these strings from documentation
|
||||||
MODEL_METHODS_EXCLUDE = ('_', 'add_', 'delete', 'save', 'set_')
|
MODEL_METHODS_EXCLUDE = ('_', 'add_', 'delete', 'save', 'set_')
|
||||||
|
|
||||||
|
|
||||||
class GenericSite(object):
|
class GenericSite(object):
|
||||||
domain = 'example.com'
|
domain = 'example.com'
|
||||||
name = 'my site'
|
name = 'my site'
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def doc_index(request):
|
def doc_index(request):
|
||||||
if not utils.docutils_is_available:
|
if not utils.docutils_is_available:
|
||||||
|
@ -33,6 +35,7 @@ def doc_index(request):
|
||||||
'root_path': urlresolvers.reverse('admin:index'),
|
'root_path': urlresolvers.reverse('admin:index'),
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def bookmarklets(request):
|
def bookmarklets(request):
|
||||||
admin_root = urlresolvers.reverse('admin:index')
|
admin_root = urlresolvers.reverse('admin:index')
|
||||||
|
@ -41,6 +44,7 @@ def bookmarklets(request):
|
||||||
'admin_url': "%s://%s%s" % (request.scheme, request.get_host(), admin_root),
|
'admin_url': "%s://%s%s" % (request.scheme, request.get_host(), admin_root),
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def template_tag_index(request):
|
def template_tag_index(request):
|
||||||
if not utils.docutils_is_available:
|
if not utils.docutils_is_available:
|
||||||
|
@ -76,6 +80,7 @@ def template_tag_index(request):
|
||||||
'tags': tags
|
'tags': tags
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def template_filter_index(request):
|
def template_filter_index(request):
|
||||||
if not utils.docutils_is_available:
|
if not utils.docutils_is_available:
|
||||||
|
@ -111,6 +116,7 @@ def template_filter_index(request):
|
||||||
'filters': filters
|
'filters': filters
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def view_index(request):
|
def view_index(request):
|
||||||
if not utils.docutils_is_available:
|
if not utils.docutils_is_available:
|
||||||
|
@ -141,6 +147,7 @@ def view_index(request):
|
||||||
'views': views
|
'views': views
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def view_detail(request, view):
|
def view_detail(request, view):
|
||||||
if not utils.docutils_is_available:
|
if not utils.docutils_is_available:
|
||||||
|
@ -166,6 +173,7 @@ def view_detail(request, view):
|
||||||
'meta': metadata,
|
'meta': metadata,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def model_index(request):
|
def model_index(request):
|
||||||
if not utils.docutils_is_available:
|
if not utils.docutils_is_available:
|
||||||
|
@ -176,6 +184,7 @@ def model_index(request):
|
||||||
'models': m_list
|
'models': m_list
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def model_detail(request, app_label, model_name):
|
def model_detail(request, app_label, model_name):
|
||||||
if not utils.docutils_is_available:
|
if not utils.docutils_is_available:
|
||||||
|
@ -278,6 +287,7 @@ def model_detail(request, app_label, model_name):
|
||||||
'fields': fields,
|
'fields': fields,
|
||||||
}, context_instance=RequestContext(request))
|
}, context_instance=RequestContext(request))
|
||||||
|
|
||||||
|
|
||||||
@staff_member_required
|
@staff_member_required
|
||||||
def template_detail(request, template):
|
def template_detail(request, template):
|
||||||
templates = []
|
templates = []
|
||||||
|
@ -307,10 +317,12 @@ def template_detail(request, template):
|
||||||
# Helper functions #
|
# Helper functions #
|
||||||
####################
|
####################
|
||||||
|
|
||||||
|
|
||||||
def missing_docutils_page(request):
|
def missing_docutils_page(request):
|
||||||
"""Display an error message for people without docutils"""
|
"""Display an error message for people without docutils"""
|
||||||
return render_to_response('admin_doc/missing_docutils.html')
|
return render_to_response('admin_doc/missing_docutils.html')
|
||||||
|
|
||||||
|
|
||||||
def load_all_installed_template_libraries():
|
def load_all_installed_template_libraries():
|
||||||
# Load/register all template tag libraries from installed apps.
|
# Load/register all template tag libraries from installed apps.
|
||||||
for module_name in template.get_templatetags_modules():
|
for module_name in template.get_templatetags_modules():
|
||||||
|
@ -329,6 +341,7 @@ def load_all_installed_template_libraries():
|
||||||
except template.InvalidTemplateLibrary:
|
except template.InvalidTemplateLibrary:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def get_return_data_type(func_name):
|
def get_return_data_type(func_name):
|
||||||
"""Return a somewhat-helpful data type given a function name"""
|
"""Return a somewhat-helpful data type given a function name"""
|
||||||
if func_name.startswith('get_'):
|
if func_name.startswith('get_'):
|
||||||
|
@ -338,6 +351,7 @@ def get_return_data_type(func_name):
|
||||||
return 'Integer'
|
return 'Integer'
|
||||||
return ''
|
return ''
|
||||||
|
|
||||||
|
|
||||||
def get_readable_field_data_type(field):
|
def get_readable_field_data_type(field):
|
||||||
"""Returns the description for a given field type, if it exists,
|
"""Returns the description for a given field type, if it exists,
|
||||||
Fields' descriptions can contain format strings, which will be interpolated
|
Fields' descriptions can contain format strings, which will be interpolated
|
||||||
|
@ -345,6 +359,7 @@ def get_readable_field_data_type(field):
|
||||||
|
|
||||||
return field.description % field.__dict__
|
return field.description % field.__dict__
|
||||||
|
|
||||||
|
|
||||||
def extract_views_from_urlpatterns(urlpatterns, base=''):
|
def extract_views_from_urlpatterns(urlpatterns, base=''):
|
||||||
"""
|
"""
|
||||||
Return a list of views from a list of urlpatterns.
|
Return a list of views from a list of urlpatterns.
|
||||||
|
@ -371,6 +386,7 @@ def extract_views_from_urlpatterns(urlpatterns, base=''):
|
||||||
named_group_matcher = re.compile(r'\(\?P(<\w+>).+?\)')
|
named_group_matcher = re.compile(r'\(\?P(<\w+>).+?\)')
|
||||||
non_named_group_matcher = re.compile(r'\(.*?\)')
|
non_named_group_matcher = re.compile(r'\(.*?\)')
|
||||||
|
|
||||||
|
|
||||||
def simplify_regex(pattern):
|
def simplify_regex(pattern):
|
||||||
"""
|
"""
|
||||||
Clean up urlpattern regexes into something somewhat readable by Mere Humans:
|
Clean up urlpattern regexes into something somewhat readable by Mere Humans:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# PermWrapper and PermLookupDict proxy the permissions system into objects that
|
# PermWrapper and PermLookupDict proxy the permissions system into objects that
|
||||||
# the template system can understand.
|
# the template system can understand.
|
||||||
|
|
||||||
|
|
||||||
class PermLookupDict(object):
|
class PermLookupDict(object):
|
||||||
def __init__(self, user, app_label):
|
def __init__(self, user, app_label):
|
||||||
self.user, self.app_label = user, app_label
|
self.user, self.app_label = user, app_label
|
||||||
|
|
|
@ -27,6 +27,7 @@ def check_password(environ, username, password):
|
||||||
finally:
|
finally:
|
||||||
db.close_old_connections()
|
db.close_old_connections()
|
||||||
|
|
||||||
|
|
||||||
def groups_for_user(environ, username):
|
def groups_for_user(environ, username):
|
||||||
"""
|
"""
|
||||||
Authorizes a user based on groups
|
Authorizes a user based on groups
|
||||||
|
|
|
@ -711,6 +711,7 @@ class LogoutTest(AuthViewsTestCase):
|
||||||
"%s should be allowed" % good_url)
|
"%s should be allowed" % good_url)
|
||||||
self.confirm_logged_out()
|
self.confirm_logged_out()
|
||||||
|
|
||||||
|
|
||||||
@skipIfCustomUser
|
@skipIfCustomUser
|
||||||
@override_settings(
|
@override_settings(
|
||||||
PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',),
|
PASSWORD_HASHERS=('django.contrib.auth.hashers.SHA1PasswordHasher',),
|
||||||
|
|
|
@ -10,11 +10,13 @@ from django.shortcuts import render_to_response
|
||||||
from django.template import Template, RequestContext
|
from django.template import Template, RequestContext
|
||||||
from django.views.decorators.cache import never_cache
|
from django.views.decorators.cache import never_cache
|
||||||
|
|
||||||
|
|
||||||
class CustomRequestAuthenticationForm(AuthenticationForm):
|
class CustomRequestAuthenticationForm(AuthenticationForm):
|
||||||
def __init__(self, request, *args, **kwargs):
|
def __init__(self, request, *args, **kwargs):
|
||||||
assert isinstance(request, HttpRequest)
|
assert isinstance(request, HttpRequest)
|
||||||
super(CustomRequestAuthenticationForm, self).__init__(request, *args, **kwargs)
|
super(CustomRequestAuthenticationForm, self).__init__(request, *args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
@never_cache
|
@never_cache
|
||||||
def remote_user_auth_view(request):
|
def remote_user_auth_view(request):
|
||||||
"Dummy view for remote user tests"
|
"Dummy view for remote user tests"
|
||||||
|
@ -22,6 +24,7 @@ def remote_user_auth_view(request):
|
||||||
c = RequestContext(request, {})
|
c = RequestContext(request, {})
|
||||||
return HttpResponse(t.render(c))
|
return HttpResponse(t.render(c))
|
||||||
|
|
||||||
|
|
||||||
def auth_processor_no_attr_access(request):
|
def auth_processor_no_attr_access(request):
|
||||||
render_to_response('context_processors/auth_attrs_no_access.html',
|
render_to_response('context_processors/auth_attrs_no_access.html',
|
||||||
RequestContext(request, {}, processors=[context_processors.auth]))
|
RequestContext(request, {}, processors=[context_processors.auth]))
|
||||||
|
@ -29,32 +32,39 @@ def auth_processor_no_attr_access(request):
|
||||||
return render_to_response('context_processors/auth_attrs_test_access.html',
|
return render_to_response('context_processors/auth_attrs_test_access.html',
|
||||||
{'session_accessed': request.session.accessed})
|
{'session_accessed': request.session.accessed})
|
||||||
|
|
||||||
|
|
||||||
def auth_processor_attr_access(request):
|
def auth_processor_attr_access(request):
|
||||||
render_to_response('context_processors/auth_attrs_access.html',
|
render_to_response('context_processors/auth_attrs_access.html',
|
||||||
RequestContext(request, {}, processors=[context_processors.auth]))
|
RequestContext(request, {}, processors=[context_processors.auth]))
|
||||||
return render_to_response('context_processors/auth_attrs_test_access.html',
|
return render_to_response('context_processors/auth_attrs_test_access.html',
|
||||||
{'session_accessed': request.session.accessed})
|
{'session_accessed': request.session.accessed})
|
||||||
|
|
||||||
|
|
||||||
def auth_processor_user(request):
|
def auth_processor_user(request):
|
||||||
return render_to_response('context_processors/auth_attrs_user.html',
|
return render_to_response('context_processors/auth_attrs_user.html',
|
||||||
RequestContext(request, {}, processors=[context_processors.auth]))
|
RequestContext(request, {}, processors=[context_processors.auth]))
|
||||||
|
|
||||||
|
|
||||||
def auth_processor_perms(request):
|
def auth_processor_perms(request):
|
||||||
return render_to_response('context_processors/auth_attrs_perms.html',
|
return render_to_response('context_processors/auth_attrs_perms.html',
|
||||||
RequestContext(request, {}, processors=[context_processors.auth]))
|
RequestContext(request, {}, processors=[context_processors.auth]))
|
||||||
|
|
||||||
|
|
||||||
def auth_processor_perm_in_perms(request):
|
def auth_processor_perm_in_perms(request):
|
||||||
return render_to_response('context_processors/auth_attrs_perm_in_perms.html',
|
return render_to_response('context_processors/auth_attrs_perm_in_perms.html',
|
||||||
RequestContext(request, {}, processors=[context_processors.auth]))
|
RequestContext(request, {}, processors=[context_processors.auth]))
|
||||||
|
|
||||||
|
|
||||||
def auth_processor_messages(request):
|
def auth_processor_messages(request):
|
||||||
info(request, "Message 1")
|
info(request, "Message 1")
|
||||||
return render_to_response('context_processors/auth_attrs_messages.html',
|
return render_to_response('context_processors/auth_attrs_messages.html',
|
||||||
RequestContext(request, {}, processors=[context_processors.auth]))
|
RequestContext(request, {}, processors=[context_processors.auth]))
|
||||||
|
|
||||||
|
|
||||||
def userpage(request):
|
def userpage(request):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
def custom_request_auth_login(request):
|
def custom_request_auth_login(request):
|
||||||
return login(request, authentication_form=CustomRequestAuthenticationForm)
|
return login(request, authentication_form=CustomRequestAuthenticationForm)
|
||||||
|
|
||||||
|
|
|
@ -234,6 +234,7 @@ def password_reset_confirm(request, uidb64=None, token=None,
|
||||||
return TemplateResponse(request, template_name, context,
|
return TemplateResponse(request, template_name, context,
|
||||||
current_app=current_app)
|
current_app=current_app)
|
||||||
|
|
||||||
|
|
||||||
def password_reset_complete(request,
|
def password_reset_complete(request,
|
||||||
template_name='registration/password_reset_complete.html',
|
template_name='registration/password_reset_complete.html',
|
||||||
current_app=None, extra_context=None):
|
current_app=None, extra_context=None):
|
||||||
|
|
|
@ -154,6 +154,7 @@ class GenericForeignKey(six.with_metaclass(RenameGenericForeignKeyMethods)):
|
||||||
setattr(instance, self.fk_field, fk)
|
setattr(instance, self.fk_field, fk)
|
||||||
setattr(instance, self.cache_attr, value)
|
setattr(instance, self.cache_attr, value)
|
||||||
|
|
||||||
|
|
||||||
class GenericRelation(ForeignObject):
|
class GenericRelation(ForeignObject):
|
||||||
"""Provides an accessor to generic related objects (e.g. comments)"""
|
"""Provides an accessor to generic related objects (e.g. comments)"""
|
||||||
|
|
||||||
|
@ -293,6 +294,7 @@ class ReverseGenericRelatedObjectsDescriptor(object):
|
||||||
for obj in value:
|
for obj in value:
|
||||||
manager.add(obj)
|
manager.add(obj)
|
||||||
|
|
||||||
|
|
||||||
def create_generic_related_manager(superclass):
|
def create_generic_related_manager(superclass):
|
||||||
"""
|
"""
|
||||||
Factory function for a manager that subclasses 'superclass' (which is a
|
Factory function for a manager that subclasses 'superclass' (which is a
|
||||||
|
@ -390,11 +392,12 @@ def create_generic_related_manager(superclass):
|
||||||
|
|
||||||
return GenericRelatedObjectManager
|
return GenericRelatedObjectManager
|
||||||
|
|
||||||
class GenericRel(ForeignObjectRel):
|
|
||||||
|
|
||||||
|
class GenericRel(ForeignObjectRel):
|
||||||
def __init__(self, field, to, related_name=None, limit_choices_to=None):
|
def __init__(self, field, to, related_name=None, limit_choices_to=None):
|
||||||
super(GenericRel, self).__init__(field, to, related_name, limit_choices_to)
|
super(GenericRel, self).__init__(field, to, related_name, limit_choices_to)
|
||||||
|
|
||||||
|
|
||||||
class BaseGenericInlineFormSet(BaseModelFormSet):
|
class BaseGenericInlineFormSet(BaseModelFormSet):
|
||||||
"""
|
"""
|
||||||
A formset for generic inline objects to a parent.
|
A formset for generic inline objects to a parent.
|
||||||
|
@ -475,6 +478,7 @@ def generic_inlineformset_factory(model, form=ModelForm,
|
||||||
FormSet.for_concrete_model = for_concrete_model
|
FormSet.for_concrete_model = for_concrete_model
|
||||||
return FormSet
|
return FormSet
|
||||||
|
|
||||||
|
|
||||||
class GenericInlineModelAdmin(InlineModelAdmin):
|
class GenericInlineModelAdmin(InlineModelAdmin):
|
||||||
ct_field = "content_type"
|
ct_field = "content_type"
|
||||||
ct_fk_field = "object_id"
|
ct_fk_field = "object_id"
|
||||||
|
@ -516,8 +520,10 @@ class GenericInlineModelAdmin(InlineModelAdmin):
|
||||||
|
|
||||||
return generic_inlineformset_factory(self.model, **defaults)
|
return generic_inlineformset_factory(self.model, **defaults)
|
||||||
|
|
||||||
|
|
||||||
class GenericStackedInline(GenericInlineModelAdmin):
|
class GenericStackedInline(GenericInlineModelAdmin):
|
||||||
template = 'admin/edit_inline/stacked.html'
|
template = 'admin/edit_inline/stacked.html'
|
||||||
|
|
||||||
|
|
||||||
class GenericTabularInline(GenericInlineModelAdmin):
|
class GenericTabularInline(GenericInlineModelAdmin):
|
||||||
template = 'admin/edit_inline/tabular.html'
|
template = 'admin/edit_inline/tabular.html'
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils.encoding import smart_text, force_text
|
from django.utils.encoding import smart_text, force_text
|
||||||
from django.utils.encoding import python_2_unicode_compatible
|
from django.utils.encoding import python_2_unicode_compatible
|
||||||
|
|
||||||
|
|
||||||
class ContentTypeManager(models.Manager):
|
class ContentTypeManager(models.Manager):
|
||||||
|
|
||||||
# Cache to avoid re-looking up ContentType objects all over the place.
|
# Cache to avoid re-looking up ContentType objects all over the place.
|
||||||
|
|
|
@ -15,10 +15,12 @@ from django.utils.encoding import python_2_unicode_compatible
|
||||||
class ConcreteModel(models.Model):
|
class ConcreteModel(models.Model):
|
||||||
name = models.CharField(max_length=10)
|
name = models.CharField(max_length=10)
|
||||||
|
|
||||||
|
|
||||||
class ProxyModel(ConcreteModel):
|
class ProxyModel(ConcreteModel):
|
||||||
class Meta:
|
class Meta:
|
||||||
proxy = True
|
proxy = True
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class FooWithoutUrl(models.Model):
|
class FooWithoutUrl(models.Model):
|
||||||
"""
|
"""
|
||||||
|
@ -39,6 +41,7 @@ class FooWithUrl(FooWithoutUrl):
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return "/users/%s/" % urlquote(self.name)
|
return "/users/%s/" % urlquote(self.name)
|
||||||
|
|
||||||
|
|
||||||
class FooWithBrokenAbsoluteUrl(FooWithoutUrl):
|
class FooWithBrokenAbsoluteUrl(FooWithoutUrl):
|
||||||
"""
|
"""
|
||||||
Fake model defining a ``get_absolute_url`` method containing an error
|
Fake model defining a ``get_absolute_url`` method containing an error
|
||||||
|
@ -47,8 +50,8 @@ class FooWithBrokenAbsoluteUrl(FooWithoutUrl):
|
||||||
def get_absolute_url(self):
|
def get_absolute_url(self):
|
||||||
return "/users/%s/" % self.unknown_field
|
return "/users/%s/" % self.unknown_field
|
||||||
|
|
||||||
class ContentTypesTests(TestCase):
|
|
||||||
|
|
||||||
|
class ContentTypesTests(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
self.old_Site_meta_installed = Site._meta.installed
|
self.old_Site_meta_installed = Site._meta.installed
|
||||||
ContentType.objects.clear_cache()
|
ContentType.objects.clear_cache()
|
||||||
|
|
|
@ -6,6 +6,7 @@ from django.contrib.sites.models import Site, get_current_site
|
||||||
from django.core.exceptions import ObjectDoesNotExist
|
from django.core.exceptions import ObjectDoesNotExist
|
||||||
from django.utils.translation import ugettext as _
|
from django.utils.translation import ugettext as _
|
||||||
|
|
||||||
|
|
||||||
def shortcut(request, content_type_id, object_id):
|
def shortcut(request, content_type_id, object_id):
|
||||||
"""
|
"""
|
||||||
Redirect to an object's page based on a content-type ID and an object ID.
|
Redirect to an object's page based on a content-type ID and an object ID.
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.contrib.flatpages.models import FlatPage
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.contrib.flatpages.forms import FlatpageForm
|
from django.contrib.flatpages.forms import FlatpageForm
|
||||||
|
|
||||||
|
|
||||||
class FlatPageAdmin(admin.ModelAdmin):
|
class FlatPageAdmin(admin.ModelAdmin):
|
||||||
form = FlatpageForm
|
form = FlatpageForm
|
||||||
fieldsets = (
|
fieldsets = (
|
||||||
|
|
|
@ -3,6 +3,7 @@ from django.conf import settings
|
||||||
from django.contrib.flatpages.models import FlatPage
|
from django.contrib.flatpages.models import FlatPage
|
||||||
from django.utils.translation import ugettext, ugettext_lazy as _
|
from django.utils.translation import ugettext, ugettext_lazy as _
|
||||||
|
|
||||||
|
|
||||||
class FlatpageForm(forms.ModelForm):
|
class FlatpageForm(forms.ModelForm):
|
||||||
url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/\.~]+$',
|
url = forms.RegexField(label=_("URL"), max_length=100, regex=r'^[-\w/\.~]+$',
|
||||||
help_text = _("Example: '/about/contact/'. Make sure to have leading"
|
help_text = _("Example: '/about/contact/'. Make sure to have leading"
|
||||||
|
|
|
@ -2,6 +2,7 @@ from django.contrib.flatpages.views import flatpage
|
||||||
from django.http import Http404
|
from django.http import Http404
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
|
||||||
|
|
||||||
class FlatpageFallbackMiddleware(object):
|
class FlatpageFallbackMiddleware(object):
|
||||||
def process_response(self, request, response):
|
def process_response(self, request, response):
|
||||||
if response.status_code != 404:
|
if response.status_code != 404:
|
||||||
|
|
|
@ -6,6 +6,7 @@ from django.core.urlresolvers import get_script_prefix
|
||||||
from django.utils.translation import ugettext_lazy as _
|
from django.utils.translation import ugettext_lazy as _
|
||||||
from django.utils.encoding import iri_to_uri, python_2_unicode_compatible
|
from django.utils.encoding import iri_to_uri, python_2_unicode_compatible
|
||||||
|
|
||||||
|
|
||||||
@python_2_unicode_compatible
|
@python_2_unicode_compatible
|
||||||
class FlatPage(models.Model):
|
class FlatPage(models.Model):
|
||||||
url = models.CharField(_('URL'), max_length=100, db_index=True)
|
url = models.CharField(_('URL'), max_length=100, db_index=True)
|
||||||
|
|
|
@ -7,6 +7,7 @@ from django.test import TestCase
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
from django.utils import translation
|
from django.utils import translation
|
||||||
|
|
||||||
|
|
||||||
@override_settings(SITE_ID=1)
|
@override_settings(SITE_ID=1)
|
||||||
class FlatpageAdminFormTests(TestCase):
|
class FlatpageAdminFormTests(TestCase):
|
||||||
fixtures = ['example_site']
|
fixtures = ['example_site']
|
||||||
|
|
|
@ -17,6 +17,8 @@ DEFAULT_TEMPLATE = 'flatpages/default.html'
|
||||||
# or a redirect is required for authentication, the 404 needs to be returned
|
# or a redirect is required for authentication, the 404 needs to be returned
|
||||||
# without any CSRF checks. Therefore, we only
|
# without any CSRF checks. Therefore, we only
|
||||||
# CSRF protect the internal implementation.
|
# CSRF protect the internal implementation.
|
||||||
|
|
||||||
|
|
||||||
def flatpage(request, url):
|
def flatpage(request, url):
|
||||||
"""
|
"""
|
||||||
Public interface to the flat page view.
|
Public interface to the flat page view.
|
||||||
|
@ -44,6 +46,7 @@ def flatpage(request, url):
|
||||||
raise
|
raise
|
||||||
return render_flatpage(request, f)
|
return render_flatpage(request, f)
|
||||||
|
|
||||||
|
|
||||||
@csrf_protect
|
@csrf_protect
|
||||||
def render_flatpage(request, f):
|
def render_flatpage(request, f):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -10,6 +10,7 @@ from django.contrib.formtools.utils import form_hmac
|
||||||
|
|
||||||
AUTO_ID = 'formtools_%s' # Each form here uses this as its auto_id parameter.
|
AUTO_ID = 'formtools_%s' # Each form here uses this as its auto_id parameter.
|
||||||
|
|
||||||
|
|
||||||
class FormPreview(object):
|
class FormPreview(object):
|
||||||
preview_template = 'formtools/preview.html'
|
preview_template = 'formtools/preview.html'
|
||||||
form_template = 'formtools/form.html'
|
form_template = 'formtools/form.html'
|
||||||
|
|
|
@ -1,15 +1,18 @@
|
||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
|
|
||||||
class TestForm(forms.Form):
|
class TestForm(forms.Form):
|
||||||
field1 = forms.CharField()
|
field1 = forms.CharField()
|
||||||
field1_ = forms.CharField()
|
field1_ = forms.CharField()
|
||||||
bool1 = forms.BooleanField(required=False)
|
bool1 = forms.BooleanField(required=False)
|
||||||
date1 = forms.DateField(required=False)
|
date1 = forms.DateField(required=False)
|
||||||
|
|
||||||
|
|
||||||
class HashTestForm(forms.Form):
|
class HashTestForm(forms.Form):
|
||||||
name = forms.CharField()
|
name = forms.CharField()
|
||||||
bio = forms.CharField()
|
bio = forms.CharField()
|
||||||
|
|
||||||
|
|
||||||
class HashTestBlankForm(forms.Form):
|
class HashTestBlankForm(forms.Form):
|
||||||
name = forms.CharField(required=False)
|
name = forms.CharField(required=False)
|
||||||
bio = forms.CharField(required=False)
|
bio = forms.CharField(required=False)
|
||||||
|
|
|
@ -19,6 +19,7 @@ from django.contrib.formtools.tests.forms import (
|
||||||
success_string = "Done was called!"
|
success_string = "Done was called!"
|
||||||
success_string_encoded = success_string.encode()
|
success_string_encoded = success_string.encode()
|
||||||
|
|
||||||
|
|
||||||
class TestFormPreview(preview.FormPreview):
|
class TestFormPreview(preview.FormPreview):
|
||||||
def get_context(self, request, form):
|
def get_context(self, request, form):
|
||||||
context = super(TestFormPreview, self).get_context(request, form)
|
context = super(TestFormPreview, self).get_context(request, form)
|
||||||
|
@ -31,6 +32,7 @@ class TestFormPreview(preview.FormPreview):
|
||||||
def done(self, request, cleaned_data):
|
def done(self, request, cleaned_data):
|
||||||
return http.HttpResponse(success_string)
|
return http.HttpResponse(success_string)
|
||||||
|
|
||||||
|
|
||||||
@override_settings(
|
@override_settings(
|
||||||
TEMPLATE_DIRS=(
|
TEMPLATE_DIRS=(
|
||||||
os.path.join(os.path.dirname(upath(__file__)), 'templates'),
|
os.path.join(os.path.dirname(upath(__file__)), 'templates'),
|
||||||
|
|
Loading…
Reference in New Issue