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'