Skip to content

Commit

Permalink
Merge pull request #110 from fbuccioni/master
Browse files Browse the repository at this point in the history
Fix: Factories and changelists for list_editable admin
  • Loading branch information
last-partizan authored Feb 21, 2018
2 parents ad7feca + 45c7845 commit 4ea7168
Show file tree
Hide file tree
Showing 2 changed files with 48 additions and 14 deletions.
28 changes: 21 additions & 7 deletions django_mongoengine/forms/documents.py
Original file line number Diff line number Diff line change
Expand Up @@ -218,8 +218,15 @@ def save(self, commit=True):
class DocumentForm(BaseDocumentForm):
pass


documentform_factory = partial(model_forms.modelform_factory, form=DocumentForm)
def documentform_factory(
model, form=DocumentForm, fields=None, exclude=None, formfield_callback=None,
widgets=None, localized_fields=None, labels=None, help_texts=None,
error_messages=None, *args, **kwargs
):
return model_forms.modelform_factory(
model, form, fields, exclude, formfield_callback, widgets, localized_fields,
labels, help_texts, error_messages, *args, **kwargs
)


@six.add_metaclass(DocumentFormMetaclass)
Expand Down Expand Up @@ -259,11 +266,18 @@ class BaseDocumentFormSet(model_forms.BaseModelFormSet):
A ``FormSet`` for editing a queryset and/or adding new objects to it.
"""


documentformset_factory = partial(
model_forms.modelformset_factory,
form=DocumentForm, formset=BaseDocumentFormSet,
)
def documentformset_factory(
model, form=DocumentForm, formfield_callback=None, formset=BaseDocumentFormSet,
extra=1, can_delete=False, can_order=False, max_num=None, fields=None,
exclude=None, widgets=None, validate_max=False, localized_fields=None,
labels=None, help_texts=None, error_messages=None, min_num=None,
validate_min=False, *args, **kwargs
):
return model_forms.modelformset_factory(
model, form, formfield_callback, formset, extra, can_delete, can_order,
max_num, fields, exclude, widgets, validate_max, localized_fields, labels,
help_texts, error_messages, min_num, validate_min, *args, **kwargs
)


class BaseInlineDocumentFormSet(BaseDocumentFormSet):
Expand Down
34 changes: 27 additions & 7 deletions django_mongoengine/mongo_admin/options.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import operator
from functools import reduce
from functools import reduce, partial

from django import forms
from django.forms.formsets import all_valid
Expand All @@ -26,6 +26,7 @@
from django.utils.text import capfirst
from django.utils.translation import ugettext as _
from django.forms.forms import pretty_name
from django.forms.models import modelform_defines_fields
from django.conf import settings
from django.apps import apps

Expand All @@ -40,7 +41,7 @@
from django_mongoengine.utils.wrappers import copy_class
from django_mongoengine.utils.monkey import get_patched_django_module
from django_mongoengine.forms.documents import (
DocumentForm,
DocumentForm, documentform_factory, documentformset_factory,
inlineformset_factory, BaseInlineDocumentFormSet)


Expand All @@ -53,7 +54,6 @@ def get_content_type_for_model(obj):
get_content_type_for_model=get_content_type_for_model,
)


class BaseDocumentAdmin(djmod.BaseModelAdmin):
"""Functionality common to both ModelAdmin and InlineAdmin."""
form = DocumentForm
Expand Down Expand Up @@ -205,12 +205,32 @@ def _get_inline_instances(self):
self.inline_instances.append(inline_instance)

def get_changelist_form(self, request, **kwargs):
kwargs.setdefault("form", DocumentForm)
return super(DocumentAdmin, self).get_changelist_form(request, **kwargs)
"""
Returns a Form class for use in the Formset on the changelist page.
"""
defaults = {
"formfield_callback": partial(self.formfield_for_dbfield, request=request),
}
defaults.update(kwargs)
if defaults.get('fields') is None and not modelform_defines_fields(defaults.get('form')):
defaults['fields'] = forms.ALL_FIELDS

return documentform_factory(self.model, **defaults)

def get_changelist_formset(self, request, **kwargs):
kwargs.setdefault("form", DocumentForm)
return super(DocumentAdmin, self).get_changelist_formset(request, **kwargs)
"""
Returns a FormSet class for use on the changelist page if list_editable
is used.
"""
defaults = {
"formfield_callback": partial(self.formfield_for_dbfield, request=request),
}
defaults.update(kwargs)
return documentformset_factory(
self.model, self.get_changelist_form(request), extra=0,
fields=self.list_editable, **defaults
)


def log_addition(self, request, object, message):
"""
Expand Down

0 comments on commit 4ea7168

Please sign in to comment.