diff --git a/categories/__init__.py b/categories/__init__.py index 8172e12..242a10e 100644 --- a/categories/__init__.py +++ b/categories/__init__.py @@ -3,7 +3,7 @@ __version_info__ = { 'minor': 7, 'micro': 0, 'releaselevel': 'beta', - 'serial': 1 + 'serial': 2 } def get_version(): diff --git a/editor/templatetags/admin_tree_list.py b/editor/templatetags/admin_tree_list.py index cd5325f..c7e82fd 100644 --- a/editor/templatetags/admin_tree_list.py +++ b/editor/templatetags/admin_tree_list.py @@ -1,7 +1,10 @@ from django.db import models from django.template import Library from django.contrib.admin.templatetags.admin_list import result_headers -from django.contrib.admin.util import lookup_field, display_for_field, label_for_field +try: + from django.contrib.admin.util import lookup_field, display_for_field, label_for_field +except ImportError: + from editor.utils import lookup_field, display_for_field, label_for_field from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE from django.core.exceptions import ObjectDoesNotExist from django.utils.encoding import smart_unicode, force_unicode diff --git a/editor/utils.py b/editor/utils.py new file mode 100644 index 0000000..1a6c877 --- /dev/null +++ b/editor/utils.py @@ -0,0 +1,103 @@ +""" +Provides compatibility with Django 1.1 + +Copied from django.contrib.admin.util +""" +from django.db import models +from django.utils.encoding import force_unicode, smart_unicode, smart_str + +def lookup_field(name, obj, model_admin=None): + opts = obj._meta + try: + f = opts.get_field(name) + except models.FieldDoesNotExist: + # For non-field values, the value is either a method, property or + # returned via a callable. + if callable(name): + attr = name + value = attr(obj) + elif (model_admin is not None and hasattr(model_admin, name) and + not name == '__str__' and not name == '__unicode__'): + attr = getattr(model_admin, name) + value = attr(obj) + else: + attr = getattr(obj, name) + if callable(attr): + value = attr() + else: + value = attr + f = None + else: + attr = None + value = getattr(obj, name) + return f, attr, value + + +def label_for_field(name, model, model_admin=None, return_attr=False): + """ + Returns a sensible label for a field name. The name can be a callable or the + name of an object attributes, as well as a genuine fields. If return_attr is + True, the resolved attribute (which could be a callable) is also returned. + This will be None if (and only if) the name refers to a field. + """ + attr = None + try: + field = model._meta.get_field_by_name(name)[0] + if isinstance(field, RelatedObject): + label = field.opts.verbose_name + else: + label = field.verbose_name + except models.FieldDoesNotExist: + if name == "__unicode__": + label = force_unicode(model._meta.verbose_name) + attr = unicode + elif name == "__str__": + label = smart_str(model._meta.verbose_name) + attr = str + else: + if callable(name): + attr = name + elif model_admin is not None and hasattr(model_admin, name): + attr = getattr(model_admin, name) + elif hasattr(model, name): + attr = getattr(model, name) + else: + message = "Unable to lookup '%s' on %s" % (name, model._meta.object_name) + if model_admin: + message += " or %s" % (model_admin.__class__.__name__,) + raise AttributeError(message) + + if hasattr(attr, "short_description"): + label = attr.short_description + elif callable(attr): + if attr.__name__ == "": + label = "--" + else: + label = pretty_name(attr.__name__) + else: + label = pretty_name(name) + if return_attr: + return (label, attr) + else: + return label + +def display_for_field(value, field): + from django.contrib.admin.templatetags.admin_list import _boolean_icon + from django.contrib.admin.views.main import EMPTY_CHANGELIST_VALUE + + if field.flatchoices: + return dict(field.flatchoices).get(value, EMPTY_CHANGELIST_VALUE) + # NullBooleanField needs special-case null-handling, so it comes + # before the general null test. + elif isinstance(field, models.BooleanField) or isinstance(field, models.NullBooleanField): + return _boolean_icon(value) + elif value is None: + return EMPTY_CHANGELIST_VALUE + elif isinstance(field, models.DateField) or isinstance(field, models.TimeField): + return formats.localize(value) + elif isinstance(field, models.DecimalField): + return formats.number_format(value, field.decimal_places) + elif isinstance(field, models.FloatField): + return formats.number_format(value) + else: + return smart_unicode(value)