diff --git a/demo_app/app/adminx.py b/demo_app/app/adminx.py index 3e3c50de4..b2ce243d2 100644 --- a/demo_app/app/adminx.py +++ b/demo_app/app/adminx.py @@ -1,6 +1,6 @@ import xadmin from xadmin import views -from models import IDC, Host, MaintainLog, HostGroup, AccessRecord +from .models import IDC, Host, MaintainLog, HostGroup, AccessRecord from xadmin.layout import Main, TabHolder, Tab, Fieldset, Row, Col, AppendedText, Side from xadmin.plugins.inline import Inline from xadmin.plugins.batch import BatchChangeAction @@ -76,7 +76,7 @@ def open_web(self, instance): search_fields = ['name', 'ip', 'description'] list_filter = ['idc', 'guarantee_date', 'status', 'brand', 'model', 'cpu', 'core_num', 'hard_disk', 'memory', ('service_type',xadmin.filters.MultiSelectFieldListFilter)] - + list_quick_filter = ['service_type',{'field':'idc__name','limit':10}] list_bookmarks = [{'title': "Need Guarantee", 'query': {'status__exact': 2}, 'order': ('-guarantee_date',), 'cols': ('brand', 'guarantee_date', 'service_type')}] @@ -118,16 +118,16 @@ def open_web(self, instance): ) inlines = [MaintainInline] reversion_enable = True - + data_charts = { - "host_service_type_counts": {'title': u"Host service type count", "x-field": "service_type", "y-field": ("service_type",), + "host_service_type_counts": {'title': u"Host service type count", "x-field": "service_type", "y-field": ("service_type",), "option": { - "series": {"bars": {"align": "center", "barWidth": 0.8,'show':True}}, + "series": {"bars": {"align": "center", "barWidth": 0.8,'show':True}}, "xaxis": {"aggregate": "count", "mode": "categories"}, }, }, } - + class HostGroupAdmin(object): list_display = ('name', 'description') list_display_links = ('name',) @@ -183,17 +183,17 @@ def avg_count(self, instance): data_charts = { "user_count": {'title': u"User Report", "x-field": "date", "y-field": ("user_count", "view_count"), "order": ('date',)}, "avg_count": {'title': u"Avg Report", "x-field": "date", "y-field": ('avg_count',), "order": ('date',)}, - "per_month": {'title': u"Monthly Users", "x-field": "_chart_month", "y-field": ("user_count", ), + "per_month": {'title': u"Monthly Users", "x-field": "_chart_month", "y-field": ("user_count", ), "option": { - "series": {"bars": {"align": "center", "barWidth": 0.8,'show':True}}, + "series": {"bars": {"align": "center", "barWidth": 0.8,'show':True}}, "xaxis": {"aggregate": "sum", "mode": "categories"}, }, }, } - + def _chart_month(self,obj): return obj.date.strftime("%B") - + xadmin.sites.site.register(Host, HostAdmin) xadmin.sites.site.register(HostGroup, HostGroupAdmin) diff --git a/demo_app/demo/settings.py b/demo_app/demo/settings.py index 87b76b1d3..4bccd354c 100644 --- a/demo_app/demo/settings.py +++ b/demo_app/demo/settings.py @@ -1,10 +1,7 @@ # Django settings for wictrl project. - -import sys import os.path -reload(sys) -sys.setdefaultencoding('utf-8') + gettext = lambda s: s PROJECT_ROOT = os.path.join( diff --git a/tests/xtests/site/apps.py b/tests/xtests/site/apps.py index 1ab4a5c31..a83d31947 100644 --- a/tests/xtests/site/apps.py +++ b/tests/xtests/site/apps.py @@ -1,11 +1,6 @@ -#!/usr/bin/env python -#coding:utf-8 -import sys -if sys.getdefaultencoding()=='ascii': - reload(sys) - sys.setdefaultencoding('utf-8') - +# -*- coding: utf-8 -*- from django.apps import AppConfig + class SiteApp(AppConfig): name = "site" diff --git a/tests/xtests/view_base/apps.py b/tests/xtests/view_base/apps.py index 6398388ca..12dd7ce1f 100644 --- a/tests/xtests/view_base/apps.py +++ b/tests/xtests/view_base/apps.py @@ -1,11 +1,6 @@ -#!/usr/bin/env python -#coding:utf-8 -import sys -if sys.getdefaultencoding()=='ascii': - reload(sys) - sys.setdefaultencoding('utf-8') - +# -*- coding: utf-8 -*- from django.apps import AppConfig + class ViewBaseApp(AppConfig): name = "view_base" diff --git a/xadmin/adminx.py b/xadmin/adminx.py index a22630107..93df4fdec 100644 --- a/xadmin/adminx.py +++ b/xadmin/adminx.py @@ -1,5 +1,5 @@ import xadmin -from models import UserSettings, Log +from .models import UserSettings, Log from xadmin.layout import * from django.utils.translation import ugettext_lazy as _, ugettext @@ -14,7 +14,7 @@ class LogAdmin(object): def link(self, instance): if instance.content_type and instance.object_id and instance.action_flag != 'delete': - admin_url = self.get_admin_url('%s_%s_change' % (instance.content_type.app_label, instance.content_type.model), + admin_url = self.get_admin_url('%s_%s_change' % (instance.content_type.app_label, instance.content_type.model), instance.object_id) return "%s" % (admin_url, _('Admin Object')) else: diff --git a/xadmin/filters.py b/xadmin/filters.py index 6656578c3..bf3a318fc 100644 --- a/xadmin/filters.py +++ b/xadmin/filters.py @@ -1,6 +1,5 @@ from django.db import models from django.core.exceptions import ImproperlyConfigured -from django.utils.encoding import smart_unicode from django.utils.translation import ugettext_lazy as _ from django.utils import timezone from django.template.loader import get_template @@ -17,7 +16,7 @@ FILTER_PREFIX = '_p_' SEARCH_VAR = '_q_' -from util import (get_model_from_relation, +from .util import (get_model_from_relation, reverse_field_path, get_limit_choices_to_from_path, prepare_lookup_value) @@ -192,7 +191,7 @@ def choices(self): } for lookup, title in self.field.flatchoices: yield { - 'selected': smart_unicode(lookup) == self.lookup_exact_val, + 'selected': lookup == self.lookup_exact_val, 'query_string': self.query_string({self.lookup_exact_name: lookup}), 'display': title, } @@ -408,7 +407,7 @@ def choices(self): } for pk_val, val in self.lookup_choices: yield { - 'selected': self.lookup_exact_val == smart_unicode(pk_val), + 'selected': self.lookup_exact_val == pk_val, 'query_string': self.query_string({ self.lookup_exact_name: pk_val, }, [self.lookup_isnull_name]), @@ -428,62 +427,62 @@ def choices(self): @manager.register class MultiSelectFieldListFilter(ListFieldFilter): """ Delegates the filter to the default filter and ors the results of each - + Lists the distinct values of each field as a checkbox - Uses the default spec for each - + Uses the default spec for each + """ template = 'xadmin/filters/checklist.html' lookup_formats = {'in': '%s__in'} cache_config = {'enabled':False,'key':'quickfilter_%s','timeout':3600,'cache':'default'} - + @classmethod def test(cls, field, request, params, model, admin_view, field_path): return True - + def get_cached_choices(self): if not self.cache_config['enabled']: return None c = caches(self.cache_config['cache']) return c.get(self.cache_config['key']%self.field_path) - + def set_cached_choices(self,choices): if not self.cache_config['enabled']: return c = caches(self.cache_config['cache']) return c.set(self.cache_config['key']%self.field_path,choices) - + def __init__(self, field, request, params, model, model_admin, field_path,field_order_by=None,field_limit=None,sort_key=None,cache_config=None): super(MultiSelectFieldListFilter,self).__init__(field, request, params, model, model_admin, field_path) - + # Check for it in the cachce if cache_config is not None and type(cache_config)==dict: self.cache_config.update(cache_config) - + if self.cache_config['enabled']: self.field_path = field_path choices = self.get_cached_choices() if choices: self.lookup_choices = choices return - + # Else rebuild it - queryset = self.admin_view.queryset().exclude(**{"%s__isnull"%field_path:True}).values_list(field_path, flat=True).distinct() + queryset = self.admin_view.queryset().exclude(**{"%s__isnull"%field_path:True}).values_list(field_path, flat=True).distinct() #queryset = self.admin_view.queryset().distinct(field_path).exclude(**{"%s__isnull"%field_path:True}) - + if field_order_by is not None: # Do a subquery to order the distinct set queryset = self.admin_view.queryset().filter(id__in=queryset).order_by(field_order_by) - + if field_limit is not None and type(field_limit)==int and queryset.count()>field_limit: queryset = queryset[:field_limit] - + self.lookup_choices = [str(it) for it in queryset.values_list(field_path,flat=True) if str(it).strip()!=""] if sort_key is not None: self.lookup_choices = sorted(self.lookup_choices,key=sort_key) - + if self.cache_config['enabled']: - self.set_cached_choices(self.lookup_choices) + self.set_cached_choices(self.lookup_choices) def choices(self): self.lookup_in_val = (type(self.lookup_in_val) in (tuple,list)) and self.lookup_in_val or list(self.lookup_in_val) @@ -494,7 +493,7 @@ def choices(self): } for val in self.lookup_choices: yield { - 'selected': smart_unicode(val) in self.lookup_in_val, + 'selected': val in self.lookup_in_val, 'query_string': self.query_string({self.lookup_in_name: ",".join([val]+self.lookup_in_val),}), 'remove_query_string': self.query_string({self.lookup_in_name: ",".join([v for v in self.lookup_in_val if v != val]),}), 'display': val, @@ -535,7 +534,6 @@ def choices(self): if val is None: include_none = True continue - val = smart_unicode(val) yield { 'selected': self.lookup_exact_val == val, 'query_string': self.query_string({self.lookup_exact_name: val}, diff --git a/xadmin/models.py b/xadmin/models.py index 32ef94f27..7008a81a2 100644 --- a/xadmin/models.py +++ b/xadmin/models.py @@ -8,7 +8,6 @@ from django.core.urlresolvers import NoReverseMatch, reverse from django.core.serializers.json import DjangoJSONEncoder from django.db.models.base import ModelBase -from django.utils.encoding import python_2_unicode_compatible, smart_text, smart_unicode from django.db.models.signals import post_migrate from django.contrib.auth.models import Permission @@ -19,6 +18,7 @@ AUTH_USER_MODEL = getattr(settings, 'AUTH_USER_MODEL', 'auth.User') + def add_view_permissions(sender, **kwargs): """ This syncdb hooks takes care of adding a view permission too all our @@ -77,7 +77,7 @@ def default(self, o): try: return super(JSONEncoder, self).default(o) except Exception: - return smart_unicode(o) + return unicode(o) class UserSettings(models.Model): @@ -162,7 +162,7 @@ class Meta: ordering = ('-action_time',) def __repr__(self): - return smart_text(self.action_time) + return self.action_time def __str__(self): if self.action_flag == 'create': diff --git a/xadmin/plugins/actions.py b/xadmin/plugins/actions.py index f05c1a180..9c96fbfe0 100644 --- a/xadmin/plugins/actions.py +++ b/xadmin/plugins/actions.py @@ -5,7 +5,6 @@ from django.http import HttpResponse, HttpResponseRedirect from django.template import loader from django.template.response import TemplateResponse -from django.utils.encoding import force_unicode from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _, ungettext from django.utils.text import capfirst @@ -24,7 +23,7 @@ def action_checkbox(obj): - return checkbox.render(ACTION_CHECKBOX_NAME, force_unicode(obj.pk)) + return checkbox.render(ACTION_CHECKBOX_NAME, obj.pk) action_checkbox.short_description = mark_safe( '') action_checkbox.allow_tags = True @@ -102,9 +101,9 @@ def do_action(self, queryset): return None if len(queryset) == 1: - objects_name = force_unicode(self.opts.verbose_name) + objects_name = self.opts.verbose_name else: - objects_name = force_unicode(self.opts.verbose_name_plural) + objects_name = self.opts.verbose_name_plural if perms_needed or protected: title = _("Cannot delete %(name)s") % {"name": objects_name} diff --git a/xadmin/plugins/ajax.py b/xadmin/plugins/ajax.py index f6e21c3d6..586e32043 100644 --- a/xadmin/plugins/ajax.py +++ b/xadmin/plugins/ajax.py @@ -1,7 +1,6 @@ from collections import OrderedDict from django.forms.utils import ErrorDict from django.utils.html import escape -from django.utils.encoding import force_unicode from xadmin.sites import site from xadmin.views import BaseAdminPlugin, ListAdminView, ModelFormAdminView, DetailAdminView @@ -16,9 +15,9 @@ def init_request(self, *args, **kwargs): class AjaxListPlugin(BaseAjaxPlugin): - + def get_list_display(self,list_display): - list_fields = [field for field in self.request.GET.get('_fields',"").split(",") + list_fields = [field for field in self.request.GET.get('_fields',"").split(",") if field.strip() != ""] if list_fields: return list_fields @@ -27,7 +26,7 @@ def get_list_display(self,list_display): def get_result_list(self, response): av = self.admin_view base_fields = self.get_list_display(av.base_list_display) - headers = dict([(c.field_name, force_unicode(c.text)) for c in av.result_headers( + headers = dict([(c.field_name, c.text) for c in av.result_headers( ).cells if c.field_name in base_fields]) objects = [dict([(o.field_name, escape(str(o.value))) for i, o in diff --git a/xadmin/plugins/batch.py b/xadmin/plugins/batch.py index b6030773b..41e71faec 100644 --- a/xadmin/plugins/batch.py +++ b/xadmin/plugins/batch.py @@ -5,7 +5,6 @@ from django.core.exceptions import PermissionDenied from django.forms.models import modelform_factory from django.template.response import TemplateResponse -from django.utils.encoding import force_unicode from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _, ugettext_lazy from xadmin.layout import FormHelper, Layout, Fieldset, Container, Col @@ -129,9 +128,9 @@ def do_action(self, queryset): self.form_obj.helper = helper count = len(queryset) if count == 1: - objects_name = force_unicode(self.opts.verbose_name) + objects_name = self.opts.verbose_name else: - objects_name = force_unicode(self.opts.verbose_name_plural) + objects_name = self.opts.verbose_name_plural context = self.get_context() context.update({ diff --git a/xadmin/plugins/chart.py b/xadmin/plugins/chart.py index 36907da65..b42a4aa6a 100644 --- a/xadmin/plugins/chart.py +++ b/xadmin/plugins/chart.py @@ -7,7 +7,6 @@ from django.http import HttpResponseNotFound from django.core.serializers.json import DjangoJSONEncoder from django.http import HttpResponse -from django.utils.encoding import smart_unicode from django.db import models from django.utils.http import urlencode from django.utils.translation import ugettext_lazy as _, ugettext @@ -16,7 +15,7 @@ from xadmin.sites import site from xadmin.views import BaseAdminPlugin, ListAdminView from xadmin.views.dashboard import ModelBaseWidget, widget_manager -from xadmin.util import lookup_field, label_for_field, force_unicode, json +from xadmin.util import lookup_field, label_for_field, json @widget_manager.register @@ -77,7 +76,7 @@ def default(self, o): try: return super(JSONEncoder, self).default(o) except Exception: - return smart_unicode(o) + return o class ChartsPlugin(BaseAdminPlugin): @@ -124,8 +123,8 @@ def get(self, request, name): self.y_fields = ( y_fields,) if type(y_fields) not in (list, tuple) else y_fields - datas = [{"data":[], "label": force_unicode(label_for_field( - i, self.model, model_admin=self))} for i in self.y_fields] + datas = [{"data":[], "label": label_for_field( + i, self.model, model_admin=self)} for i in self.y_fields] self.make_result_list() diff --git a/xadmin/plugins/editable.py b/xadmin/plugins/editable.py index 00c4c8ae0..b40aa56ec 100644 --- a/xadmin/plugins/editable.py +++ b/xadmin/plugins/editable.py @@ -3,7 +3,6 @@ from django.db import models, transaction from django.forms.models import modelform_factory from django.http import Http404, HttpResponse -from django.utils.encoding import force_unicode, smart_unicode from django.utils.html import escape, conditional_escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ @@ -32,7 +31,7 @@ def init_request(self, *args, **kwargs): return active def result_item(self, item, obj, field_name, row): - if self.list_editable and item.field and item.field.editable and (field_name in self.list_editable): + if self.list_editable and item.field and item.field.editable and (field_name in self.list_editable): pk = getattr(obj, obj._meta.pk.attname) field_label = label_for_field(field_name, obj, model_admin=self.admin_view, @@ -71,7 +70,7 @@ def init_request(self, object_id, *args, **kwargs): if self.org_obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % - {'name': force_unicode(self.opts.verbose_name), 'key': escape(object_id)}) + {'name': self.opts.verbose_name, 'key': escape(object_id)}) def get_new_field_html(self, f): result = self.result_item(self.org_obj, f, {'is_display_first': @@ -92,7 +91,7 @@ def _get_new_field_html(self, field_name): allow_tags = True text = boolean_icon(value) else: - text = smart_unicode(value) + text = value else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(self.org_obj, f.name) diff --git a/xadmin/plugins/export.py b/xadmin/plugins/export.py index 860755640..bf75d3614 100644 --- a/xadmin/plugins/export.py +++ b/xadmin/plugins/export.py @@ -1,10 +1,12 @@ -import StringIO +try: + from StringIO import StringIO +except ImportError: + from io import StringIO import datetime import sys from django.http import HttpResponse from django.template import loader -from django.utils.encoding import force_unicode, smart_unicode from django.utils.html import escape from django.utils.translation import ugettext as _ from django.utils.xmlutils import SimplerXMLGenerator @@ -75,7 +77,7 @@ def _get_objects(self, context): rows = context['results'] return [dict([ - (force_unicode(headers[i].text), self._format_value(o)) for i, o in + (headers[i].text, self._format_value(o)) for i, o in enumerate(filter(lambda c:getattr(c, 'export', False), r.cells))]) for r in rows] def _get_datas(self, context): @@ -83,7 +85,7 @@ def _get_datas(self, context): new_rows = [[self._format_value(o) for o in filter(lambda c:getattr(c, 'export', False), r.cells)] for r in rows] - new_rows.insert(0, [force_unicode(c.text) for c in context['result_headers'].cells if c.export]) + new_rows.insert(0, [c.text for c in context['result_headers'].cells if c.export]) return new_rows def get_xlsx_export(self, context): @@ -95,7 +97,7 @@ def get_xlsx_export(self, context): model_name = self.opts.verbose_name book = xlsxwriter.Workbook(output) sheet = book.add_worksheet( - u"%s %s" % (_(u'Sheet'), force_unicode(model_name))) + u"%s %s" % (_(u'Sheet'), model_name)) styles = {'datetime': book.add_format({'num_format': 'yyyy-mm-dd hh:mm:ss'}), 'date': book.add_format({'num_format': 'yyyy-mm-dd'}), 'time': book.add_format({'num_format': 'hh:mm:ss'}), @@ -132,7 +134,7 @@ def get_xls_export(self, context): model_name = self.opts.verbose_name book = xlwt.Workbook(encoding='utf8') sheet = book.add_sheet( - u"%s %s" % (_(u'Sheet'), force_unicode(model_name))) + u"%s %s" % (_(u'Sheet'), model_name)) styles = {'datetime': xlwt.easyxf(num_format_str='yyyy-mm-dd hh:mm:ss'), 'date': xlwt.easyxf(num_format_str='yyyy-mm-dd'), 'time': xlwt.easyxf(num_format_str='hh:mm:ss'), @@ -193,7 +195,7 @@ def _to_xml(self, xml, data): self._to_xml(xml, value) xml.endElement(key) else: - xml.characters(smart_unicode(data)) + xml.characters(data) def get_xml_export(self, context): results = self._get_objects(context) diff --git a/xadmin/plugins/filters.py b/xadmin/plugins/filters.py index 03e4f7831..27164ced1 100644 --- a/xadmin/plugins/filters.py +++ b/xadmin/plugins/filters.py @@ -128,7 +128,7 @@ def get_list_queryset(self, queryset): if spec and spec.has_output(): try: new_qs = spec.do_filte(queryset) - except ValidationError, e: + except (ValidationError, e): new_qs = None self.admin_view.message_user(_("Filtering error: %s") % e.messages[0], 'error') if new_qs is not None: @@ -145,14 +145,14 @@ def get_list_queryset(self, queryset): for key, value in lookup_params.items(): use_distinct = ( use_distinct or lookup_needs_distinct(self.opts, key)) - except FieldDoesNotExist, e: + except (FieldDoesNotExist, e): raise IncorrectLookupParameters(e) try: queryset = queryset.filter(**lookup_params) except (SuspiciousOperation, ImproperlyConfigured): raise - except Exception, e: + except (Exception, e): raise IncorrectLookupParameters(e) query = self.request.GET.get(SEARCH_VAR, '') diff --git a/xadmin/plugins/multiselect.py b/xadmin/plugins/multiselect.py index 29426a7fe..8b97d60e0 100644 --- a/xadmin/plugins/multiselect.py +++ b/xadmin/plugins/multiselect.py @@ -6,7 +6,6 @@ from django.db.models import ManyToManyField from django.forms.utils import flatatt from django.template import loader -from django.utils.encoding import force_unicode from django.utils.html import escape, conditional_escape from django.utils.safestring import mark_safe from xadmin.util import vendor @@ -25,9 +24,8 @@ def __init__(self, verbose_name, is_stacked, attrs=None, choices=()): super(SelectMultipleTransfer, self).__init__(attrs, choices) def render_opt(self, selected_choices, option_value, option_label): - option_value = force_unicode(option_value) return u'' % ( - escape(option_value), conditional_escape(force_unicode(option_label))), bool(option_value in selected_choices) + escape(option_value), conditional_escape(option_label)), bool(option_value in selected_choices) def render(self, name, value, attrs=None, choices=()): if attrs is None: @@ -39,14 +37,14 @@ def render(self, name, value, attrs=None, choices=()): value = [] final_attrs = self.build_attrs(attrs, name=name) - selected_choices = set(force_unicode(v) for v in value) + selected_choices = set(v for v in value) available_output = [] chosen_output = [] for option_value, option_label in chain(self.choices, choices): if isinstance(option_label, (list, tuple)): available_output.append(u'' % - escape(force_unicode(option_value))) + escape(option_value)) for option in option_label: output, selected = self.render_opt( selected_choices, *option) diff --git a/xadmin/plugins/quickfilter.py b/xadmin/plugins/quickfilter.py index b51a401e9..2d0638861 100644 --- a/xadmin/plugins/quickfilter.py +++ b/xadmin/plugins/quickfilter.py @@ -11,28 +11,28 @@ @manager.register class QuickFilterMultiSelectFieldListFilter(MultiSelectFieldListFilter): """ Delegates the filter to the default filter and ors the results of each - + Lists the distinct values of each field as a checkbox - Uses the default spec for each - + Uses the default spec for each + """ template = 'xadmin/filters/quickfilter.html' class QuickFilterPlugin(BaseAdminPlugin): """ Add a filter menu to the left column of the page """ list_quick_filter = () # these must be a subset of list_filter to work - quickfilter = {} + quickfilter = {} search_fields = () free_query_filter = True - + def init_request(self, *args, **kwargs): menu_style_accordian = hasattr(self.admin_view,'menu_style') and self.admin_view.menu_style == 'accordion' return bool(self.list_quick_filter) and not menu_style_accordian - + # Media def get_media(self, media): return media + self.vendor('xadmin.plugin.quickfilter.js','xadmin.plugin.quickfilter.css') - + def lookup_allowed(self, lookup, value): model = self.model # Check FKey lookups that are allowed, so that popups produced by @@ -42,14 +42,14 @@ def lookup_allowed(self, lookup, value): for k, v in widgets.url_params_from_lookup_dict(l).items(): if k == lookup and v == value: return True - + parts = lookup.split(LOOKUP_SEP) - + # Last term in lookup is a query term (__exact, __startswith etc) # This term can be ignored. if len(parts) > 1 and parts[-1] in QUERY_TERMS: parts.pop() - + # Special case -- foo__id__exact and foo__id queries are implied # if foo has been specificially included in the lookup list; so # drop __id if it is the last part. However, first we need to find @@ -72,32 +72,32 @@ def lookup_allowed(self, lookup, value): rel_name = None if rel_name and len(parts) > 1 and parts[-1] == rel_name: parts.pop() - + if len(parts) == 1: return True clean_lookup = LOOKUP_SEP.join(parts) return clean_lookup in self.list_quick_filter - + def get_list_queryset(self, queryset): lookup_params = dict([(smart_str(k)[len(FILTER_PREFIX):], v) for k, v in self.admin_view.params.items() if smart_str(k).startswith(FILTER_PREFIX) and v != '']) for p_key, p_val in lookup_params.iteritems(): if p_val == "False": lookup_params[p_key] = False use_distinct = False - + if not hasattr(self.admin_view,'quickfilter'): self.admin_view.quickfilter = {} - + # for clean filters self.admin_view.quickfilter['has_query_param'] = bool(lookup_params) self.admin_view.quickfilter['clean_query_url'] = self.admin_view.get_query_string(remove=[k for k in self.request.GET.keys() if k.startswith(FILTER_PREFIX)]) - + # Normalize the types of keys if not self.free_query_filter: for key, value in lookup_params.items(): if not self.lookup_allowed(key, value): raise SuspiciousOperation("Filtering by %s not allowed" % key) - + self.filter_specs = [] if self.list_quick_filter: for list_quick_filter in self.list_quick_filter: @@ -105,9 +105,9 @@ def get_list_queryset(self, queryset): field_order_by = None field_limit = None field_parts = [] - sort_key = None + sort_key = None cache_config = None - + if type(list_quick_filter)==dict and 'field' in list_quick_filter: field = list_quick_filter['field'] if 'order_by' in list_quick_filter: @@ -118,43 +118,43 @@ def get_list_queryset(self, queryset): sort_key = list_quick_filter['sort'] if 'cache' in list_quick_filter and type(list_quick_filter)==dict: cache_config = list_quick_filter['cache'] - - else: + + else: field = list_quick_filter # This plugin only uses MultiselectFieldListFilter - + if not isinstance(field, models.Field): field_path = field field_parts = get_fields_from_path(self.model, field_path) field = field_parts[-1] spec = QuickFilterMultiSelectFieldListFilter(field, self.request, lookup_params,self.model, self.admin_view, field_path=field_path,field_order_by=field_order_by,field_limit=field_limit,sort_key=sort_key,cache_config=cache_config) - + if len(field_parts)>1: - spec.title = "%s %s"%(field_parts[-2].name,spec.title) - + spec.title = "%s %s"%(field_parts[-2].name,spec.title) + # Check if we need to use distinct() use_distinct = True#(use_distinct orlookup_needs_distinct(self.opts, field_path)) if spec and spec.has_output(): try: new_qs = spec.do_filte(queryset) - except ValidationError, e: + except (ValidationError, e): new_qs = None self.admin_view.message_user(_("Filtering error: %s") % e.messages[0], 'error') if new_qs is not None: queryset = new_qs - + self.filter_specs.append(spec) - + self.has_filters = bool(self.filter_specs) self.admin_view.quickfilter['filter_specs'] = self.filter_specs self.admin_view.quickfilter['used_filter_num'] = len(filter(lambda f: f.is_used, self.filter_specs)) - + if use_distinct: return queryset.distinct() else: return queryset - + def block_left_navbar(self, context, nodes): nodes.append(loader.render_to_string('xadmin/blocks/modal_list.left_navbar.quickfilter.html', get_context_dict(context))) - + site.register_plugin(QuickFilterPlugin, ListAdminView) diff --git a/xadmin/plugins/relate.py b/xadmin/plugins/relate.py index feb108b49..4a971c585 100644 --- a/xadmin/plugins/relate.py +++ b/xadmin/plugins/relate.py @@ -3,7 +3,6 @@ from django.core.urlresolvers import reverse from django.db.models.options import PROXY_PARENTS -from django.utils.encoding import force_unicode from django.utils.encoding import smart_str from django.utils.safestring import mark_safe from django.db.models.sql.query import LOOKUP_SEP @@ -78,7 +77,7 @@ def related_link(self, instance): field = rel.field rel_name = rel.get_related_field().name - verbose_name = force_unicode(opts.verbose_name) + verbose_name = opts.verbose_name lookup_name = '%s__%s__exact' % (field.name, rel_name) link = ''.join(('
  • ', @@ -145,9 +144,9 @@ def get_brand_name(self): if len(self.to_objs) == 1: to_model_name = str(self.to_objs[0]) else: - to_model_name = force_unicode(self.to_model._meta.verbose_name) + to_model_name = self.to_model._meta.verbose_name - return mark_safe(u"%s %s" % (to_model_name, force_unicode(self.opts.verbose_name_plural))) + return mark_safe(u"%s %s" % (to_model_name, self.opts.verbose_name_plural)) class BaseRelateDisplayPlugin(BaseAdminPlugin): diff --git a/xadmin/plugins/themes.py b/xadmin/plugins/themes.py index 534429f3a..7194efbe7 100644 --- a/xadmin/plugins/themes.py +++ b/xadmin/plugins/themes.py @@ -68,8 +68,8 @@ def block_top_navmenu(self, context, nodes): {'name': t['name'], 'description': t['description'], 'css': t['cssMin'], 'thumbnail': t['thumbnail']} for t in watch_themes]) - except Exception, e: - print e + except (Exception, e): + print(e) cache.set(THEME_CACHE_KEY, json.dumps(ex_themes), 24 * 3600) themes.extend(ex_themes) diff --git a/xadmin/plugins/xversion.py b/xadmin/plugins/xversion.py index e0b186035..74385d024 100644 --- a/xadmin/plugins/xversion.py +++ b/xadmin/plugins/xversion.py @@ -8,7 +8,6 @@ from django.http import HttpResponseRedirect from django.shortcuts import get_object_or_404 from django.template.response import TemplateResponse -from django.utils.encoding import force_unicode from django.utils.safestring import mark_safe from django.utils.text import capfirst from django.utils.translation import ugettext as _ @@ -191,7 +190,7 @@ def get_context(self): "opts": opts, "app_label": opts.app_label, "model_name": capfirst(opts.verbose_name), - "title": _("Recover deleted %(name)s") % {"name": force_unicode(opts.verbose_name_plural)}, + "title": _("Recover deleted %(name)s") % {"name": opts.verbose_name_plural}, "deleted": deleted, "changelist_url": self.model_admin_url("changelist"), }) @@ -235,9 +234,9 @@ def get_context(self): ).select_related("revision__user")) ] context.update({ - 'title': _('Change history: %s') % force_unicode(self.obj), + 'title': _('Change history: %s') % self.obj, 'action_list': action_list, - 'model_name': capfirst(force_unicode(opts.verbose_name_plural)), + 'model_name': capfirst(opts.verbose_name_plural), 'object': self.obj, 'app_label': opts.app_label, "changelist_url": self.model_admin_url("changelist"), @@ -401,7 +400,7 @@ def get_form_helper(self): helper = super(RevisionView, self).get_form_helper() diff_fields = {} version_data = self.version.field_dict - + for f in self.opts.fields: fvalue = f.value_from_object(self.org_obj) vvalue = version_data.get(f.name, None) @@ -421,7 +420,7 @@ def get_form_helper(self): def get_context(self): context = super(RevisionView, self).get_context() context["title"] = _( - "Revert %s") % force_unicode(self.model._meta.verbose_name) + "Revert %s") % self.model._meta.verbose_name return context @filter_hook @@ -438,7 +437,7 @@ def get_response(self): @filter_hook def post_response(self): self.message_user(_('The %(model)s "%(name)s" was reverted successfully. You may edit it again below.') % - {"model": force_unicode(self.opts.verbose_name), "name": unicode(self.new_obj)}, 'success') + {"model": self.opts.verbose_name, "name": unicode(self.new_obj)}, 'success') return HttpResponseRedirect(self.model_admin_url('change', self.new_obj.pk)) @@ -475,7 +474,7 @@ def get_response(self): @filter_hook def post_response(self): self.message_user(_('The %(model)s "%(name)s" was recovered successfully. You may edit it again below.') % - {"model": force_unicode(self.opts.verbose_name), "name": unicode(self.new_obj)}, 'success') + {"model": self.opts.verbose_name, "name": unicode(self.new_obj)}, 'success') return HttpResponseRedirect(self.model_admin_url('change', self.new_obj.pk)) diff --git a/xadmin/sites.py b/xadmin/sites.py index 8963b7061..ede17e6e8 100644 --- a/xadmin/sites.py +++ b/xadmin/sites.py @@ -1,4 +1,4 @@ -import sys +# -*- coding: utf-8 -*- from functools import update_wrapper from django.conf import settings from django.core.exceptions import ImproperlyConfigured @@ -7,9 +7,6 @@ from django.template.engine import Engine import inspect -reload(sys) -sys.setdefaultencoding("utf-8") - class AlreadyRegistered(Exception): pass @@ -310,7 +307,7 @@ def wrapper(*args, **kwargs): ] # Add in each model's views. - for model, admin_class in self._registry.iteritems(): + for model, admin_class in self._registry.items(): view_urls = [url( path, wrap( self.create_model_admin_view(clz, model, admin_class)), diff --git a/xadmin/util.py b/xadmin/util.py index ed923e8a2..e4e21b7be 100644 --- a/xadmin/util.py +++ b/xadmin/util.py @@ -8,7 +8,6 @@ from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.text import capfirst -from django.utils.encoding import force_unicode, smart_unicode, smart_str from django.utils.translation import ungettext from django.core.urlresolvers import reverse from django.conf import settings @@ -45,7 +44,7 @@ def xstatic(*tags): try: for p in tag.split('.'): node = node[p] - except Exception, e: + except (Exception, e): if tag.startswith('xadmin'): file_type = tag.split('.')[-1] if file_type in ('css', 'js'): @@ -187,7 +186,7 @@ def collect(self, objs, source_attr=None, **kwargs): self.add_edge(None, obj) try: return super(NestedObjects, self).collect(objs, source_attr=source_attr, **kwargs) - except models.ProtectedError, e: + except (models.ProtectedError, e): self.protected.update(e.protected_objects) def related_objects(self, related, objs): @@ -236,8 +235,8 @@ def model_format_dict(obj): else: opts = obj return { - 'verbose_name': force_unicode(opts.verbose_name), - 'verbose_name_plural': force_unicode(opts.verbose_name_plural) + 'verbose_name': opts.verbose_name, + 'verbose_name_plural': opts.verbose_name_plural } @@ -329,9 +328,9 @@ def display_for_field(value, field): elif isinstance(field, models.FloatField): return formats.number_format(value) elif isinstance(field.rel, models.ManyToManyRel): - return ', '.join([smart_unicode(obj) for obj in value.all()]) + return ', '.join([obj for obj in value.all()]) else: - return smart_unicode(value) + return value def display_for_value(value, boolean=False): @@ -348,7 +347,7 @@ def display_for_value(value, boolean=False): elif isinstance(value, (decimal.Decimal, float)): return formats.number_format(value) else: - return smart_unicode(value) + return value class NotRelationField(Exception): diff --git a/xadmin/views/__init__.py b/xadmin/views/__init__.py index c7db4ff58..5f2dc4f95 100644 --- a/xadmin/views/__init__.py +++ b/xadmin/views/__init__.py @@ -1,13 +1,12 @@ +from .base import BaseAdminPlugin, BaseAdminView, CommAdminView, ModelAdminView, filter_hook, csrf_protect_m, BaseAdminObject -from base import BaseAdminPlugin, BaseAdminView, CommAdminView, ModelAdminView, filter_hook, csrf_protect_m, BaseAdminObject - -from list import ListAdminView -from edit import CreateAdminView, UpdateAdminView, ModelFormAdminView -from delete import DeleteAdminView -from detail import DetailAdminView -from form import FormAdminView -from dashboard import Dashboard, BaseWidget, widget_manager, ModelDashboard -from website import IndexView, LoginView, LogoutView, UserSettingView +from .list import ListAdminView +from .edit import CreateAdminView, UpdateAdminView, ModelFormAdminView +from .delete import DeleteAdminView +from .detail import DetailAdminView +from .form import FormAdminView +from .dashboard import Dashboard, BaseWidget, widget_manager, ModelDashboard +from .website import IndexView, LoginView, LogoutView, UserSettingView __all__ = ( 'BaseAdminObject', @@ -18,6 +17,7 @@ 'filter_hook', 'csrf_protect_m' ) + # admin site-wide views def register_builtin_views(site): site.register_view(r'^$', IndexView, name='index') @@ -37,4 +37,4 @@ def register_builtin_views(site): site.register_modelview( r'^(.+)/dashboard/$', ModelDashboard, name='%s_%s_dashboard') - site.set_loginview(LoginView) \ No newline at end of file + site.set_loginview(LoginView) diff --git a/xadmin/views/base.py b/xadmin/views/base.py index 44cb044fb..276c1ee87 100644 --- a/xadmin/views/base.py +++ b/xadmin/views/base.py @@ -7,7 +7,7 @@ from inspect import getargspec from django import forms -from django.utils.encoding import force_unicode, force_text +from django.utils.encoding import force_text from django.apps import apps from django.conf import settings from django.contrib import messages @@ -19,7 +19,6 @@ from django.template import Context, Template from django.template.response import TemplateResponse from django.utils.decorators import method_decorator, classonlymethod -from django.utils.encoding import force_unicode, smart_unicode, smart_str from django.utils.http import urlencode from django.utils.itercompat import is_iterable from django.utils.safestring import mark_safe @@ -38,10 +37,12 @@ class IncorrectPluginArg(Exception): pass + def get_content_type_for_model(obj): from django.contrib.contenttypes.models import ContentType return ContentType.objects.get_for_model(obj, for_concrete_model=False) + def filter_chain(filters, token, func, *args, **kwargs): if token == -1: return func() @@ -120,7 +121,7 @@ def default(self, o): try: return super(JSONEncoder, self).default(o) except Exception: - return smart_unicode(o) + return o class BaseAdminObject(object): @@ -212,7 +213,7 @@ def vendor(self, *tags): def log(self, flag, message, obj=None): log = Log( - user=self.user, + user=self.user, ip_addr=self.request.META['REMOTE_ADDR'], action_flag=flag, message=message @@ -495,7 +496,7 @@ def get_context(self): "opts": self.opts, "app_label": self.app_label, "model_name": self.model_name, - "verbose_name": force_unicode(self.opts.verbose_name), + "verbose_name": self.opts.verbose_name, 'model_icon': self.get_model_icon(self.model), } context = super(ModelAdminView, self).get_context() diff --git a/xadmin/views/dashboard.py b/xadmin/views/dashboard.py index 569c938d7..4a9375cad 100644 --- a/xadmin/views/dashboard.py +++ b/xadmin/views/dashboard.py @@ -9,7 +9,6 @@ from django.template import loader from django.http import Http404 from django.test.client import RequestFactory -from django.utils.encoding import force_unicode, smart_unicode from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ @@ -39,12 +38,12 @@ def render(self, name, value, attrs=None): final_attrs = self.build_attrs(attrs, name=name) final_attrs['class'] = 'nav nav-pills nav-stacked' output = [u'' % flatatt(final_attrs)] - options = self.render_options(force_unicode(value), final_attrs['id']) + options = self.render_options(value, final_attrs['id']) if options: output.append(options) output.append(u'') output.append('' % - (final_attrs['id'], name, force_unicode(value))) + (final_attrs['id'], name, value)) return mark_safe(u'\n'.join(output)) def render_option(self, selected_choice, widget, id): @@ -305,7 +304,7 @@ def prepare_value(self, value): def valid_value(self, value): value = self.prepare_value(value) for k, v in self.choices: - if value == smart_unicode(k): + if value == k: return True return False @@ -558,7 +557,7 @@ def get_widgets(self): widget = user_widgets.get(int(wid)) if widget: ws.append(self.get_widget(widget)) - except Exception, e: + except (Exception, e): import logging logging.error(e, exc_info=True) widgets.append(ws) @@ -637,7 +636,7 @@ def get_page_id(self): @filter_hook def get_title(self): - return self.title % force_unicode(self.obj) + return self.title % self.obj def init_request(self, object_id, *args, **kwargs): self.obj = self.get_object(unquote(object_id)) @@ -647,7 +646,7 @@ def init_request(self, object_id, *args, **kwargs): if self.obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % - {'name': force_unicode(self.opts.verbose_name), 'key': escape(object_id)}) + {'name': self.opts.verbose_name, 'key': escape(object_id)}) @filter_hook def get_context(self): diff --git a/xadmin/views/delete.py b/xadmin/views/delete.py index a6b75d066..fdf7b4802 100644 --- a/xadmin/views/delete.py +++ b/xadmin/views/delete.py @@ -2,7 +2,6 @@ from django.db import transaction, router from django.http import Http404, HttpResponseRedirect from django.template.response import TemplateResponse -from django.utils.encoding import force_unicode from django.utils.html import escape from django.utils.translation import ugettext as _ from django.contrib.admin.utils import get_deleted_objects @@ -24,7 +23,7 @@ def init_request(self, object_id, *args, **kwargs): raise PermissionDenied if self.obj is None: - raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': force_unicode(self.opts.verbose_name), 'key': escape(object_id)}) + raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % {'name': self.opts.verbose_name, 'key': escape(object_id)}) using = router.db_for_write(self.model) @@ -68,7 +67,7 @@ def delete_model(self): def get_context(self): if self.perms_needed or self.protected: title = _("Cannot delete %(name)s") % {"name": - force_unicode(self.opts.verbose_name)} + self.opts.verbose_name} else: title = _("Are you sure?") @@ -87,7 +86,7 @@ def get_context(self): def get_breadcrumb(self): bcs = super(DeleteAdminView, self).get_breadcrumb() bcs.append({ - 'title': force_unicode(self.obj), + 'title': self.obj, 'url': self.get_object_url(self.obj) }) item = {'title': _('Delete')} @@ -101,7 +100,7 @@ def get_breadcrumb(self): def post_response(self): self.message_user(_('The %(name)s "%(obj)s" was deleted successfully.') % - {'name': force_unicode(self.opts.verbose_name), 'obj': force_unicode(self.obj)}, 'success') + {'name': self.opts.verbose_name, 'obj': self.obj}, 'success') if not self.has_view_permission(): return self.get_admin_url('index') diff --git a/xadmin/views/detail.py b/xadmin/views/detail.py index bc459f2d9..61de5e9ca 100644 --- a/xadmin/views/detail.py +++ b/xadmin/views/detail.py @@ -9,7 +9,6 @@ from django.http import Http404 from django.template import loader from django.template.response import TemplateResponse -from django.utils.encoding import force_unicode, smart_unicode from django.utils.html import escape from django.utils.safestring import mark_safe from django.utils.translation import ugettext as _ @@ -17,7 +16,7 @@ from xadmin.layout import FormHelper, Layout, Fieldset, Container, Column, Field, Col, TabHolder from xadmin.util import unquote, lookup_field, display_for_field, boolean_icon, label_for_field -from base import ModelAdminView, filter_hook, csrf_protect_m +from .base import ModelAdminView, filter_hook, csrf_protect_m # Text to display within change-list table cells if the value is blank. EMPTY_CHANGELIST_VALUE = _('Null') @@ -90,7 +89,7 @@ def init(self): self.allow_tags = True self.text = boolean_icon(value) else: - self.text = smart_unicode(value) + self.text = value else: if isinstance(f.rel, models.ManyToOneRel): self.text = getattr(self.obj, f.name) @@ -104,7 +103,7 @@ def init(self): def val(self): text = mark_safe( self.text) if self.allow_tags else conditional_escape(self.text) - if force_unicode(text) == '' or text == 'None' or text == EMPTY_CHANGELIST_VALUE: + if not text or text == 'None' or text == EMPTY_CHANGELIST_VALUE: text = mark_safe( '%s' % EMPTY_CHANGELIST_VALUE) for wrap in self.wraps: @@ -140,7 +139,7 @@ def init_request(self, object_id, *args, **kwargs): if self.obj is None: raise Http404( _('%(name)s object with primary key %(key)r does not exist.') % - {'name': force_unicode(self.opts.verbose_name), 'key': escape(object_id)}) + {'name': self.opts.verbose_name, 'key': escape(object_id)}) self.org_obj = self.obj @filter_hook @@ -227,7 +226,7 @@ def get(self, request, *args, **kwargs): @filter_hook def get_context(self): new_context = { - 'title': _('%s Detail') % force_unicode(self.opts.verbose_name), + 'title': _('%s Detail') % self.opts.verbose_name, 'form': self.form_obj, 'object': self.obj, @@ -245,7 +244,7 @@ def get_context(self): @filter_hook def get_breadcrumb(self): bcs = super(DetailAdminView, self).get_breadcrumb() - item = {'title': force_unicode(self.obj)} + item = {'title': self.obj} if self.has_view_permission(): item['url'] = self.model_admin_url('detail', self.obj.pk) bcs.append(item) diff --git a/xadmin/views/edit.py b/xadmin/views/edit.py index 0a25259d6..7366c8e84 100644 --- a/xadmin/views/edit.py +++ b/xadmin/views/edit.py @@ -8,7 +8,6 @@ from django.forms.models import modelform_factory, modelform_defines_fields from django.http import Http404, HttpResponseRedirect from django.template.response import TemplateResponse -from django.utils.encoding import force_unicode from django.utils.html import escape from django.utils.text import capfirst, get_text_list from django.template import loader @@ -18,7 +17,7 @@ from xadmin.util import unquote from xadmin.views.detail import DetailAdminUtil -from base import ModelAdminView, filter_hook, csrf_protect_m +from .base import ModelAdminView, filter_hook, csrf_protect_m FORMFIELD_FOR_DBFIELD_DEFAULTS = { @@ -384,7 +383,7 @@ def get_form_datas(self): @filter_hook def get_context(self): new_context = { - 'title': _('Add %s') % force_unicode(self.opts.verbose_name), + 'title': _('Add %s') % self.opts.verbose_name, } context = super(CreateAdminView, self).get_context() context.update(new_context) @@ -393,7 +392,7 @@ def get_context(self): @filter_hook def get_breadcrumb(self): bcs = super(ModelFormAdminView, self).get_breadcrumb() - item = {'title': _('Add %s') % force_unicode(self.opts.verbose_name)} + item = {'title': _('Add %s') % self.opts.verbose_name} if self.has_add_permission(): item['url'] = self.model_admin_url('add') bcs.append(item) @@ -417,8 +416,8 @@ def post_response(self): request = self.request msg = _( - 'The %(name)s "%(obj)s" was added successfully.') % {'name': force_unicode(self.opts.verbose_name), - 'obj': "%s" % (self.model_admin_url('change', self.new_obj._get_pk_val()), force_unicode(self.new_obj))} + 'The %(name)s "%(obj)s" was added successfully.') % {'name': self.opts.verbose_name, + 'obj': "%s" % (self.model_admin_url('change', self.new_obj._get_pk_val()), self.new_obj)} if "_continue" in request.POST: self.message_user( @@ -426,7 +425,7 @@ def post_response(self): return self.model_admin_url('change', self.new_obj._get_pk_val()) if "_addanother" in request.POST: - self.message_user(msg + ' ' + (_("You may add another %s below.") % force_unicode(self.opts.verbose_name)), 'success') + self.message_user(msg + ' ' + (_("You may add another %s below.") % self.opts.verbose_name), 'success') return request.path else: self.message_user(msg, 'success') @@ -452,7 +451,7 @@ def init_request(self, object_id, *args, **kwargs): if self.org_obj is None: raise Http404(_('%(name)s object with primary key %(key)r does not exist.') % - {'name': force_unicode(self.opts.verbose_name), 'key': escape(object_id)}) + {'name': self.opts.verbose_name, 'key': escape(object_id)}) # comm method for both get and post self.prepare_form() @@ -468,7 +467,7 @@ def get_form_datas(self): @filter_hook def get_context(self): new_context = { - 'title': _('Change %s') % force_unicode(self.org_obj), + 'title': _('Change %s') % self.org_obj, 'object_id': str(self.org_obj.pk), } context = super(UpdateAdminView, self).get_context() @@ -479,7 +478,7 @@ def get_context(self): def get_breadcrumb(self): bcs = super(ModelFormAdminView, self).get_breadcrumb() - item = {'title': force_unicode(self.org_obj)} + item = {'title': self.org_obj} if self.has_change_permission(): item['url'] = self.model_admin_url('change', self.org_obj.pk) bcs.append(item) @@ -514,14 +513,14 @@ def post_response(self): pk_value = obj._get_pk_val() msg = _('The %(name)s "%(obj)s" was changed successfully.') % {'name': - force_unicode(verbose_name), 'obj': force_unicode(obj)} + verbose_name, 'obj': obj} if "_continue" in request.POST: self.message_user( msg + ' ' + _("You may edit it again below."), 'success') return request.path elif "_addanother" in request.POST: self.message_user(msg + ' ' + (_("You may add another %s below.") - % force_unicode(verbose_name)), 'success') + % verbose_name), 'success') return self.model_admin_url('add') else: self.message_user(msg, 'success') diff --git a/xadmin/views/form.py b/xadmin/views/form.py index 685c4b0af..679136352 100644 --- a/xadmin/views/form.py +++ b/xadmin/views/form.py @@ -7,7 +7,6 @@ from django.forms.models import modelform_factory from django.http import Http404, HttpResponseRedirect from django.template.response import TemplateResponse -from django.utils.encoding import force_unicode from django.utils.html import escape from django.template import loader from django.utils.translation import ugettext as _ @@ -16,7 +15,8 @@ from xadmin.util import unquote from xadmin.views.detail import DetailAdminUtil -from base import CommAdminView, filter_hook, csrf_protect_m +from .base import CommAdminView, filter_hook, csrf_protect_m + class FormAdminView(CommAdminView): form = forms.ModelForm diff --git a/xadmin/views/list.py b/xadmin/views/list.py index 0afe43b32..7ed77870d 100644 --- a/xadmin/views/list.py +++ b/xadmin/views/list.py @@ -5,7 +5,6 @@ from django.db import models from django.http import HttpResponseRedirect from django.template.response import SimpleTemplateResponse, TemplateResponse -from django.utils.encoding import force_unicode, smart_unicode from django.utils.html import escape, conditional_escape from django.utils.safestring import mark_safe from django.utils.text import capfirst @@ -13,7 +12,7 @@ from xadmin.util import lookup_field, display_for_field, label_for_field, boolean_icon -from base import ModelAdminView, filter_hook, inclusion_tag, csrf_protect_m +from .base import ModelAdminView, filter_hook, inclusion_tag, csrf_protect_m # List settings ALL_VAR = 'all' @@ -66,7 +65,7 @@ def __init__(self, field_name, row): def label(self): text = mark_safe( self.text) if self.allow_tags else conditional_escape(self.text) - if force_unicode(text) == '': + if not text: text = mark_safe(' ') for wrap in self.wraps: text = mark_safe(wrap % text) @@ -370,12 +369,12 @@ def get_context(self): """ Prepare the context for templates. """ - self.title = _('%s List') % force_unicode(self.opts.verbose_name) + self.title = _('%s List') % self.opts.verbose_name model_fields = [(f, f.name in self.list_display, self.get_check_field_url(f)) for f in (list(self.opts.fields) + self.get_model_method_fields()) if f.name not in self.list_exclude] new_context = { - 'model_name': force_unicode(self.opts.verbose_name_plural), + 'model_name': self.opts.verbose_name_plural, 'title': self.title, 'cl': self, 'model_fields': model_fields, @@ -543,7 +542,7 @@ def result_item(self, obj, field_name, row): item.allow_tags = True item.text = boolean_icon(value) else: - item.text = smart_unicode(value) + item.text = value else: if isinstance(f.rel, models.ManyToOneRel): field_val = getattr(obj, f.name) diff --git a/xadmin/views/website.py b/xadmin/views/website.py index eb4bcf020..35fa6812c 100644 --- a/xadmin/views/website.py +++ b/xadmin/views/website.py @@ -5,8 +5,8 @@ from django.contrib.auth.views import logout from django.http import HttpResponse -from base import BaseAdminView, filter_hook -from dashboard import Dashboard +from .base import BaseAdminView, filter_hook +from .dashboard import Dashboard from xadmin.forms import AdminAuthenticationForm from xadmin.models import UserSettings from xadmin.layout import FormHelper diff --git a/xadmin/widgets.py b/xadmin/widgets.py index e7301b6eb..ef6d6e1db 100644 --- a/xadmin/widgets.py +++ b/xadmin/widgets.py @@ -4,12 +4,11 @@ from itertools import chain from django import forms from django.forms.widgets import RadioFieldRenderer, RadioChoiceInput -from django.utils.encoding import force_unicode from django.utils.safestring import mark_safe from django.utils.html import conditional_escape from django.utils.translation import ugettext as _ -from util import vendor +from .util import vendor class AdminDateWidget(forms.DateInput): @@ -81,7 +80,7 @@ def render(self, name=None, value=None, attrs=None, choices=()): label_for = ' for="%s_%s"' % (self.attrs['id'], self.index) else: label_for = '' - choice_label = conditional_escape(force_unicode(self.choice_label)) + choice_label = conditional_escape(self.choice_label) if attrs.get('inline', False): return mark_safe(u'%s %s' % (label_for, self.tag(), choice_label)) else: @@ -99,7 +98,7 @@ def __getitem__(self, idx): return AdminRadioInput(self.name, self.value, self.attrs.copy(), choice, idx) def render(self): - return mark_safe(u'\n'.join([force_unicode(w) for w in self])) + return mark_safe(u'\n'.join([w for w in self])) class AdminRadioSelect(forms.RadioSelect): @@ -114,7 +113,7 @@ def render(self, name, value, attrs=None, choices=()): final_attrs = self.build_attrs(attrs, name=name) output = [] # Normalize to strings - str_values = set([force_unicode(v) for v in value]) + str_values = set([v for v in value]) for i, (option_value, option_label) in enumerate(chain(self.choices, choices)): # If an ID attribute was given, add a numeric index as a suffix, # so that the checkboxes don't all have the same ID attribute. @@ -126,9 +125,8 @@ def render(self, name, value, attrs=None, choices=()): cb = forms.CheckboxInput( final_attrs, check_test=lambda value: value in str_values) - option_value = force_unicode(option_value) rendered_cb = cb.render(name, option_value) - option_label = conditional_escape(force_unicode(option_label)) + option_label = conditional_escape(option_label) if final_attrs.get('inline', False): output.append(u'%s %s' % (label_for, rendered_cb, option_label))