1
0
mirror of https://github.com/django/django.git synced 2025-07-05 02:09:13 +00:00

[soc2009/multidb] Modified admin to allow for multidb customization. Patch from Russell Keith-Magee.

git-svn-id: http://code.djangoproject.com/svn/django/branches/soc2009/multidb@11896 bcc190cf-cafb-0310-a4f2-bffc1f526a37
This commit is contained in:
Alex Gaynor 2009-12-17 16:13:36 +00:00
parent 4eecb92fc4
commit c958523121
3 changed files with 33 additions and 18 deletions

View File

@ -140,8 +140,9 @@ class BaseModelAdmin(object):
""" """
Get a form Field for a ForeignKey. Get a form Field for a ForeignKey.
""" """
db = kwargs.get('using')
if db_field.name in self.raw_id_fields: if db_field.name in self.raw_id_fields:
kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel) kwargs['widget'] = widgets.ForeignKeyRawIdWidget(db_field.rel, using=db)
elif db_field.name in self.radio_fields: elif db_field.name in self.radio_fields:
kwargs['widget'] = widgets.AdminRadioSelect(attrs={ kwargs['widget'] = widgets.AdminRadioSelect(attrs={
'class': get_ul_class(self.radio_fields[db_field.name]), 'class': get_ul_class(self.radio_fields[db_field.name]),
@ -158,9 +159,10 @@ class BaseModelAdmin(object):
# a field in admin. # a field in admin.
if not db_field.rel.through._meta.auto_created: if not db_field.rel.through._meta.auto_created:
return None return None
db = kwargs.get('using')
if db_field.name in self.raw_id_fields: if db_field.name in self.raw_id_fields:
kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel) kwargs['widget'] = widgets.ManyToManyRawIdWidget(db_field.rel, using=db)
kwargs['help_text'] = '' kwargs['help_text'] = ''
elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)): elif db_field.name in (list(self.filter_vertical) + list(self.filter_horizontal)):
kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical)) kwargs['widget'] = widgets.FilteredSelectMultiple(db_field.verbose_name, (db_field.name in self.filter_vertical))
@ -731,7 +733,7 @@ class ModelAdmin(BaseModelAdmin):
form_validated = False form_validated = False
new_object = self.model() new_object = self.model()
prefixes = {} prefixes = {}
for FormSet in self.get_formsets(request): for FormSet, inline in zip(self.get_formsets(request), self.inline_instances):
prefix = FormSet.get_default_prefix() prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1 prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1: if prefixes[prefix] != 1:
@ -739,7 +741,7 @@ class ModelAdmin(BaseModelAdmin):
formset = FormSet(data=request.POST, files=request.FILES, formset = FormSet(data=request.POST, files=request.FILES,
instance=new_object, instance=new_object,
save_as_new=request.POST.has_key("_saveasnew"), save_as_new=request.POST.has_key("_saveasnew"),
prefix=prefix) prefix=prefix, queryset=inline.queryset(request))
formsets.append(formset) formsets.append(formset)
if all_valid(formsets) and form_validated: if all_valid(formsets) and form_validated:
self.save_model(request, new_object, form, change=False) self.save_model(request, new_object, form, change=False)
@ -762,12 +764,14 @@ class ModelAdmin(BaseModelAdmin):
initial[k] = initial[k].split(",") initial[k] = initial[k].split(",")
form = ModelForm(initial=initial) form = ModelForm(initial=initial)
prefixes = {} prefixes = {}
for FormSet in self.get_formsets(request): for FormSet, inline in zip(self.get_formsets(request),
self.inline_instances):
prefix = FormSet.get_default_prefix() prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1 prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1: if prefixes[prefix] != 1:
prefix = "%s-%s" % (prefix, prefixes[prefix]) prefix = "%s-%s" % (prefix, prefixes[prefix])
formset = FormSet(instance=self.model(), prefix=prefix) formset = FormSet(instance=self.model(), prefix=prefix,
queryset=inline.queryset(request))
formsets.append(formset) formsets.append(formset)
adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields) adminForm = helpers.AdminForm(form, list(self.get_fieldsets(request)), self.prepopulated_fields)
@ -829,13 +833,16 @@ class ModelAdmin(BaseModelAdmin):
form_validated = False form_validated = False
new_object = obj new_object = obj
prefixes = {} prefixes = {}
for FormSet in self.get_formsets(request, new_object): for FormSet, inline in zip(self.get_formsets(request, new_object),
self.inline_instances):
prefix = FormSet.get_default_prefix() prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1 prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1: if prefixes[prefix] != 1:
prefix = "%s-%s" % (prefix, prefixes[prefix]) prefix = "%s-%s" % (prefix, prefixes[prefix])
formset = FormSet(request.POST, request.FILES, formset = FormSet(request.POST, request.FILES,
instance=new_object, prefix=prefix) instance=new_object, prefix=prefix,
queryset=inline.queryset(request))
formsets.append(formset) formsets.append(formset)
if all_valid(formsets) and form_validated: if all_valid(formsets) and form_validated:
@ -851,12 +858,13 @@ class ModelAdmin(BaseModelAdmin):
else: else:
form = ModelForm(instance=obj) form = ModelForm(instance=obj)
prefixes = {} prefixes = {}
for FormSet in self.get_formsets(request, obj): for FormSet, inline in zip(self.get_formsets(request, obj), self.inline_instances):
prefix = FormSet.get_default_prefix() prefix = FormSet.get_default_prefix()
prefixes[prefix] = prefixes.get(prefix, 0) + 1 prefixes[prefix] = prefixes.get(prefix, 0) + 1
if prefixes[prefix] != 1: if prefixes[prefix] != 1:
prefix = "%s-%s" % (prefix, prefixes[prefix]) prefix = "%s-%s" % (prefix, prefixes[prefix])
formset = FormSet(instance=obj, prefix=prefix) formset = FormSet(instance=obj, prefix=prefix,
queryset=inline.queryset(request))
formsets.append(formset) formsets.append(formset)
adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields) adminForm = helpers.AdminForm(form, self.get_fieldsets(request, obj), self.prepopulated_fields)
@ -1178,6 +1186,9 @@ class InlineModelAdmin(BaseModelAdmin):
form = self.get_formset(request).form form = self.get_formset(request).form
return [(None, {'fields': form.base_fields.keys()})] return [(None, {'fields': form.base_fields.keys()})]
def queryset(self, request):
return self.model._default_manager.all()
class StackedInline(InlineModelAdmin): class StackedInline(InlineModelAdmin):
template = 'admin/edit_inline/stacked.html' template = 'admin/edit_inline/stacked.html'

View File

@ -102,8 +102,9 @@ class ForeignKeyRawIdWidget(forms.TextInput):
A Widget for displaying ForeignKeys in the "raw_id" interface rather than A Widget for displaying ForeignKeys in the "raw_id" interface rather than
in a <select> box. in a <select> box.
""" """
def __init__(self, rel, attrs=None): def __init__(self, rel, attrs=None, using=None):
self.rel = rel self.rel = rel
self.db = using
super(ForeignKeyRawIdWidget, self).__init__(attrs) super(ForeignKeyRawIdWidget, self).__init__(attrs)
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None):
@ -148,7 +149,7 @@ class ForeignKeyRawIdWidget(forms.TextInput):
def label_for_value(self, value): def label_for_value(self, value):
key = self.rel.get_related_field().name key = self.rel.get_related_field().name
obj = self.rel.to._default_manager.get(**{key: value}) obj = self.rel.to._default_manager.using(self.db).get(**{key: value})
return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14)) return '&nbsp;<strong>%s</strong>' % escape(truncate_words(obj, 14))
class ManyToManyRawIdWidget(ForeignKeyRawIdWidget): class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
@ -156,8 +157,8 @@ class ManyToManyRawIdWidget(ForeignKeyRawIdWidget):
A Widget for displaying ManyToMany ids in the "raw_id" interface rather than A Widget for displaying ManyToMany ids in the "raw_id" interface rather than
in a <select multiple> box. in a <select multiple> box.
""" """
def __init__(self, rel, attrs=None): def __init__(self, rel, attrs=None, using=None):
super(ManyToManyRawIdWidget, self).__init__(rel, attrs) super(ManyToManyRawIdWidget, self).__init__(rel, attrs, using=None)
def render(self, name, value, attrs=None): def render(self, name, value, attrs=None):
attrs['class'] = 'vManyToManyRawIdAdminField' attrs['class'] = 'vManyToManyRawIdAdminField'

View File

@ -284,7 +284,9 @@ class ReverseSingleRelatedObjectDescriptor(object):
elif value is not None and value._state.db != instance._state.db: elif value is not None and value._state.db != instance._state.db:
if instance._state.db is None: if instance._state.db is None:
instance._state.db = value._state.db instance._state.db = value._state.db
else: elif value._state.db is None:
value._state.db = instance._state.db
elif value._state.db is not None and instance._state.db is not None:
raise ValueError('Cannot assign "%r": instance is on database "%s", value is is on database "%s"' % raise ValueError('Cannot assign "%r": instance is on database "%s", value is is on database "%s"' %
(value, instance._state.db, value._state.db)) (value, instance._state.db, value._state.db))
@ -782,10 +784,10 @@ class ForeignKey(RelatedField, Field):
self.rel.field_name = cls._meta.pk.name self.rel.field_name = cls._meta.pk.name
def formfield(self, **kwargs): def formfield(self, **kwargs):
db = kwargs.pop('using', None)
defaults = { defaults = {
'form_class': forms.ModelChoiceField, 'form_class': forms.ModelChoiceField,
'queryset': self.rel.to._default_manager.complex_filter( 'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to),
self.rel.limit_choices_to),
'to_field_name': self.rel.field_name, 'to_field_name': self.rel.field_name,
} }
defaults.update(kwargs) defaults.update(kwargs)
@ -1030,9 +1032,10 @@ class ManyToManyField(RelatedField, Field):
setattr(instance, self.attname, data) setattr(instance, self.attname, data)
def formfield(self, **kwargs): def formfield(self, **kwargs):
db = kwargs.pop('using', None)
defaults = { defaults = {
'form_class': forms.ModelMultipleChoiceField, 'form_class': forms.ModelMultipleChoiceField,
'queryset': self.rel.to._default_manager.complex_filter(self.rel.limit_choices_to) 'queryset': self.rel.to._default_manager.using(db).complex_filter(self.rel.limit_choices_to)
} }
defaults.update(kwargs) defaults.update(kwargs)
# If initial is passed in, it's a list of related objects, but the # If initial is passed in, it's a list of related objects, but the