-
diff --git a/django/contrib/admin/options.py b/django/contrib/admin/options.py
index cf7ea83..620dbf0 100644
a
|
b
|
from django.contrib import messages
|
11 | 11 | from django.views.decorators.csrf import csrf_protect |
12 | 12 | from django.core.exceptions import PermissionDenied, ValidationError |
13 | 13 | from django.core.paginator import Paginator |
| 14 | from django.core.urlresolvers import reverse |
14 | 15 | from django.db import models, transaction, router |
15 | 16 | from django.db.models.related import RelatedObject |
16 | 17 | from django.db.models.fields import BLANK_CHOICE_DASH, FieldDoesNotExist |
… |
… |
class ModelAdmin(BaseModelAdmin):
|
775 | 776 | # redirect to the change-list page for this object. Otherwise, |
776 | 777 | # redirect to the admin index. |
777 | 778 | if self.has_change_permission(request, None): |
778 | | post_url = '../' |
| 779 | post_url = reverse('admin:%s_%s_changelist' % |
| 780 | (opts.app_label, opts.module_name), |
| 781 | current_app=self.admin_site.name) |
779 | 782 | else: |
780 | | post_url = '../../../' |
| 783 | post_url = reverse('admin:index', |
| 784 | current_app=self.admin_site.name) |
781 | 785 | return HttpResponseRedirect(post_url) |
782 | 786 | |
783 | 787 | def response_change(self, request, obj): |
… |
… |
class ModelAdmin(BaseModelAdmin):
|
786 | 790 | """ |
787 | 791 | opts = obj._meta |
788 | 792 | |
789 | | # Handle proxy models automatically created by .only() or .defer() |
| 793 | # Handle proxy models automatically created by .only() or .defer(). |
| 794 | # Refs #14529 |
790 | 795 | verbose_name = opts.verbose_name |
| 796 | module_name = opts.module_name |
791 | 797 | if obj._deferred: |
792 | 798 | opts_ = opts.proxy_for_model._meta |
793 | 799 | verbose_name = opts_.verbose_name |
| 800 | module_name = opts_.module_name |
794 | 801 | |
795 | 802 | pk_value = obj._get_pk_val() |
796 | 803 | |
… |
… |
class ModelAdmin(BaseModelAdmin):
|
804 | 811 | elif "_saveasnew" in request.POST: |
805 | 812 | msg = _('The %(name)s "%(obj)s" was added successfully. You may edit it again below.') % {'name': force_unicode(verbose_name), 'obj': obj} |
806 | 813 | self.message_user(request, msg) |
807 | | return HttpResponseRedirect("../%s/" % pk_value) |
| 814 | return HttpResponseRedirect(reverse('admin:%s_%s_change' % |
| 815 | (opts.app_label, module_name), |
| 816 | args=(pk_value,), |
| 817 | current_app=self.admin_site.name)) |
808 | 818 | elif "_addanother" in request.POST: |
809 | 819 | self.message_user(request, msg + ' ' + (_("You may add another %s below.") % force_unicode(verbose_name))) |
810 | | return HttpResponseRedirect("../add/") |
| 820 | return HttpResponseRedirect(reverse('admin:%s_%s_add' % |
| 821 | (opts.app_label, module_name), |
| 822 | current_app=self.admin_site.name)) |
811 | 823 | else: |
812 | 824 | self.message_user(request, msg) |
813 | 825 | # Figure out where to redirect. If the user has change permission, |
814 | 826 | # redirect to the change-list page for this object. Otherwise, |
815 | 827 | # redirect to the admin index. |
816 | 828 | if self.has_change_permission(request, None): |
817 | | return HttpResponseRedirect('../') |
| 829 | post_url = reverse('admin:%s_%s_changelist' % |
| 830 | (opts.app_label, module_name), |
| 831 | current_app=self.admin_site.name) |
818 | 832 | else: |
819 | | return HttpResponseRedirect('../../../') |
| 833 | post_url = reverse('admin:index', |
| 834 | current_app=self.admin_site.name) |
| 835 | return HttpResponseRedirect(post_url) |
820 | 836 | |
821 | 837 | def response_action(self, request, queryset): |
822 | 838 | """ |
… |
… |
class ModelAdmin(BaseModelAdmin):
|
989 | 1005 | raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(opts.verbose_name), 'key': escape(object_id)}) |
990 | 1006 | |
991 | 1007 | if request.method == 'POST' and "_saveasnew" in request.POST: |
992 | | return self.add_view(request, form_url='../add/') |
| 1008 | return self.add_view(request, form_url=reverse('admin:%s_%s_add' % |
| 1009 | (opts.app_label, opts.module_name), |
| 1010 | current_app=self.admin_site.name)) |
993 | 1011 | |
994 | 1012 | ModelForm = self.get_form(request, obj) |
995 | 1013 | formsets = [] |
… |
… |
class ModelAdmin(BaseModelAdmin):
|
1245 | 1263 | self.message_user(request, _('The %(name)s "%(obj)s" was deleted successfully.') % {'name': force_unicode(opts.verbose_name), 'obj': force_unicode(obj_display)}) |
1246 | 1264 | |
1247 | 1265 | if not self.has_change_permission(request, None): |
1248 | | return HttpResponseRedirect("../../../../") |
1249 | | return HttpResponseRedirect("../../") |
| 1266 | return HttpResponseRedirect(reverse('admin:index', |
| 1267 | current_app=self.admin_site.name)) |
| 1268 | return HttpResponseRedirect(reverse('admin:%s_%s_changelist' % |
| 1269 | (opts.app_label, opts.module_name), |
| 1270 | current_app=self.admin_site.name)) |
1250 | 1271 | |
1251 | 1272 | object_name = force_unicode(opts.verbose_name) |
1252 | 1273 | |
… |
… |
class ModelAdmin(BaseModelAdmin):
|
1291 | 1312 | 'module_name': capfirst(force_unicode(opts.verbose_name_plural)), |
1292 | 1313 | 'object': obj, |
1293 | 1314 | 'app_label': app_label, |
| 1315 | 'opts': opts, |
1294 | 1316 | } |
1295 | 1317 | context.update(extra_context or {}) |
1296 | 1318 | return TemplateResponse(request, self.object_history_template or [ |
-
diff --git a/django/contrib/admin/sites.py b/django/contrib/admin/sites.py
index 49c1e78..3ba9314 100644
a
|
b
|
class AdminSite(object):
|
339 | 339 | # Check whether user has any perm for this module. |
340 | 340 | # If so, add the module to the model_list. |
341 | 341 | if True in perms.values(): |
| 342 | info = (app_label, model._meta.module_name) |
342 | 343 | model_dict = { |
343 | 344 | 'name': capfirst(model._meta.verbose_name_plural), |
344 | | 'admin_url': mark_safe('%s/%s/' % (app_label, model.__name__.lower())), |
| 345 | 'admin_url': reverse('admin:%s_%s_changelist' % info, current_app=self.name), |
| 346 | 'add_url': reverse('admin:%s_%s_add' % info, current_app=self.name), |
345 | 347 | 'perms': perms, |
346 | 348 | } |
347 | 349 | if app_label in app_dict: |
… |
… |
class AdminSite(object):
|
349 | 351 | else: |
350 | 352 | app_dict[app_label] = { |
351 | 353 | 'name': app_label.title(), |
352 | | 'app_url': app_label + '/', |
| 354 | 'app_url': reverse('admin:app_list', kwargs={'app_label': app_label}, current_app=self.name), |
353 | 355 | 'has_module_perms': has_module_perms, |
354 | 356 | 'models': [model_dict], |
355 | 357 | } |
… |
… |
class AdminSite(object):
|
383 | 385 | # Check whether user has any perm for this module. |
384 | 386 | # If so, add the module to the model_list. |
385 | 387 | if True in perms.values(): |
| 388 | info = (app_label, model._meta.module_name) |
386 | 389 | model_dict = { |
387 | 390 | 'name': capfirst(model._meta.verbose_name_plural), |
388 | | 'admin_url': '%s/' % model.__name__.lower(), |
| 391 | 'admin_url': reverse('admin:%s_%s_changelist' % info, current_app=self.name), |
| 392 | 'add_url': reverse('admin:%s_%s_add' % info, current_app=self.name), |
389 | 393 | 'perms': perms, |
390 | 394 | } |
391 | 395 | if app_dict: |
-
diff --git a/django/contrib/admin/templates/admin/500.html b/django/contrib/admin/templates/admin/500.html
index b30e431..eeb9e8d 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans "Home" %}</a> › {% trans "Server error" %}</div>{% endblock %} |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Server error' %} |
| 9 | </div> |
| 10 | {% endblock %} |
5 | 11 | |
6 | 12 | {% block title %}{% trans 'Server error (500)' %}{% endblock %} |
7 | 13 | |
-
diff --git a/django/contrib/admin/templates/admin/app_index.html b/django/contrib/admin/templates/admin/app_index.html
index 120433d..4616b16 100644
a
|
b
|
|
1 | | {% extends "admin/index.html" %} |
2 | | {% load i18n %} |
| 1 | {% extends "admin/index.html" %} |
| 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | 5 | {% if not is_popup %} |
5 | | |
6 | 6 | {% block breadcrumbs %} |
7 | | <div class="breadcrumbs"><a href="../"> |
8 | | {% trans "Home" %}</a> › |
| 7 | <div class="breadcrumbs"> |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › |
9 | 10 | {% for app in app_list %} |
10 | 11 | {% blocktrans with app.name as name %}{{ name }}{% endblocktrans %} |
11 | | {% endfor %}</div>{% endblock %} |
12 | | |
13 | | {% endif %} |
| 12 | {% endfor %} |
| 13 | </div> |
| 14 | {% endblock %} |
| 15 | {% endif %} |
14 | 16 | |
15 | | {% block sidebar %}{% endblock %} |
16 | | No newline at end of file |
| 17 | {% block sidebar %}{% endblock %} |
-
diff --git a/django/contrib/admin/templates/admin/auth/user/change_password.html b/django/contrib/admin/templates/admin/auth/user/change_password.html
index b18b0aa..32dbcd9 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n admin_static admin_modify %} |
3 | 3 | {% load url from future %} |
| 4 | {% load admin_urls %} |
| 5 | |
4 | 6 | {% block extrahead %}{{ block.super }} |
5 | 7 | {% url 'admin:jsi18n' as jsi18nurl %} |
6 | 8 | <script type="text/javascript" src="{{ jsi18nurl|default:"../../../../jsi18n/" }}"></script> |
7 | 9 | {% endblock %} |
8 | 10 | {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %} |
9 | 11 | {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} |
10 | | {% block breadcrumbs %}{% if not is_popup %} |
11 | | <div class="breadcrumbs"> |
12 | | <a href="../../../../">{% trans "Home" %}</a> › |
13 | | <a href="../../../">{{ opts.app_label|capfirst|escape }}</a> › |
14 | | <a href="../../">{{ opts.verbose_name_plural|capfirst }}</a> › |
15 | | <a href="../">{{ original|truncatewords:"18" }}</a> › |
16 | | {% trans 'Change password' %} |
| 12 | {% if not is_popup %} |
| 13 | {% block breadcrumbs %} |
| 14 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 15 | › <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ opts.app_label|capfirst|escape }}</a> |
| 16 | › <a href="{% url opts|admin_url:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> |
| 17 | › <a href="{% url opts|admin_url:'changelist' %}{{ original.pk }}">{{ original|truncatewords:"18" }}</a> |
| 18 | › {% trans 'Change password' %} |
17 | 19 | </div> |
18 | | {% endif %}{% endblock %} |
| 20 | {% endblock %} |
| 21 | {% endif %} |
19 | 22 | {% block content %}<div id="content-main"> |
20 | 23 | <form action="{{ form_url }}" method="post" id="{{ opts.module_name }}_form">{% csrf_token %}{% block form_top %}{% endblock %} |
21 | 24 | <div> |
-
diff --git a/django/contrib/admin/templates/admin/base.html b/django/contrib/admin/templates/admin/base.html
index 4b3c429..3b50adc 100644
a
|
b
|
|
32 | 32 | {% if docsroot %} |
33 | 33 | <a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / |
34 | 34 | {% endif %} |
35 | | <a href="{% url 'admin:password_change' %}"> |
36 | | {% trans 'Change password' %}</a> / |
37 | | <a href="{% url 'admin:logout' %}"> |
38 | | {% trans 'Log out' %}</a> |
| 35 | <a href="{% url 'admin:password_change' %}">{% trans 'Change password' %}</a> / |
| 36 | <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a> |
39 | 37 | {% endblock %} |
40 | 38 | </div> |
41 | 39 | {% endif %} |
42 | 40 | {% block nav-global %}{% endblock %} |
43 | 41 | </div> |
44 | 42 | <!-- END Header --> |
45 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="/">{% trans 'Home' %}</a>{% if title %} › {{ title }}{% endif %}</div>{% endblock %} |
| 43 | {% block breadcrumbs %} |
| 44 | <div class="breadcrumbs"> |
| 45 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 46 | {% if title %} › {{ title }}{% endif %} |
| 47 | </div> |
| 48 | {% endblock %} |
46 | 49 | {% endif %} |
47 | 50 | |
48 | 51 | {% block messages %} |
-
diff --git a/django/contrib/admin/templates/admin/change_form.html b/django/contrib/admin/templates/admin/change_form.html
index 56661e9..71230e4 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n admin_static admin_modify %} |
3 | 3 | {% load url from future %} |
| 4 | {% load admin_urls %} |
4 | 5 | |
5 | 6 | {% block extrahead %}{{ block.super }} |
6 | 7 | {% url 'admin:jsi18n' as jsi18nurl %} |
… |
… |
|
14 | 15 | |
15 | 16 | {% block bodyclass %}{{ opts.app_label }}-{{ opts.object_name.lower }} change-form{% endblock %} |
16 | 17 | |
17 | | {% block breadcrumbs %}{% if not is_popup %} |
18 | | <div class="breadcrumbs"> |
19 | | <a href="../../../">{% trans "Home" %}</a> › |
20 | | <a href="../../">{{ app_label|capfirst|escape }}</a> › |
21 | | {% if has_change_permission %}<a href="../">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} › |
22 | | {% if add %}{% trans "Add" %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %} |
| 18 | {% if not is_popup %} |
| 19 | {% block breadcrumbs %} |
| 20 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 21 | › <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ app_label|capfirst|escape }}</a> |
| 22 | › {% if has_change_permission %}<a href="{% url opts|admin_url:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a>{% else %}{{ opts.verbose_name_plural|capfirst }}{% endif %} |
| 23 | › {% if add %}{% trans 'Add' %} {{ opts.verbose_name }}{% else %}{{ original|truncatewords:"18" }}{% endif %} |
23 | 24 | </div> |
24 | | {% endif %}{% endblock %} |
| 25 | {% endblock %} |
| 26 | {% endif %} |
25 | 27 | |
26 | 28 | {% block content %}<div id="content-main"> |
27 | 29 | {% block object-tools %} |
-
diff --git a/django/contrib/admin/templates/admin/change_list.html b/django/contrib/admin/templates/admin/change_list.html
index 24c6d8c..6a92496 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n admin_static admin_list %} |
3 | 3 | {% load url from future %} |
| 4 | {% load admin_urls %} |
| 5 | |
4 | 6 | {% block extrastyle %} |
5 | 7 | {{ block.super }} |
6 | 8 | <link rel="stylesheet" type="text/css" href="{% static "admin/css/changelists.css" %}" /> |
… |
… |
|
36 | 38 | {% block bodyclass %}change-list{% endblock %} |
37 | 39 | |
38 | 40 | {% if not is_popup %} |
39 | | {% block breadcrumbs %} |
40 | | <div class="breadcrumbs"> |
41 | | <a href="../../"> |
42 | | {% trans "Home" %} |
43 | | </a> |
44 | | › |
45 | | <a href="../"> |
46 | | {{ app_label|capfirst }} |
47 | | </a> |
48 | | › |
49 | | {{ cl.opts.verbose_name_plural|capfirst }} |
50 | | </div> |
51 | | {% endblock %} |
| 41 | {% block breadcrumbs %} |
| 42 | <div class="breadcrumbs"> |
| 43 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 44 | › <a href="{% url 'admin:app_list' app_label=cl.opts.app_label %}">{{ app_label|capfirst|escape }}</a> |
| 45 | › {{ cl.opts.verbose_name_plural|capfirst }} |
| 46 | </div> |
| 47 | {% endblock %} |
52 | 48 | {% endif %} |
53 | 49 | |
54 | 50 | {% block coltype %}flex{% endblock %} |
… |
… |
|
60 | 56 | <ul class="object-tools"> |
61 | 57 | {% block object-tools-items %} |
62 | 58 | <li> |
63 | | <a href="add/{% if is_popup %}?_popup=1{% endif %}" class="addlink"> |
| 59 | <a href="{% url cl.opts|admin_url:'add' %}{% if is_popup %}?_popup=1{% endif %}" class="addlink"> |
64 | 60 | {% blocktrans with cl.opts.verbose_name as name %}Add {{ name }}{% endblocktrans %} |
65 | 61 | </a> |
66 | 62 | </li> |
-
diff --git a/django/contrib/admin/templates/admin/delete_confirmation.html b/django/contrib/admin/templates/admin/delete_confirmation.html
index 0e6d47e..a4acb95 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | {% load admin_urls %} |
3 | 5 | |
4 | 6 | {% block breadcrumbs %} |
5 | 7 | <div class="breadcrumbs"> |
6 | | <a href="../../../../">{% trans "Home" %}</a> › |
7 | | <a href="../../../">{{ app_label|capfirst }}</a> › |
8 | | <a href="../../">{{ opts.verbose_name_plural|capfirst }}</a> › |
9 | | <a href="../">{{ object|truncatewords:"18" }}</a> › |
10 | | {% trans 'Delete' %} |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › <a href="{% url 'admin:app_list' app_label=opts.app_label %}">{{ app_label|capfirst }}</a> |
| 10 | › <a href="{% url opts|admin_url:'changelist' %}">{{ opts.verbose_name_plural|capfirst|escape }}</a> |
| 11 | › <a href="{% url opts|admin_url:'changelist' %}{{ object.pk }}">{{ object|truncatewords:"18" }}</a> |
| 12 | › {% trans 'Delete' %} |
11 | 13 | </div> |
12 | 14 | {% endblock %} |
13 | 15 | |
-
diff --git a/django/contrib/admin/templates/admin/delete_selected_confirmation.html b/django/contrib/admin/templates/admin/delete_selected_confirmation.html
index 127519b..04a2ae7 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n l10n %} |
| 3 | {% load url from future %} |
| 4 | {% load admin_urls %} |
3 | 5 | |
4 | 6 | {% block breadcrumbs %} |
5 | 7 | <div class="breadcrumbs"> |
6 | | <a href="../../">{% trans "Home" %}</a> › |
7 | | <a href="../">{{ app_label|capfirst }}</a> › |
8 | | <a href="./">{{ opts.verbose_name_plural|capfirst }}</a> › |
9 | | {% trans 'Delete multiple objects' %} |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › <a href="{% url 'admin:app_list' app_label=app_label %}">{{ app_label|capfirst|escape }}</a> |
| 10 | › <a href="{% url opts|admin_url:'changelist' %}">{{ opts.verbose_name_plural|capfirst }}</a> |
| 11 | › {% trans 'Delete multiple objects' %} |
10 | 12 | </div> |
11 | 13 | {% endblock %} |
12 | 14 | |
-
diff --git a/django/contrib/admin/templates/admin/index.html b/django/contrib/admin/templates/admin/index.html
index 7164220..86c795b 100644
a
|
b
|
|
26 | 26 | {% endif %} |
27 | 27 | |
28 | 28 | {% if model.perms.add %} |
29 | | <td><a href="{{ model.admin_url }}add/" class="addlink">{% trans 'Add' %}</a></td> |
| 29 | <td><a href="{{ model.add_url }}" class="addlink">{% trans 'Add' %}</a></td> |
30 | 30 | {% else %} |
31 | 31 | <td> </td> |
32 | 32 | {% endif %} |
-
diff --git a/django/contrib/admin/templates/admin/invalid_setup.html b/django/contrib/admin/templates/admin/invalid_setup.html
index f09b316..c2df4df 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> › {{ title }}</div>{% endblock %} |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {{ title }} |
| 9 | </div> |
| 10 | {% endblock %} |
5 | 11 | |
6 | 12 | {% block content %} |
7 | 13 | <p>{% trans "Something's wrong with your database installation. Make sure the appropriate database tables have been created, and make sure the database is readable by the appropriate user." %}</p> |
-
diff --git a/django/contrib/admin/templates/admin/object_history.html b/django/contrib/admin/templates/admin/object_history.html
index 5ae7847..e39471b 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | {% load admin_urls %} |
3 | 5 | |
4 | 6 | {% block breadcrumbs %} |
5 | 7 | <div class="breadcrumbs"> |
6 | | <a href="../../../../">{% trans 'Home' %}</a> › |
7 | | <a href="../../../">{{ app_label|capfirst }}</a> › |
8 | | <a href="../../">{{ module_name }}</a> › |
9 | | <a href="../">{{ object|truncatewords:"18" }}</a> › |
10 | | {% trans 'History' %} |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › <a href="{% url 'admin:app_list' app_label=app_label %}">{{ app_label|capfirst|escape }}</a> |
| 10 | › <a href="{% url opts|admin_url:'changelist' %}">{{ module_name }}</a> |
| 11 | › <a href="{% url opts|admin_url:'changelist' %}{{ object.pk }}">{{ object|truncatewords:"18" }}</a> |
| 12 | › {% trans 'History' %} |
11 | 13 | </div> |
12 | 14 | {% endblock %} |
13 | 15 | |
-
diff --git a/django/contrib/admin/templates/registration/logged_out.html b/django/contrib/admin/templates/registration/logged_out.html
index d339ef0..e95d864 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a></div>{% endblock %} |
| 5 | {% block breadcrumbs %}<div class="breadcrumbs"><a href="{% url 'admin:index' %}">{% trans 'Home' %}</a></div>{% endblock %} |
5 | 6 | |
6 | 7 | {% block content %} |
7 | 8 | |
8 | 9 | <p>{% trans "Thanks for spending some quality time with the Web site today." %}</p> |
9 | 10 | |
10 | | <p><a href="../">{% trans 'Log in again' %}</a></p> |
| 11 | <p><a href="{% url 'admin:index' %}">{% trans 'Log in again' %}</a></p> |
11 | 12 | |
12 | 13 | {% endblock %} |
-
diff --git a/django/contrib/admin/templates/registration/password_change_done.html b/django/contrib/admin/templates/registration/password_change_done.html
index 0c0690d..863fc96 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
3 | 3 | {% load url from future %} |
4 | | {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %}{% trans 'Change password' %} / <a href="../../logout/">{% trans 'Log out' %}</a>{% endblock %} |
5 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> › {% trans 'Password change' %}</div>{% endblock %} |
| 4 | {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %}{% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %} |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Password change' %} |
| 9 | </div> |
| 10 | {% endblock %} |
6 | 11 | |
7 | 12 | {% block title %}{% trans 'Password change successful' %}{% endblock %} |
8 | 13 | |
-
diff --git a/django/contrib/admin/templates/registration/password_change_form.html b/django/contrib/admin/templates/registration/password_change_form.html
index f76692d..0e4ea53 100644
a
|
b
|
|
2 | 2 | {% load i18n static %} |
3 | 3 | {% load url from future %} |
4 | 4 | {% block extrastyle %}{{ block.super }}<link rel="stylesheet" type="text/css" href="{% static "admin/css/forms.css" %}" />{% endblock %} |
5 | | {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %} {% trans 'Change password' %} / <a href="../logout/">{% trans 'Log out' %}</a>{% endblock %} |
6 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% trans 'Password change' %}</div>{% endblock %} |
| 5 | {% block userlinks %}{% url 'django-admindocs-docroot' as docsroot %}{% if docsroot %}<a href="{{ docsroot }}">{% trans 'Documentation' %}</a> / {% endif %} {% trans 'Change password' %} / <a href="{% url 'admin:logout' %}">{% trans 'Log out' %}</a>{% endblock %} |
| 6 | {% block breadcrumbs %} |
| 7 | <div class="breadcrumbs"> |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › {% trans 'Password change' %} |
| 10 | </div> |
| 11 | {% endblock %} |
7 | 12 | |
8 | 13 | {% block title %}{% trans 'Password change' %}{% endblock %} |
9 | 14 | |
-
diff --git a/django/contrib/admin/templates/registration/password_reset_complete.html b/django/contrib/admin/templates/registration/password_reset_complete.html
index fceb167..7c07707 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">{% trans 'Home' %}</a> › {% trans 'Password reset' %}</div>{% endblock %} |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Password reset' %} |
| 9 | </div> |
| 10 | {% endblock %} |
5 | 11 | |
6 | 12 | {% block title %}{% trans 'Password reset complete' %}{% endblock %} |
7 | 13 | |
-
diff --git a/django/contrib/admin/templates/registration/password_reset_confirm.html b/django/contrib/admin/templates/registration/password_reset_confirm.html
index df9cf1b..d5299eb 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% trans 'Password reset confirmation' %}</div>{% endblock %} |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Password reset confirmation' %} |
| 9 | </div> |
| 10 | {% endblock %} |
5 | 11 | |
6 | 12 | {% block title %}{% trans 'Password reset' %}{% endblock %} |
7 | 13 | |
-
diff --git a/django/contrib/admin/templates/registration/password_reset_done.html b/django/contrib/admin/templates/registration/password_reset_done.html
index e223bdb..fd73af8 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% trans 'Password reset' %}</div>{% endblock %} |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Password reset' %} |
| 9 | </div> |
| 10 | {% endblock %} |
5 | 11 | |
6 | 12 | {% block title %}{% trans 'Password reset successful' %}{% endblock %} |
7 | 13 | |
-
diff --git a/django/contrib/admin/templates/registration/password_reset_form.html b/django/contrib/admin/templates/registration/password_reset_form.html
index d3a1284..2b591fe 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
3 | 4 | |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../">{% trans 'Home' %}</a> › {% trans 'Password reset' %}</div>{% endblock %} |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Password reset' %} |
| 9 | </div> |
| 10 | {% endblock %} |
5 | 11 | |
6 | 12 | {% block title %}{% trans "Password reset" %}{% endblock %} |
7 | 13 | |
-
diff --git a/django/contrib/admin/templatetags/admin_urls.py b/django/contrib/admin/templatetags/admin_urls.py
new file mode 100644
index 0000000..15e4649
-
|
+
|
|
| 1 | from django.core.urlresolvers import reverse, NoReverseMatch |
| 2 | from django import template |
| 3 | |
| 4 | register = template.Library() |
| 5 | |
| 6 | @register.filter |
| 7 | def admin_url(value, arg): |
| 8 | return 'admin:%s_%s_%s' % (value.app_label, value.module_name, arg) |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/bookmarklets.html b/django/contrib/admindocs/templates/admin_doc/bookmarklets.html
index 6447529..baa717c 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | | |
3 | | {% block breadcrumbs %}{% load i18n %}<div class="breadcrumbs"><a href="../../">{% trans "Home" %}</a> › <a href="../">{% trans "Documentation" %}</a> › {% trans "Bookmarklets" %}</div>{% endblock %} |
| 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 9 | › {% trans 'Bookmarklets' %} |
| 10 | </div> |
| 11 | {% endblock %} |
4 | 12 | {% block title %}{% trans "Documentation bookmarklets" %}{% endblock %} |
5 | 13 | |
6 | 14 | {% block content %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/index.html b/django/contrib/admindocs/templates/admin_doc/index.html
index a8b21c3..652fbfd 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
3 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="{{ root_path }}">Home</a> › Documentation</div>{% endblock %} |
| 3 | {% load url from future %} |
| 4 | |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Documentation' %}</a> |
| 9 | </div> |
| 10 | {% endblock %} |
4 | 11 | {% block title %}Documentation{% endblock %} |
5 | 12 | |
6 | 13 | {% block content %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/missing_docutils.html b/django/contrib/admindocs/templates/admin_doc/missing_docutils.html
index 97c9d47..34c18ff 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
3 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../">Home</a> › Documentation</div>{% endblock %} |
| 3 | {% load url from future %} |
| 4 | |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › {% trans 'Documentation' %}</a> |
| 9 | </div> |
4 | 10 | {% block title %}Please install docutils{% endblock %} |
5 | 11 | |
6 | 12 | {% block content %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/model_detail.html b/django/contrib/admindocs/templates/admin_doc/model_detail.html
index 828df18..82cb405 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | |
3 | 5 | {% block extrahead %} |
4 | 6 | {{ block.super }} |
5 | 7 | <style type="text/css"> |
… |
… |
|
8 | 10 | </style> |
9 | 11 | {% endblock %} |
10 | 12 | |
11 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> › <a href="../../">Documentation</a> › <a href="../">Models</a> › {{ name }}</div>{% endblock %} |
| 13 | {% block breadcrumbs %} |
| 14 | <div class="breadcrumbs"> |
| 15 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 16 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 17 | › <a href="{% url 'django-admindocs-models-index' %}">{% trans 'Models' %}</a> |
| 18 | › {{ name }} |
| 19 | </div> |
| 20 | {% endblock %} |
12 | 21 | |
13 | 22 | {% block title %}Model: {{ name }}{% endblock %} |
14 | 23 | |
… |
… |
|
41 | 50 | </table> |
42 | 51 | </div> |
43 | 52 | |
44 | | <p class="small"><a href="../">‹ Back to Models Documentation</a></p> |
| 53 | <p class="small"><a href="{% url 'django-admindocs-models-index' %}">‹ Back to Models Documentation</a></p> |
45 | 54 | </div> |
46 | 55 | {% endblock %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/model_index.html b/django/contrib/admindocs/templates/admin_doc/model_index.html
index 47c94c0..4eb3cf6 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | |
3 | 5 | {% block coltype %}colSM{% endblock %} |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> › <a href="../">Documentation</a> › Models</div>{% endblock %} |
| 6 | |
| 7 | {% block breadcrumbs %} |
| 8 | <div class="breadcrumbs"> |
| 9 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 10 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 11 | › {% trans 'Models' %} |
| 12 | </div> |
| 13 | {% endblock %} |
5 | 14 | |
6 | 15 | {% block title %}Models{% endblock %} |
7 | 16 | |
… |
… |
|
19 | 28 | <table class="xfull"> |
20 | 29 | {% for model in group.list %} |
21 | 30 | <tr> |
22 | | <th><a href="{{ model.app_label }}.{{ model.object_name.lower }}/">{{ model.object_name }}</a></th> |
| 31 | <th><a href="{% url 'django-admindocs-models-detail' app_label=model.app_label model_name=model.object_name.lower %}">{{ model.object_name }}</a></th> |
23 | 32 | </tr> |
24 | 33 | {% endfor %} |
25 | 34 | </table> |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/template_detail.html b/django/contrib/admindocs/templates/admin_doc/template_detail.html
index c04dedc..307dd62 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
3 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> › <a href="../../">Documentation</a> › Templates › {{ name }}</div>{% endblock %} |
| 3 | {% load url from future %} |
| 4 | |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 9 | › {% trans 'Templates' %} |
| 10 | › {{ name }} |
| 11 | </div> |
| 12 | {% endblock %} |
4 | 13 | |
5 | 14 | {% block title %}Template: {{ name }}{% endblock %} |
6 | 15 | |
… |
… |
|
17 | 26 | </ol> |
18 | 27 | {% endfor %} |
19 | 28 | |
20 | | <p class="small"><a href="../../">‹ Back to Documentation</a></p> |
| 29 | <p class="small"><a href="{% url 'django-admindocs-docroot' %}">‹ Back to Documentation</a></p> |
21 | 30 | {% endblock %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/template_filter_index.html b/django/contrib/admindocs/templates/admin_doc/template_filter_index.html
index 46ccf0f..1809bc9 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | |
3 | 5 | {% block coltype %}colSM{% endblock %} |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> › <a href="../">Documentation</a> › filters</div>{% endblock %} |
| 6 | {% block breadcrumbs %} |
| 7 | <div class="breadcrumbs"> |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 10 | › {% trans 'Filters' %} |
| 11 | </div> |
| 12 | {% endblock %} |
5 | 13 | {% block title %}Template filters{% endblock %} |
6 | 14 | |
7 | 15 | {% block content %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/template_tag_index.html b/django/contrib/admindocs/templates/admin_doc/template_tag_index.html
index 676c025..18e5d95 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | |
3 | 5 | {% block coltype %}colSM{% endblock %} |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> › <a href="../">Documentation</a> › Tags</div>{% endblock %} |
| 6 | {% block breadcrumbs %} |
| 7 | <div class="breadcrumbs"> |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 10 | › {% trans 'Tags' %} |
| 11 | </div> |
| 12 | {% endblock %} |
5 | 13 | {% block title %}Template tags{% endblock %} |
6 | 14 | |
7 | 15 | {% block content %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/view_detail.html b/django/contrib/admindocs/templates/admin_doc/view_detail.html
index c6d080c..41c8121 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
3 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../../">Home</a> › <a href="../../">Documentation</a> › <a href="../">Views</a> › {{ name }}</div>{% endblock %} |
| 3 | {% load url from future %} |
| 4 | |
| 5 | {% block breadcrumbs %} |
| 6 | <div class="breadcrumbs"> |
| 7 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 8 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 9 | › <a href="{% url 'django-admindocs-views-index' %}">{% trans 'Views' %}</a> |
| 10 | › {{ name }} |
| 11 | </div> |
| 12 | {% endblock %} |
4 | 13 | {% block title %}View: {{ name }}{% endblock %} |
5 | 14 | |
6 | 15 | {% block content %} |
… |
… |
|
21 | 30 | <p>{{ meta.Templates }}</p> |
22 | 31 | {% endif %} |
23 | 32 | |
24 | | <p class="small"><a href="../">‹ Back to Views Documentation</a></p> |
| 33 | <p class="small"><a href="{% url 'django-admindocs-views-index' %}">‹ Back to Views Documentation</a></p> |
25 | 34 | {% endblock %} |
-
diff --git a/django/contrib/admindocs/templates/admin_doc/view_index.html b/django/contrib/admindocs/templates/admin_doc/view_index.html
index 6b10fa6..e508c84 100644
a
|
b
|
|
1 | 1 | {% extends "admin/base_site.html" %} |
2 | 2 | {% load i18n %} |
| 3 | {% load url from future %} |
| 4 | |
3 | 5 | {% block coltype %}colSM{% endblock %} |
4 | | {% block breadcrumbs %}<div class="breadcrumbs"><a href="../../">Home</a> › <a href="../">Documentation</a> › Views</div>{% endblock %} |
| 6 | {% block breadcrumbs %} |
| 7 | <div class="breadcrumbs"> |
| 8 | <a href="{% url 'admin:index' %}">{% trans 'Home' %}</a> |
| 9 | › <a href="{% url 'django-admindocs-docroot' %}">{% trans 'Documentation' %}</a> |
| 10 | › {% trans 'Views' %} |
| 11 | </div> |
| 12 | {% endblock %} |
5 | 13 | {% block title %}Views{% endblock %} |
6 | 14 | |
7 | 15 | {% block content %} |
… |
… |
|
29 | 37 | |
30 | 38 | {% for view in site_views.list|dictsort:"url" %} |
31 | 39 | {% ifchanged %} |
32 | | <h3><a href="{{ view.module }}.{{ view.name }}/">{{ view.url }}</a></h3> |
33 | | <p class="small quiet">View function: {{ view.module }}.{{ view.name }}</p> |
| 40 | <h3><a href="{% url 'django-admindocs-views-detail' view=view.full_name %}">{{ view.url }}</a></h3> |
| 41 | <p class="small quiet">View function: {{ view.full_name }}</p> |
34 | 42 | <p>{{ view.title }}</p> |
35 | 43 | <hr /> |
36 | 44 | {% endifchanged %} |
-
diff --git a/django/contrib/admindocs/views.py b/django/contrib/admindocs/views.py
index 28319be..9725865 100644
a
|
b
|
def view_index(request):
|
136 | 136 | site_obj = GenericSite() |
137 | 137 | for (func, regex) in view_functions: |
138 | 138 | views.append({ |
139 | | 'name': getattr(func, '__name__', func.__class__.__name__), |
140 | | 'module': func.__module__, |
| 139 | 'full_name': '%s.%s' % (func.__module__, getattr(func, '__name__', func.__class__.__name__)), |
141 | 140 | 'site_id': settings_mod.SITE_ID, |
142 | 141 | 'site': site_obj, |
143 | 142 | 'url': simplify_regex(regex), |
-
diff --git a/tests/regressiontests/admin_changelist/tests.py b/tests/regressiontests/admin_changelist/tests.py
index 709fa76..f09d4a0 100644
a
|
b
|
class ChangeListTests(TestCase):
|
326 | 326 | request.user = user |
327 | 327 | return request |
328 | 328 | |
329 | | # Test with user 'noparents' |
330 | 329 | m = DynamicListDisplayChildAdmin(Child, admin.site) |
| 330 | # Test with user 'noparents' |
331 | 331 | request = _mocked_authenticated_request(user_noparents) |
332 | 332 | response = m.changelist_view(request) |
333 | 333 | # XXX - Calling render here to avoid ContentNotRenderedError to be |
… |
… |
class ChangeListTests(TestCase):
|
336 | 336 | self.assertNotContains(response, 'Parent object') |
337 | 337 | |
338 | 338 | # Test with user 'parents' |
339 | | m = DynamicListDisplayChildAdmin(Child, admin.site) |
340 | 339 | request = _mocked_authenticated_request(user_parents) |
341 | 340 | response = m.changelist_view(request) |
342 | 341 | # XXX - #15826 |
343 | 342 | response.render() |
344 | 343 | self.assertContains(response, 'Parent object') |
345 | 344 | |
| 345 | admin.site.unregister(Child) |
| 346 | |
346 | 347 | # Test default implementation |
347 | 348 | m = ChildAdmin(Child, admin.site) |
348 | 349 | request = _mocked_authenticated_request(user_noparents) |
-
diff --git a/tests/regressiontests/admin_custom_urls/__init__.py b/tests/regressiontests/admin_custom_urls/__init__.py
new file mode 100644
index 0000000..792d600
-
diff --git a/tests/regressiontests/admin_custom_urls/fixtures/actions.json b/tests/regressiontests/admin_custom_urls/fixtures/actions.json
new file mode 100644
index 0000000..d803393
-
|
+
|
|
| 1 | [ |
| 2 | { |
| 3 | "pk": "delete", |
| 4 | "model": "admin_custom_urls.action", |
| 5 | "fields": { |
| 6 | "description": "Remove things." |
| 7 | } |
| 8 | }, |
| 9 | { |
| 10 | "pk": "rename", |
| 11 | "model": "admin_custom_urls.action", |
| 12 | "fields": { |
| 13 | "description": "Gives things other names." |
| 14 | } |
| 15 | }, |
| 16 | { |
| 17 | "pk": "add", |
| 18 | "model": "admin_custom_urls.action", |
| 19 | "fields": { |
| 20 | "description": "Add things." |
| 21 | } |
| 22 | }, |
| 23 | { |
| 24 | "pk": "path/to/file/", |
| 25 | "model": "admin_custom_urls.action", |
| 26 | "fields": { |
| 27 | "description": "An action with '/' in its name." |
| 28 | } |
| 29 | }, |
| 30 | { |
| 31 | "pk": "path/to/html/document.html", |
| 32 | "model": "admin_custom_urls.action", |
| 33 | "fields": { |
| 34 | "description": "An action with a name similar to a HTML doc path." |
| 35 | } |
| 36 | }, |
| 37 | { |
| 38 | "pk": "javascript:alert('Hello world');\">Click here</a>", |
| 39 | "model": "admin_custom_urls.action", |
| 40 | "fields": { |
| 41 | "description": "An action with a name suspected of being a XSS attempt" |
| 42 | } |
| 43 | } |
| 44 | ] |
| 45 | No newline at end of file |
-
diff --git a/tests/regressiontests/admin_custom_urls/fixtures/users.json b/tests/regressiontests/admin_custom_urls/fixtures/users.json
new file mode 100644
index 0000000..72d86d7
-
|
+
|
|
| 1 | [ |
| 2 | { |
| 3 | "pk": 100, |
| 4 | "model": "auth.user", |
| 5 | "fields": { |
| 6 | "username": "super", |
| 7 | "first_name": "Super", |
| 8 | "last_name": "User", |
| 9 | "is_active": true, |
| 10 | "is_superuser": true, |
| 11 | "is_staff": true, |
| 12 | "last_login": "2007-05-30 13:20:10", |
| 13 | "groups": [], |
| 14 | "user_permissions": [], |
| 15 | "password": "sha1$995a3$6011485ea3834267d719b4c801409b8b1ddd0158", |
| 16 | "email": "super@example.com", |
| 17 | "date_joined": "2007-05-30 13:20:10" |
| 18 | } |
| 19 | } |
| 20 | ] |
-
diff --git a/tests/regressiontests/admin_custom_urls/models.py b/tests/regressiontests/admin_custom_urls/models.py
new file mode 100644
index 0000000..f8c83a9
-
|
+
|
|
| 1 | from functools import update_wrapper |
| 2 | |
| 3 | from django.contrib import admin |
| 4 | from django.db import models |
| 5 | |
| 6 | |
| 7 | class Action(models.Model): |
| 8 | name = models.CharField(max_length=50, primary_key=True) |
| 9 | description = models.CharField(max_length=70) |
| 10 | |
| 11 | def __unicode__(self): |
| 12 | return self.name |
| 13 | |
| 14 | |
| 15 | class ActionAdmin(admin.ModelAdmin): |
| 16 | """ |
| 17 | A ModelAdmin for the Action model that changes the URL of the add_view |
| 18 | to '<app name>/<model name>/!add/' |
| 19 | The Action model has a CharField PK. |
| 20 | """ |
| 21 | |
| 22 | list_display = ('name', 'description') |
| 23 | |
| 24 | def remove_url(self, name): |
| 25 | """ |
| 26 | Remove all entries named 'name' from the ModelAdmin instance URL |
| 27 | patterns list |
| 28 | """ |
| 29 | return filter(lambda e: e.name != name, super(ActionAdmin, self).get_urls()) |
| 30 | |
| 31 | def get_urls(self): |
| 32 | # Add the URL of our custom 'add_view' view to the front of the URLs |
| 33 | # list. Remove the existing one(s) first |
| 34 | from django.conf.urls.defaults import patterns, url |
| 35 | |
| 36 | def wrap(view): |
| 37 | def wrapper(*args, **kwargs): |
| 38 | return self.admin_site.admin_view(view)(*args, **kwargs) |
| 39 | return update_wrapper(wrapper, view) |
| 40 | |
| 41 | info = self.model._meta.app_label, self.model._meta.module_name |
| 42 | |
| 43 | view_name = '%s_%s_add' % info |
| 44 | |
| 45 | return patterns('', |
| 46 | url(r'^!add/$', wrap(self.add_view), name=view_name), |
| 47 | ) + self.remove_url(view_name) |
| 48 | |
| 49 | |
| 50 | admin.site.register(Action, ActionAdmin) |
-
diff --git a/tests/regressiontests/admin_custom_urls/tests.py b/tests/regressiontests/admin_custom_urls/tests.py
new file mode 100644
index 0000000..cfc6b85
-
|
+
|
|
| 1 | from django.core.urlresolvers import reverse |
| 2 | from django.template.response import TemplateResponse |
| 3 | from django.test import TestCase |
| 4 | |
| 5 | from models import Action |
| 6 | |
| 7 | |
| 8 | class AdminCustomUrlsTest(TestCase): |
| 9 | fixtures = ['users.json', 'actions.json'] |
| 10 | |
| 11 | def setUp(self): |
| 12 | self.client.login(username='super', password='secret') |
| 13 | |
| 14 | def tearDown(self): |
| 15 | self.client.logout() |
| 16 | |
| 17 | def testBasicAddGet(self): |
| 18 | """ |
| 19 | A smoke test to ensure GET on the add_view works. |
| 20 | """ |
| 21 | response = self.client.get('/custom_urls/admin/admin_custom_urls/action/!add/') |
| 22 | self.assertIsInstance(response, TemplateResponse) |
| 23 | self.assertEqual(response.status_code, 200) |
| 24 | |
| 25 | def testAddWithGETArgs(self): |
| 26 | response = self.client.get('/custom_urls/admin/admin_custom_urls/action/!add/', {'name': 'My Action'}) |
| 27 | self.assertEqual(response.status_code, 200) |
| 28 | self.assertTrue( |
| 29 | 'value="My Action"' in response.content, |
| 30 | "Couldn't find an input with the right value in the response." |
| 31 | ) |
| 32 | |
| 33 | def testBasicAddPost(self): |
| 34 | """ |
| 35 | A smoke test to ensure POST on add_view works. |
| 36 | """ |
| 37 | post_data = { |
| 38 | '_popup': u'1', |
| 39 | "name": u'Action added through a popup', |
| 40 | "description": u"Description of added action", |
| 41 | } |
| 42 | response = self.client.post('/custom_urls/admin/admin_custom_urls/action/!add/', post_data) |
| 43 | self.assertEqual(response.status_code, 200) |
| 44 | self.assertContains(response, 'dismissAddAnotherPopup') |
| 45 | self.assertContains(response, 'Action added through a popup') |
| 46 | |
| 47 | def testAdminUrlsNoClash(self): |
| 48 | """ |
| 49 | Test that some admin URLs work correctly. The model has a CharField |
| 50 | PK and the add_view URL has been customized. |
| 51 | """ |
| 52 | # Should get the change_view for model instance with PK 'add', not show |
| 53 | # the add_view |
| 54 | response = self.client.get('/custom_urls/admin/admin_custom_urls/action/add/') |
| 55 | self.assertEqual(response.status_code, 200) |
| 56 | self.assertContains(response, 'Change action') |
| 57 | |
| 58 | # Ditto, but use reverse() to build the URL |
| 59 | path = reverse('admin:%s_action_change' % Action._meta.app_label, |
| 60 | args=('add',)) |
| 61 | response = self.client.get(path) |
| 62 | self.assertEqual(response.status_code, 200) |
| 63 | self.assertContains(response, 'Change action') |
| 64 | |
| 65 | # Should correctly get the change_view for the model instance with the |
| 66 | # funny-looking PK |
| 67 | path = reverse('admin:%s_action_change' % Action._meta.app_label, |
| 68 | args=("path/to/html/document.html",)) |
| 69 | response = self.client.get(path) |
| 70 | self.assertEqual(response.status_code, 200) |
| 71 | self.assertContains(response, 'Change action') |
| 72 | self.assertContains(response, 'value="path/to/html/document.html"') |
-
diff --git a/tests/regressiontests/admin_custom_urls/urls.py b/tests/regressiontests/admin_custom_urls/urls.py
new file mode 100644
index 0000000..6c2761a
-
|
+
|
|
| 1 | from django.conf.urls.defaults import * |
| 2 | from django.contrib import admin |
| 3 | |
| 4 | urlpatterns = patterns('', |
| 5 | (r'^admin/', include(admin.site.urls)), |
| 6 | ) |
| 7 | |
-
diff --git a/tests/regressiontests/admin_views/models.py b/tests/regressiontests/admin_views/models.py
index 8dc61e3..9f6fb0b 100644
a
|
b
|
admin.site.register(Question)
|
896 | 896 | admin.site.register(Answer) |
897 | 897 | admin.site.register(PrePopulatedPost, PrePopulatedPostAdmin) |
898 | 898 | admin.site.register(ComplexSortedPerson, ComplexSortedPersonAdmin) |
| 899 | # Since contrib.comments is in INSTALLED_APPS we need it's admin too |
| 900 | from django.contrib.comments import admin |
-
diff --git a/tests/regressiontests/admin_views/tests.py b/tests/regressiontests/admin_views/tests.py
index 22b65a6..33e6dc3 100644
a
|
b
|
class SaveAsTests(TestCase):
|
590 | 590 | self.assertTrue(response.context['save_as']) |
591 | 591 | post_data = {'_saveasnew':'', 'name':'John M', 'gender':3, 'alive':'checked'} |
592 | 592 | response = self.client.post('/test_admin/admin/admin_views/person/1/', post_data) |
593 | | self.assertEqual(response.context['form_url'], '../add/') |
| 593 | self.assertEqual(response.context['form_url'], '/test_admin/admin/admin_views/person/add/') |
594 | 594 | |
595 | 595 | class CustomModelAdminTest(AdminViewBasicTest): |
596 | 596 | urlbit = "admin2" |
… |
… |
class AdminViewPermissionsTest(TestCase):
|
835 | 835 | self.client.post('/test_admin/admin/', self.adduser_login) |
836 | 836 | addpage = self.client.get('/test_admin/admin/admin_views/article/add/') |
837 | 837 | self.assertEqual(addpage.status_code, 200) |
838 | | change_list_link = '<a href="../">Articles</a> ›' |
| 838 | change_list_link = '› <a href="/test_admin/admin/admin_views/article/">Articles</a>' |
839 | 839 | self.assertFalse(change_list_link in addpage.content, |
840 | 840 | 'User restricted to add permission is given link to change list view in breadcrumbs.') |
841 | 841 | post = self.client.post('/test_admin/admin/admin_views/article/add/', add_dict) |
-
diff --git a/tests/urls.py b/tests/urls.py
index b3f719d..7a5d76f 100644
a
|
b
|
|
1 | 1 | from django.conf.urls.defaults import * |
2 | 2 | |
| 3 | # Fix problems with cached urlconfs and reverse: |
| 4 | from regressiontests.admin_views import customadmin, models |
| 5 | from regressiontests.generic_inline_admin import models |
3 | 6 | |
4 | 7 | urlpatterns = patterns('', |
5 | 8 | # test_client modeltest urls |
… |
… |
urlpatterns = patterns('',
|
29 | 32 | # admin widget tests |
30 | 33 | (r'widget_admin/', include('regressiontests.admin_widgets.urls')), |
31 | 34 | |
| 35 | # admin custom URL tests |
| 36 | (r'^custom_urls/', include('regressiontests.admin_custom_urls.urls')), |
| 37 | |
32 | 38 | ) |