Skip to content

Commit 6bb4833

Browse files
committed
Provisional Django 1.7 support
1 parent c2aa339 commit 6bb4833

File tree

6 files changed

+49
-21
lines changed

6 files changed

+49
-21
lines changed

xadmin/plugins/inline.py

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22
import inspect
33
from django import forms
44
from django.forms.formsets import all_valid, DELETION_FIELD_NAME
5-
from django.forms.models import inlineformset_factory, BaseInlineFormSet
5+
from django.forms.models import inlineformset_factory, BaseInlineFormSet, modelform_defines_fields
66
from django.contrib.contenttypes.generic import BaseGenericInlineFormSet, generic_inlineformset_factory
77
from django.template import loader
88
from django.template.loader import render_to_string
9+
from django.contrib.auth import get_permission_codename
910
from xadmin.layout import FormHelper, Layout, flatatt, Container, Column, Field, Fieldset
1011
from xadmin.sites import site
1112
from xadmin.views import BaseAdminPlugin, ModelFormAdminView, DetailAdminView, filter_hook
@@ -157,13 +158,15 @@ def get_formset(self, **kwargs):
157158
"form": self.form,
158159
"formset": self.formset,
159160
"fk_name": self.fk_name,
161+
'fields': forms.ALL_FIELDS,
160162
"exclude": exclude,
161163
"formfield_callback": self.formfield_for_dbfield,
162164
"extra": self.extra,
163165
"max_num": self.max_num,
164166
"can_delete": can_delete,
165167
}
166168
defaults.update(kwargs)
169+
167170
return inlineformset_factory(self.parent_model, self.model, **defaults)
168171

169172
@filter_hook
@@ -250,8 +253,9 @@ def queryset(self):
250253
def has_add_permission(self):
251254
if self.opts.auto_created:
252255
return self.has_change_permission()
253-
return self.user.has_perm(
254-
self.opts.app_label + '.' + self.opts.get_add_permission())
256+
257+
codename = get_permission_codename('add', self.opts)
258+
return self.user.has_perm("%s.%s" % (self.opts.app_label, codename))
255259

256260
def has_change_permission(self):
257261
opts = self.opts
@@ -260,14 +264,16 @@ def has_change_permission(self):
260264
if field.rel and field.rel.to != self.parent_model:
261265
opts = field.rel.to._meta
262266
break
263-
return self.user.has_perm(
264-
opts.app_label + '.' + opts.get_change_permission())
267+
268+
codename = get_permission_codename('change', opts)
269+
return self.user.has_perm("%s.%s" % (opts.app_label, codename))
265270

266271
def has_delete_permission(self):
267272
if self.opts.auto_created:
268273
return self.has_change_permission()
269-
return self.user.has_perm(
270-
self.opts.app_label + '.' + self.opts.get_delete_permission())
274+
275+
codename = get_permission_codename('delete', self.opts)
276+
return self.user.has_perm("%s.%s" % (self.opts.app_label, codename))
271277

272278

273279
class GenericInlineModelAdmin(InlineModelAdmin):
@@ -298,9 +304,11 @@ def get_formset(self, **kwargs):
298304
"can_delete": can_delete,
299305
"can_order": False,
300306
"max_num": self.max_num,
301-
"exclude": exclude
307+
"exclude": exclude,
308+
'fields': forms.ALL_FIELDS
302309
}
303310
defaults.update(kwargs)
311+
304312
return generic_inlineformset_factory(self.model, **defaults)
305313

306314

xadmin/plugins/quickform.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,6 @@ class RelatedFieldWidgetWrapper(forms.Widget):
4545
admin interface.
4646
"""
4747
def __init__(self, widget, rel, add_url, rel_add_url):
48-
self.is_hidden = widget.is_hidden
4948
self.needs_multipart_form = widget.needs_multipart_form
5049
self.attrs = widget.attrs
5150
self.choices = widget.choices
@@ -56,6 +55,9 @@ def __init__(self, widget, rel, add_url, rel_add_url):
5655
self.add_url = add_url
5756
self.rel_add_url = rel_add_url
5857

58+
if hasattr(self, 'input_type'):
59+
self.input_type = widget.input_type
60+
5961
def __deepcopy__(self, memo):
6062
obj = copy.copy(self)
6163
obj.widget = copy.deepcopy(self.widget, memo)

xadmin/templates/xadmin/base_site.html

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
{% extends 'xadmin/base.html' %}
22
{% load i18n xadmin_tags %}
33
{% load url from future %}
4+
{% load firstof from future %}
45

56
{% block title %}{{ title }} | {{ site_title }}{% endblock %}
67

@@ -16,7 +17,7 @@
1617
{% if user.is_active and user.is_staff %}
1718
<li class="dropdown">
1819
<a class="dropdown-toggle" role="button" data-toggle="dropdown" href="#">
19-
<strong>{% trans 'Welcome,' %} {% filter force_escape %}{% firstof user.first_name user.username %}{% endfilter %}</strong> <span class="caret"></span></a>
20+
<strong>{% trans 'Welcome,' %} {% firstof user.first_name user.username %}</strong> <span class="caret"></span></a>
2021
<ul id="g-account-menu" class="dropdown-menu" role="menu">
2122
{% view_block 'top_account_menu' %}
2223
</ul>

xadmin/views/base.py

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.utils.encoding import force_unicode
1111
from django.conf import settings
1212
from django.contrib import messages
13+
from django.contrib.auth import get_permission_codename
1314
from django.core.exceptions import ValidationError
1415
from django.core.serializers.json import DjangoJSONEncoder
1516
from django.core.urlresolvers import reverse
@@ -561,17 +562,23 @@ def queryset(self):
561562
Returns a QuerySet of all model instances that can be edited by the
562563
admin site. This is used by changelist_view.
563564
"""
564-
return self.model._default_manager.get_query_set()
565+
return self.model._default_manager.get_queryset()
565566

566567
def has_view_permission(self, obj=None):
567-
return ('view' not in self.remove_permissions) and (self.user.has_perm('%s.view_%s' % self.model_info) or \
568-
self.user.has_perm('%s.change_%s' % self.model_info))
568+
view_codename = get_permission_codename('view', self.opts)
569+
change_codename = get_permission_codename('change', self.opts)
570+
571+
return ('view' not in self.remove_permissions) and (self.user.has_perm('%s.%s' % (self.app_label, view_codename)) or \
572+
self.user.has_perm('%s.%s' % (self.app_label, change_codename)))
569573

570574
def has_add_permission(self):
571-
return ('add' not in self.remove_permissions) and self.user.has_perm('%s.add_%s' % self.model_info)
575+
codename = get_permission_codename('add', self.opts)
576+
return ('add' not in self.remove_permissions) and self.user.has_perm('%s.%s' % (self.app_label, codename))
572577

573578
def has_change_permission(self, obj=None):
574-
return ('change' not in self.remove_permissions) and self.user.has_perm('%s.change_%s' % self.model_info)
579+
codename = get_permission_codename('change', self.opts)
580+
return ('change' not in self.remove_permissions) and self.user.has_perm('%s.%s' % (self.app_label, codename))
575581

576582
def has_delete_permission(self, obj=None):
577-
return ('delete' not in self.remove_permissions) and self.user.has_perm('%s.delete_%s' % self.model_info)
583+
codename = get_permission_codename('delete', self.opts)
584+
return ('delete' not in self.remove_permissions) and self.user.has_perm('%s.%s' % (self.app_label, codename))

xadmin/views/edit.py

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,9 @@
22

33
from django import forms
44
from django.contrib.contenttypes.models import ContentType
5-
from django.core.exceptions import PermissionDenied
5+
from django.core.exceptions import PermissionDenied, FieldError
66
from django.db import models, transaction
7-
from django.forms.models import modelform_factory
7+
from django.forms.models import modelform_factory, modelform_defines_fields
88
from django.http import Http404, HttpResponseRedirect
99
from django.template.response import TemplateResponse
1010
from django.utils.encoding import force_unicode
@@ -93,7 +93,7 @@ def formfield_for_dbfield(self, db_field, **kwargs):
9393
def get_field_style(self, db_field, style, **kwargs):
9494
if style in ('radio', 'radio-inline') and (db_field.choices or isinstance(db_field, models.ForeignKey)):
9595
attrs = {'widget': widgets.AdminRadioSelect(
96-
attrs={'inline': style == 'radio-inline'})}
96+
attrs={'inline': 'inline' if style == 'radio-inline' else ''})}
9797
if db_field.choices:
9898
attrs['choices'] = db_field.get_choices(
9999
include_blank=db_field.blank,
@@ -173,8 +173,18 @@ def get_model_form(self, **kwargs):
173173
"formfield_callback": self.formfield_for_dbfield,
174174
}
175175
defaults.update(kwargs)
176+
177+
if defaults['fields'] is None and not modelform_defines_fields(defaults['form']):
178+
defaults['fields'] = forms.ALL_FIELDS
179+
176180
return modelform_factory(self.model, **defaults)
177181

182+
try:
183+
return modelform_factory(self.model, **defaults)
184+
except FieldError as e:
185+
raise FieldError('%s. Check fields/fieldsets/exclude attributes of class %s.'
186+
% (e, self.__class__.__name__))
187+
178188
@filter_hook
179189
def get_form_layout(self):
180190
layout = copy.deepcopy(self.form_layout)

xadmin/widgets.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"""
44
from itertools import chain
55
from django import forms
6-
from django.forms.widgets import RadioFieldRenderer, RadioInput
6+
from django.forms.widgets import RadioFieldRenderer, RadioChoiceInput
77
from django.utils.encoding import force_unicode
88
from django.utils.safestring import mark_safe
99
from django.utils.html import conditional_escape
@@ -70,7 +70,7 @@ def format_output(self, rendered_widgets):
7070
(rendered_widgets[0], rendered_widgets[1]))
7171

7272

73-
class AdminRadioInput(RadioInput):
73+
class AdminRadioInput(RadioChoiceInput):
7474

7575
def render(self, name=None, value=None, attrs=None, choices=()):
7676
name = name or self.name

0 commit comments

Comments
 (0)