Index: django/conf/global_settings.py =================================================================== --- django/conf/global_settings.py (revision 4077) +++ django/conf/global_settings.py (working copy) @@ -205,15 +205,18 @@ # Default formatting for date objects. See all available format strings here: # http://www.djangoproject.com/documentation/templates/#now -DATE_FORMAT = 'N j, Y' +#DATE_FORMAT = 'N j, Y' +DATE_FORMAT = 'j/m/y' # Default formatting for datetime objects. See all available format strings here: # http://www.djangoproject.com/documentation/templates/#now -DATETIME_FORMAT = 'N j, Y, P' +#DATETIME_FORMAT = 'N j, Y, P' +DATETIME_FORMAT = 'j/m/y H:i' # Default formatting for time objects. See all available format strings here: # http://www.djangoproject.com/documentation/templates/#now -TIME_FORMAT = 'P' +#TIME_FORMAT = 'P' +TIME_FORMAT = 'H:i' # Default formatting for date objects when only the year and month are relevant. # See all available format strings here: Index: django/utils/translation/trans_real.py =================================================================== --- django/utils/translation/trans_real.py (revision 4077) +++ django/utils/translation/trans_real.py (working copy) @@ -359,7 +359,9 @@ one, the formats provided in the settings will be used. """ from django.conf import settings + print settings.DATETIME_FORMAT date_format = _('DATE_FORMAT') + print date_format datetime_format = _('DATETIME_FORMAT') time_format = _('TIME_FORMAT') if date_format == 'DATE_FORMAT': @@ -368,7 +370,9 @@ datetime_format = settings.DATETIME_FORMAT if time_format == 'TIME_FORMAT': time_format = settings.TIME_FORMAT - return date_format, datetime_format, time_format + #HORRIBLE HACK!!!: + return settings.DATE_FORMAT, settings.DATETIME_FORMAT, settings.TIME_FORMAT + #return date_format, datetime_format, time_format def get_partial_date_formats(): """ Index: django/contrib/admin/media/css/changelists.css =================================================================== --- django/contrib/admin/media/css/changelists.css (revision 4077) +++ django/contrib/admin/media/css/changelists.css (working copy) @@ -48,3 +48,6 @@ .paginator .end { border-width:2px !important; margin-right:6px; } .paginator .this-page { padding:2px 6px; font-weight:bold; font-size:13px; vertical-align:top; } .paginator a:hover { color:white; background:#5b80b2; border-color:#036; } +.paginator span#page_no { float:left; width: 60%; } +.paginator form { float:right; padding-right: 1em; } + Index: django/contrib/admin/templatetags/admin_list.py =================================================================== --- django/contrib/admin/templatetags/admin_list.py (revision 4077) +++ django/contrib/admin/templatetags/admin_list.py (working copy) @@ -56,11 +56,16 @@ page_range.extend(range(page_num + 1, paginator.pages)) need_show_all_link = cl.can_show_all and not cl.show_all and cl.multi_page + #Some extra logic to allow choosing the number per page + MIN = 20 + MAX = 250 + STEP = 10 return { 'cl': cl, 'pagination_required': pagination_required, 'show_all_url': need_show_all_link and cl.get_query_string({ALL_VAR: ''}), 'page_range': page_range, + 'num_choices': range(MIN, MAX+STEP, STEP), 'ALL_VAR': ALL_VAR, '1': 1, } @@ -87,19 +92,19 @@ # Non-field list_display values don't get ordering capability. yield {"text": header} else: - if isinstance(f.rel, models.ManyToOneRel) and f.null: - yield {"text": f.verbose_name} - else: - th_classes = [] - new_order_type = 'asc' - if field_name == cl.order_field: - th_classes.append('sorted %sending' % cl.order_type.lower()) - new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()] + #if isinstance(f.rel, models.ManyToOneRel) and f.null: + # yield {"text": f.verbose_name} + #else: + th_classes = [] + new_order_type = 'asc' + if field_name == cl.order_field: + th_classes.append('sorted %sending' % cl.order_type.lower()) + new_order_type = {'asc': 'desc', 'desc': 'asc'}[cl.order_type.lower()] - yield {"text": f.verbose_name, - "sortable": True, - "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), - "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')} + yield {"text": f.verbose_name, + "sortable": True, + "url": cl.get_query_string({ORDER_VAR: i, ORDER_TYPE_VAR: new_order_type}), + "class_attrib": (th_classes and ' class="%s"' % ' '.join(th_classes) or '')} def items_for_result(cl, result): first = True Index: django/contrib/admin/views/main.py =================================================================== --- django/contrib/admin/views/main.py (revision 4077) +++ django/contrib/admin/views/main.py (working copy) @@ -30,6 +30,7 @@ ORDER_VAR = 'o' ORDER_TYPE_VAR = 'ot' PAGE_VAR = 'p' +NPP = 'npp' SEARCH_VAR = 'q' IS_POPUP_VAR = 'pop' ERROR_FLAG = 'e' @@ -550,6 +551,9 @@ self.lookup_opts = self.opts self.manager = self.opts.admin.manager + #Number on page from query string + self.show_per_page = int(request.GET.get(NPP, self.opts.admin.list_per_page)) + # Get search parameters from the query string. try: self.page_num = int(request.GET.get(PAGE_VAR, 0)) @@ -573,7 +577,7 @@ def get_filters(self, request): filter_specs = [] - if self.lookup_opts.admin.list_filter and not self.opts.one_to_one_field: + if self.lookup_opts.admin.list_filter: filter_fields = [self.lookup_opts.get_field(field_name) \ for field_name in self.lookup_opts.admin.list_filter] for f in filter_fields: @@ -598,7 +602,7 @@ return '?' + '&'.join(['%s=%s' % (k, v) for k, v in p.items()]).replace(' ', '%20') def get_results(self, request): - paginator = ObjectPaginator(self.query_set, self.lookup_opts.admin.list_per_page) + paginator = ObjectPaginator(self.query_set, self.show_per_page) # Get the number of objects, with admin filters applied. try: @@ -620,7 +624,7 @@ full_result_count = self.manager.count() can_show_all = result_count <= MAX_SHOW_ALL_ALLOWED - multi_page = result_count > self.lookup_opts.admin.list_per_page + multi_page = result_count > self.show_per_page # Get the list of objects to display on this page. if (self.show_all and can_show_all) or not multi_page: @@ -671,7 +675,7 @@ def get_query_set(self): qs = self.manager.get_query_set() lookup_params = self.params.copy() # a dictionary of the query string - for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR): + for i in (ALL_VAR, ORDER_VAR, ORDER_TYPE_VAR, SEARCH_VAR, IS_POPUP_VAR, NPP): if lookup_params.has_key(i): del lookup_params[i] @@ -706,7 +710,13 @@ # For OneToOneFields, don't try to order by the related object's ordering criteria. pass elif isinstance(f.rel, models.ManyToOneRel): - rel_ordering = f.rel.to._meta.ordering and f.rel.to._meta.ordering[0] or f.rel.to._meta.pk.column + #Get round admin breaking with ordering on the related model being '-*' + if f.rel.to._meta.ordering: + o_field = f.rel.to._meta.ordering[0] + if o_field[0] == '-': + self.order_type = 'desc' + o_field = o_field[1:] + rel_ordering = f.rel.to._meta.ordering and o_field or f.rel.to._meta.pk.column lookup_order_field = '%s.%s' % (f.rel.to._meta.db_table, rel_ordering) # Set ordering. Index: django/contrib/admin/templates/admin/change_list.html =================================================================== --- django/contrib/admin/templates/admin/change_list.html (revision 4077) +++ django/contrib/admin/templates/admin/change_list.html (working copy) @@ -1,9 +1,11 @@ {% extends "admin/base_site.html" %} {% load adminmedia admin_list i18n %} -{% block stylesheet %}{% admin_media_prefix %}css/changelists.css{% endblock %} +{% block stylesheet %}/media/css/changelists.css{% endblock %} {% block bodyclass %}change-list{% endblock %} {% block userlinks %}{% trans 'Documentation' %} / {% trans 'Change password' %} / {% trans 'Log out' %}{% endblock %} -{% if not is_popup %}{% block breadcrumbs %}
{% endblock %}{% endif %} +{% block breadcrumbs %} + {{ block.super }} ›+ {% if pagination_required %} +Page {% for i in page_range %} {% paginator_number cl i %} {% endfor %} {% endif %} {{ cl.result_count }} {% ifequal cl.result_count 1 %}{{ cl.opts.verbose_name|escape }}{% else %}{{ cl.opts.verbose_name_plural|escape }}{% endifequal %} {% if show_all_url %} {% trans 'Show all' %}{% endif %} + + + +
Index: django/contrib/admin/templates/admin/edit_inline_tabular.html =================================================================== --- django/contrib/admin/templates/admin/edit_inline_tabular.html (revision 4077) +++ django/contrib/admin/templates/admin/edit_inline_tabular.html (working copy) @@ -7,7 +7,6 @@