Skip to content

Commit

Permalink
fix InlineM2MAdminMixin
Browse files Browse the repository at this point in the history
  • Loading branch information
awieckowski committed May 28, 2024
1 parent 92353f3 commit 2d8c67e
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 44 deletions.
65 changes: 22 additions & 43 deletions src/ralph/admin/m2m.py
Original file line number Diff line number Diff line change
Expand Up @@ -53,11 +53,10 @@ class AuthorAdmin(admin.ModelAdmin):
modelformset_factory
)
from django.utils.text import get_text_list
from django.utils.translation import ugettext_lazy as _
from django.utils.translation import gettext_lazy as _

from ralph.admin.mixins import (
RalphAdminForm,
RalphStackedInline,
RalphTabularInline
)

Expand Down Expand Up @@ -150,7 +149,7 @@ def get_foreign_key_for_m2m(parent_model, m2m):
for field in m2m.remote_field.through._meta.fields:
if (
isinstance(field, ForeignKey) and
issubclass(parent_model, field.rel.to)
issubclass(parent_model, field.remote_field.model)
):
return field

Expand Down Expand Up @@ -211,35 +210,24 @@ def get_formset(self, request, obj=None, **kwargs):
fields = kwargs.pop('fields')
else:
fields = flatten_fieldsets(self.get_fieldsets(request, obj))
if self.exclude is None:
exclude = []
else:
exclude = list(self.exclude)
excluded = self.get_exclude(request, obj)
exclude = [] if excluded is None else list(excluded)
exclude.extend(self.get_readonly_fields(request, obj))
if (
self.exclude is None and
hasattr(self.form, '_meta') and
self.form._meta.exclude
):
if excluded is None and hasattr(self.form, '_meta') and self.form._meta.exclude:
# Take the custom ModelForm's Meta.exclude into account only if the
# InlineModelAdmin doesn't define its own.
exclude.extend(self.form._meta.exclude)
# If exclude is an empty list we use None, since that's the actual
# default.
exclude = exclude or None
can_delete = (
self.can_delete and
self.has_delete_permission(request, obj)
)
can_delete = self.can_delete and self.has_delete_permission(request, obj)
defaults = {
"form": self.form,
"formset": self.formset,
"fk_name": self.fk_name,
"fields": fields,
"exclude": exclude,
"formfield_callback": partial(
self.formfield_for_dbfield, request=request
),
"formfield_callback": partial(self.formfield_for_dbfield, request=request),
"extra": self.get_extra(request, obj, **kwargs),
"min_num": self.get_min_num(request, obj, **kwargs),
"max_num": self.get_max_num(request, obj, **kwargs),
Expand All @@ -266,26 +254,19 @@ def hand_clean_DELETE(self):
objs = []
for p in collector.protected:
objs.append(
# Translators: Model verbose name and instance
# representation, suitable to be an item in a
# list.
# Translators: Model verbose name and instance representation,
# suitable to be an item in a list.
_('%(class_name)s %(instance)s') % {
'class_name': p._meta.verbose_name,
'instance': p}
)
params = {
'class_name': self._meta.model._meta.verbose_name,
'instance': self.instance,
'related_objects': get_text_list(objs, _('and'))
}
msg = _(
"Deleting %(class_name)s %(instance)s would require"
" deleting the following protected related objects:"
" %(related_objects)s"
)
raise ValidationError(
msg, code='deleting_protected', params=params
)
params = {'class_name': self._meta.model._meta.verbose_name,
'instance': self.instance,
'related_objects': get_text_list(objs, _('and'))}
msg = _("Deleting %(class_name)s %(instance)s would require "
"deleting the following protected related objects: "
"%(related_objects)s")
raise ValidationError(msg, code='deleting_protected', params=params)

def is_valid(self):
result = super(DeleteProtectedModelForm, self).is_valid()
Expand All @@ -294,22 +275,20 @@ def is_valid(self):

defaults['form'] = DeleteProtectedModelForm

if (
defaults['fields'] is None and
not modelform_defines_fields(defaults['form'])
):
if defaults['fields'] is None and not modelform_defines_fields(defaults['form']):
defaults['fields'] = forms.ALL_FIELDS

# THE ONLY DIFFERENCE HERE COMPARING TO ORIGINAL \/
# return m2minlineformset_factory instead of inlineformset_factory

# dirty fix for through queryset being passed as self.model in init in some cases
if hasattr(self.model._meta, 'auto_created') and self.model._meta.auto_created:
self.model = self.model._meta.auto_created

return m2minlineformset_factory(
self.parent_model, self.model, **defaults
)


class RalphTabularM2MInline(InlineM2MAdminMixin, RalphTabularInline):
template = 'admin/edit_inline/tabular_m2m.html'


class RalphStackedM2MInline(InlineM2MAdminMixin, RalphStackedInline):
pass
2 changes: 1 addition & 1 deletion src/ralph/networks/fields.py
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ def to_python(self, value):
if value is None:
return value
try:
return ipaddress.ip_network(value)
return value
except ValueError as exc:
raise ValidationError(
str(exc),
Expand Down

0 comments on commit 2d8c67e

Please sign in to comment.